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