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