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