aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/server.go
AgeCommit message (Collapse)Author
2016-03-31net/http: allow Handlers to handle http2 upgrade PRI requestsBrad Fitzpatrick
The http2 spec defines a magic string which initates an http2 session: "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" It was intentionally chosen to kinda look like an HTTP request, but just different enough to break things not ready for it. This change makes Go ready for it. Notably: Go now accepts the request header (the prefix "PRI * HTTP/2.0\r\n\r\n") as a valid request, even though it doesn't have a Host header. But we now mark it as "Connection: close" and teach the Server to never read a second request from the connection once that's seen. If the http.Handler wants to deal with the upgrade, it has to hijack the request, read out the "body", compare it against "SM\r\n\r\n", and then speak http2. One of the new tests demonstrates that hijacking. Fixes #14451 Updates #14141 (h2c) Change-Id: Ib46142f31c55be7d00c56fa2624ec8a232e00c43 Reviewed-on: https://go-review.googlesource.com/21327 Reviewed-by: Andrew Gerrand <adg@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-03-16net/http: remove init func reference to ServeMuxBrad Fitzpatrick
Shrinks cmd/go by 30KB. Change-Id: Ied31192e85af76ebac743f8cc12bd9ef6ec5048f Reviewed-on: https://go-review.googlesource.com/20765 Reviewed-by: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
2016-03-07net/http: TimeoutHandler should start timer when serving requestCaio Marcelo de Oliveira Filho
TimeoutHandler was starting the Timer when the handler was created, instead of when serving a request. It also was sharing it between multiple requests, which is incorrect, as the requests might start at different times. Store the timeout duration and create the Timer when ServeHTTP is called. Different requests will have different timers. The testing plumbing was simplified to store the channel used to control when timeout happens. It overrides the regular timer. Fixes #14568. Change-Id: I4bd51a83f412396f208682d3ae5e382db5f8dc81 Reviewed-on: https://go-review.googlesource.com/20046 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-03-02all: single space after period.Brad Fitzpatrick
The tree's pretty inconsistent about single space vs double space after a period in documentation. Make it consistently a single space, per earlier decisions. This means contributors won't be confused by misleading precedence. This CL doesn't use go/doc to parse. It only addresses // comments. It was generated with: $ perl -i -npe 's,^(\s*// .+[a-z]\.) +([A-Z]),$1 $2,' $(git grep -l -E '^\s*//(.+\.) +([A-Z])') $ go test go/doc -update Change-Id: Iccdb99c37c797ef1f804a94b22ba5ee4b500c4f7 Reviewed-on: https://go-review.googlesource.com/20022 Reviewed-by: Rob Pike <r@golang.org> Reviewed-by: Dave Day <djd@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-02-24all: fix typos and spellingMartin Möhrmann
Change-Id: Icd06d99c42b8299fd931c7da821e1f418684d913 Reviewed-on: https://go-review.googlesource.com/19829 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-02-23all: fix typosShawn Smith
Change-Id: I6035941df8b0de6aeaf6c05df7257bcf6e9191fe Reviewed-on: https://go-review.googlesource.com/19320 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-02-21all: use cannot instead of can notJosh Bleecher Snyder
You can not use cannot, but you cannot spell cannot can not. Change-Id: I2f0971481a460804de96fd8c9e46a9cc62a3fc5b Reviewed-on: https://go-review.googlesource.com/19772 Reviewed-by: Rob Pike <r@golang.org>
2016-02-09net/http: make ListenAndServeTLS treat GetCertificate as a set cert tooBrad Fitzpatrick
ListenAndServeTLS doesn't require cert and key file names if the server's TLSConfig has a cert configured. This code was never updated when the GetCertificate hook was added to *tls.Config, however. Fixes #14268 Change-Id: Ib282ebb05697edd37ed8ff105972cbd1176d900b Reviewed-on: https://go-review.googlesource.com/19381 Reviewed-by: Russ Cox <rsc@golang.org>
2016-01-26net/http: document TimeFormat moreBrad Fitzpatrick
Fixes #14103 Change-Id: I89963643eccc902b809e04b7a14153acb0d242e1 Reviewed-on: https://go-review.googlesource.com/18933 Reviewed-by: Ian Lance Taylor <iant@golang.org>
2016-01-18net/http: panic on bogus use of CloseNotifier or HijackerBrad Fitzpatrick
Fixes #14001 Change-Id: I6f9bc3028345081758d8f537c3aaddb2e254e69e Reviewed-on: https://go-review.googlesource.com/18708 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-01-13net/http: clarify ConnState StateActive docs for HTTP/2Brad Fitzpatrick
Update #13925 Change-Id: I7cd0625fad841eb0e3f364629f9bc225aa2fdce9 Reviewed-on: https://go-review.googlesource.com/18575 Reviewed-by: Andrew Gerrand <adg@golang.org>
2016-01-12net/http: support URLs without schemes in http.RedirectDenys Honsiorovskyi
Many browsers now support schemeless URLs in the Location headers and also it is allowed in the draft HTTP/1.1 specification (see http://stackoverflow.com/q/4831741#comment25926312_4831741), but Go standard library lacks support for them. This patch implements schemeless URLs support in http.Redirect(). Since url.Parse() correctly handles schemeless URLs, I've just added an extra condition to verify URL's Host part in the absoulute/relative check in the http.Redirect function. Also I've moved oldpath variable initialization inside the block of code where it is used. Change-Id: Ib8a6347816a83e16576f00c4aa13224a89d610b5 Reviewed-on: https://go-review.googlesource.com/14172 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-01-10net/http: don't remove Expect Request header in Server.Harshavardhana
Fixes #13893 Change-Id: I2577b38fdb19299227dc146f707cf9df663dcdfc Reviewed-on: https://go-review.googlesource.com/18471 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2016-01-08net/http: document GODEBUG settings, update bundled http2Brad Fitzpatrick
Document the three GODEBUG environment variables in the package doc. Updates the bundled http2 to x/net git rev 415f1917 for https://golang.org/cl/18372. Fixes #13611 Change-Id: I3116c5d7de70d3d15242d7198f3758b1fb7d94b9 Reviewed-on: https://go-review.googlesource.com/18373 Reviewed-by: Andrew Gerrand <adg@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-01-05net/http: relax recently-updated rules and behavior of CloseNotifierBrad Fitzpatrick
The CloseNotifier implementation and documentation was substantially changed in https://golang.org/cl/17750 but it was a bit too aggressive. Issue #13666 highlighted that in addition to breaking external projects, even the standard library (httputil.ReverseProxy) didn't obey the new rules about not using CloseNotifier until the Request.Body is fully consumed. So, instead of fixing httputil.ReverseProxy, dial back the rules a bit. It's now okay to call CloseNotify before consuming the request body. The docs now say CloseNotifier may wait to fire before the request body is fully consumed, but doesn't say that the behavior is undefined anymore. Instead, we just wait until the request body is consumed and start watching for EOF from the client then. This CL also adds a test to ReverseProxy (using a POST request) that would've caught this earlier. Fixes #13666 Change-Id: Ib4e8c29c4bfbe7511f591cf9ffcda23a0f0b1269 Reviewed-on: https://go-review.googlesource.com/18144 Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
2015-12-24net/http: fix typo in docstringJonathan Boulle
s/activitiy/activity Change-Id: Ib2bbc929b38b1993000da57daed2d795f4a93997 Reviewed-on: https://go-review.googlesource.com/18131 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-12-18net/http: document that Server.TLSNextProto has automatic HTTP/2 alsoBrad Fitzpatrick
Copy the same sentence from Transport.TLSNextProto. Change-Id: Ib67bf054e891a68be8ba466a8c52968363374d16 Reviewed-on: https://go-review.googlesource.com/18031 Reviewed-by: Russ Cox <rsc@golang.org>
2015-12-17net/http: document ResponseWriter and Handler more; add testBrad Fitzpatrick
Update docs on ResponseWriter and Handler around concurrency. Also add a test. The Handler docs were old and used "object" a lot. It was also too ServeMux-centric. Fixes #13050 Updates #13659 (new issue found in http2 while writing the test) Change-Id: I25f53d5fa54f1c9d579d3d0f191bf3d94b1a251b Reviewed-on: https://go-review.googlesource.com/17982 Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
2015-12-17net/http: don't accept invalid bytes in server request headersBrad Fitzpatrick
Fixes #11207 Change-Id: I7f00b638e749fbc7907dc1597347ea426367d13e Reviewed-on: https://go-review.googlesource.com/17980 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
2015-12-17net/http: document a few ServeMux behaviorsRuss Cox
Fixes #13639. Fixes #11757. Change-Id: Iecf9ebcd652c23c96477305a41082e5b63b41d83 Reviewed-on: https://go-review.googlesource.com/17955 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-12-17net/http: document that ListenAndServe is a bit more than Listen+ServeBrad Fitzpatrick
Document that ListenAndServe and ListenAndServeTLS also set TCP keep-alives. Fixes #12748 Change-Id: Iba2e8a58dd657eba326db49a6c872e2d972883a4 Reviewed-on: https://go-review.googlesource.com/17681 Reviewed-by: Russ Cox <rsc@golang.org>
2015-12-16net/http: make Server validate Host headersBrad Fitzpatrick
Fixes #11206 (that we accept invalid bytes) Fixes #13624 (that we don't require a Host header in HTTP/1.1 per spec) Change-Id: I4138281d513998789163237e83bb893aeda43336 Reviewed-on: https://go-review.googlesource.com/17892 Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-12-15net/http: rework CloseNotifier implementation, clarify expectations in docsBrad Fitzpatrick
CloseNotifier wasn't well specified previously. This CL simplifies its implementation, clarifies the public documentation on CloseNotifier, clarifies internal documentation on conn, and fixes two CloseNotifier bugs in the process. The main change, though, is tightening the rules and expectations for using CloseNotifier: * the caller must consume the Request.Body first (old rule, unwritten) * the received value is the "true" value (old rule, unwritten) * no promises for channel sends after Handler returns (old rule, unwritten) * a subsequent pipelined request fires the CloseNotifier (new behavior; previously it never fired and thus effectively deadlocked as in #13165) * advise that it should only be used without HTTP/1.1 pipelining (use HTTP/2 or non-idempotent browsers). Not that browsers actually use pipelining. The main implementation change is that each Handler now gets its own CloseNotifier channel value, rather than sharing one between the whole conn. This means Handlers can't affect subsequent requests. This is how HTTP/2's Server works too. The old docs never clarified a behavior either way. The other side effect of each request getting its own CloseNotifier channel is that one handler can't "poison" the underlying conn preventing subsequent requests on the same connection from using CloseNotifier (this is #9763). In the old implementation, once any request on a connection used ClosedNotifier, the conn's underlying bufio.Reader source was switched from the TCPConn to the read side of the pipe being fed by a never-ending copy. Since it was impossible to abort that never-ending copy, we could never get back to a fresh state where it was possible to return the underlying TCPConn to callers of Hijack. Now, instead of a never-ending Copy, the background goroutine doing a Read from the TCPConn (or *tls.Conn) only reads a single byte. That single byte can be in the request body, a socket timeout error, io.EOF error, or the first byte of the second body. In any case, the new *connReader type stitches sync and async reads together like an io.MultiReader. To clarify the flow of Read data and combat the complexity of too many wrapper Reader types, the *connReader absorbs the io.LimitReader previously used for bounding request header reads. The liveSwitchReader type is removed. (an unused switchWriter type is also removed) Many fields on *conn are also documented more fully. Fixes #9763 (CloseNotify + Hijack together) Fixes #13165 (deadlock with CloseNotify + pipelined requests) Change-Id: I40abc0a1992d05b294d627d1838c33cbccb9dd65 Reviewed-on: https://go-review.googlesource.com/17750 Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-12-14net/http: fix race in TimeoutHandlerBrad Fitzpatrick
New implementation of TimeoutHandler: buffer everything to memory. All or nothing: either the handler finishes completely within the timeout (in which case the wrapper writes it all), or it misses the timeout and none of it gets written, in which case handler wrapper can reliably print the error response without fear that some of the wrapped Handler's code already wrote to the output. Now the goroutine running the wrapped Handler has its own write buffer and Header copy. Document the limitations. Fixes #9162 Change-Id: Ia058c1d62cefd11843e7a2fc1ae1609d75de2441 Reviewed-on: https://go-review.googlesource.com/17752 Reviewed-by: David Symonds <dsymonds@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
2015-12-10net/http: run more tests in http2 modeBrad Fitzpatrick
Failing ones are marked skipped. Fixes #13543 (was just a test issue) Updates #13555 (to be fixed later) Updates #13556 (to be fixed later) Updates #13557 (to be fixed later) Fixes bug in golang.org/cl/17428 (http1 now uses HTTP status 431, not 413) Change-Id: I8f7431fee35f2fc081cfe2c232ae75a00800a60b Reviewed-on: https://go-review.googlesource.com/17683 Reviewed-by: Blake Mizerany <blake.mizerany@gmail.com> Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com> Reviewed-by: Burcu Dogan <jbd@google.com> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-11-04net/http: register HTTP/2 before listening in ListenAndServeBrad Fitzpatrick
Change-Id: Icf9b6802945051aa484fb9ebcce71704f5655474 Reviewed-on: https://go-review.googlesource.com/16630 Reviewed-by: Andrew Gerrand <adg@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-11-04net/http: don't panic after request if Handler sets Request.Body to nilBrad Fitzpatrick
The Server's server goroutine was panicing (but recovering) when cleaning up after handling a request. It was pretty harmless (it just closed that one connection and didn't kill the whole process) but it was distracting. Updates #13135 Change-Id: I2a0ce9e8b52c8d364e3f4ce245e05c6f8d62df14 Reviewed-on: https://go-review.googlesource.com/16572 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Andrew Gerrand <adg@golang.org>
2015-10-29net/http: extra documentation for Redirect and RedirectHandlerTaru Karttunen
Errors with http.Redirect and http.StatusOk seem to occur from time to time on the irc channel. This change adds documentation suggesting to use one of the 3xx codes and not StatusOk with Redirect. Change-Id: I6b900a8eb868265fbbb846ee6a53e426d90a727d Reviewed-on: https://go-review.googlesource.com/15980 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-10-20net/http: return error from Serve if http2.ConfigureServer returns an errorBrad Fitzpatrick
In https://golang.org/cl/15860 http2.ConfigureServer was changed to return an error if explicit CipherSuites are listed and they're not compliant with the HTTP/2 spec. This is the net/http side of the change, to look at the return value from ConfigureServer and propagate it in Server.Serve. h2_bundle.go will be updated in a future CL. There are too many other http2 changes pending to be worth updating it now. Instead, h2_bundle.go is minimally updated by hand in this CL so at least the net/http change will compile. Updates #12895 Change-Id: I4df7a097faff2d235742c2d310c333bd3fd5c08e Reviewed-on: https://go-review.googlesource.com/16065 Reviewed-by: Andrew Gerrand <adg@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-10-14net/http: enable automatic HTTP/2 if TLSNextProto is nilBrad Fitzpatrick
This enables HTTP/2 by default (for https only) if the user didn't configure anything in their NPN/ALPN map. If they're using SPDY or an alternate http2 or a newer http2 from x/net/http2, we do nothing and don't use the standard library's vendored copy of x/net/http2. Upstream remains golang.org/x/net/http2. Update #6891 Change-Id: I69a8957a021a00ac353f9d7fdb9a40a5b69f2199 Reviewed-on: https://go-review.googlesource.com/15828 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Andrew Gerrand <adg@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-10-14net/http: don't hang if RemoteAddr() blocksDavid Glasser
The PROXY protocol is supported by several proxy servers such as haproxy and Amazon ELB. This protocol allows services running behind a proxy to learn the remote address of the actual client connecting to the proxy, by including a single textual line at the beginning of the TCP connection. http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt There are several Go libraries for this protocol (such as https://github.com/armon/go-proxyproto), which operate by wrapping a net.Conn with an implementation whose RemoteAddr method reads the protocol line before returning. This means that RemoteAddr is a blocking call. Before this change, http.Serve called RemoteAddr from the main Accepting goroutine, not from the per-connection goroutine. This meant that it would not Accept another connection until RemoteAddr returned, which is not appropriate if RemoteAddr needs to do a blocking read from the socket first. Fixes #12943. Change-Id: I1a242169e6e4aafd118b794e7c8ac45d0d573421 Reviewed-on: https://go-review.googlesource.com/15835 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-10-05net/http: add response body to 413 and 400 errorsKenny Grant
The existing serve() method returns a zero-length response body when it encounters an error, which results in a blank page and no visible error in browsers. This change sends a response body explaining the error for display in browsers. Fixes #12745 Change-Id: I9dc3b95ad88cb92c18ced51f6b52bd3b2c1b974c Reviewed-on: https://go-review.googlesource.com/15018 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-09-04net/http: optimize some io.Copy calls by reusing buffersArtyom Pervukhin
Optimize two calls of io.Copy which cannot make use of neither io.ReaderFrom nor io.WriterTo optimization tricks by replacing them with io.CopyBuffer with reusable buffers. First is fallback call to io.Copy when server misses the optimized case of using sendfile to copy from a regular file to net.TCPConn; second is use of io.Copy on piped reader/writer when handler implementation uses http.CloseNotifier interface. One of the notable users of http.CloseNotifier is httputil.ReverseProxy. benchmark old ns/op new ns/op delta BenchmarkCloseNotifier-4 309591 303388 -2.00% benchmark old allocs new allocs delta BenchmarkCloseNotifier-4 50 49 -2.00% benchmark old bytes new bytes delta BenchmarkCloseNotifier-4 36168 3140 -91.32% Fixes #12455 Change-Id: I512e6aa2f1aeed2ed00246afb3350c819b65b87e Reviewed-on: https://go-review.googlesource.com/14177 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-08-20net/http: document that [ListenAnd]Serve always returns a non-nil errorAndrew Gerrand
Fixes #12229 Change-Id: I243e39f67748e6754fb7726b21b3afc1ff436771 Reviewed-on: https://go-review.googlesource.com/13780 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-08-18net/http: fix races cloning TLS configBrad Fitzpatrick
Found in a Google program running under the race detector. No test, but verified that this fixes the race with go run -race of: package main import ( "crypto/tls" "fmt" "net" "net/http" "net/http/httptest" ) func main() { for { ts := httptest.NewTLSServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {})) conf := &tls.Config{} // non-nil a, b := net.Pipe() go func() { sconn := tls.Server(a, conf) sconn.Handshake() }() tr := &http.Transport{ TLSClientConfig: conf, } req, _ := http.NewRequest("GET", ts.URL, nil) _, err := tr.RoundTrip(req) println(fmt.Sprint(err)) a.Close() b.Close() ts.Close() } } Also modified cmd/vet to report the copy-of-mutex bug statically in CL 13646, and fixed two other instances in the code found by vet. But vet could not have told us about cloneTLSConfig vs cloneTLSClientConfig. Confirmed that original report is also fixed by this. Fixes #12099. Change-Id: Iba0171549e01852a5ec3438c25a1951c98524dec Reviewed-on: https://go-review.googlesource.com/13453 Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Austin Clements <austin@google.com> Run-TryBot: Russ Cox <rsc@golang.org>
2015-08-03net/http: fix server/transport data race when sharing the request bodyBrad Fitzpatrick
Introduced in https://go-review.googlesource.com/12865 (git rev c2db5f4c). This fix doesn't add any new lock acquistions: it just moves the existing one taken by the unreadDataSize method and moves it out wider. It became flaky at rev c2db5f4c, but now reliably passes again: $ go test -v -race -run=TestTransportAndServerSharedBodyRace -count=100 net/http Fixes #11985 Change-Id: I6956d62839fd7c37e2f7441b1d425793f4a0db30 Reviewed-on: https://go-review.googlesource.com/12909 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2015-08-02net/http: close server conn after request body errorJed Denlea
HTTP servers attempt to entirely consume a request body before sending a response. However, when doing so, it previously would ignore any errors encountered. Unfortunately, the errors triggered at this stage are indicative of at least a couple problems: read timeouts and chunked encoding errors. This means properly crafted and/or timed requests could lead to a "smuggled" request. The fix is to inspect the errors created by the response body Reader, and treat anything other than io.EOF or ErrBodyReadAfterClose as fatal to the connection. Fixes #11930 Change-Id: I0bf18006d7d8f6537529823fc450f2e2bdb7c18e Reviewed-on: https://go-review.googlesource.com/12865 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-08-02net/http: fix SetKeepAlivesEnabled receiver nameCarl Jackson
This makes the receiver name consistent with the rest of the methods on type Server. Change-Id: Ic2a007d3b5eb50bd87030e15405e9856109cf590 Reviewed-on: https://go-review.googlesource.com/13035 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
2015-07-27net/http: pause briefly after closing Server connection when body remainsBrad Fitzpatrick
From https://github.com/golang/go/issues/11745#issuecomment-123555313 this implements option (b), having the server pause slightly after sending the final response on a TCP connection when we're about to close it when we know there's a request body outstanding. This biases the client (which might not be Go) to prefer our response header over the request body write error. Updates #11745 Change-Id: I07cb0b74519d266c8049d9e0eb23a61304eedbf8 Reviewed-on: https://go-review.googlesource.com/12658 Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
2015-07-20net/http: add example for setting trailers in an HandlerBrad Fitzpatrick
Change-Id: I6a8bb853a538c80d95589321d3226784bc017eef Reviewed-on: https://go-review.googlesource.com/12327 Reviewed-by: Andrew Gerrand <adg@golang.org>
2015-07-15net/http: don't reuse conns after incomplete 100-continue requestsBrad Fitzpatrick
If we receive an HTTP request with "Expect: 100-continue" and the Handler never read to EOF, the conn is in an unknown state. Don't reuse that connection. Fixes #11549 Change-Id: I5be93e7a54e899d615b05f72bdcf12b25304bc60 Reviewed-on: https://go-review.googlesource.com/12262 Reviewed-by: Andrew Gerrand <adg@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
2015-07-11all: link to https instead of httpBrad Fitzpatrick
The one in misc/makerelease/makerelease.go is particularly bad and probably warrants rotating our keys. I didn't update old weekly notes, and reverted some changes involving test code for now, since we're late in the Go 1.5 freeze. Otherwise, the rest are all auto-generated changes, and all manually reviewed. Change-Id: Ia2753576ab5d64826a167d259f48a2f50508792d Reviewed-on: https://go-review.googlesource.com/12048 Reviewed-by: Rob Pike <r@golang.org>
2015-06-26net/http: escape path in implicit /tree→/tree/ ServeMux.Handle redirectMihai Borobocea
Fixes #10572 Change-Id: I764f3c226cf98ff39d9e553e4613d0ee108ef766 Reviewed-on: https://go-review.googlesource.com/9311 Reviewed-by: Russ Cox <rsc@golang.org>
2015-06-25net/http: tolerate old buggy user agents, per RFC 2616 section 4.1Brad Fitzpatrick
Some old buggy browsers sent extra CRLF(s) after POST bodies. Skip over them before reading subsequent requests. Fixes #10876 Change-Id: I62eacf2b3e985caffa85aee3de39d8cd3548130b Reviewed-on: https://go-review.googlesource.com/11491 Reviewed-by: Andrew Gerrand <adg@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
2015-06-25net/http: bound the number of bytes read seeking EOF in Handler's Body.CloseBrad Fitzpatrick
If a client sent a POST with a huge request body, calling req.Body.Close in the handler (which is implicit at the end of a request) would end up consuming it all. Put a cap on that, using the same threshold used elsewhere for similar cases. Fixes #9662 Change-Id: I26628413aa5f623a96ef7c2609a8d03c746669e5 Reviewed-on: https://go-review.googlesource.com/11412 Reviewed-by: Andrew Gerrand <adg@golang.org>
2015-06-25net/http: document that Hijack's net.Conn might have left-over timeouts setBrad Fitzpatrick
Fixes #8296 Change-Id: I71b330a0f961d46ae4ed81d5f3f5ce5bf708a29a Reviewed-on: https://go-review.googlesource.com/11411 Reviewed-by: Andrew Gerrand <adg@golang.org>
2015-06-25net/http: don't always require certFile, keyFile in Server.ListenAndServerTLSBrad Fitzpatrick
The ListenAndServerTLS function still requires the certFile and keyFile, but the Server.ListenAndServerTLS method doesn't need to require the certFile and keyFile if the Server.TLSConfig.Certificates are already populated. Fixes #8599 Change-Id: Id2e3433732f93e2619bfd78891f775d89f1d651e Reviewed-on: https://go-review.googlesource.com/11413 Reviewed-by: Andrew Gerrand <adg@golang.org>
2015-06-02net/http: set nosniff header when serving ErrorAndrew Gerrand
The Error function is a potential XSS vector if a user can control the error message. For example, an http.FileServer when given a request for this path /<script>alert("xss!")</script> may return a response with a body like this open <script>alert("xss!")</script>: no such file or directory Browsers that sniff the content may interpret this as HTML and execute the script. The nosniff header added by this CL should help, but we should also try santizing the output entirely. Change-Id: I447f701531329a2fc8ffee2df2f8fa69d546f893 Reviewed-on: https://go-review.googlesource.com/10640 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2015-05-06net/http: don't send implicit Content-Length if Transfer-Encoding is setBrad Fitzpatrick
Fixes #9987 Change-Id: Ibebd105a2bcdc1741f3b41aa78cb986f3f518b53 Reviewed-on: https://go-review.googlesource.com/9638 Reviewed-by: Andrew Gerrand <adg@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
2015-04-28net/http: test and document suppressing implicit Content-Type response headerBrad Fitzpatrick
No code changes. Fixes #8992 Change-Id: I10c8340a4f8e3e7add9b3ac5aa0a1e8d8aa49f40 Reviewed-on: https://go-review.googlesource.com/9412 Reviewed-by: David Crawshaw <crawshaw@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>