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