diff options
| author | Yasuharu Goto <matope.ono@gmail.com> | 2015-05-15 00:44:34 +0900 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2015-10-17 00:44:46 +0000 |
| commit | dab143c8820151538fea908efe54e9625d1bc795 (patch) | |
| tree | eb3a2aeab689356796f1cf3f6d8193ad564f969c /src/net/http/request.go | |
| parent | 4562784baed3b64e4ffdd3b2ea3c6d4b11391335 (diff) | |
| download | go-dab143c8820151538fea908efe54e9625d1bc795.tar.xz | |
net/http: Client support for Expect: 100-continue
Current http client doesn't support Expect: 100-continue request
header(RFC2616-8/RFC7231-5.1.1). So even if the client have the header,
the head of the request body is consumed prematurely.
Those are my intentions to avoid premature consuming body in this change.
- If http.Request header contains body and Expect: 100-continue
header, it blocks sending body until it gets the first response.
- If the first status code to the request were 100, the request
starts sending body. Otherwise, sending body will be cancelled.
- Tranport.ExpectContinueTimeout specifies the amount of the time to
wait for the first response.
Fixes #3665
Change-Id: I4c04f7d88573b08cabd146c4e822061764a7cd1f
Reviewed-on: https://go-review.googlesource.com/10091
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/net/http/request.go')
| -rw-r--r-- | src/net/http/request.go | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/net/http/request.go b/src/net/http/request.go index 31fe45a4ed..8467decc18 100644 --- a/src/net/http/request.go +++ b/src/net/http/request.go @@ -354,7 +354,7 @@ const defaultUserAgent = "Go-http-client/1.1" // hasn't been set to "identity", Write adds "Transfer-Encoding: // chunked" to the header. Body is closed after it is sent. func (r *Request) Write(w io.Writer) error { - return r.write(w, false, nil) + return r.write(w, false, nil, nil) } // WriteProxy is like Write but writes the request in the form @@ -364,11 +364,12 @@ func (r *Request) Write(w io.Writer) error { // In either case, WriteProxy also writes a Host header, using // either r.Host or r.URL.Host. func (r *Request) WriteProxy(w io.Writer) error { - return r.write(w, true, nil) + return r.write(w, true, nil, nil) } // extraHeaders may be nil -func (req *Request) write(w io.Writer, usingProxy bool, extraHeaders Header) error { +// waitForContinue may be nil +func (req *Request) write(w io.Writer, usingProxy bool, extraHeaders Header, waitForContinue func() bool) error { // Find the target host. Prefer the Host: header, but if that // is not given, use the host from the request URL. // @@ -458,6 +459,21 @@ func (req *Request) write(w io.Writer, usingProxy bool, extraHeaders Header) err return err } + // Flush and wait for 100-continue if expected. + if waitForContinue != nil { + if bw, ok := w.(*bufio.Writer); ok { + err = bw.Flush() + if err != nil { + return err + } + } + + if !waitForContinue() { + req.closeBody() + return nil + } + } + // Write body and trailer err = tw.WriteBody(w) if err != nil { |
