diff options
author | Daniel Stenberg <daniel@haxx.se> | 2020-02-26 22:48:09 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2020-02-26 22:48:14 +0100 |
commit | 6375b205a9d3ebe9583871178db258e6a1f4dfff (patch) | |
tree | 425ef8d1e1d3c6c23c83f9eefb491ec14935e087 /lib | |
parent | 8220ec82196f8331460f68b676b7aea6d9e3e806 (diff) |
http: added 417 response treatment
When doing a request with a body + Expect: 100-continue and the server
responds with a 417, the same request will be retried immediately
without the Expect: header.
Added test 357 to verify.
Also added a control instruction to tell the sws test server to not read
the request body if Expect: is present, which the new test 357 uses.
Reported-by: bramus on github
Fixes #4949
Closes #4964
Diffstat (limited to 'lib')
-rw-r--r-- | lib/http.c | 13 | ||||
-rw-r--r-- | lib/urldata.h | 2 |
2 files changed, 13 insertions, 2 deletions
diff --git a/lib/http.c b/lib/http.c index c500ae0d7..39e4d3447 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1689,7 +1689,7 @@ static CURLcode expect100(struct Curl_easy *data, CURLcode result = CURLE_OK; data->state.expect100header = FALSE; /* default to false unless it is set to TRUE below */ - if(use_http_1_1plus(data, conn) && + if(!data->state.disableexpect && use_http_1_1plus(data, conn) && (conn->httpversion < 20)) { /* if not doing HTTP 1.0 or version 2, or disabled explicitly, we add an Expect: 100-continue to the headers which actually speeds up post @@ -3543,7 +3543,16 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data, */ Curl_expire_done(data, EXPIRE_100_TIMEOUT); if(!k->upload_done) { - if(data->set.http_keep_sending_on_error) { + if((k->httpcode == 417) && data->state.expect100header) { + /* 417 Expectation Failed - try again without the Expect + header */ + infof(data, "Got 417 while waiting for a 100\n"); + data->state.disableexpect = TRUE; + DEBUGASSERT(!data->req.newurl); + data->req.newurl = strdup(conn->data->change.url); + Curl_done_sending(conn, k); + } + else if(data->set.http_keep_sending_on_error) { infof(data, "HTTP error before end of send, keep sending\n"); if(k->exp100 > EXP100_SEND_DATA) { k->exp100 = EXP100_SEND_DATA; diff --git a/lib/urldata.h b/lib/urldata.h index 6401f49f2..e1348cf29 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1442,6 +1442,8 @@ struct UrlState { BIT(ftp_trying_alternative); BIT(wildcardmatch); /* enable wildcard matching */ BIT(expect100header); /* TRUE if we added Expect: 100-continue */ + BIT(disableexpect); /* TRUE if Expect: is disabled due to a previous + 417 response */ BIT(use_range); BIT(rangestringalloc); /* the range string is malloc()'ed */ BIT(done); /* set to FALSE when Curl_init_do() is called and set to TRUE |