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