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