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 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 inShutdown atomic.Bool
3078
3079 disableKeepAlives atomic.Bool
3080 nextProtoOnce sync.Once
3081 nextProtoErr error
3082
3083 mu sync.Mutex
3084 listeners map[*net.Listener]struct{}
3085 activeConn map[*conn]struct{}
3086 onShutdown []func()
3087
3088 listenerGroup sync.WaitGroup
3089 }
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100 func (s *Server) Close() error {
3101 s.inShutdown.Store(true)
3102 s.mu.Lock()
3103 defer s.mu.Unlock()
3104 err := s.closeListenersLocked()
3105
3106
3107
3108
3109
3110 s.mu.Unlock()
3111 s.listenerGroup.Wait()
3112 s.mu.Lock()
3113
3114 for c := range s.activeConn {
3115 c.rwc.Close()
3116 delete(s.activeConn, c)
3117 }
3118 return err
3119 }
3120
3121
3122
3123
3124
3125
3126
3127
3128 const shutdownPollIntervalMax = 500 * time.Millisecond
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150 func (s *Server) Shutdown(ctx context.Context) error {
3151 s.inShutdown.Store(true)
3152
3153 s.mu.Lock()
3154 lnerr := s.closeListenersLocked()
3155 for _, f := range s.onShutdown {
3156 go f()
3157 }
3158 s.mu.Unlock()
3159 s.listenerGroup.Wait()
3160
3161 pollIntervalBase := time.Millisecond
3162 nextPollInterval := func() time.Duration {
3163
3164 interval := pollIntervalBase + time.Duration(rand.Intn(int(pollIntervalBase/10)))
3165
3166 pollIntervalBase *= 2
3167 if pollIntervalBase > shutdownPollIntervalMax {
3168 pollIntervalBase = shutdownPollIntervalMax
3169 }
3170 return interval
3171 }
3172
3173 timer := time.NewTimer(nextPollInterval())
3174 defer timer.Stop()
3175 for {
3176 if s.closeIdleConns() {
3177 return lnerr
3178 }
3179 select {
3180 case <-ctx.Done():
3181 return ctx.Err()
3182 case <-timer.C:
3183 timer.Reset(nextPollInterval())
3184 }
3185 }
3186 }
3187
3188
3189
3190
3191
3192
3193 func (s *Server) RegisterOnShutdown(f func()) {
3194 s.mu.Lock()
3195 s.onShutdown = append(s.onShutdown, f)
3196 s.mu.Unlock()
3197 }
3198
3199
3200
3201 func (s *Server) closeIdleConns() bool {
3202 s.mu.Lock()
3203 defer s.mu.Unlock()
3204 quiescent := true
3205 for c := range s.activeConn {
3206 st, unixSec := c.getState()
3207
3208
3209
3210 if st == StateNew && unixSec < time.Now().Unix()-5 {
3211 st = StateIdle
3212 }
3213 if st != StateIdle || unixSec == 0 {
3214
3215
3216 quiescent = false
3217 continue
3218 }
3219 c.rwc.Close()
3220 delete(s.activeConn, c)
3221 }
3222 return quiescent
3223 }
3224
3225 func (s *Server) closeListenersLocked() error {
3226 var err error
3227 for ln := range s.listeners {
3228 if cerr := (*ln).Close(); cerr != nil && err == nil {
3229 err = cerr
3230 }
3231 }
3232 return err
3233 }
3234
3235
3236
3237 type ConnState int
3238
3239 const (
3240
3241
3242
3243
3244 StateNew ConnState = iota
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257 StateActive
3258
3259
3260
3261
3262
3263 StateIdle
3264
3265
3266
3267 StateHijacked
3268
3269
3270
3271
3272 StateClosed
3273 )
3274
3275 var stateName = map[ConnState]string{
3276 StateNew: "new",
3277 StateActive: "active",
3278 StateIdle: "idle",
3279 StateHijacked: "hijacked",
3280 StateClosed: "closed",
3281 }
3282
3283 func (c ConnState) String() string {
3284 return stateName[c]
3285 }
3286
3287
3288
3289 type serverHandler struct {
3290 srv *Server
3291 }
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302 func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {
3303 handler := sh.srv.Handler
3304 if handler == nil {
3305 handler = DefaultServeMux
3306 }
3307 if !sh.srv.DisableGeneralOptionsHandler && req.RequestURI == "*" && req.Method == "OPTIONS" {
3308 handler = globalOptionsHandler{}
3309 }
3310
3311 handler.ServeHTTP(rw, req)
3312 }
3313
3314 func badServeHTTP(serverHandler, ResponseWriter, *Request)
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325 func AllowQuerySemicolons(h Handler) Handler {
3326 return HandlerFunc(func(w ResponseWriter, r *Request) {
3327 if strings.Contains(r.URL.RawQuery, ";") {
3328 r2 := new(Request)
3329 *r2 = *r
3330 r2.URL = new(url.URL)
3331 *r2.URL = *r.URL
3332 r2.URL.RawQuery = strings.ReplaceAll(r.URL.RawQuery, ";", "&")
3333 h.ServeHTTP(w, r2)
3334 } else {
3335 h.ServeHTTP(w, r)
3336 }
3337 })
3338 }
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348 func (s *Server) ListenAndServe() error {
3349 if s.shuttingDown() {
3350 return ErrServerClosed
3351 }
3352 addr := s.Addr
3353 if addr == "" {
3354 addr = ":http"
3355 }
3356 ln, err := net.Listen("tcp", addr)
3357 if err != nil {
3358 return err
3359 }
3360 return s.Serve(ln)
3361 }
3362
3363 var testHookServerServe func(*Server, net.Listener)
3364
3365
3366
3367 func (s *Server) shouldConfigureHTTP2ForServe() bool {
3368 if s.TLSConfig == nil {
3369
3370
3371
3372
3373
3374
3375 return true
3376 }
3377 if s.protocols().UnencryptedHTTP2() {
3378 return true
3379 }
3380
3381
3382
3383
3384
3385
3386
3387 return slices.Contains(s.TLSConfig.NextProtos, http2NextProtoTLS)
3388 }
3389
3390
3391
3392 var ErrServerClosed = errors.New("http: Server closed")
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404 func (s *Server) Serve(l net.Listener) error {
3405 if fn := testHookServerServe; fn != nil {
3406 fn(s, l)
3407 }
3408
3409 origListener := l
3410 l = &onceCloseListener{Listener: l}
3411 defer l.Close()
3412
3413 if err := s.setupHTTP2_Serve(); err != nil {
3414 return err
3415 }
3416
3417 if !s.trackListener(&l, true) {
3418 return ErrServerClosed
3419 }
3420 defer s.trackListener(&l, false)
3421
3422 baseCtx := context.Background()
3423 if s.BaseContext != nil {
3424 baseCtx = s.BaseContext(origListener)
3425 if baseCtx == nil {
3426 panic("BaseContext returned a nil context")
3427 }
3428 }
3429
3430 var tempDelay time.Duration
3431
3432 ctx := context.WithValue(baseCtx, ServerContextKey, s)
3433 for {
3434 rw, err := l.Accept()
3435 if err != nil {
3436 if s.shuttingDown() {
3437 return ErrServerClosed
3438 }
3439 if ne, ok := err.(net.Error); ok && ne.Temporary() {
3440 if tempDelay == 0 {
3441 tempDelay = 5 * time.Millisecond
3442 } else {
3443 tempDelay *= 2
3444 }
3445 if max := 1 * time.Second; tempDelay > max {
3446 tempDelay = max
3447 }
3448 s.logf("http: Accept error: %v; retrying in %v", err, tempDelay)
3449 time.Sleep(tempDelay)
3450 continue
3451 }
3452 return err
3453 }
3454 connCtx := ctx
3455 if cc := s.ConnContext; cc != nil {
3456 connCtx = cc(connCtx, rw)
3457 if connCtx == nil {
3458 panic("ConnContext returned nil")
3459 }
3460 }
3461 tempDelay = 0
3462 c := s.newConn(rw)
3463 c.setState(c.rwc, StateNew, runHooks)
3464 go c.serve(connCtx)
3465 }
3466 }
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482 func (s *Server) ServeTLS(l net.Listener, certFile, keyFile string) error {
3483
3484
3485 if err := s.setupHTTP2_ServeTLS(); err != nil {
3486 return err
3487 }
3488
3489 config := cloneTLSConfig(s.TLSConfig)
3490 config.NextProtos = adjustNextProtos(config.NextProtos, s.protocols())
3491
3492 configHasCert := len(config.Certificates) > 0 || config.GetCertificate != nil || config.GetConfigForClient != nil
3493 if !configHasCert || certFile != "" || keyFile != "" {
3494 var err error
3495 config.Certificates = make([]tls.Certificate, 1)
3496 config.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile)
3497 if err != nil {
3498 return err
3499 }
3500 }
3501
3502 tlsListener := tls.NewListener(l, config)
3503 return s.Serve(tlsListener)
3504 }
3505
3506 func (s *Server) protocols() Protocols {
3507 if s.Protocols != nil {
3508 return *s.Protocols
3509 }
3510
3511
3512
3513 _, hasH2 := s.TLSNextProto["h2"]
3514 http2Disabled := s.TLSNextProto != nil && !hasH2
3515
3516
3517
3518
3519 if http2server.Value() == "0" && !hasH2 {
3520 http2Disabled = true
3521 }
3522
3523 var p Protocols
3524 p.SetHTTP1(true)
3525 if !http2Disabled {
3526 p.SetHTTP2(true)
3527 }
3528 return p
3529 }
3530
3531
3532
3533 func adjustNextProtos(nextProtos []string, protos Protocols) []string {
3534
3535
3536
3537
3538
3539 nextProtos = slices.Clone(nextProtos)
3540 var have Protocols
3541 nextProtos = slices.DeleteFunc(nextProtos, func(s string) bool {
3542 switch s {
3543 case "http/1.1":
3544 if !protos.HTTP1() {
3545 return true
3546 }
3547 have.SetHTTP1(true)
3548 case "h2":
3549 if !protos.HTTP2() {
3550 return true
3551 }
3552 have.SetHTTP2(true)
3553 }
3554 return false
3555 })
3556 if protos.HTTP2() && !have.HTTP2() {
3557 nextProtos = append(nextProtos, "h2")
3558 }
3559 if protos.HTTP1() && !have.HTTP1() {
3560 nextProtos = append(nextProtos, "http/1.1")
3561 }
3562 return nextProtos
3563 }
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575 func (s *Server) trackListener(ln *net.Listener, add bool) bool {
3576 s.mu.Lock()
3577 defer s.mu.Unlock()
3578 if s.listeners == nil {
3579 s.listeners = make(map[*net.Listener]struct{})
3580 }
3581 if add {
3582 if s.shuttingDown() {
3583 return false
3584 }
3585 s.listeners[ln] = struct{}{}
3586 s.listenerGroup.Add(1)
3587 } else {
3588 delete(s.listeners, ln)
3589 s.listenerGroup.Done()
3590 }
3591 return true
3592 }
3593
3594 func (s *Server) trackConn(c *conn, add bool) {
3595 s.mu.Lock()
3596 defer s.mu.Unlock()
3597 if s.activeConn == nil {
3598 s.activeConn = make(map[*conn]struct{})
3599 }
3600 if add {
3601 s.activeConn[c] = struct{}{}
3602 } else {
3603 delete(s.activeConn, c)
3604 }
3605 }
3606
3607 func (s *Server) idleTimeout() time.Duration {
3608 if s.IdleTimeout != 0 {
3609 return s.IdleTimeout
3610 }
3611 return s.ReadTimeout
3612 }
3613
3614 func (s *Server) readHeaderTimeout() time.Duration {
3615 if s.ReadHeaderTimeout != 0 {
3616 return s.ReadHeaderTimeout
3617 }
3618 return s.ReadTimeout
3619 }
3620
3621 func (s *Server) doKeepAlives() bool {
3622 return !s.disableKeepAlives.Load() && !s.shuttingDown()
3623 }
3624
3625 func (s *Server) shuttingDown() bool {
3626 return s.inShutdown.Load()
3627 }
3628
3629
3630
3631
3632
3633 func (s *Server) SetKeepAlivesEnabled(v bool) {
3634 if v {
3635 s.disableKeepAlives.Store(false)
3636 return
3637 }
3638 s.disableKeepAlives.Store(true)
3639
3640
3641 s.closeIdleConns()
3642
3643
3644 }
3645
3646 func (s *Server) logf(format string, args ...any) {
3647 if s.ErrorLog != nil {
3648 s.ErrorLog.Printf(format, args...)
3649 } else {
3650 log.Printf(format, args...)
3651 }
3652 }
3653
3654
3655
3656
3657 func logf(r *Request, format string, args ...any) {
3658 s, _ := r.Context().Value(ServerContextKey).(*Server)
3659 if s != nil && s.ErrorLog != nil {
3660 s.ErrorLog.Printf(format, args...)
3661 } else {
3662 log.Printf(format, args...)
3663 }
3664 }
3665
3666
3667
3668
3669
3670
3671
3672
3673 func ListenAndServe(addr string, handler Handler) error {
3674 server := &Server{Addr: addr, Handler: handler}
3675 return server.ListenAndServe()
3676 }
3677
3678
3679
3680
3681
3682
3683 func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error {
3684 server := &Server{Addr: addr, Handler: handler}
3685 return server.ListenAndServeTLS(certFile, keyFile)
3686 }
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703 func (s *Server) ListenAndServeTLS(certFile, keyFile string) error {
3704 if s.shuttingDown() {
3705 return ErrServerClosed
3706 }
3707 addr := s.Addr
3708 if addr == "" {
3709 addr = ":https"
3710 }
3711
3712 ln, err := net.Listen("tcp", addr)
3713 if err != nil {
3714 return err
3715 }
3716
3717 defer ln.Close()
3718
3719 return s.ServeTLS(ln, certFile, keyFile)
3720 }
3721
3722
3723
3724
3725 func (s *Server) setupHTTP2_ServeTLS() error {
3726 s.nextProtoOnce.Do(s.onceSetNextProtoDefaults)
3727 return s.nextProtoErr
3728 }
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738 func (s *Server) setupHTTP2_Serve() error {
3739 s.nextProtoOnce.Do(s.onceSetNextProtoDefaults_Serve)
3740 return s.nextProtoErr
3741 }
3742
3743 func (s *Server) onceSetNextProtoDefaults_Serve() {
3744 if s.shouldConfigureHTTP2ForServe() {
3745 s.onceSetNextProtoDefaults()
3746 }
3747 }
3748
3749 var http2server = godebug.New("http2server")
3750
3751
3752
3753
3754 func (s *Server) onceSetNextProtoDefaults() {
3755 if omitBundledHTTP2 {
3756 return
3757 }
3758 p := s.protocols()
3759 if !p.HTTP2() && !p.UnencryptedHTTP2() {
3760 return
3761 }
3762 if http2server.Value() == "0" {
3763 http2server.IncNonDefault()
3764 return
3765 }
3766 if _, ok := s.TLSNextProto["h2"]; ok {
3767
3768
3769
3770 return
3771 }
3772 conf := &http2Server{}
3773 s.nextProtoErr = http2ConfigureServer(s, conf)
3774 }
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787 func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler {
3788 return &timeoutHandler{
3789 handler: h,
3790 body: msg,
3791 dt: dt,
3792 }
3793 }
3794
3795
3796
3797 var ErrHandlerTimeout = errors.New("http: Handler timeout")
3798
3799 type timeoutHandler struct {
3800 handler Handler
3801 body string
3802 dt time.Duration
3803
3804
3805
3806 testContext context.Context
3807 }
3808
3809 func (h *timeoutHandler) errorBody() string {
3810 if h.body != "" {
3811 return h.body
3812 }
3813 return "<html><head><title>Timeout</title></head><body><h1>Timeout</h1></body></html>"
3814 }
3815
3816 func (h *timeoutHandler) ServeHTTP(w ResponseWriter, r *Request) {
3817 ctx := h.testContext
3818 if ctx == nil {
3819 var cancelCtx context.CancelFunc
3820 ctx, cancelCtx = context.WithTimeout(r.Context(), h.dt)
3821 defer cancelCtx()
3822 }
3823 r = r.WithContext(ctx)
3824 done := make(chan struct{})
3825 tw := &timeoutWriter{
3826 w: w,
3827 h: make(Header),
3828 req: r,
3829 }
3830 panicChan := make(chan any, 1)
3831 go func() {
3832 defer func() {
3833 if p := recover(); p != nil {
3834 panicChan <- p
3835 }
3836 }()
3837 h.handler.ServeHTTP(tw, r)
3838 close(done)
3839 }()
3840 select {
3841 case p := <-panicChan:
3842 panic(p)
3843 case <-done:
3844 tw.mu.Lock()
3845 defer tw.mu.Unlock()
3846 dst := w.Header()
3847 maps.Copy(dst, tw.h)
3848 if !tw.wroteHeader {
3849 tw.code = StatusOK
3850 }
3851 w.WriteHeader(tw.code)
3852 w.Write(tw.wbuf.Bytes())
3853 case <-ctx.Done():
3854 tw.mu.Lock()
3855 defer tw.mu.Unlock()
3856 switch err := ctx.Err(); err {
3857 case context.DeadlineExceeded:
3858 w.WriteHeader(StatusServiceUnavailable)
3859 io.WriteString(w, h.errorBody())
3860 tw.err = ErrHandlerTimeout
3861 default:
3862 w.WriteHeader(StatusServiceUnavailable)
3863 tw.err = err
3864 }
3865 }
3866 }
3867
3868 type timeoutWriter struct {
3869 w ResponseWriter
3870 h Header
3871 wbuf bytes.Buffer
3872 req *Request
3873
3874 mu sync.Mutex
3875 err error
3876 wroteHeader bool
3877 code int
3878 }
3879
3880 var _ Pusher = (*timeoutWriter)(nil)
3881
3882
3883 func (tw *timeoutWriter) Push(target string, opts *PushOptions) error {
3884 if pusher, ok := tw.w.(Pusher); ok {
3885 return pusher.Push(target, opts)
3886 }
3887 return ErrNotSupported
3888 }
3889
3890 func (tw *timeoutWriter) Header() Header { return tw.h }
3891
3892 func (tw *timeoutWriter) Write(p []byte) (int, error) {
3893 tw.mu.Lock()
3894 defer tw.mu.Unlock()
3895 if tw.err != nil {
3896 return 0, tw.err
3897 }
3898 if !tw.wroteHeader {
3899 tw.writeHeaderLocked(StatusOK)
3900 }
3901 return tw.wbuf.Write(p)
3902 }
3903
3904 func (tw *timeoutWriter) writeHeaderLocked(code int) {
3905 checkWriteHeaderCode(code)
3906
3907 switch {
3908 case tw.err != nil:
3909 return
3910 case tw.wroteHeader:
3911 if tw.req != nil {
3912 caller := relevantCaller()
3913 logf(tw.req, "http: superfluous response.WriteHeader call from %s (%s:%d)", caller.Function, path.Base(caller.File), caller.Line)
3914 }
3915 default:
3916 tw.wroteHeader = true
3917 tw.code = code
3918 }
3919 }
3920
3921 func (tw *timeoutWriter) WriteHeader(code int) {
3922 tw.mu.Lock()
3923 defer tw.mu.Unlock()
3924 tw.writeHeaderLocked(code)
3925 }
3926
3927
3928
3929 type onceCloseListener struct {
3930 net.Listener
3931 once sync.Once
3932 closeErr error
3933 }
3934
3935 func (oc *onceCloseListener) Close() error {
3936 oc.once.Do(oc.close)
3937 return oc.closeErr
3938 }
3939
3940 func (oc *onceCloseListener) close() { oc.closeErr = oc.Listener.Close() }
3941
3942
3943 type globalOptionsHandler struct{}
3944
3945 func (globalOptionsHandler) ServeHTTP(w ResponseWriter, r *Request) {
3946 w.Header().Set("Content-Length", "0")
3947 if r.ContentLength != 0 {
3948
3949
3950
3951
3952
3953 mb := MaxBytesReader(w, r.Body, 4<<10)
3954 io.Copy(io.Discard, mb)
3955 }
3956 }
3957
3958
3959
3960
3961 type initALPNRequest struct {
3962 ctx context.Context
3963 c *tls.Conn
3964 h serverHandler
3965 }
3966
3967
3968
3969
3970
3971 func (h initALPNRequest) BaseContext() context.Context { return h.ctx }
3972
3973 func (h initALPNRequest) ServeHTTP(rw ResponseWriter, req *Request) {
3974 if req.TLS == nil {
3975 req.TLS = &tls.ConnectionState{}
3976 *req.TLS = h.c.ConnectionState()
3977 }
3978 if req.Body == nil {
3979 req.Body = NoBody
3980 }
3981 if req.RemoteAddr == "" {
3982 req.RemoteAddr = h.c.RemoteAddr().String()
3983 }
3984 h.h.ServeHTTP(rw, req)
3985 }
3986
3987
3988 type loggingConn struct {
3989 name string
3990 net.Conn
3991 }
3992
3993 var (
3994 uniqNameMu sync.Mutex
3995 uniqNameNext = make(map[string]int)
3996 )
3997
3998 func newLoggingConn(baseName string, c net.Conn) net.Conn {
3999 uniqNameMu.Lock()
4000 defer uniqNameMu.Unlock()
4001 uniqNameNext[baseName]++
4002 return &loggingConn{
4003 name: fmt.Sprintf("%s-%d", baseName, uniqNameNext[baseName]),
4004 Conn: c,
4005 }
4006 }
4007
4008 func (c *loggingConn) Write(p []byte) (n int, err error) {
4009 log.Printf("%s.Write(%d) = ....", c.name, len(p))
4010 n, err = c.Conn.Write(p)
4011 log.Printf("%s.Write(%d) = %d, %v", c.name, len(p), n, err)
4012 return
4013 }
4014
4015 func (c *loggingConn) Read(p []byte) (n int, err error) {
4016 log.Printf("%s.Read(%d) = ....", c.name, len(p))
4017 n, err = c.Conn.Read(p)
4018 log.Printf("%s.Read(%d) = %d, %v", c.name, len(p), n, err)
4019 return
4020 }
4021
4022 func (c *loggingConn) Close() (err error) {
4023 log.Printf("%s.Close() = ...", c.name)
4024 err = c.Conn.Close()
4025 log.Printf("%s.Close() = %v", c.name, err)
4026 return
4027 }
4028
4029
4030
4031
4032 type checkConnErrorWriter struct {
4033 c *conn
4034 }
4035
4036 func (w checkConnErrorWriter) Write(p []byte) (n int, err error) {
4037 n, err = w.c.rwc.Write(p)
4038 if err != nil && w.c.werr == nil {
4039 w.c.werr = err
4040 w.c.cancelCtx()
4041 }
4042 return
4043 }
4044
4045 func numLeadingCRorLF(v []byte) (n int) {
4046 for _, b := range v {
4047 if b == '\r' || b == '\n' {
4048 n++
4049 continue
4050 }
4051 break
4052 }
4053 return
4054 }
4055
4056
4057
4058 func tlsRecordHeaderLooksLikeHTTP(hdr [5]byte) bool {
4059 switch string(hdr[:]) {
4060 case "GET /", "HEAD ", "POST ", "PUT /", "OPTIO":
4061 return true
4062 }
4063 return false
4064 }
4065
4066
4067 func MaxBytesHandler(h Handler, n int64) Handler {
4068 return HandlerFunc(func(w ResponseWriter, r *Request) {
4069 r2 := *r
4070 r2.Body = MaxBytesReader(w, r.Body, n)
4071 h.ServeHTTP(w, &r2)
4072 })
4073 }
4074
View as plain text