Source file
src/net/http/server.go
1
2
3
4
5
6
7 package http
8
9 import (
10 "bufio"
11 "bytes"
12 "context"
13 "crypto/tls"
14 "errors"
15 "fmt"
16 "internal/godebug"
17 "io"
18 "log"
19 "math/rand"
20 "net"
21 "net/textproto"
22 "net/url"
23 urlpkg "net/url"
24 "path"
25 "runtime"
26 "sort"
27 "strconv"
28 "strings"
29 "sync"
30 "sync/atomic"
31 "time"
32
33 "golang.org/x/net/http/httpguts"
34 )
35
36
37 var (
38
39
40
41 ErrBodyNotAllowed = errors.New("http: request method or response status code does not allow body")
42
43
44
45
46
47
48 ErrHijacked = errors.New("http: connection has been hijacked")
49
50
51
52
53
54 ErrContentLength = errors.New("http: wrote more than the declared Content-Length")
55
56
57
58
59 ErrWriteAfterFlush = errors.New("unused")
60 )
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 type Handler interface {
87 ServeHTTP(ResponseWriter, *Request)
88 }
89
90
91
92
93
94
95 type ResponseWriter interface {
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 Header() Header
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 Write([]byte) (int, error)
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 WriteHeader(statusCode int)
160 }
161
162
163
164
165
166
167
168
169
170
171
172
173 type Flusher interface {
174
175 Flush()
176 }
177
178
179
180
181
182
183
184
185 type Hijacker interface {
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205 Hijack() (net.Conn, *bufio.ReadWriter, error)
206 }
207
208
209
210
211
212
213
214
215
216 type CloseNotifier interface {
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235 CloseNotify() <-chan bool
236 }
237
238 var (
239
240
241
242
243 ServerContextKey = &contextKey{"http-server"}
244
245
246
247
248
249 LocalAddrContextKey = &contextKey{"local-addr"}
250 )
251
252
253 type conn struct {
254
255
256 server *Server
257
258
259 cancelCtx context.CancelFunc
260
261
262
263
264
265 rwc net.Conn
266
267
268
269
270
271 remoteAddr string
272
273
274
275 tlsState *tls.ConnectionState
276
277
278
279 werr error
280
281
282
283
284 r *connReader
285
286
287 bufr *bufio.Reader
288
289
290 bufw *bufio.Writer
291
292
293
294 lastMethod string
295
296 curReq atomic.Pointer[response]
297
298 curState atomic.Uint64
299
300
301 mu sync.Mutex
302
303
304
305
306 hijackedv bool
307 }
308
309 func (c *conn) hijacked() bool {
310 c.mu.Lock()
311 defer c.mu.Unlock()
312 return c.hijackedv
313 }
314
315
316 func (c *conn) hijackLocked() (rwc net.Conn, buf *bufio.ReadWriter, err error) {
317 if c.hijackedv {
318 return nil, nil, ErrHijacked
319 }
320 c.r.abortPendingRead()
321
322 c.hijackedv = true
323 rwc = c.rwc
324 rwc.SetDeadline(time.Time{})
325
326 buf = bufio.NewReadWriter(c.bufr, bufio.NewWriter(rwc))
327 if c.r.hasByte {
328 if _, err := c.bufr.Peek(c.bufr.Buffered() + 1); err != nil {
329 return nil, nil, fmt.Errorf("unexpected Peek failure reading buffered byte: %v", err)
330 }
331 }
332 c.setState(rwc, StateHijacked, runHooks)
333 return
334 }
335
336
337
338 const bufferBeforeChunkingSize = 2048
339
340
341
342
343
344
345
346
347
348
349 type chunkWriter struct {
350 res *response
351
352
353
354
355
356 header Header
357
358
359
360
361
362 wroteHeader bool
363
364
365 chunking bool
366 }
367
368 var (
369 crlf = []byte("\r\n")
370 colonSpace = []byte(": ")
371 )
372
373 func (cw *chunkWriter) Write(p []byte) (n int, err error) {
374 if !cw.wroteHeader {
375 cw.writeHeader(p)
376 }
377 if cw.res.req.Method == "HEAD" {
378
379 return len(p), nil
380 }
381 if cw.chunking {
382 _, err = fmt.Fprintf(cw.res.conn.bufw, "%x\r\n", len(p))
383 if err != nil {
384 cw.res.conn.rwc.Close()
385 return
386 }
387 }
388 n, err = cw.res.conn.bufw.Write(p)
389 if cw.chunking && err == nil {
390 _, err = cw.res.conn.bufw.Write(crlf)
391 }
392 if err != nil {
393 cw.res.conn.rwc.Close()
394 }
395 return
396 }
397
398 func (cw *chunkWriter) flush() error {
399 if !cw.wroteHeader {
400 cw.writeHeader(nil)
401 }
402 return cw.res.conn.bufw.Flush()
403 }
404
405 func (cw *chunkWriter) close() {
406 if !cw.wroteHeader {
407 cw.writeHeader(nil)
408 }
409 if cw.chunking {
410 bw := cw.res.conn.bufw
411
412 bw.WriteString("0\r\n")
413 if trailers := cw.res.finalTrailers(); trailers != nil {
414 trailers.Write(bw)
415 }
416
417
418 bw.WriteString("\r\n")
419 }
420 }
421
422
423 type response struct {
424 conn *conn
425 req *Request
426 reqBody io.ReadCloser
427 cancelCtx context.CancelFunc
428 wroteHeader bool
429 wroteContinue bool
430 wants10KeepAlive bool
431 wantsClose bool
432
433
434
435
436
437
438
439
440 canWriteContinue atomic.Bool
441 writeContinueMu sync.Mutex
442
443 w *bufio.Writer
444 cw chunkWriter
445
446
447
448
449
450 handlerHeader Header
451 calledHeader bool
452
453 written int64
454 contentLength int64
455 status int
456
457
458
459
460
461 closeAfterReply bool
462
463
464
465
466
467
468
469
470 requestBodyLimitHit bool
471
472
473
474
475
476 trailers []string
477
478 handlerDone atomic.Bool
479
480
481 dateBuf [len(TimeFormat)]byte
482 clenBuf [10]byte
483 statusBuf [3]byte
484
485
486
487
488 closeNotifyCh chan bool
489 didCloseNotify atomic.Bool
490 }
491
492 func (c *response) SetReadDeadline(deadline time.Time) error {
493 return c.conn.rwc.SetReadDeadline(deadline)
494 }
495
496 func (c *response) SetWriteDeadline(deadline time.Time) error {
497 return c.conn.rwc.SetWriteDeadline(deadline)
498 }
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513 const TrailerPrefix = "Trailer:"
514
515
516
517 func (w *response) finalTrailers() Header {
518 var t Header
519 for k, vv := range w.handlerHeader {
520 if kk, found := strings.CutPrefix(k, TrailerPrefix); found {
521 if t == nil {
522 t = make(Header)
523 }
524 t[kk] = vv
525 }
526 }
527 for _, k := range w.trailers {
528 if t == nil {
529 t = make(Header)
530 }
531 for _, v := range w.handlerHeader[k] {
532 t.Add(k, v)
533 }
534 }
535 return t
536 }
537
538
539
540
541 func (w *response) declareTrailer(k string) {
542 k = CanonicalHeaderKey(k)
543 if !httpguts.ValidTrailerHeader(k) {
544
545 return
546 }
547 w.trailers = append(w.trailers, k)
548 }
549
550
551
552 func (w *response) requestTooLarge() {
553 w.closeAfterReply = true
554 w.requestBodyLimitHit = true
555 if !w.wroteHeader {
556 w.Header().Set("Connection", "close")
557 }
558 }
559
560
561
562 type writerOnly struct {
563 io.Writer
564 }
565
566
567
568
569 func (w *response) ReadFrom(src io.Reader) (n int64, err error) {
570 bufp := copyBufPool.Get().(*[]byte)
571 buf := *bufp
572 defer copyBufPool.Put(bufp)
573
574
575
576
577 rf, ok := w.conn.rwc.(io.ReaderFrom)
578 if !ok {
579 return io.CopyBuffer(writerOnly{w}, src, buf)
580 }
581
582
583
584
585
586 if !w.cw.wroteHeader {
587 n0, err := io.CopyBuffer(writerOnly{w}, io.LimitReader(src, sniffLen), buf)
588 n += n0
589 if err != nil || n0 < sniffLen {
590 return n, err
591 }
592 }
593
594 w.w.Flush()
595 w.cw.flush()
596
597
598 if !w.cw.chunking && w.bodyAllowed() {
599 n0, err := rf.ReadFrom(src)
600 n += n0
601 w.written += n0
602 return n, err
603 }
604
605 n0, err := io.CopyBuffer(writerOnly{w}, src, buf)
606 n += n0
607 return n, err
608 }
609
610
611
612 const debugServerConnections = false
613
614
615 func (srv *Server) newConn(rwc net.Conn) *conn {
616 c := &conn{
617 server: srv,
618 rwc: rwc,
619 }
620 if debugServerConnections {
621 c.rwc = newLoggingConn("server", c.rwc)
622 }
623 return c
624 }
625
626 type readResult struct {
627 _ incomparable
628 n int
629 err error
630 b byte
631 }
632
633
634
635
636
637
638 type connReader struct {
639 conn *conn
640
641 mu sync.Mutex
642 hasByte bool
643 byteBuf [1]byte
644 cond *sync.Cond
645 inRead bool
646 aborted bool
647 remain int64
648 }
649
650 func (cr *connReader) lock() {
651 cr.mu.Lock()
652 if cr.cond == nil {
653 cr.cond = sync.NewCond(&cr.mu)
654 }
655 }
656
657 func (cr *connReader) unlock() { cr.mu.Unlock() }
658
659 func (cr *connReader) startBackgroundRead() {
660 cr.lock()
661 defer cr.unlock()
662 if cr.inRead {
663 panic("invalid concurrent Body.Read call")
664 }
665 if cr.hasByte {
666 return
667 }
668 cr.inRead = true
669 cr.conn.rwc.SetReadDeadline(time.Time{})
670 go cr.backgroundRead()
671 }
672
673 func (cr *connReader) backgroundRead() {
674 n, err := cr.conn.rwc.Read(cr.byteBuf[:])
675 cr.lock()
676 if n == 1 {
677 cr.hasByte = true
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700 }
701 if ne, ok := err.(net.Error); ok && cr.aborted && ne.Timeout() {
702
703
704 } else if err != nil {
705 cr.handleReadError(err)
706 }
707 cr.aborted = false
708 cr.inRead = false
709 cr.unlock()
710 cr.cond.Broadcast()
711 }
712
713 func (cr *connReader) abortPendingRead() {
714 cr.lock()
715 defer cr.unlock()
716 if !cr.inRead {
717 return
718 }
719 cr.aborted = true
720 cr.conn.rwc.SetReadDeadline(aLongTimeAgo)
721 for cr.inRead {
722 cr.cond.Wait()
723 }
724 cr.conn.rwc.SetReadDeadline(time.Time{})
725 }
726
727 func (cr *connReader) setReadLimit(remain int64) { cr.remain = remain }
728 func (cr *connReader) setInfiniteReadLimit() { cr.remain = maxInt64 }
729 func (cr *connReader) hitReadLimit() bool { return cr.remain <= 0 }
730
731
732
733
734
735
736
737
738
739
740
741 func (cr *connReader) handleReadError(_ error) {
742 cr.conn.cancelCtx()
743 cr.closeNotify()
744 }
745
746
747 func (cr *connReader) closeNotify() {
748 res := cr.conn.curReq.Load()
749 if res != nil && !res.didCloseNotify.Swap(true) {
750 res.closeNotifyCh <- true
751 }
752 }
753
754 func (cr *connReader) Read(p []byte) (n int, err error) {
755 cr.lock()
756 if cr.inRead {
757 cr.unlock()
758 if cr.conn.hijacked() {
759 panic("invalid Body.Read call. After hijacked, the original Request must not be used")
760 }
761 panic("invalid concurrent Body.Read call")
762 }
763 if cr.hitReadLimit() {
764 cr.unlock()
765 return 0, io.EOF
766 }
767 if len(p) == 0 {
768 cr.unlock()
769 return 0, nil
770 }
771 if int64(len(p)) > cr.remain {
772 p = p[:cr.remain]
773 }
774 if cr.hasByte {
775 p[0] = cr.byteBuf[0]
776 cr.hasByte = false
777 cr.unlock()
778 return 1, nil
779 }
780 cr.inRead = true
781 cr.unlock()
782 n, err = cr.conn.rwc.Read(p)
783
784 cr.lock()
785 cr.inRead = false
786 if err != nil {
787 cr.handleReadError(err)
788 }
789 cr.remain -= int64(n)
790 cr.unlock()
791
792 cr.cond.Broadcast()
793 return n, err
794 }
795
796 var (
797 bufioReaderPool sync.Pool
798 bufioWriter2kPool sync.Pool
799 bufioWriter4kPool sync.Pool
800 )
801
802 var copyBufPool = sync.Pool{
803 New: func() any {
804 b := make([]byte, 32*1024)
805 return &b
806 },
807 }
808
809 func bufioWriterPool(size int) *sync.Pool {
810 switch size {
811 case 2 << 10:
812 return &bufioWriter2kPool
813 case 4 << 10:
814 return &bufioWriter4kPool
815 }
816 return nil
817 }
818
819 func newBufioReader(r io.Reader) *bufio.Reader {
820 if v := bufioReaderPool.Get(); v != nil {
821 br := v.(*bufio.Reader)
822 br.Reset(r)
823 return br
824 }
825
826
827 return bufio.NewReader(r)
828 }
829
830 func putBufioReader(br *bufio.Reader) {
831 br.Reset(nil)
832 bufioReaderPool.Put(br)
833 }
834
835 func newBufioWriterSize(w io.Writer, size int) *bufio.Writer {
836 pool := bufioWriterPool(size)
837 if pool != nil {
838 if v := pool.Get(); v != nil {
839 bw := v.(*bufio.Writer)
840 bw.Reset(w)
841 return bw
842 }
843 }
844 return bufio.NewWriterSize(w, size)
845 }
846
847 func putBufioWriter(bw *bufio.Writer) {
848 bw.Reset(nil)
849 if pool := bufioWriterPool(bw.Available()); pool != nil {
850 pool.Put(bw)
851 }
852 }
853
854
855
856
857 const DefaultMaxHeaderBytes = 1 << 20
858
859 func (srv *Server) maxHeaderBytes() int {
860 if srv.MaxHeaderBytes > 0 {
861 return srv.MaxHeaderBytes
862 }
863 return DefaultMaxHeaderBytes
864 }
865
866 func (srv *Server) initialReadLimitSize() int64 {
867 return int64(srv.maxHeaderBytes()) + 4096
868 }
869
870
871
872
873
874
875 func (srv *Server) tlsHandshakeTimeout() time.Duration {
876 var ret time.Duration
877 for _, v := range [...]time.Duration{
878 srv.ReadHeaderTimeout,
879 srv.ReadTimeout,
880 srv.WriteTimeout,
881 } {
882 if v <= 0 {
883 continue
884 }
885 if ret == 0 || v < ret {
886 ret = v
887 }
888 }
889 return ret
890 }
891
892
893
894 type expectContinueReader struct {
895 resp *response
896 readCloser io.ReadCloser
897 closed atomic.Bool
898 sawEOF atomic.Bool
899 }
900
901 func (ecr *expectContinueReader) Read(p []byte) (n int, err error) {
902 if ecr.closed.Load() {
903 return 0, ErrBodyReadAfterClose
904 }
905 w := ecr.resp
906 if !w.wroteContinue && w.canWriteContinue.Load() && !w.conn.hijacked() {
907 w.wroteContinue = true
908 w.writeContinueMu.Lock()
909 if w.canWriteContinue.Load() {
910 w.conn.bufw.WriteString("HTTP/1.1 100 Continue\r\n\r\n")
911 w.conn.bufw.Flush()
912 w.canWriteContinue.Store(false)
913 }
914 w.writeContinueMu.Unlock()
915 }
916 n, err = ecr.readCloser.Read(p)
917 if err == io.EOF {
918 ecr.sawEOF.Store(true)
919 }
920 return
921 }
922
923 func (ecr *expectContinueReader) Close() error {
924 ecr.closed.Store(true)
925 return ecr.readCloser.Close()
926 }
927
928
929
930
931
932
933
934 const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT"
935
936
937 func appendTime(b []byte, t time.Time) []byte {
938 const days = "SunMonTueWedThuFriSat"
939 const months = "JanFebMarAprMayJunJulAugSepOctNovDec"
940
941 t = t.UTC()
942 yy, mm, dd := t.Date()
943 hh, mn, ss := t.Clock()
944 day := days[3*t.Weekday():]
945 mon := months[3*(mm-1):]
946
947 return append(b,
948 day[0], day[1], day[2], ',', ' ',
949 byte('0'+dd/10), byte('0'+dd%10), ' ',
950 mon[0], mon[1], mon[2], ' ',
951 byte('0'+yy/1000), byte('0'+(yy/100)%10), byte('0'+(yy/10)%10), byte('0'+yy%10), ' ',
952 byte('0'+hh/10), byte('0'+hh%10), ':',
953 byte('0'+mn/10), byte('0'+mn%10), ':',
954 byte('0'+ss/10), byte('0'+ss%10), ' ',
955 'G', 'M', 'T')
956 }
957
958 var errTooLarge = errors.New("http: request too large")
959
960
961 func (c *conn) readRequest(ctx context.Context) (w *response, err error) {
962 if c.hijacked() {
963 return nil, ErrHijacked
964 }
965
966 var (
967 wholeReqDeadline time.Time
968 hdrDeadline time.Time
969 )
970 t0 := time.Now()
971 if d := c.server.readHeaderTimeout(); d > 0 {
972 hdrDeadline = t0.Add(d)
973 }
974 if d := c.server.ReadTimeout; d > 0 {
975 wholeReqDeadline = t0.Add(d)
976 }
977 c.rwc.SetReadDeadline(hdrDeadline)
978 if d := c.server.WriteTimeout; d > 0 {
979 defer func() {
980 c.rwc.SetWriteDeadline(time.Now().Add(d))
981 }()
982 }
983
984 c.r.setReadLimit(c.server.initialReadLimitSize())
985 if c.lastMethod == "POST" {
986
987 peek, _ := c.bufr.Peek(4)
988 c.bufr.Discard(numLeadingCRorLF(peek))
989 }
990 req, err := readRequest(c.bufr)
991 if err != nil {
992 if c.r.hitReadLimit() {
993 return nil, errTooLarge
994 }
995 return nil, err
996 }
997
998 if !http1ServerSupportsRequest(req) {
999 return nil, statusError{StatusHTTPVersionNotSupported, "unsupported protocol version"}
1000 }
1001
1002 c.lastMethod = req.Method
1003 c.r.setInfiniteReadLimit()
1004
1005 hosts, haveHost := req.Header["Host"]
1006 isH2Upgrade := req.isH2Upgrade()
1007 if req.ProtoAtLeast(1, 1) && (!haveHost || len(hosts) == 0) && !isH2Upgrade && req.Method != "CONNECT" {
1008 return nil, badRequestError("missing required Host header")
1009 }
1010 if len(hosts) == 1 && !httpguts.ValidHostHeader(hosts[0]) {
1011 return nil, badRequestError("malformed Host header")
1012 }
1013 for k, vv := range req.Header {
1014 if !httpguts.ValidHeaderFieldName(k) {
1015 return nil, badRequestError("invalid header name")
1016 }
1017 for _, v := range vv {
1018 if !httpguts.ValidHeaderFieldValue(v) {
1019 return nil, badRequestError("invalid header value")
1020 }
1021 }
1022 }
1023 delete(req.Header, "Host")
1024
1025 ctx, cancelCtx := context.WithCancel(ctx)
1026 req.ctx = ctx
1027 req.RemoteAddr = c.remoteAddr
1028 req.TLS = c.tlsState
1029 if body, ok := req.Body.(*body); ok {
1030 body.doEarlyClose = true
1031 }
1032
1033
1034 if !hdrDeadline.Equal(wholeReqDeadline) {
1035 c.rwc.SetReadDeadline(wholeReqDeadline)
1036 }
1037
1038 w = &response{
1039 conn: c,
1040 cancelCtx: cancelCtx,
1041 req: req,
1042 reqBody: req.Body,
1043 handlerHeader: make(Header),
1044 contentLength: -1,
1045 closeNotifyCh: make(chan bool, 1),
1046
1047
1048
1049
1050 wants10KeepAlive: req.wantsHttp10KeepAlive(),
1051 wantsClose: req.wantsClose(),
1052 }
1053 if isH2Upgrade {
1054 w.closeAfterReply = true
1055 }
1056 w.cw.res = w
1057 w.w = newBufioWriterSize(&w.cw, bufferBeforeChunkingSize)
1058 return w, nil
1059 }
1060
1061
1062
1063 func http1ServerSupportsRequest(req *Request) bool {
1064 if req.ProtoMajor == 1 {
1065 return true
1066 }
1067
1068
1069 if req.ProtoMajor == 2 && req.ProtoMinor == 0 &&
1070 req.Method == "PRI" && req.RequestURI == "*" {
1071 return true
1072 }
1073
1074
1075 return false
1076 }
1077
1078 func (w *response) Header() Header {
1079 if w.cw.header == nil && w.wroteHeader && !w.cw.wroteHeader {
1080
1081
1082
1083 w.cw.header = w.handlerHeader.Clone()
1084 }
1085 w.calledHeader = true
1086 return w.handlerHeader
1087 }
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098 const maxPostHandlerReadBytes = 256 << 10
1099
1100 func checkWriteHeaderCode(code int) {
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111 if code < 100 || code > 999 {
1112 panic(fmt.Sprintf("invalid WriteHeader code %v", code))
1113 }
1114 }
1115
1116
1117
1118 func relevantCaller() runtime.Frame {
1119 pc := make([]uintptr, 16)
1120 n := runtime.Callers(1, pc)
1121 frames := runtime.CallersFrames(pc[:n])
1122 var frame runtime.Frame
1123 for {
1124 frame, more := frames.Next()
1125 if !strings.HasPrefix(frame.Function, "net/http.") {
1126 return frame
1127 }
1128 if !more {
1129 break
1130 }
1131 }
1132 return frame
1133 }
1134
1135 func (w *response) WriteHeader(code int) {
1136 if w.conn.hijacked() {
1137 caller := relevantCaller()
1138 w.conn.server.logf("http: response.WriteHeader on hijacked connection from %s (%s:%d)", caller.Function, path.Base(caller.File), caller.Line)
1139 return
1140 }
1141 if w.wroteHeader {
1142 caller := relevantCaller()
1143 w.conn.server.logf("http: superfluous response.WriteHeader call from %s (%s:%d)", caller.Function, path.Base(caller.File), caller.Line)
1144 return
1145 }
1146 checkWriteHeaderCode(code)
1147
1148
1149 if code >= 100 && code <= 199 {
1150
1151 if code == 100 && w.canWriteContinue.Load() {
1152 w.writeContinueMu.Lock()
1153 w.canWriteContinue.Store(false)
1154 w.writeContinueMu.Unlock()
1155 }
1156
1157 writeStatusLine(w.conn.bufw, w.req.ProtoAtLeast(1, 1), code, w.statusBuf[:])
1158
1159
1160 w.handlerHeader.WriteSubset(w.conn.bufw, excludedHeadersNoBody)
1161 w.conn.bufw.Write(crlf)
1162 w.conn.bufw.Flush()
1163
1164 return
1165 }
1166
1167 w.wroteHeader = true
1168 w.status = code
1169
1170 if w.calledHeader && w.cw.header == nil {
1171 w.cw.header = w.handlerHeader.Clone()
1172 }
1173
1174 if cl := w.handlerHeader.get("Content-Length"); cl != "" {
1175 v, err := strconv.ParseInt(cl, 10, 64)
1176 if err == nil && v >= 0 {
1177 w.contentLength = v
1178 } else {
1179 w.conn.server.logf("http: invalid Content-Length of %q", cl)
1180 w.handlerHeader.Del("Content-Length")
1181 }
1182 }
1183 }
1184
1185
1186
1187
1188 type extraHeader struct {
1189 contentType string
1190 connection string
1191 transferEncoding string
1192 date []byte
1193 contentLength []byte
1194 }
1195
1196
1197 var extraHeaderKeys = [][]byte{
1198 []byte("Content-Type"),
1199 []byte("Connection"),
1200 []byte("Transfer-Encoding"),
1201 }
1202
1203 var (
1204 headerContentLength = []byte("Content-Length: ")
1205 headerDate = []byte("Date: ")
1206 )
1207
1208
1209
1210
1211
1212
1213 func (h extraHeader) Write(w *bufio.Writer) {
1214 if h.date != nil {
1215 w.Write(headerDate)
1216 w.Write(h.date)
1217 w.Write(crlf)
1218 }
1219 if h.contentLength != nil {
1220 w.Write(headerContentLength)
1221 w.Write(h.contentLength)
1222 w.Write(crlf)
1223 }
1224 for i, v := range []string{h.contentType, h.connection, h.transferEncoding} {
1225 if v != "" {
1226 w.Write(extraHeaderKeys[i])
1227 w.Write(colonSpace)
1228 w.WriteString(v)
1229 w.Write(crlf)
1230 }
1231 }
1232 }
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242 func (cw *chunkWriter) writeHeader(p []byte) {
1243 if cw.wroteHeader {
1244 return
1245 }
1246 cw.wroteHeader = true
1247
1248 w := cw.res
1249 keepAlivesEnabled := w.conn.server.doKeepAlives()
1250 isHEAD := w.req.Method == "HEAD"
1251
1252
1253
1254
1255
1256
1257 header := cw.header
1258 owned := header != nil
1259 if !owned {
1260 header = w.handlerHeader
1261 }
1262 var excludeHeader map[string]bool
1263 delHeader := func(key string) {
1264 if owned {
1265 header.Del(key)
1266 return
1267 }
1268 if _, ok := header[key]; !ok {
1269 return
1270 }
1271 if excludeHeader == nil {
1272 excludeHeader = make(map[string]bool)
1273 }
1274 excludeHeader[key] = true
1275 }
1276 var setHeader extraHeader
1277
1278
1279 trailers := false
1280 for k := range cw.header {
1281 if strings.HasPrefix(k, TrailerPrefix) {
1282 if excludeHeader == nil {
1283 excludeHeader = make(map[string]bool)
1284 }
1285 excludeHeader[k] = true
1286 trailers = true
1287 }
1288 }
1289 for _, v := range cw.header["Trailer"] {
1290 trailers = true
1291 foreachHeaderElement(v, cw.res.declareTrailer)
1292 }
1293
1294 te := header.get("Transfer-Encoding")
1295 hasTE := te != ""
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311 if w.handlerDone.Load() && !trailers && !hasTE && bodyAllowedForStatus(w.status) && header.get("Content-Length") == "" && (!isHEAD || len(p) > 0) {
1312 w.contentLength = int64(len(p))
1313 setHeader.contentLength = strconv.AppendInt(cw.res.clenBuf[:0], int64(len(p)), 10)
1314 }
1315
1316
1317
1318 if w.wants10KeepAlive && keepAlivesEnabled {
1319 sentLength := header.get("Content-Length") != ""
1320 if sentLength && header.get("Connection") == "keep-alive" {
1321 w.closeAfterReply = false
1322 }
1323 }
1324
1325
1326 hasCL := w.contentLength != -1
1327
1328 if w.wants10KeepAlive && (isHEAD || hasCL || !bodyAllowedForStatus(w.status)) {
1329 _, connectionHeaderSet := header["Connection"]
1330 if !connectionHeaderSet {
1331 setHeader.connection = "keep-alive"
1332 }
1333 } else if !w.req.ProtoAtLeast(1, 1) || w.wantsClose {
1334 w.closeAfterReply = true
1335 }
1336
1337 if header.get("Connection") == "close" || !keepAlivesEnabled {
1338 w.closeAfterReply = true
1339 }
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353 if ecr, ok := w.req.Body.(*expectContinueReader); ok && !ecr.sawEOF.Load() {
1354 w.closeAfterReply = true
1355 }
1356
1357
1358
1359
1360
1361
1362
1363
1364 if w.req.ContentLength != 0 && !w.closeAfterReply {
1365 var discard, tooBig bool
1366
1367 switch bdy := w.req.Body.(type) {
1368 case *expectContinueReader:
1369 if bdy.resp.wroteContinue {
1370 discard = true
1371 }
1372 case *body:
1373 bdy.mu.Lock()
1374 switch {
1375 case bdy.closed:
1376 if !bdy.sawEOF {
1377
1378 w.closeAfterReply = true
1379 }
1380 case bdy.unreadDataSizeLocked() >= maxPostHandlerReadBytes:
1381 tooBig = true
1382 default:
1383 discard = true
1384 }
1385 bdy.mu.Unlock()
1386 default:
1387 discard = true
1388 }
1389
1390 if discard {
1391 _, err := io.CopyN(io.Discard, w.reqBody, maxPostHandlerReadBytes+1)
1392 switch err {
1393 case nil:
1394
1395 tooBig = true
1396 case ErrBodyReadAfterClose:
1397
1398 case io.EOF:
1399
1400 err = w.reqBody.Close()
1401 if err != nil {
1402 w.closeAfterReply = true
1403 }
1404 default:
1405
1406
1407
1408 w.closeAfterReply = true
1409 }
1410 }
1411
1412 if tooBig {
1413 w.requestTooLarge()
1414 delHeader("Connection")
1415 setHeader.connection = "close"
1416 }
1417 }
1418
1419 code := w.status
1420 if bodyAllowedForStatus(code) {
1421
1422 _, haveType := header["Content-Type"]
1423
1424
1425
1426 ce := header.Get("Content-Encoding")
1427 hasCE := len(ce) > 0
1428 if !hasCE && !haveType && !hasTE && len(p) > 0 {
1429 setHeader.contentType = DetectContentType(p)
1430 }
1431 } else {
1432 for _, k := range suppressedHeaders(code) {
1433 delHeader(k)
1434 }
1435 }
1436
1437 if !header.has("Date") {
1438 setHeader.date = appendTime(cw.res.dateBuf[:0], time.Now())
1439 }
1440
1441 if hasCL && hasTE && te != "identity" {
1442
1443
1444 w.conn.server.logf("http: WriteHeader called with both Transfer-Encoding of %q and a Content-Length of %d",
1445 te, w.contentLength)
1446 delHeader("Content-Length")
1447 hasCL = false
1448 }
1449
1450 if w.req.Method == "HEAD" || !bodyAllowedForStatus(code) || code == StatusNoContent {
1451
1452 delHeader("Transfer-Encoding")
1453 } else if hasCL {
1454
1455 delHeader("Transfer-Encoding")
1456 } else if w.req.ProtoAtLeast(1, 1) {
1457
1458
1459
1460
1461
1462 if hasTE && te == "identity" {
1463 cw.chunking = false
1464 w.closeAfterReply = true
1465 delHeader("Transfer-Encoding")
1466 } else {
1467
1468
1469 cw.chunking = true
1470 setHeader.transferEncoding = "chunked"
1471 if hasTE && te == "chunked" {
1472
1473 delHeader("Transfer-Encoding")
1474 }
1475 }
1476 } else {
1477
1478
1479
1480 w.closeAfterReply = true
1481 delHeader("Transfer-Encoding")
1482 }
1483
1484
1485 if cw.chunking {
1486 delHeader("Content-Length")
1487 }
1488 if !w.req.ProtoAtLeast(1, 0) {
1489 return
1490 }
1491
1492
1493
1494
1495 delConnectionHeader := w.closeAfterReply &&
1496 (!keepAlivesEnabled || !hasToken(cw.header.get("Connection"), "close")) &&
1497 !isProtocolSwitchResponse(w.status, header)
1498 if delConnectionHeader {
1499 delHeader("Connection")
1500 if w.req.ProtoAtLeast(1, 1) {
1501 setHeader.connection = "close"
1502 }
1503 }
1504
1505 writeStatusLine(w.conn.bufw, w.req.ProtoAtLeast(1, 1), code, w.statusBuf[:])
1506 cw.header.WriteSubset(w.conn.bufw, excludeHeader)
1507 setHeader.Write(w.conn.bufw)
1508 w.conn.bufw.Write(crlf)
1509 }
1510
1511
1512
1513 func foreachHeaderElement(v string, fn func(string)) {
1514 v = textproto.TrimString(v)
1515 if v == "" {
1516 return
1517 }
1518 if !strings.Contains(v, ",") {
1519 fn(v)
1520 return
1521 }
1522 for _, f := range strings.Split(v, ",") {
1523 if f = textproto.TrimString(f); f != "" {
1524 fn(f)
1525 }
1526 }
1527 }
1528
1529
1530
1531
1532
1533 func writeStatusLine(bw *bufio.Writer, is11 bool, code int, scratch []byte) {
1534 if is11 {
1535 bw.WriteString("HTTP/1.1 ")
1536 } else {
1537 bw.WriteString("HTTP/1.0 ")
1538 }
1539 if text := StatusText(code); text != "" {
1540 bw.Write(strconv.AppendInt(scratch[:0], int64(code), 10))
1541 bw.WriteByte(' ')
1542 bw.WriteString(text)
1543 bw.WriteString("\r\n")
1544 } else {
1545
1546 fmt.Fprintf(bw, "%03d status code %d\r\n", code, code)
1547 }
1548 }
1549
1550
1551
1552 func (w *response) bodyAllowed() bool {
1553 if !w.wroteHeader {
1554 panic("")
1555 }
1556 return bodyAllowedForStatus(w.status)
1557 }
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593 func (w *response) Write(data []byte) (n int, err error) {
1594 return w.write(len(data), data, "")
1595 }
1596
1597 func (w *response) WriteString(data string) (n int, err error) {
1598 return w.write(len(data), nil, data)
1599 }
1600
1601
1602 func (w *response) write(lenData int, dataB []byte, dataS string) (n int, err error) {
1603 if w.conn.hijacked() {
1604 if lenData > 0 {
1605 caller := relevantCaller()
1606 w.conn.server.logf("http: response.Write on hijacked connection from %s (%s:%d)", caller.Function, path.Base(caller.File), caller.Line)
1607 }
1608 return 0, ErrHijacked
1609 }
1610
1611 if w.canWriteContinue.Load() {
1612
1613
1614
1615
1616 w.writeContinueMu.Lock()
1617 w.canWriteContinue.Store(false)
1618 w.writeContinueMu.Unlock()
1619 }
1620
1621 if !w.wroteHeader {
1622 w.WriteHeader(StatusOK)
1623 }
1624 if lenData == 0 {
1625 return 0, nil
1626 }
1627 if !w.bodyAllowed() {
1628 return 0, ErrBodyNotAllowed
1629 }
1630
1631 w.written += int64(lenData)
1632 if w.contentLength != -1 && w.written > w.contentLength {
1633 return 0, ErrContentLength
1634 }
1635 if dataB != nil {
1636 return w.w.Write(dataB)
1637 } else {
1638 return w.w.WriteString(dataS)
1639 }
1640 }
1641
1642 func (w *response) finishRequest() {
1643 w.handlerDone.Store(true)
1644
1645 if !w.wroteHeader {
1646 w.WriteHeader(StatusOK)
1647 }
1648
1649 w.w.Flush()
1650 putBufioWriter(w.w)
1651 w.cw.close()
1652 w.conn.bufw.Flush()
1653
1654 w.conn.r.abortPendingRead()
1655
1656
1657
1658 w.reqBody.Close()
1659
1660 if w.req.MultipartForm != nil {
1661 w.req.MultipartForm.RemoveAll()
1662 }
1663 }
1664
1665
1666
1667 func (w *response) shouldReuseConnection() bool {
1668 if w.closeAfterReply {
1669
1670
1671
1672 return false
1673 }
1674
1675 if w.req.Method != "HEAD" && w.contentLength != -1 && w.bodyAllowed() && w.contentLength != w.written {
1676
1677 return false
1678 }
1679
1680
1681
1682 if w.conn.werr != nil {
1683 return false
1684 }
1685
1686 if w.closedRequestBodyEarly() {
1687 return false
1688 }
1689
1690 return true
1691 }
1692
1693 func (w *response) closedRequestBodyEarly() bool {
1694 body, ok := w.req.Body.(*body)
1695 return ok && body.didEarlyClose()
1696 }
1697
1698 func (w *response) Flush() {
1699 w.FlushError()
1700 }
1701
1702 func (w *response) FlushError() error {
1703 if !w.wroteHeader {
1704 w.WriteHeader(StatusOK)
1705 }
1706 err := w.w.Flush()
1707 e2 := w.cw.flush()
1708 if err == nil {
1709 err = e2
1710 }
1711 return err
1712 }
1713
1714 func (c *conn) finalFlush() {
1715 if c.bufr != nil {
1716
1717
1718 putBufioReader(c.bufr)
1719 c.bufr = nil
1720 }
1721
1722 if c.bufw != nil {
1723 c.bufw.Flush()
1724
1725
1726 putBufioWriter(c.bufw)
1727 c.bufw = nil
1728 }
1729 }
1730
1731
1732 func (c *conn) close() {
1733 c.finalFlush()
1734 c.rwc.Close()
1735 }
1736
1737
1738
1739
1740
1741
1742
1743
1744 const rstAvoidanceDelay = 500 * time.Millisecond
1745
1746 type closeWriter interface {
1747 CloseWrite() error
1748 }
1749
1750 var _ closeWriter = (*net.TCPConn)(nil)
1751
1752
1753
1754
1755
1756
1757
1758 func (c *conn) closeWriteAndWait() {
1759 c.finalFlush()
1760 if tcp, ok := c.rwc.(closeWriter); ok {
1761 tcp.CloseWrite()
1762 }
1763 time.Sleep(rstAvoidanceDelay)
1764 }
1765
1766
1767
1768
1769 func validNextProto(proto string) bool {
1770 switch proto {
1771 case "", "http/1.1", "http/1.0":
1772 return false
1773 }
1774 return true
1775 }
1776
1777 const (
1778 runHooks = true
1779 skipHooks = false
1780 )
1781
1782 func (c *conn) setState(nc net.Conn, state ConnState, runHook bool) {
1783 srv := c.server
1784 switch state {
1785 case StateNew:
1786 srv.trackConn(c, true)
1787 case StateHijacked, StateClosed:
1788 srv.trackConn(c, false)
1789 }
1790 if state > 0xff || state < 0 {
1791 panic("internal error")
1792 }
1793 packedState := uint64(time.Now().Unix()<<8) | uint64(state)
1794 c.curState.Store(packedState)
1795 if !runHook {
1796 return
1797 }
1798 if hook := srv.ConnState; hook != nil {
1799 hook(nc, state)
1800 }
1801 }
1802
1803 func (c *conn) getState() (state ConnState, unixSec int64) {
1804 packedState := c.curState.Load()
1805 return ConnState(packedState & 0xff), int64(packedState >> 8)
1806 }
1807
1808
1809
1810
1811 func badRequestError(e string) error { return statusError{StatusBadRequest, e} }
1812
1813
1814
1815 type statusError struct {
1816 code int
1817 text string
1818 }
1819
1820 func (e statusError) Error() string { return StatusText(e.code) + ": " + e.text }
1821
1822
1823
1824
1825
1826 var ErrAbortHandler = errors.New("net/http: abort Handler")
1827
1828
1829
1830
1831
1832 func isCommonNetReadError(err error) bool {
1833 if err == io.EOF {
1834 return true
1835 }
1836 if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
1837 return true
1838 }
1839 if oe, ok := err.(*net.OpError); ok && oe.Op == "read" {
1840 return true
1841 }
1842 return false
1843 }
1844
1845
1846 func (c *conn) serve(ctx context.Context) {
1847 c.remoteAddr = c.rwc.RemoteAddr().String()
1848 ctx = context.WithValue(ctx, LocalAddrContextKey, c.rwc.LocalAddr())
1849 var inFlightResponse *response
1850 defer func() {
1851 if err := recover(); err != nil && err != ErrAbortHandler {
1852 const size = 64 << 10
1853 buf := make([]byte, size)
1854 buf = buf[:runtime.Stack(buf, false)]
1855 c.server.logf("http: panic serving %v: %v\n%s", c.remoteAddr, err, buf)
1856 }
1857 if inFlightResponse != nil {
1858 inFlightResponse.cancelCtx()
1859 }
1860 if !c.hijacked() {
1861 if inFlightResponse != nil {
1862 inFlightResponse.conn.r.abortPendingRead()
1863 inFlightResponse.reqBody.Close()
1864 }
1865 c.close()
1866 c.setState(c.rwc, StateClosed, runHooks)
1867 }
1868 }()
1869
1870 if tlsConn, ok := c.rwc.(*tls.Conn); ok {
1871 tlsTO := c.server.tlsHandshakeTimeout()
1872 if tlsTO > 0 {
1873 dl := time.Now().Add(tlsTO)
1874 c.rwc.SetReadDeadline(dl)
1875 c.rwc.SetWriteDeadline(dl)
1876 }
1877 if err := tlsConn.HandshakeContext(ctx); err != nil {
1878
1879
1880
1881 if re, ok := err.(tls.RecordHeaderError); ok && re.Conn != nil && tlsRecordHeaderLooksLikeHTTP(re.RecordHeader) {
1882 io.WriteString(re.Conn, "HTTP/1.0 400 Bad Request\r\n\r\nClient sent an HTTP request to an HTTPS server.\n")
1883 re.Conn.Close()
1884 return
1885 }
1886 c.server.logf("http: TLS handshake error from %s: %v", c.rwc.RemoteAddr(), err)
1887 return
1888 }
1889
1890 if tlsTO > 0 {
1891 c.rwc.SetReadDeadline(time.Time{})
1892 c.rwc.SetWriteDeadline(time.Time{})
1893 }
1894 c.tlsState = new(tls.ConnectionState)
1895 *c.tlsState = tlsConn.ConnectionState()
1896 if proto := c.tlsState.NegotiatedProtocol; validNextProto(proto) {
1897 if fn := c.server.TLSNextProto[proto]; fn != nil {
1898 h := initALPNRequest{ctx, tlsConn, serverHandler{c.server}}
1899
1900
1901
1902 c.setState(c.rwc, StateActive, skipHooks)
1903 fn(c.server, tlsConn, h)
1904 }
1905 return
1906 }
1907 }
1908
1909
1910
1911 ctx, cancelCtx := context.WithCancel(ctx)
1912 c.cancelCtx = cancelCtx
1913 defer cancelCtx()
1914
1915 c.r = &connReader{conn: c}
1916 c.bufr = newBufioReader(c.r)
1917 c.bufw = newBufioWriterSize(checkConnErrorWriter{c}, 4<<10)
1918
1919 for {
1920 w, err := c.readRequest(ctx)
1921 if c.r.remain != c.server.initialReadLimitSize() {
1922
1923 c.setState(c.rwc, StateActive, runHooks)
1924 }
1925 if err != nil {
1926 const errorHeaders = "\r\nContent-Type: text/plain; charset=utf-8\r\nConnection: close\r\n\r\n"
1927
1928 switch {
1929 case err == errTooLarge:
1930
1931
1932
1933
1934
1935 const publicErr = "431 Request Header Fields Too Large"
1936 fmt.Fprintf(c.rwc, "HTTP/1.1 "+publicErr+errorHeaders+publicErr)
1937 c.closeWriteAndWait()
1938 return
1939
1940 case isUnsupportedTEError(err):
1941
1942
1943
1944
1945 code := StatusNotImplemented
1946
1947
1948
1949 fmt.Fprintf(c.rwc, "HTTP/1.1 %d %s%sUnsupported transfer encoding", code, StatusText(code), errorHeaders)
1950 return
1951
1952 case isCommonNetReadError(err):
1953 return
1954
1955 default:
1956 if v, ok := err.(statusError); ok {
1957 fmt.Fprintf(c.rwc, "HTTP/1.1 %d %s: %s%s%d %s: %s", v.code, StatusText(v.code), v.text, errorHeaders, v.code, StatusText(v.code), v.text)
1958 return
1959 }
1960 publicErr := "400 Bad Request"
1961 fmt.Fprintf(c.rwc, "HTTP/1.1 "+publicErr+errorHeaders+publicErr)
1962 return
1963 }
1964 }
1965
1966
1967 req := w.req
1968 if req.expectsContinue() {
1969 if req.ProtoAtLeast(1, 1) && req.ContentLength != 0 {
1970
1971 req.Body = &expectContinueReader{readCloser: req.Body, resp: w}
1972 w.canWriteContinue.Store(true)
1973 }
1974 } else if req.Header.get("Expect") != "" {
1975 w.sendExpectationFailed()
1976 return
1977 }
1978
1979 c.curReq.Store(w)
1980
1981 if requestBodyRemains(req.Body) {
1982 registerOnHitEOF(req.Body, w.conn.r.startBackgroundRead)
1983 } else {
1984 w.conn.r.startBackgroundRead()
1985 }
1986
1987
1988
1989
1990
1991
1992
1993
1994 inFlightResponse = w
1995 serverHandler{c.server}.ServeHTTP(w, w.req)
1996 inFlightResponse = nil
1997 w.cancelCtx()
1998 if c.hijacked() {
1999 return
2000 }
2001 w.finishRequest()
2002 c.rwc.SetWriteDeadline(time.Time{})
2003 if !w.shouldReuseConnection() {
2004 if w.requestBodyLimitHit || w.closedRequestBodyEarly() {
2005 c.closeWriteAndWait()
2006 }
2007 return
2008 }
2009 c.setState(c.rwc, StateIdle, runHooks)
2010 c.curReq.Store(nil)
2011
2012 if !w.conn.server.doKeepAlives() {
2013
2014
2015
2016
2017 return
2018 }
2019
2020 if d := c.server.idleTimeout(); d != 0 {
2021 c.rwc.SetReadDeadline(time.Now().Add(d))
2022 } else {
2023 c.rwc.SetReadDeadline(time.Time{})
2024 }
2025
2026
2027
2028
2029
2030 if _, err := c.bufr.Peek(4); err != nil {
2031 return
2032 }
2033
2034 c.rwc.SetReadDeadline(time.Time{})
2035 }
2036 }
2037
2038 func (w *response) sendExpectationFailed() {
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051 w.Header().Set("Connection", "close")
2052 w.WriteHeader(StatusExpectationFailed)
2053 w.finishRequest()
2054 }
2055
2056
2057
2058 func (w *response) Hijack() (rwc net.Conn, buf *bufio.ReadWriter, err error) {
2059 if w.handlerDone.Load() {
2060 panic("net/http: Hijack called after ServeHTTP finished")
2061 }
2062 if w.wroteHeader {
2063 w.cw.flush()
2064 }
2065
2066 c := w.conn
2067 c.mu.Lock()
2068 defer c.mu.Unlock()
2069
2070
2071
2072 rwc, buf, err = c.hijackLocked()
2073 if err == nil {
2074 putBufioWriter(w.w)
2075 w.w = nil
2076 }
2077 return rwc, buf, err
2078 }
2079
2080 func (w *response) CloseNotify() <-chan bool {
2081 if w.handlerDone.Load() {
2082 panic("net/http: CloseNotify called after ServeHTTP finished")
2083 }
2084 return w.closeNotifyCh
2085 }
2086
2087 func registerOnHitEOF(rc io.ReadCloser, fn func()) {
2088 switch v := rc.(type) {
2089 case *expectContinueReader:
2090 registerOnHitEOF(v.readCloser, fn)
2091 case *body:
2092 v.registerOnHitEOF(fn)
2093 default:
2094 panic("unexpected type " + fmt.Sprintf("%T", rc))
2095 }
2096 }
2097
2098
2099
2100 func requestBodyRemains(rc io.ReadCloser) bool {
2101 if rc == NoBody {
2102 return false
2103 }
2104 switch v := rc.(type) {
2105 case *expectContinueReader:
2106 return requestBodyRemains(v.readCloser)
2107 case *body:
2108 return v.bodyRemains()
2109 default:
2110 panic("unexpected type " + fmt.Sprintf("%T", rc))
2111 }
2112 }
2113
2114
2115
2116
2117
2118 type HandlerFunc func(ResponseWriter, *Request)
2119
2120
2121 func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
2122 f(w, r)
2123 }
2124
2125
2126
2127
2128
2129
2130
2131 func Error(w ResponseWriter, error string, code int) {
2132 w.Header().Set("Content-Type", "text/plain; charset=utf-8")
2133 w.Header().Set("X-Content-Type-Options", "nosniff")
2134 w.WriteHeader(code)
2135 fmt.Fprintln(w, error)
2136 }
2137
2138
2139 func NotFound(w ResponseWriter, r *Request) { Error(w, "404 page not found", StatusNotFound) }
2140
2141
2142
2143 func NotFoundHandler() Handler { return HandlerFunc(NotFound) }
2144
2145
2146
2147
2148
2149
2150
2151 func StripPrefix(prefix string, h Handler) Handler {
2152 if prefix == "" {
2153 return h
2154 }
2155 return HandlerFunc(func(w ResponseWriter, r *Request) {
2156 p := strings.TrimPrefix(r.URL.Path, prefix)
2157 rp := strings.TrimPrefix(r.URL.RawPath, prefix)
2158 if len(p) < len(r.URL.Path) && (r.URL.RawPath == "" || len(rp) < len(r.URL.RawPath)) {
2159 r2 := new(Request)
2160 *r2 = *r
2161 r2.URL = new(url.URL)
2162 *r2.URL = *r.URL
2163 r2.URL.Path = p
2164 r2.URL.RawPath = rp
2165 h.ServeHTTP(w, r2)
2166 } else {
2167 NotFound(w, r)
2168 }
2169 })
2170 }
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182 func Redirect(w ResponseWriter, r *Request, url string, code int) {
2183 if u, err := urlpkg.Parse(url); err == nil {
2184
2185
2186
2187
2188
2189 if u.Scheme == "" && u.Host == "" {
2190 oldpath := r.URL.Path
2191 if oldpath == "" {
2192 oldpath = "/"
2193 }
2194
2195
2196 if url == "" || url[0] != '/' {
2197
2198 olddir, _ := path.Split(oldpath)
2199 url = olddir + url
2200 }
2201
2202 var query string
2203 if i := strings.Index(url, "?"); i != -1 {
2204 url, query = url[:i], url[i:]
2205 }
2206
2207
2208 trailing := strings.HasSuffix(url, "/")
2209 url = path.Clean(url)
2210 if trailing && !strings.HasSuffix(url, "/") {
2211 url += "/"
2212 }
2213 url += query
2214 }
2215 }
2216
2217 h := w.Header()
2218
2219
2220
2221
2222 _, hadCT := h["Content-Type"]
2223
2224 h.Set("Location", hexEscapeNonASCII(url))
2225 if !hadCT && (r.Method == "GET" || r.Method == "HEAD") {
2226 h.Set("Content-Type", "text/html; charset=utf-8")
2227 }
2228 w.WriteHeader(code)
2229
2230
2231 if !hadCT && r.Method == "GET" {
2232 body := "<a href=\"" + htmlEscape(url) + "\">" + StatusText(code) + "</a>.\n"
2233 fmt.Fprintln(w, body)
2234 }
2235 }
2236
2237 var htmlReplacer = strings.NewReplacer(
2238 "&", "&",
2239 "<", "<",
2240 ">", ">",
2241
2242 `"`, """,
2243
2244 "'", "'",
2245 )
2246
2247 func htmlEscape(s string) string {
2248 return htmlReplacer.Replace(s)
2249 }
2250
2251
2252 type redirectHandler struct {
2253 url string
2254 code int
2255 }
2256
2257 func (rh *redirectHandler) ServeHTTP(w ResponseWriter, r *Request) {
2258 Redirect(w, r, rh.url, rh.code)
2259 }
2260
2261
2262
2263
2264
2265
2266
2267 func RedirectHandler(url string, code int) Handler {
2268 return &redirectHandler{url, code}
2269 }
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306 type ServeMux struct {
2307 mu sync.RWMutex
2308 m map[string]muxEntry
2309 es []muxEntry
2310 hosts bool
2311 }
2312
2313 type muxEntry struct {
2314 h Handler
2315 pattern string
2316 }
2317
2318
2319 func NewServeMux() *ServeMux { return new(ServeMux) }
2320
2321
2322 var DefaultServeMux = &defaultServeMux
2323
2324 var defaultServeMux ServeMux
2325
2326
2327 func cleanPath(p string) string {
2328 if p == "" {
2329 return "/"
2330 }
2331 if p[0] != '/' {
2332 p = "/" + p
2333 }
2334 np := path.Clean(p)
2335
2336
2337 if p[len(p)-1] == '/' && np != "/" {
2338
2339 if len(p) == len(np)+1 && strings.HasPrefix(p, np) {
2340 np = p
2341 } else {
2342 np += "/"
2343 }
2344 }
2345 return np
2346 }
2347
2348
2349 func stripHostPort(h string) string {
2350
2351 if !strings.Contains(h, ":") {
2352 return h
2353 }
2354 host, _, err := net.SplitHostPort(h)
2355 if err != nil {
2356 return h
2357 }
2358 return host
2359 }
2360
2361
2362
2363 func (mux *ServeMux) match(path string) (h Handler, pattern string) {
2364
2365 v, ok := mux.m[path]
2366 if ok {
2367 return v.h, v.pattern
2368 }
2369
2370
2371
2372 for _, e := range mux.es {
2373 if strings.HasPrefix(path, e.pattern) {
2374 return e.h, e.pattern
2375 }
2376 }
2377 return nil, ""
2378 }
2379
2380
2381
2382
2383
2384 func (mux *ServeMux) redirectToPathSlash(host, path string, u *url.URL) (*url.URL, bool) {
2385 mux.mu.RLock()
2386 shouldRedirect := mux.shouldRedirectRLocked(host, path)
2387 mux.mu.RUnlock()
2388 if !shouldRedirect {
2389 return u, false
2390 }
2391 path = path + "/"
2392 u = &url.URL{Path: path, RawQuery: u.RawQuery}
2393 return u, true
2394 }
2395
2396
2397
2398
2399 func (mux *ServeMux) shouldRedirectRLocked(host, path string) bool {
2400 p := []string{path, host + path}
2401
2402 for _, c := range p {
2403 if _, exist := mux.m[c]; exist {
2404 return false
2405 }
2406 }
2407
2408 n := len(path)
2409 if n == 0 {
2410 return false
2411 }
2412 for _, c := range p {
2413 if _, exist := mux.m[c+"/"]; exist {
2414 return path[n-1] != '/'
2415 }
2416 }
2417
2418 return false
2419 }
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436 func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string) {
2437
2438
2439 if r.Method == "CONNECT" {
2440
2441
2442
2443 if u, ok := mux.redirectToPathSlash(r.URL.Host, r.URL.Path, r.URL); ok {
2444 return RedirectHandler(u.String(), StatusMovedPermanently), u.Path
2445 }
2446
2447 return mux.handler(r.Host, r.URL.Path)
2448 }
2449
2450
2451
2452 host := stripHostPort(r.Host)
2453 path := cleanPath(r.URL.Path)
2454
2455
2456
2457 if u, ok := mux.redirectToPathSlash(host, path, r.URL); ok {
2458 return RedirectHandler(u.String(), StatusMovedPermanently), u.Path
2459 }
2460
2461 if path != r.URL.Path {
2462 _, pattern = mux.handler(host, path)
2463 u := &url.URL{Path: path, RawQuery: r.URL.RawQuery}
2464 return RedirectHandler(u.String(), StatusMovedPermanently), pattern
2465 }
2466
2467 return mux.handler(host, r.URL.Path)
2468 }
2469
2470
2471
2472 func (mux *ServeMux) handler(host, path string) (h Handler, pattern string) {
2473 mux.mu.RLock()
2474 defer mux.mu.RUnlock()
2475
2476
2477 if mux.hosts {
2478 h, pattern = mux.match(host + path)
2479 }
2480 if h == nil {
2481 h, pattern = mux.match(path)
2482 }
2483 if h == nil {
2484 h, pattern = NotFoundHandler(), ""
2485 }
2486 return
2487 }
2488
2489
2490
2491 func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) {
2492 if r.RequestURI == "*" {
2493 if r.ProtoAtLeast(1, 1) {
2494 w.Header().Set("Connection", "close")
2495 }
2496 w.WriteHeader(StatusBadRequest)
2497 return
2498 }
2499 h, _ := mux.Handler(r)
2500 h.ServeHTTP(w, r)
2501 }
2502
2503
2504
2505 func (mux *ServeMux) Handle(pattern string, handler Handler) {
2506 mux.mu.Lock()
2507 defer mux.mu.Unlock()
2508
2509 if pattern == "" {
2510 panic("http: invalid pattern")
2511 }
2512 if handler == nil {
2513 panic("http: nil handler")
2514 }
2515 if _, exist := mux.m[pattern]; exist {
2516 panic("http: multiple registrations for " + pattern)
2517 }
2518
2519 if mux.m == nil {
2520 mux.m = make(map[string]muxEntry)
2521 }
2522 e := muxEntry{h: handler, pattern: pattern}
2523 mux.m[pattern] = e
2524 if pattern[len(pattern)-1] == '/' {
2525 mux.es = appendSorted(mux.es, e)
2526 }
2527
2528 if pattern[0] != '/' {
2529 mux.hosts = true
2530 }
2531 }
2532
2533 func appendSorted(es []muxEntry, e muxEntry) []muxEntry {
2534 n := len(es)
2535 i := sort.Search(n, func(i int) bool {
2536 return len(es[i].pattern) < len(e.pattern)
2537 })
2538 if i == n {
2539 return append(es, e)
2540 }
2541
2542 es = append(es, muxEntry{})
2543 copy(es[i+1:], es[i:])
2544 es[i] = e
2545 return es
2546 }
2547
2548
2549 func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
2550 if handler == nil {
2551 panic("http: nil handler")
2552 }
2553 mux.Handle(pattern, HandlerFunc(handler))
2554 }
2555
2556
2557
2558
2559 func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
2560
2561
2562
2563
2564 func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
2565 DefaultServeMux.HandleFunc(pattern, handler)
2566 }
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579 func Serve(l net.Listener, handler Handler) error {
2580 srv := &Server{Handler: handler}
2581 return srv.Serve(l)
2582 }
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596 func ServeTLS(l net.Listener, handler Handler, certFile, keyFile string) error {
2597 srv := &Server{Handler: handler}
2598 return srv.ServeTLS(l, certFile, keyFile)
2599 }
2600
2601
2602
2603 type Server struct {
2604
2605
2606
2607
2608 Addr string
2609
2610 Handler Handler
2611
2612
2613
2614 DisableGeneralOptionsHandler bool
2615
2616
2617
2618
2619
2620
2621
2622
2623 TLSConfig *tls.Config
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633 ReadTimeout time.Duration
2634
2635
2636
2637
2638
2639
2640
2641 ReadHeaderTimeout time.Duration
2642
2643
2644
2645
2646
2647
2648 WriteTimeout time.Duration
2649
2650
2651
2652
2653
2654 IdleTimeout time.Duration
2655
2656
2657
2658
2659
2660
2661 MaxHeaderBytes int
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672 TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
2673
2674
2675
2676
2677 ConnState func(net.Conn, ConnState)
2678
2679
2680
2681
2682
2683 ErrorLog *log.Logger
2684
2685
2686
2687
2688
2689
2690
2691 BaseContext func(net.Listener) context.Context
2692
2693
2694
2695
2696
2697 ConnContext func(ctx context.Context, c net.Conn) context.Context
2698
2699 inShutdown atomic.Bool
2700
2701 disableKeepAlives atomic.Bool
2702 nextProtoOnce sync.Once
2703 nextProtoErr error
2704
2705 mu sync.Mutex
2706 listeners map[*net.Listener]struct{}
2707 activeConn map[*conn]struct{}
2708 onShutdown []func()
2709
2710 listenerGroup sync.WaitGroup
2711 }
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722 func (srv *Server) Close() error {
2723 srv.inShutdown.Store(true)
2724 srv.mu.Lock()
2725 defer srv.mu.Unlock()
2726 err := srv.closeListenersLocked()
2727
2728
2729
2730
2731
2732 srv.mu.Unlock()
2733 srv.listenerGroup.Wait()
2734 srv.mu.Lock()
2735
2736 for c := range srv.activeConn {
2737 c.rwc.Close()
2738 delete(srv.activeConn, c)
2739 }
2740 return err
2741 }
2742
2743
2744
2745
2746
2747
2748
2749
2750 const shutdownPollIntervalMax = 500 * time.Millisecond
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772 func (srv *Server) Shutdown(ctx context.Context) error {
2773 srv.inShutdown.Store(true)
2774
2775 srv.mu.Lock()
2776 lnerr := srv.closeListenersLocked()
2777 for _, f := range srv.onShutdown {
2778 go f()
2779 }
2780 srv.mu.Unlock()
2781 srv.listenerGroup.Wait()
2782
2783 pollIntervalBase := time.Millisecond
2784 nextPollInterval := func() time.Duration {
2785
2786 interval := pollIntervalBase + time.Duration(rand.Intn(int(pollIntervalBase/10)))
2787
2788 pollIntervalBase *= 2
2789 if pollIntervalBase > shutdownPollIntervalMax {
2790 pollIntervalBase = shutdownPollIntervalMax
2791 }
2792 return interval
2793 }
2794
2795 timer := time.NewTimer(nextPollInterval())
2796 defer timer.Stop()
2797 for {
2798 if srv.closeIdleConns() {
2799 return lnerr
2800 }
2801 select {
2802 case <-ctx.Done():
2803 return ctx.Err()
2804 case <-timer.C:
2805 timer.Reset(nextPollInterval())
2806 }
2807 }
2808 }
2809
2810
2811
2812
2813
2814
2815 func (srv *Server) RegisterOnShutdown(f func()) {
2816 srv.mu.Lock()
2817 srv.onShutdown = append(srv.onShutdown, f)
2818 srv.mu.Unlock()
2819 }
2820
2821
2822
2823 func (s *Server) closeIdleConns() bool {
2824 s.mu.Lock()
2825 defer s.mu.Unlock()
2826 quiescent := true
2827 for c := range s.activeConn {
2828 st, unixSec := c.getState()
2829
2830
2831
2832 if st == StateNew && unixSec < time.Now().Unix()-5 {
2833 st = StateIdle
2834 }
2835 if st != StateIdle || unixSec == 0 {
2836
2837
2838 quiescent = false
2839 continue
2840 }
2841 c.rwc.Close()
2842 delete(s.activeConn, c)
2843 }
2844 return quiescent
2845 }
2846
2847 func (s *Server) closeListenersLocked() error {
2848 var err error
2849 for ln := range s.listeners {
2850 if cerr := (*ln).Close(); cerr != nil && err == nil {
2851 err = cerr
2852 }
2853 }
2854 return err
2855 }
2856
2857
2858
2859 type ConnState int
2860
2861 const (
2862
2863
2864
2865
2866 StateNew ConnState = iota
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879 StateActive
2880
2881
2882
2883
2884
2885 StateIdle
2886
2887
2888
2889 StateHijacked
2890
2891
2892
2893
2894 StateClosed
2895 )
2896
2897 var stateName = map[ConnState]string{
2898 StateNew: "new",
2899 StateActive: "active",
2900 StateIdle: "idle",
2901 StateHijacked: "hijacked",
2902 StateClosed: "closed",
2903 }
2904
2905 func (c ConnState) String() string {
2906 return stateName[c]
2907 }
2908
2909
2910
2911 type serverHandler struct {
2912 srv *Server
2913 }
2914
2915 func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {
2916 handler := sh.srv.Handler
2917 if handler == nil {
2918 handler = DefaultServeMux
2919 }
2920 if !sh.srv.DisableGeneralOptionsHandler && req.RequestURI == "*" && req.Method == "OPTIONS" {
2921 handler = globalOptionsHandler{}
2922 }
2923
2924 if req.URL != nil && strings.Contains(req.URL.RawQuery, ";") {
2925 var allowQuerySemicolonsInUse atomic.Bool
2926 req = req.WithContext(context.WithValue(req.Context(), silenceSemWarnContextKey, func() {
2927 allowQuerySemicolonsInUse.Store(true)
2928 }))
2929 defer func() {
2930 if !allowQuerySemicolonsInUse.Load() {
2931 sh.srv.logf("http: URL query contains semicolon, which is no longer a supported separator; parts of the query may be stripped when parsed; see golang.org/issue/25192")
2932 }
2933 }()
2934 }
2935
2936 handler.ServeHTTP(rw, req)
2937 }
2938
2939 var silenceSemWarnContextKey = &contextKey{"silence-semicolons"}
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950 func AllowQuerySemicolons(h Handler) Handler {
2951 return HandlerFunc(func(w ResponseWriter, r *Request) {
2952 if silenceSemicolonsWarning, ok := r.Context().Value(silenceSemWarnContextKey).(func()); ok {
2953 silenceSemicolonsWarning()
2954 }
2955 if strings.Contains(r.URL.RawQuery, ";") {
2956 r2 := new(Request)
2957 *r2 = *r
2958 r2.URL = new(url.URL)
2959 *r2.URL = *r.URL
2960 r2.URL.RawQuery = strings.ReplaceAll(r.URL.RawQuery, ";", "&")
2961 h.ServeHTTP(w, r2)
2962 } else {
2963 h.ServeHTTP(w, r)
2964 }
2965 })
2966 }
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976 func (srv *Server) ListenAndServe() error {
2977 if srv.shuttingDown() {
2978 return ErrServerClosed
2979 }
2980 addr := srv.Addr
2981 if addr == "" {
2982 addr = ":http"
2983 }
2984 ln, err := net.Listen("tcp", addr)
2985 if err != nil {
2986 return err
2987 }
2988 return srv.Serve(ln)
2989 }
2990
2991 var testHookServerServe func(*Server, net.Listener)
2992
2993
2994
2995 func (srv *Server) shouldConfigureHTTP2ForServe() bool {
2996 if srv.TLSConfig == nil {
2997
2998
2999
3000
3001
3002
3003 return true
3004 }
3005
3006
3007
3008
3009
3010
3011
3012 return strSliceContains(srv.TLSConfig.NextProtos, http2NextProtoTLS)
3013 }
3014
3015
3016
3017 var ErrServerClosed = errors.New("http: Server closed")
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029 func (srv *Server) Serve(l net.Listener) error {
3030 if fn := testHookServerServe; fn != nil {
3031 fn(srv, l)
3032 }
3033
3034 origListener := l
3035 l = &onceCloseListener{Listener: l}
3036 defer l.Close()
3037
3038 if err := srv.setupHTTP2_Serve(); err != nil {
3039 return err
3040 }
3041
3042 if !srv.trackListener(&l, true) {
3043 return ErrServerClosed
3044 }
3045 defer srv.trackListener(&l, false)
3046
3047 baseCtx := context.Background()
3048 if srv.BaseContext != nil {
3049 baseCtx = srv.BaseContext(origListener)
3050 if baseCtx == nil {
3051 panic("BaseContext returned a nil context")
3052 }
3053 }
3054
3055 var tempDelay time.Duration
3056
3057 ctx := context.WithValue(baseCtx, ServerContextKey, srv)
3058 for {
3059 rw, err := l.Accept()
3060 if err != nil {
3061 if srv.shuttingDown() {
3062 return ErrServerClosed
3063 }
3064 if ne, ok := err.(net.Error); ok && ne.Temporary() {
3065 if tempDelay == 0 {
3066 tempDelay = 5 * time.Millisecond
3067 } else {
3068 tempDelay *= 2
3069 }
3070 if max := 1 * time.Second; tempDelay > max {
3071 tempDelay = max
3072 }
3073 srv.logf("http: Accept error: %v; retrying in %v", err, tempDelay)
3074 time.Sleep(tempDelay)
3075 continue
3076 }
3077 return err
3078 }
3079 connCtx := ctx
3080 if cc := srv.ConnContext; cc != nil {
3081 connCtx = cc(connCtx, rw)
3082 if connCtx == nil {
3083 panic("ConnContext returned nil")
3084 }
3085 }
3086 tempDelay = 0
3087 c := srv.newConn(rw)
3088 c.setState(c.rwc, StateNew, runHooks)
3089 go c.serve(connCtx)
3090 }
3091 }
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106 func (srv *Server) ServeTLS(l net.Listener, certFile, keyFile string) error {
3107
3108
3109 if err := srv.setupHTTP2_ServeTLS(); err != nil {
3110 return err
3111 }
3112
3113 config := cloneTLSConfig(srv.TLSConfig)
3114 if !strSliceContains(config.NextProtos, "http/1.1") {
3115 config.NextProtos = append(config.NextProtos, "http/1.1")
3116 }
3117
3118 configHasCert := len(config.Certificates) > 0 || config.GetCertificate != nil
3119 if !configHasCert || certFile != "" || keyFile != "" {
3120 var err error
3121 config.Certificates = make([]tls.Certificate, 1)
3122 config.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile)
3123 if err != nil {
3124 return err
3125 }
3126 }
3127
3128 tlsListener := tls.NewListener(l, config)
3129 return srv.Serve(tlsListener)
3130 }
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142 func (s *Server) trackListener(ln *net.Listener, add bool) bool {
3143 s.mu.Lock()
3144 defer s.mu.Unlock()
3145 if s.listeners == nil {
3146 s.listeners = make(map[*net.Listener]struct{})
3147 }
3148 if add {
3149 if s.shuttingDown() {
3150 return false
3151 }
3152 s.listeners[ln] = struct{}{}
3153 s.listenerGroup.Add(1)
3154 } else {
3155 delete(s.listeners, ln)
3156 s.listenerGroup.Done()
3157 }
3158 return true
3159 }
3160
3161 func (s *Server) trackConn(c *conn, add bool) {
3162 s.mu.Lock()
3163 defer s.mu.Unlock()
3164 if s.activeConn == nil {
3165 s.activeConn = make(map[*conn]struct{})
3166 }
3167 if add {
3168 s.activeConn[c] = struct{}{}
3169 } else {
3170 delete(s.activeConn, c)
3171 }
3172 }
3173
3174 func (s *Server) idleTimeout() time.Duration {
3175 if s.IdleTimeout != 0 {
3176 return s.IdleTimeout
3177 }
3178 return s.ReadTimeout
3179 }
3180
3181 func (s *Server) readHeaderTimeout() time.Duration {
3182 if s.ReadHeaderTimeout != 0 {
3183 return s.ReadHeaderTimeout
3184 }
3185 return s.ReadTimeout
3186 }
3187
3188 func (s *Server) doKeepAlives() bool {
3189 return !s.disableKeepAlives.Load() && !s.shuttingDown()
3190 }
3191
3192 func (s *Server) shuttingDown() bool {
3193 return s.inShutdown.Load()
3194 }
3195
3196
3197
3198
3199
3200 func (srv *Server) SetKeepAlivesEnabled(v bool) {
3201 if v {
3202 srv.disableKeepAlives.Store(false)
3203 return
3204 }
3205 srv.disableKeepAlives.Store(true)
3206
3207
3208 srv.closeIdleConns()
3209
3210
3211 }
3212
3213 func (s *Server) logf(format string, args ...any) {
3214 if s.ErrorLog != nil {
3215 s.ErrorLog.Printf(format, args...)
3216 } else {
3217 log.Printf(format, args...)
3218 }
3219 }
3220
3221
3222
3223
3224 func logf(r *Request, format string, args ...any) {
3225 s, _ := r.Context().Value(ServerContextKey).(*Server)
3226 if s != nil && s.ErrorLog != nil {
3227 s.ErrorLog.Printf(format, args...)
3228 } else {
3229 log.Printf(format, args...)
3230 }
3231 }
3232
3233
3234
3235
3236
3237
3238
3239
3240 func ListenAndServe(addr string, handler Handler) error {
3241 server := &Server{Addr: addr, Handler: handler}
3242 return server.ListenAndServe()
3243 }
3244
3245
3246
3247
3248
3249
3250 func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error {
3251 server := &Server{Addr: addr, Handler: handler}
3252 return server.ListenAndServeTLS(certFile, keyFile)
3253 }
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270 func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error {
3271 if srv.shuttingDown() {
3272 return ErrServerClosed
3273 }
3274 addr := srv.Addr
3275 if addr == "" {
3276 addr = ":https"
3277 }
3278
3279 ln, err := net.Listen("tcp", addr)
3280 if err != nil {
3281 return err
3282 }
3283
3284 defer ln.Close()
3285
3286 return srv.ServeTLS(ln, certFile, keyFile)
3287 }
3288
3289
3290
3291
3292 func (srv *Server) setupHTTP2_ServeTLS() error {
3293 srv.nextProtoOnce.Do(srv.onceSetNextProtoDefaults)
3294 return srv.nextProtoErr
3295 }
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305 func (srv *Server) setupHTTP2_Serve() error {
3306 srv.nextProtoOnce.Do(srv.onceSetNextProtoDefaults_Serve)
3307 return srv.nextProtoErr
3308 }
3309
3310 func (srv *Server) onceSetNextProtoDefaults_Serve() {
3311 if srv.shouldConfigureHTTP2ForServe() {
3312 srv.onceSetNextProtoDefaults()
3313 }
3314 }
3315
3316 var http2server = godebug.New("http2server")
3317
3318
3319
3320
3321 func (srv *Server) onceSetNextProtoDefaults() {
3322 if omitBundledHTTP2 || http2server.Value() == "0" {
3323 return
3324 }
3325
3326
3327 if srv.TLSNextProto == nil {
3328 conf := &http2Server{
3329 NewWriteScheduler: func() http2WriteScheduler { return http2NewPriorityWriteScheduler(nil) },
3330 }
3331 srv.nextProtoErr = http2ConfigureServer(srv, conf)
3332 }
3333 }
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346 func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler {
3347 return &timeoutHandler{
3348 handler: h,
3349 body: msg,
3350 dt: dt,
3351 }
3352 }
3353
3354
3355
3356 var ErrHandlerTimeout = errors.New("http: Handler timeout")
3357
3358 type timeoutHandler struct {
3359 handler Handler
3360 body string
3361 dt time.Duration
3362
3363
3364
3365 testContext context.Context
3366 }
3367
3368 func (h *timeoutHandler) errorBody() string {
3369 if h.body != "" {
3370 return h.body
3371 }
3372 return "<html><head><title>Timeout</title></head><body><h1>Timeout</h1></body></html>"
3373 }
3374
3375 func (h *timeoutHandler) ServeHTTP(w ResponseWriter, r *Request) {
3376 ctx := h.testContext
3377 if ctx == nil {
3378 var cancelCtx context.CancelFunc
3379 ctx, cancelCtx = context.WithTimeout(r.Context(), h.dt)
3380 defer cancelCtx()
3381 }
3382 r = r.WithContext(ctx)
3383 done := make(chan struct{})
3384 tw := &timeoutWriter{
3385 w: w,
3386 h: make(Header),
3387 req: r,
3388 }
3389 panicChan := make(chan any, 1)
3390 go func() {
3391 defer func() {
3392 if p := recover(); p != nil {
3393 panicChan <- p
3394 }
3395 }()
3396 h.handler.ServeHTTP(tw, r)
3397 close(done)
3398 }()
3399 select {
3400 case p := <-panicChan:
3401 panic(p)
3402 case <-done:
3403 tw.mu.Lock()
3404 defer tw.mu.Unlock()
3405 dst := w.Header()
3406 for k, vv := range tw.h {
3407 dst[k] = vv
3408 }
3409 if !tw.wroteHeader {
3410 tw.code = StatusOK
3411 }
3412 w.WriteHeader(tw.code)
3413 w.Write(tw.wbuf.Bytes())
3414 case <-ctx.Done():
3415 tw.mu.Lock()
3416 defer tw.mu.Unlock()
3417 switch err := ctx.Err(); err {
3418 case context.DeadlineExceeded:
3419 w.WriteHeader(StatusServiceUnavailable)
3420 io.WriteString(w, h.errorBody())
3421 tw.err = ErrHandlerTimeout
3422 default:
3423 w.WriteHeader(StatusServiceUnavailable)
3424 tw.err = err
3425 }
3426 }
3427 }
3428
3429 type timeoutWriter struct {
3430 w ResponseWriter
3431 h Header
3432 wbuf bytes.Buffer
3433 req *Request
3434
3435 mu sync.Mutex
3436 err error
3437 wroteHeader bool
3438 code int
3439 }
3440
3441 var _ Pusher = (*timeoutWriter)(nil)
3442
3443
3444 func (tw *timeoutWriter) Push(target string, opts *PushOptions) error {
3445 if pusher, ok := tw.w.(Pusher); ok {
3446 return pusher.Push(target, opts)
3447 }
3448 return ErrNotSupported
3449 }
3450
3451 func (tw *timeoutWriter) Header() Header { return tw.h }
3452
3453 func (tw *timeoutWriter) Write(p []byte) (int, error) {
3454 tw.mu.Lock()
3455 defer tw.mu.Unlock()
3456 if tw.err != nil {
3457 return 0, tw.err
3458 }
3459 if !tw.wroteHeader {
3460 tw.writeHeaderLocked(StatusOK)
3461 }
3462 return tw.wbuf.Write(p)
3463 }
3464
3465 func (tw *timeoutWriter) writeHeaderLocked(code int) {
3466 checkWriteHeaderCode(code)
3467
3468 switch {
3469 case tw.err != nil:
3470 return
3471 case tw.wroteHeader:
3472 if tw.req != nil {
3473 caller := relevantCaller()
3474 logf(tw.req, "http: superfluous response.WriteHeader call from %s (%s:%d)", caller.Function, path.Base(caller.File), caller.Line)
3475 }
3476 default:
3477 tw.wroteHeader = true
3478 tw.code = code
3479 }
3480 }
3481
3482 func (tw *timeoutWriter) WriteHeader(code int) {
3483 tw.mu.Lock()
3484 defer tw.mu.Unlock()
3485 tw.writeHeaderLocked(code)
3486 }
3487
3488
3489
3490 type onceCloseListener struct {
3491 net.Listener
3492 once sync.Once
3493 closeErr error
3494 }
3495
3496 func (oc *onceCloseListener) Close() error {
3497 oc.once.Do(oc.close)
3498 return oc.closeErr
3499 }
3500
3501 func (oc *onceCloseListener) close() { oc.closeErr = oc.Listener.Close() }
3502
3503
3504 type globalOptionsHandler struct{}
3505
3506 func (globalOptionsHandler) ServeHTTP(w ResponseWriter, r *Request) {
3507 w.Header().Set("Content-Length", "0")
3508 if r.ContentLength != 0 {
3509
3510
3511
3512
3513
3514 mb := MaxBytesReader(w, r.Body, 4<<10)
3515 io.Copy(io.Discard, mb)
3516 }
3517 }
3518
3519
3520
3521
3522 type initALPNRequest struct {
3523 ctx context.Context
3524 c *tls.Conn
3525 h serverHandler
3526 }
3527
3528
3529
3530
3531
3532 func (h initALPNRequest) BaseContext() context.Context { return h.ctx }
3533
3534 func (h initALPNRequest) ServeHTTP(rw ResponseWriter, req *Request) {
3535 if req.TLS == nil {
3536 req.TLS = &tls.ConnectionState{}
3537 *req.TLS = h.c.ConnectionState()
3538 }
3539 if req.Body == nil {
3540 req.Body = NoBody
3541 }
3542 if req.RemoteAddr == "" {
3543 req.RemoteAddr = h.c.RemoteAddr().String()
3544 }
3545 h.h.ServeHTTP(rw, req)
3546 }
3547
3548
3549 type loggingConn struct {
3550 name string
3551 net.Conn
3552 }
3553
3554 var (
3555 uniqNameMu sync.Mutex
3556 uniqNameNext = make(map[string]int)
3557 )
3558
3559 func newLoggingConn(baseName string, c net.Conn) net.Conn {
3560 uniqNameMu.Lock()
3561 defer uniqNameMu.Unlock()
3562 uniqNameNext[baseName]++
3563 return &loggingConn{
3564 name: fmt.Sprintf("%s-%d", baseName, uniqNameNext[baseName]),
3565 Conn: c,
3566 }
3567 }
3568
3569 func (c *loggingConn) Write(p []byte) (n int, err error) {
3570 log.Printf("%s.Write(%d) = ....", c.name, len(p))
3571 n, err = c.Conn.Write(p)
3572 log.Printf("%s.Write(%d) = %d, %v", c.name, len(p), n, err)
3573 return
3574 }
3575
3576 func (c *loggingConn) Read(p []byte) (n int, err error) {
3577 log.Printf("%s.Read(%d) = ....", c.name, len(p))
3578 n, err = c.Conn.Read(p)
3579 log.Printf("%s.Read(%d) = %d, %v", c.name, len(p), n, err)
3580 return
3581 }
3582
3583 func (c *loggingConn) Close() (err error) {
3584 log.Printf("%s.Close() = ...", c.name)
3585 err = c.Conn.Close()
3586 log.Printf("%s.Close() = %v", c.name, err)
3587 return
3588 }
3589
3590
3591
3592
3593 type checkConnErrorWriter struct {
3594 c *conn
3595 }
3596
3597 func (w checkConnErrorWriter) Write(p []byte) (n int, err error) {
3598 n, err = w.c.rwc.Write(p)
3599 if err != nil && w.c.werr == nil {
3600 w.c.werr = err
3601 w.c.cancelCtx()
3602 }
3603 return
3604 }
3605
3606 func numLeadingCRorLF(v []byte) (n int) {
3607 for _, b := range v {
3608 if b == '\r' || b == '\n' {
3609 n++
3610 continue
3611 }
3612 break
3613 }
3614 return
3615
3616 }
3617
3618 func strSliceContains(ss []string, s string) bool {
3619 for _, v := range ss {
3620 if v == s {
3621 return true
3622 }
3623 }
3624 return false
3625 }
3626
3627
3628
3629 func tlsRecordHeaderLooksLikeHTTP(hdr [5]byte) bool {
3630 switch string(hdr[:]) {
3631 case "GET /", "HEAD ", "POST ", "PUT /", "OPTIO":
3632 return true
3633 }
3634 return false
3635 }
3636
3637
3638 func MaxBytesHandler(h Handler, n int64) Handler {
3639 return HandlerFunc(func(w ResponseWriter, r *Request) {
3640 r2 := *r
3641 r2.Body = MaxBytesReader(w, r.Body, n)
3642 h.ServeHTTP(w, &r2)
3643 })
3644 }
3645
View as plain text