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