Skip to content

Commit ee97a23

Browse files
committed
Fix handling of expect continue
1 parent 69e39ba commit ee97a23

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

http2/transport.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,6 +1244,7 @@ func (cs *clientStream) writeRequest(req *http.Request) (err error) {
12441244
req.Header["Expect"],
12451245
"100-continue") {
12461246
continueTimeout = 0
1247+
} else if continueTimeout != 0 {
12471248
cs.on100 = make(chan struct{}, 1)
12481249
}
12491250

http2/transport_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5109,6 +5109,55 @@ func TestTransportServerResetStreamAtHeaders(t *testing.T) {
51095109
res.Body.Close()
51105110
}
51115111

5112+
func TestTransportExpectContinue(t *testing.T) {
5113+
st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
5114+
io.Copy(io.Discard, r.Body)
5115+
return
5116+
}, optOnlyServer)
5117+
defer st.Close()
5118+
5119+
tr := &http.Transport{
5120+
TLSClientConfig: tlsConfigInsecure,
5121+
MaxConnsPerHost: 1,
5122+
ExpectContinueTimeout: 10 * time.Second,
5123+
}
5124+
5125+
err := ConfigureTransport(tr)
5126+
if err != nil {
5127+
t.Fatal(err)
5128+
}
5129+
client := &http.Client{
5130+
Transport: tr,
5131+
}
5132+
5133+
reqCh := make(chan error)
5134+
startTime := time.Now()
5135+
5136+
go func() {
5137+
req, err := http.NewRequest("POST", st.ts.URL, strings.NewReader("hello"))
5138+
if err != nil {
5139+
reqCh <- err
5140+
return
5141+
}
5142+
req.Header.Set("Expect", "100-continue")
5143+
res, err := client.Do(req)
5144+
if err != nil {
5145+
reqCh <- err
5146+
return
5147+
}
5148+
reqCh <- res.Body.Close()
5149+
}()
5150+
5151+
err = <-reqCh
5152+
if err != nil {
5153+
t.Fatal(err)
5154+
}
5155+
delta := time.Since(startTime)
5156+
if delta >= tr.ExpectContinueTimeout {
5157+
t.Error("Request didn't resume after receiving 100 continue")
5158+
}
5159+
}
5160+
51125161
type closeChecker struct {
51135162
io.ReadCloser
51145163
closed chan struct{}

0 commit comments

Comments
 (0)