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