Source file src/pkg/net/http/server.go
1
2
3
4
5
6
7 package http
8
9 import (
10 "bufio"
11 "crypto/tls"
12 "errors"
13 "fmt"
14 "io"
15 "io/ioutil"
16 "log"
17 "net"
18 "net/url"
19 "path"
20 "runtime"
21 "strconv"
22 "strings"
23 "sync"
24 "time"
25 )
26
27
28 var (
29 ErrWriteAfterFlush = errors.New("Conn.Write called after Flush")
30 ErrBodyNotAllowed = errors.New("http: request method or response status code does not allow body")
31 ErrHijacked = errors.New("Conn has been hijacked")
32 ErrContentLength = errors.New("Conn.Write wrote more than the declared Content-Length")
33 )
34
35
36
37
38
39
40
41
42
43 type Handler interface {
44 ServeHTTP(ResponseWriter, *Request)
45 }
46
47
48
49 type ResponseWriter interface {
50
51
52
53 Header() Header
54
55
56
57
58
59
60 Write([]byte) (int, error)
61
62
63
64
65
66
67 WriteHeader(int)
68 }
69
70
71
72
73
74
75
76
77 type Flusher interface {
78
79 Flush()
80 }
81
82
83
84 type Hijacker interface {
85
86
87
88
89
90 Hijack() (net.Conn, *bufio.ReadWriter, error)
91 }
92
93
94
95
96
97
98 type CloseNotifier interface {
99
100
101 CloseNotify() <-chan bool
102 }
103
104
105 type conn struct {
106 remoteAddr string
107 server *Server
108 rwc net.Conn
109 sr liveSwitchReader
110 lr *io.LimitedReader
111 buf *bufio.ReadWriter
112 bufswr *switchReader
113 bufsww *switchWriter
114 tlsState *tls.ConnectionState
115
116 mu sync.Mutex
117 clientGone bool
118 closeNotifyc chan bool
119 hijackedv bool
120 }
121
122 func (c *conn) hijacked() bool {
123 c.mu.Lock()
124 defer c.mu.Unlock()
125 return c.hijackedv
126 }
127
128 func (c *conn) hijack() (rwc net.Conn, buf *bufio.ReadWriter, err error) {
129 c.mu.Lock()
130 defer c.mu.Unlock()
131 if c.hijackedv {
132 return nil, nil, ErrHijacked
133 }
134 if c.closeNotifyc != nil {
135 return nil, nil, errors.New("http: Hijack is incompatible with use of CloseNotifier")
136 }
137 c.hijackedv = true
138 rwc = c.rwc
139 buf = c.buf
140 c.rwc = nil
141 c.buf = nil
142 return
143 }
144
145 func (c *conn) closeNotify() <-chan bool {
146 c.mu.Lock()
147 defer c.mu.Unlock()
148 if c.closeNotifyc == nil {
149 c.closeNotifyc = make(chan bool, 1)
150 if c.hijackedv {
151
152
153 return c.closeNotifyc
154 }
155 pr, pw := io.Pipe()
156
157 readSource := c.sr.r
158 c.sr.Lock()
159 c.sr.r = pr
160 c.sr.Unlock()
161 go func() {
162 _, err := io.Copy(pw, readSource)
163 if err == nil {
164 err = io.EOF
165 }
166 pw.CloseWithError(err)
167 c.noteClientGone()
168 }()
169 }
170 return c.closeNotifyc
171 }
172
173 func (c *conn) noteClientGone() {
174 c.mu.Lock()
175 defer c.mu.Unlock()
176 if c.closeNotifyc != nil && !c.clientGone {
177 c.closeNotifyc <- true
178 }
179 c.clientGone = true
180 }
181
182
183
184 type switchReader struct {
185 io.Reader
186 }
187
188
189
190 type switchWriter struct {
191 io.Writer
192 }
193
194
195
196 type liveSwitchReader struct {
197 sync.Mutex
198 r io.Reader
199 }
200
201 func (sr *liveSwitchReader) Read(p []byte) (n int, err error) {
202 sr.Lock()
203 r := sr.r
204 sr.Unlock()
205 return r.Read(p)
206 }
207
208
209
210 const bufferBeforeChunkingSize = 2048
211
212
213
214
215
216
217
218
219
220
221 type chunkWriter struct {
222 res *response
223
224
225
226
227
228 header Header
229
230
231
232
233
234 wroteHeader bool
235
236
237 chunking bool
238 }
239
240 var (
241 crlf = []byte("\r\n")
242 colonSpace = []byte(": ")
243 )
244
245 func (cw *chunkWriter) Write(p []byte) (n int, err error) {
246 if !cw.wroteHeader {
247 cw.writeHeader(p)
248 }
249 if cw.chunking {
250 _, err = fmt.Fprintf(cw.res.conn.buf, "%x\r\n", len(p))
251 if err != nil {
252 cw.res.conn.rwc.Close()
253 return
254 }
255 }
256 n, err = cw.res.conn.buf.Write(p)
257 if cw.chunking && err == nil {
258 _, err = cw.res.conn.buf.Write(crlf)
259 }
260 if err != nil {
261 cw.res.conn.rwc.Close()
262 }
263 return
264 }
265
266 func (cw *chunkWriter) flush() {
267 if !cw.wroteHeader {
268 cw.writeHeader(nil)
269 }
270 cw.res.conn.buf.Flush()
271 }
272
273 func (cw *chunkWriter) close() {
274 if !cw.wroteHeader {
275 cw.writeHeader(nil)
276 }
277 if cw.chunking {
278
279
280
281 io.WriteString(cw.res.conn.buf, "0\r\n\r\n")
282 }
283 }
284
285
286 type response struct {
287 conn *conn
288 req *Request
289 wroteHeader bool
290 wroteContinue bool
291
292 w *bufio.Writer
293 cw chunkWriter
294 sw *switchWriter
295
296
297
298
299
300 handlerHeader Header
301 calledHeader bool
302
303 written int64
304 contentLength int64
305 status int
306
307
308
309
310
311 closeAfterReply bool
312
313
314
315
316
317
318
319
320 requestBodyLimitHit bool
321
322 handlerDone bool
323 }
324
325
326
327 func (w *response) requestTooLarge() {
328 w.closeAfterReply = true
329 w.requestBodyLimitHit = true
330 if !w.wroteHeader {
331 w.Header().Set("Connection", "close")
332 }
333 }
334
335
336 func (w *response) needsSniff() bool {
337 return !w.cw.wroteHeader && w.handlerHeader.Get("Content-Type") == "" && w.written < sniffLen
338 }
339
340 type writerOnly struct {
341 io.Writer
342 }
343
344 func (w *response) ReadFrom(src io.Reader) (n int64, err error) {
345 if !w.wroteHeader {
346 w.WriteHeader(StatusOK)
347 }
348
349 if w.needsSniff() {
350 n0, err := io.Copy(writerOnly{w}, io.LimitReader(src, sniffLen))
351 n += n0
352 if err != nil {
353 return n, err
354 }
355 }
356
357 w.w.Flush()
358 w.cw.flush()
359
360
361 if !w.cw.chunking && w.bodyAllowed() {
362 if rf, ok := w.conn.rwc.(io.ReaderFrom); ok {
363 n0, err := rf.ReadFrom(src)
364 n += n0
365 w.written += n0
366 return n, err
367 }
368 }
369
370
371
372 n0, err := io.Copy(writerOnly{w}, src)
373 n += n0
374 return n, err
375 }
376
377
378 const noLimit int64 = (1 << 63) - 1
379
380
381
382 const debugServerConnections = false
383
384
385 func (srv *Server) newConn(rwc net.Conn) (c *conn, err error) {
386 c = new(conn)
387 c.remoteAddr = rwc.RemoteAddr().String()
388 c.server = srv
389 c.rwc = rwc
390 if debugServerConnections {
391 c.rwc = newLoggingConn("server", c.rwc)
392 }
393 c.sr = liveSwitchReader{r: c.rwc}
394 c.lr = io.LimitReader(&c.sr, noLimit).(*io.LimitedReader)
395 br, sr := newBufioReader(c.lr)
396 bw, sw := newBufioWriterSize(c.rwc, 4<<10)
397 c.buf = bufio.NewReadWriter(br, bw)
398 c.bufswr = sr
399 c.bufsww = sw
400 return c, nil
401 }
402
403
404 type bufioReaderPair struct {
405 br *bufio.Reader
406 sr *switchReader
407 }
408
409
410 type bufioWriterPair struct {
411 bw *bufio.Writer
412 sw *switchWriter
413 }
414
415
416 var (
417 bufioReaderCache = make(chan bufioReaderPair, 4)
418 bufioWriterCache2k = make(chan bufioWriterPair, 4)
419 bufioWriterCache4k = make(chan bufioWriterPair, 4)
420 )
421
422 func bufioWriterCache(size int) chan bufioWriterPair {
423 switch size {
424 case 2 << 10:
425 return bufioWriterCache2k
426 case 4 << 10:
427 return bufioWriterCache4k
428 }
429 return nil
430 }
431
432 func newBufioReader(r io.Reader) (*bufio.Reader, *switchReader) {
433 select {
434 case p := <-bufioReaderCache:
435 p.sr.Reader = r
436 return p.br, p.sr
437 default:
438 sr := &switchReader{r}
439 return bufio.NewReader(sr), sr
440 }
441 }
442
443 func putBufioReader(br *bufio.Reader, sr *switchReader) {
444 if n := br.Buffered(); n > 0 {
445 io.CopyN(ioutil.Discard, br, int64(n))
446 }
447 br.Read(nil)
448 sr.Reader = nil
449 select {
450 case bufioReaderCache <- bufioReaderPair{br, sr}:
451 default:
452 }
453 }
454
455 func newBufioWriterSize(w io.Writer, size int) (*bufio.Writer, *switchWriter) {
456 select {
457 case p := <-bufioWriterCache(size):
458 p.sw.Writer = w
459 return p.bw, p.sw
460 default:
461 sw := &switchWriter{w}
462 return bufio.NewWriterSize(sw, size), sw
463 }
464 }
465
466 func putBufioWriter(bw *bufio.Writer, sw *switchWriter) {
467 if bw.Buffered() > 0 {
468
469
470 return
471 }
472 if err := bw.Flush(); err != nil {
473
474
475
476 return
477 }
478 sw.Writer = nil
479 select {
480 case bufioWriterCache(bw.Available()) <- bufioWriterPair{bw, sw}:
481 default:
482 }
483 }
484
485
486
487
488 const DefaultMaxHeaderBytes = 1 << 20
489
490 func (srv *Server) maxHeaderBytes() int {
491 if srv.MaxHeaderBytes > 0 {
492 return srv.MaxHeaderBytes
493 }
494 return DefaultMaxHeaderBytes
495 }
496
497
498
499 type expectContinueReader struct {
500 resp *response
501 readCloser io.ReadCloser
502 closed bool
503 }
504
505 func (ecr *expectContinueReader) Read(p []byte) (n int, err error) {
506 if ecr.closed {
507 return 0, ErrBodyReadAfterClose
508 }
509 if !ecr.resp.wroteContinue && !ecr.resp.conn.hijacked() {
510 ecr.resp.wroteContinue = true
511 io.WriteString(ecr.resp.conn.buf, "HTTP/1.1 100 Continue\r\n\r\n")
512 ecr.resp.conn.buf.Flush()
513 }
514 return ecr.readCloser.Read(p)
515 }
516
517 func (ecr *expectContinueReader) Close() error {
518 ecr.closed = true
519 return ecr.readCloser.Close()
520 }
521
522
523
524
525
526 const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT"
527
528 var errTooLarge = errors.New("http: request too large")
529
530
531 func (c *conn) readRequest() (w *response, err error) {
532 if c.hijacked() {
533 return nil, ErrHijacked
534 }
535
536 if d := c.server.ReadTimeout; d != 0 {
537 c.rwc.SetReadDeadline(time.Now().Add(d))
538 }
539 if d := c.server.WriteTimeout; d != 0 {
540 defer func() {
541 c.rwc.SetWriteDeadline(time.Now().Add(d))
542 }()
543 }
544
545 c.lr.N = int64(c.server.maxHeaderBytes()) + 4096
546 var req *Request
547 if req, err = ReadRequest(c.buf.Reader); err != nil {
548 if c.lr.N == 0 {
549 return nil, errTooLarge
550 }
551 return nil, err
552 }
553 c.lr.N = noLimit
554
555 req.RemoteAddr = c.remoteAddr
556 req.TLS = c.tlsState
557
558 w = &response{
559 conn: c,
560 req: req,
561 handlerHeader: make(Header),
562 contentLength: -1,
563 }
564 w.cw.res = w
565 w.w, w.sw = newBufioWriterSize(&w.cw, bufferBeforeChunkingSize)
566 return w, nil
567 }
568
569 func (w *response) Header() Header {
570 if w.cw.header == nil && w.wroteHeader && !w.cw.wroteHeader {
571
572
573
574 w.cw.header = w.handlerHeader.clone()
575 }
576 w.calledHeader = true
577 return w.handlerHeader
578 }
579
580
581
582
583
584
585
586
587
588
589 const maxPostHandlerReadBytes = 256 << 10
590
591 func (w *response) WriteHeader(code int) {
592 if w.conn.hijacked() {
593 log.Print("http: response.WriteHeader on hijacked connection")
594 return
595 }
596 if w.wroteHeader {
597 log.Print("http: multiple response.WriteHeader calls")
598 return
599 }
600 w.wroteHeader = true
601 w.status = code
602
603 if w.calledHeader && w.cw.header == nil {
604 w.cw.header = w.handlerHeader.clone()
605 }
606
607 if cl := w.handlerHeader.get("Content-Length"); cl != "" {
608 v, err := strconv.ParseInt(cl, 10, 64)
609 if err == nil && v >= 0 {
610 w.contentLength = v
611 } else {
612 log.Printf("http: invalid Content-Length of %q", cl)
613 w.handlerHeader.Del("Content-Length")
614 }
615 }
616 }
617
618
619
620
621 type extraHeader struct {
622 contentType string
623 contentLength string
624 connection string
625 date string
626 transferEncoding string
627 }
628
629
630 var extraHeaderKeys = [][]byte{
631 []byte("Content-Type"), []byte("Content-Length"),
632 []byte("Connection"), []byte("Date"), []byte("Transfer-Encoding"),
633 }
634
635
636
637
638 func (h extraHeader) Write(w io.Writer) {
639 for i, v := range []string{h.contentType, h.contentLength, h.connection, h.date, h.transferEncoding} {
640 if v != "" {
641 w.Write(extraHeaderKeys[i])
642 w.Write(colonSpace)
643 io.WriteString(w, v)
644 w.Write(crlf)
645 }
646 }
647 }
648
649
650
651
652
653
654
655
656
657 func (cw *chunkWriter) writeHeader(p []byte) {
658 if cw.wroteHeader {
659 return
660 }
661 cw.wroteHeader = true
662
663 w := cw.res
664
665
666
667
668
669
670 header := cw.header
671 owned := header != nil
672 if !owned {
673 header = w.handlerHeader
674 }
675 var excludeHeader map[string]bool
676 delHeader := func(key string) {
677 if owned {
678 header.Del(key)
679 return
680 }
681 if _, ok := header[key]; !ok {
682 return
683 }
684 if excludeHeader == nil {
685 excludeHeader = make(map[string]bool)
686 }
687 excludeHeader[key] = true
688 }
689 var setHeader extraHeader
690
691
692
693
694
695 if w.handlerDone && header.get("Content-Length") == "" && w.req.Method != "HEAD" {
696 w.contentLength = int64(len(p))
697 setHeader.contentLength = strconv.Itoa(len(p))
698 }
699
700
701
702 if w.req.wantsHttp10KeepAlive() {
703 sentLength := header.get("Content-Length") != ""
704 if sentLength && header.get("Connection") == "keep-alive" {
705 w.closeAfterReply = false
706 }
707 }
708
709
710 hasCL := w.contentLength != -1
711
712 if w.req.wantsHttp10KeepAlive() && (w.req.Method == "HEAD" || hasCL) {
713 _, connectionHeaderSet := header["Connection"]
714 if !connectionHeaderSet {
715 setHeader.connection = "keep-alive"
716 }
717 } else if !w.req.ProtoAtLeast(1, 1) || w.req.wantsClose() {
718 w.closeAfterReply = true
719 }
720
721 if header.get("Connection") == "close" {
722 w.closeAfterReply = true
723 }
724
725
726
727
728
729 if w.req.ContentLength != 0 && !w.closeAfterReply {
730 ecr, isExpecter := w.req.Body.(*expectContinueReader)
731 if !isExpecter || ecr.resp.wroteContinue {
732 n, _ := io.CopyN(ioutil.Discard, w.req.Body, maxPostHandlerReadBytes+1)
733 if n >= maxPostHandlerReadBytes {
734 w.requestTooLarge()
735 delHeader("Connection")
736 setHeader.connection = "close"
737 } else {
738 w.req.Body.Close()
739 }
740 }
741 }
742
743 code := w.status
744 if code == StatusNotModified {
745
746
747 for _, k := range []string{"Content-Type", "Content-Length", "Transfer-Encoding"} {
748 delHeader(k)
749 }
750 } else {
751
752 if header.get("Content-Type") == "" && w.req.Method != "HEAD" {
753 setHeader.contentType = DetectContentType(p)
754 }
755 }
756
757 if _, ok := header["Date"]; !ok {
758 setHeader.date = time.Now().UTC().Format(TimeFormat)
759 }
760
761 te := header.get("Transfer-Encoding")
762 hasTE := te != ""
763 if hasCL && hasTE && te != "identity" {
764
765
766 log.Printf("http: WriteHeader called with both Transfer-Encoding of %q and a Content-Length of %d",
767 te, w.contentLength)
768 delHeader("Content-Length")
769 hasCL = false
770 }
771
772 if w.req.Method == "HEAD" || code == StatusNotModified {
773
774 } else if code == StatusNoContent {
775 delHeader("Transfer-Encoding")
776 } else if hasCL {
777 delHeader("Transfer-Encoding")
778 } else if w.req.ProtoAtLeast(1, 1) {
779
780
781
782
783
784 cw.chunking = true
785 setHeader.transferEncoding = "chunked"
786 } else {
787
788
789
790 w.closeAfterReply = true
791 delHeader("Transfer-Encoding")
792 }
793
794
795 if cw.chunking {
796 delHeader("Content-Length")
797 }
798 if !w.req.ProtoAtLeast(1, 0) {
799 return
800 }
801
802 if w.closeAfterReply && !hasToken(cw.header.get("Connection"), "close") {
803 delHeader("Connection")
804 setHeader.connection = "close"
805 }
806
807 io.WriteString(w.conn.buf, statusLine(w.req, code))
808 cw.header.WriteSubset(w.conn.buf, excludeHeader)
809 setHeader.Write(w.conn.buf)
810 w.conn.buf.Write(crlf)
811 }
812
813
814
815
816
817
818 var (
819 statusMu sync.RWMutex
820 statusLines = make(map[int]string)
821 )
822
823
824
825 func statusLine(req *Request, code int) string {
826
827 key := code
828 proto11 := req.ProtoAtLeast(1, 1)
829 if !proto11 {
830 key = -key
831 }
832 statusMu.RLock()
833 line, ok := statusLines[key]
834 statusMu.RUnlock()
835 if ok {
836 return line
837 }
838
839
840 proto := "HTTP/1.0"
841 if proto11 {
842 proto = "HTTP/1.1"
843 }
844 codestring := strconv.Itoa(code)
845 text, ok := statusText[code]
846 if !ok {
847 text = "status code " + codestring
848 }
849 line = proto + " " + codestring + " " + text + "\r\n"
850 if ok {
851 statusMu.Lock()
852 defer statusMu.Unlock()
853 statusLines[key] = line
854 }
855 return line
856 }
857
858
859
860 func (w *response) bodyAllowed() bool {
861 if !w.wroteHeader {
862 panic("")
863 }
864 return w.status != StatusNotModified && w.req.Method != "HEAD"
865 }
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899 func (w *response) Write(data []byte) (n int, err error) {
900 if w.conn.hijacked() {
901 log.Print("http: response.Write on hijacked connection")
902 return 0, ErrHijacked
903 }
904 if !w.wroteHeader {
905 w.WriteHeader(StatusOK)
906 }
907 if len(data) == 0 {
908 return 0, nil
909 }
910 if !w.bodyAllowed() {
911 return 0, ErrBodyNotAllowed
912 }
913
914 w.written += int64(len(data))
915 if w.contentLength != -1 && w.written > w.contentLength {
916 return 0, ErrContentLength
917 }
918 return w.w.Write(data)
919 }
920
921 func (w *response) finishRequest() {
922 w.handlerDone = true
923
924 if !w.wroteHeader {
925 w.WriteHeader(StatusOK)
926 }
927
928 w.w.Flush()
929 putBufioWriter(w.w, w.sw)
930 w.cw.close()
931 w.conn.buf.Flush()
932
933
934
935 if !w.closeAfterReply {
936 w.req.Body.Close()
937 }
938 if w.req.MultipartForm != nil {
939 w.req.MultipartForm.RemoveAll()
940 }
941
942 if w.contentLength != -1 && w.bodyAllowed() && w.contentLength != w.written {
943
944 w.closeAfterReply = true
945 }
946 }
947
948 func (w *response) Flush() {
949 if !w.wroteHeader {
950 w.WriteHeader(StatusOK)
951 }
952 w.w.Flush()
953 w.cw.flush()
954 }
955
956 func (c *conn) finalFlush() {
957 if c.buf != nil {
958 c.buf.Flush()
959
960
961
962 putBufioReader(c.buf.Reader, c.bufswr)
963
964
965
966 putBufioWriter(c.buf.Writer, c.bufsww)
967
968 c.buf = nil
969 }
970 }
971
972
973 func (c *conn) close() {
974 c.finalFlush()
975 if c.rwc != nil {
976 c.rwc.Close()
977 c.rwc = nil
978 }
979 }
980
981
982
983
984
985
986
987
988 const rstAvoidanceDelay = 500 * time.Millisecond
989
990
991
992
993
994
995
996 func (c *conn) closeWriteAndWait() {
997 c.finalFlush()
998 if tcp, ok := c.rwc.(*net.TCPConn); ok {
999 tcp.CloseWrite()
1000 }
1001 time.Sleep(rstAvoidanceDelay)
1002 }
1003
1004
1005
1006
1007
1008 func validNPN(proto string) bool {
1009 switch proto {
1010 case "", "http/1.1", "http/1.0":
1011 return false
1012 }
1013 return true
1014 }
1015
1016
1017 func (c *conn) serve() {
1018 defer func() {
1019 if err := recover(); err != nil {
1020 const size = 4096
1021 buf := make([]byte, size)
1022 buf = buf[:runtime.Stack(buf, false)]
1023 log.Printf("http: panic serving %v: %v\n%s", c.remoteAddr, err, buf)
1024 }
1025 if !c.hijacked() {
1026 c.close()
1027 }
1028 }()
1029
1030 if tlsConn, ok := c.rwc.(*tls.Conn); ok {
1031 if d := c.server.ReadTimeout; d != 0 {
1032 c.rwc.SetReadDeadline(time.Now().Add(d))
1033 }
1034 if d := c.server.WriteTimeout; d != 0 {
1035 c.rwc.SetWriteDeadline(time.Now().Add(d))
1036 }
1037 if err := tlsConn.Handshake(); err != nil {
1038 return
1039 }
1040 c.tlsState = new(tls.ConnectionState)
1041 *c.tlsState = tlsConn.ConnectionState()
1042 if proto := c.tlsState.NegotiatedProtocol; validNPN(proto) {
1043 if fn := c.server.TLSNextProto[proto]; fn != nil {
1044 h := initNPNRequest{tlsConn, serverHandler{c.server}}
1045 fn(c.server, tlsConn, h)
1046 }
1047 return
1048 }
1049 }
1050
1051 for {
1052 w, err := c.readRequest()
1053 if err != nil {
1054 if err == errTooLarge {
1055
1056
1057
1058
1059
1060 io.WriteString(c.rwc, "HTTP/1.1 413 Request Entity Too Large\r\n\r\n")
1061 c.closeWriteAndWait()
1062 break
1063 } else if err == io.EOF {
1064 break
1065 } else if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
1066 break
1067 }
1068 io.WriteString(c.rwc, "HTTP/1.1 400 Bad Request\r\n\r\n")
1069 break
1070 }
1071
1072
1073 req := w.req
1074 if req.expectsContinue() {
1075 if req.ProtoAtLeast(1, 1) {
1076
1077 req.Body = &expectContinueReader{readCloser: req.Body, resp: w}
1078 }
1079 if req.ContentLength == 0 {
1080 w.Header().Set("Connection", "close")
1081 w.WriteHeader(StatusBadRequest)
1082 w.finishRequest()
1083 break
1084 }
1085 req.Header.Del("Expect")
1086 } else if req.Header.get("Expect") != "" {
1087 w.sendExpectationFailed()
1088 break
1089 }
1090
1091
1092
1093
1094
1095
1096 serverHandler{c.server}.ServeHTTP(w, w.req)
1097 if c.hijacked() {
1098 return
1099 }
1100 w.finishRequest()
1101 if w.closeAfterReply {
1102 if w.requestBodyLimitHit {
1103 c.closeWriteAndWait()
1104 }
1105 break
1106 }
1107 }
1108 }
1109
1110 func (w *response) sendExpectationFailed() {
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123 w.Header().Set("Connection", "close")
1124 w.WriteHeader(StatusExpectationFailed)
1125 w.finishRequest()
1126 }
1127
1128
1129
1130 func (w *response) Hijack() (rwc net.Conn, buf *bufio.ReadWriter, err error) {
1131 if w.wroteHeader {
1132 w.cw.flush()
1133 }
1134 return w.conn.hijack()
1135 }
1136
1137 func (w *response) CloseNotify() <-chan bool {
1138 return w.conn.closeNotify()
1139 }
1140
1141
1142
1143
1144
1145 type HandlerFunc func(ResponseWriter, *Request)
1146
1147
1148 func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
1149 f(w, r)
1150 }
1151
1152
1153
1154
1155 func Error(w ResponseWriter, error string, code int) {
1156 w.Header().Set("Content-Type", "text/plain; charset=utf-8")
1157 w.WriteHeader(code)
1158 fmt.Fprintln(w, error)
1159 }
1160
1161
1162 func NotFound(w ResponseWriter, r *Request) { Error(w, "404 page not found", StatusNotFound) }
1163
1164
1165
1166 func NotFoundHandler() Handler { return HandlerFunc(NotFound) }
1167
1168
1169
1170
1171
1172
1173 func StripPrefix(prefix string, h Handler) Handler {
1174 if prefix == "" {
1175 return h
1176 }
1177 return HandlerFunc(func(w ResponseWriter, r *Request) {
1178 if p := strings.TrimPrefix(r.URL.Path, prefix); len(p) < len(r.URL.Path) {
1179 r.URL.Path = p
1180 h.ServeHTTP(w, r)
1181 } else {
1182 NotFound(w, r)
1183 }
1184 })
1185 }
1186
1187
1188
1189 func Redirect(w ResponseWriter, r *Request, urlStr string, code int) {
1190 if u, err := url.Parse(urlStr); err == nil {
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207 oldpath := r.URL.Path
1208 if oldpath == "" {
1209 oldpath = "/"
1210 }
1211 if u.Scheme == "" {
1212
1213 if urlStr == "" || urlStr[0] != '/' {
1214
1215 olddir, _ := path.Split(oldpath)
1216 urlStr = olddir + urlStr
1217 }
1218
1219 var query string
1220 if i := strings.Index(urlStr, "?"); i != -1 {
1221 urlStr, query = urlStr[:i], urlStr[i:]
1222 }
1223
1224
1225 trailing := strings.HasSuffix(urlStr, "/")
1226 urlStr = path.Clean(urlStr)
1227 if trailing && !strings.HasSuffix(urlStr, "/") {
1228 urlStr += "/"
1229 }
1230 urlStr += query
1231 }
1232 }
1233
1234 w.Header().Set("Location", urlStr)
1235 w.WriteHeader(code)
1236
1237
1238
1239
1240 if r.Method == "GET" {
1241 note := "<a href=\"" + htmlEscape(urlStr) + "\">" + statusText[code] + "</a>.\n"
1242 fmt.Fprintln(w, note)
1243 }
1244 }
1245
1246 var htmlReplacer = strings.NewReplacer(
1247 "&", "&",
1248 "<", "<",
1249 ">", ">",
1250
1251 `"`, """,
1252
1253 "'", "'",
1254 )
1255
1256 func htmlEscape(s string) string {
1257 return htmlReplacer.Replace(s)
1258 }
1259
1260
1261 type redirectHandler struct {
1262 url string
1263 code int
1264 }
1265
1266 func (rh *redirectHandler) ServeHTTP(w ResponseWriter, r *Request) {
1267 Redirect(w, r, rh.url, rh.code)
1268 }
1269
1270
1271
1272
1273 func RedirectHandler(url string, code int) Handler {
1274 return &redirectHandler{url, code}
1275 }
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300 type ServeMux struct {
1301 mu sync.RWMutex
1302 m map[string]muxEntry
1303 hosts bool
1304 }
1305
1306 type muxEntry struct {
1307 explicit bool
1308 h Handler
1309 pattern string
1310 }
1311
1312
1313 func NewServeMux() *ServeMux { return &ServeMux{m: make(map[string]muxEntry)} }
1314
1315
1316 var DefaultServeMux = NewServeMux()
1317
1318
1319 func pathMatch(pattern, path string) bool {
1320 if len(pattern) == 0 {
1321
1322 return false
1323 }
1324 n := len(pattern)
1325 if pattern[n-1] != '/' {
1326 return pattern == path
1327 }
1328 return len(path) >= n && path[0:n] == pattern
1329 }
1330
1331
1332 func cleanPath(p string) string {
1333 if p == "" {
1334 return "/"
1335 }
1336 if p[0] != '/' {
1337 p = "/" + p
1338 }
1339 np := path.Clean(p)
1340
1341
1342 if p[len(p)-1] == '/' && np != "/" {
1343 np += "/"
1344 }
1345 return np
1346 }
1347
1348
1349
1350 func (mux *ServeMux) match(path string) (h Handler, pattern string) {
1351 var n = 0
1352 for k, v := range mux.m {
1353 if !pathMatch(k, path) {
1354 continue
1355 }
1356 if h == nil || len(k) > n {
1357 n = len(k)
1358 h = v.h
1359 pattern = v.pattern
1360 }
1361 }
1362 return
1363 }
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377 func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string) {
1378 if r.Method != "CONNECT" {
1379 if p := cleanPath(r.URL.Path); p != r.URL.Path {
1380 _, pattern = mux.handler(r.Host, p)
1381 return RedirectHandler(p, StatusMovedPermanently), pattern
1382 }
1383 }
1384
1385 return mux.handler(r.Host, r.URL.Path)
1386 }
1387
1388
1389
1390 func (mux *ServeMux) handler(host, path string) (h Handler, pattern string) {
1391 mux.mu.RLock()
1392 defer mux.mu.RUnlock()
1393
1394
1395 if mux.hosts {
1396 h, pattern = mux.match(host + path)
1397 }
1398 if h == nil {
1399 h, pattern = mux.match(path)
1400 }
1401 if h == nil {
1402 h, pattern = NotFoundHandler(), ""
1403 }
1404 return
1405 }
1406
1407
1408
1409 func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) {
1410 if r.RequestURI == "*" {
1411 w.Header().Set("Connection", "close")
1412 w.WriteHeader(StatusBadRequest)
1413 return
1414 }
1415 h, _ := mux.Handler(r)
1416 h.ServeHTTP(w, r)
1417 }
1418
1419
1420
1421 func (mux *ServeMux) Handle(pattern string, handler Handler) {
1422 mux.mu.Lock()
1423 defer mux.mu.Unlock()
1424
1425 if pattern == "" {
1426 panic("http: invalid pattern " + pattern)
1427 }
1428 if handler == nil {
1429 panic("http: nil handler")
1430 }
1431 if mux.m[pattern].explicit {
1432 panic("http: multiple registrations for " + pattern)
1433 }
1434
1435 mux.m[pattern] = muxEntry{explicit: true, h: handler, pattern: pattern}
1436
1437 if pattern[0] != '/' {
1438 mux.hosts = true
1439 }
1440
1441
1442
1443
1444 n := len(pattern)
1445 if n > 0 && pattern[n-1] == '/' && !mux.m[pattern[0:n-1]].explicit {
1446
1447
1448 path := pattern
1449 if pattern[0] != '/' {
1450
1451
1452 path = pattern[strings.Index(pattern, "/"):]
1453 }
1454 mux.m[pattern[0:n-1]] = muxEntry{h: RedirectHandler(path, StatusMovedPermanently), pattern: pattern}
1455 }
1456 }
1457
1458
1459 func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
1460 mux.Handle(pattern, HandlerFunc(handler))
1461 }
1462
1463
1464
1465
1466 func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
1467
1468
1469
1470
1471 func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
1472 DefaultServeMux.HandleFunc(pattern, handler)
1473 }
1474
1475
1476
1477
1478
1479 func Serve(l net.Listener, handler Handler) error {
1480 srv := &Server{Handler: handler}
1481 return srv.Serve(l)
1482 }
1483
1484
1485 type Server struct {
1486 Addr string
1487 Handler Handler
1488 ReadTimeout time.Duration
1489 WriteTimeout time.Duration
1490 MaxHeaderBytes int
1491 TLSConfig *tls.Config
1492
1493
1494
1495
1496
1497
1498
1499
1500 TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
1501 }
1502
1503
1504
1505 type serverHandler struct {
1506 srv *Server
1507 }
1508
1509 func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {
1510 handler := sh.srv.Handler
1511 if handler == nil {
1512 handler = DefaultServeMux
1513 }
1514 if req.RequestURI == "*" && req.Method == "OPTIONS" {
1515 handler = globalOptionsHandler{}
1516 }
1517 handler.ServeHTTP(rw, req)
1518 }
1519
1520
1521
1522
1523 func (srv *Server) ListenAndServe() error {
1524 addr := srv.Addr
1525 if addr == "" {
1526 addr = ":http"
1527 }
1528 l, e := net.Listen("tcp", addr)
1529 if e != nil {
1530 return e
1531 }
1532 return srv.Serve(l)
1533 }
1534
1535
1536
1537
1538 func (srv *Server) Serve(l net.Listener) error {
1539 defer l.Close()
1540 var tempDelay time.Duration
1541 for {
1542 rw, e := l.Accept()
1543 if e != nil {
1544 if ne, ok := e.(net.Error); ok && ne.Temporary() {
1545 if tempDelay == 0 {
1546 tempDelay = 5 * time.Millisecond
1547 } else {
1548 tempDelay *= 2
1549 }
1550 if max := 1 * time.Second; tempDelay > max {
1551 tempDelay = max
1552 }
1553 log.Printf("http: Accept error: %v; retrying in %v", e, tempDelay)
1554 time.Sleep(tempDelay)
1555 continue
1556 }
1557 return e
1558 }
1559 tempDelay = 0
1560 c, err := srv.newConn(rw)
1561 if err != nil {
1562 continue
1563 }
1564 go c.serve()
1565 }
1566 }
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595 func ListenAndServe(addr string, handler Handler) error {
1596 server := &Server{Addr: addr, Handler: handler}
1597 return server.ListenAndServe()
1598 }
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628 func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error {
1629 server := &Server{Addr: addr, Handler: handler}
1630 return server.ListenAndServeTLS(certFile, keyFile)
1631 }
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642 func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error {
1643 addr := srv.Addr
1644 if addr == "" {
1645 addr = ":https"
1646 }
1647 config := &tls.Config{}
1648 if srv.TLSConfig != nil {
1649 *config = *srv.TLSConfig
1650 }
1651 if config.NextProtos == nil {
1652 config.NextProtos = []string{"http/1.1"}
1653 }
1654
1655 var err error
1656 config.Certificates = make([]tls.Certificate, 1)
1657 config.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile)
1658 if err != nil {
1659 return err
1660 }
1661
1662 conn, err := net.Listen("tcp", addr)
1663 if err != nil {
1664 return err
1665 }
1666
1667 tlsListener := tls.NewListener(conn, config)
1668 return srv.Serve(tlsListener)
1669 }
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679 func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler {
1680 f := func() <-chan time.Time {
1681 return time.After(dt)
1682 }
1683 return &timeoutHandler{h, f, msg}
1684 }
1685
1686
1687
1688 var ErrHandlerTimeout = errors.New("http: Handler timeout")
1689
1690 type timeoutHandler struct {
1691 handler Handler
1692 timeout func() <-chan time.Time
1693 body string
1694 }
1695
1696 func (h *timeoutHandler) errorBody() string {
1697 if h.body != "" {
1698 return h.body
1699 }
1700 return "<html><head><title>Timeout</title></head><body><h1>Timeout</h1></body></html>"
1701 }
1702
1703 func (h *timeoutHandler) ServeHTTP(w ResponseWriter, r *Request) {
1704 done := make(chan bool, 1)
1705 tw := &timeoutWriter{w: w}
1706 go func() {
1707 h.handler.ServeHTTP(tw, r)
1708 done <- true
1709 }()
1710 select {
1711 case <-done:
1712 return
1713 case <-h.timeout():
1714 tw.mu.Lock()
1715 defer tw.mu.Unlock()
1716 if !tw.wroteHeader {
1717 tw.w.WriteHeader(StatusServiceUnavailable)
1718 tw.w.Write([]byte(h.errorBody()))
1719 }
1720 tw.timedOut = true
1721 }
1722 }
1723
1724 type timeoutWriter struct {
1725 w ResponseWriter
1726
1727 mu sync.Mutex
1728 timedOut bool
1729 wroteHeader bool
1730 }
1731
1732 func (tw *timeoutWriter) Header() Header {
1733 return tw.w.Header()
1734 }
1735
1736 func (tw *timeoutWriter) Write(p []byte) (int, error) {
1737 tw.mu.Lock()
1738 timedOut := tw.timedOut
1739 tw.mu.Unlock()
1740 if timedOut {
1741 return 0, ErrHandlerTimeout
1742 }
1743 return tw.w.Write(p)
1744 }
1745
1746 func (tw *timeoutWriter) WriteHeader(code int) {
1747 tw.mu.Lock()
1748 if tw.timedOut || tw.wroteHeader {
1749 tw.mu.Unlock()
1750 return
1751 }
1752 tw.wroteHeader = true
1753 tw.mu.Unlock()
1754 tw.w.WriteHeader(code)
1755 }
1756
1757
1758 type globalOptionsHandler struct{}
1759
1760 func (globalOptionsHandler) ServeHTTP(w ResponseWriter, r *Request) {
1761 w.Header().Set("Content-Length", "0")
1762 if r.ContentLength != 0 {
1763
1764
1765
1766
1767
1768 mb := MaxBytesReader(w, r.Body, 4<<10)
1769 io.Copy(ioutil.Discard, mb)
1770 }
1771 }
1772
1773
1774 var eofReader = ioutil.NopCloser(strings.NewReader(""))
1775
1776
1777
1778
1779 type initNPNRequest struct {
1780 c *tls.Conn
1781 h serverHandler
1782 }
1783
1784 func (h initNPNRequest) ServeHTTP(rw ResponseWriter, req *Request) {
1785 if req.TLS == nil {
1786 req.TLS = &tls.ConnectionState{}
1787 *req.TLS = h.c.ConnectionState()
1788 }
1789 if req.Body == nil {
1790 req.Body = eofReader
1791 }
1792 if req.RemoteAddr == "" {
1793 req.RemoteAddr = h.c.RemoteAddr().String()
1794 }
1795 h.h.ServeHTTP(rw, req)
1796 }
1797
1798
1799 type loggingConn struct {
1800 name string
1801 net.Conn
1802 }
1803
1804 var (
1805 uniqNameMu sync.Mutex
1806 uniqNameNext = make(map[string]int)
1807 )
1808
1809 func newLoggingConn(baseName string, c net.Conn) net.Conn {
1810 uniqNameMu.Lock()
1811 defer uniqNameMu.Unlock()
1812 uniqNameNext[baseName]++
1813 return &loggingConn{
1814 name: fmt.Sprintf("%s-%d", baseName, uniqNameNext[baseName]),
1815 Conn: c,
1816 }
1817 }
1818
1819 func (c *loggingConn) Write(p []byte) (n int, err error) {
1820 log.Printf("%s.Write(%d) = ....", c.name, len(p))
1821 n, err = c.Conn.Write(p)
1822 log.Printf("%s.Write(%d) = %d, %v", c.name, len(p), n, err)
1823 return
1824 }
1825
1826 func (c *loggingConn) Read(p []byte) (n int, err error) {
1827 log.Printf("%s.Read(%d) = ....", c.name, len(p))
1828 n, err = c.Conn.Read(p)
1829 log.Printf("%s.Read(%d) = %d, %v", c.name, len(p), n, err)
1830 return
1831 }
1832
1833 func (c *loggingConn) Close() (err error) {
1834 log.Printf("%s.Close() = ...", c.name)
1835 err = c.Conn.Close()
1836 log.Printf("%s.Close() = %v", c.name, err)
1837 return
1838 }
View as plain text