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