1
0
mirror of https://github.com/moparisthebest/curl synced 2025-03-11 07:39:50 -04:00

Change the confusing two variables for the expect 100 continue stuff into

a single state variable to make the code easier to follow and understand.
This commit is contained in:
Daniel Stenberg 2008-03-13 20:56:13 +00:00
parent b74cdee6ab
commit 553ed99e3b
2 changed files with 29 additions and 24 deletions

View File

@ -412,7 +412,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
if((k->bytecount == 0) && (k->writebytecount == 0)) { if((k->bytecount == 0) && (k->writebytecount == 0)) {
Curl_pgrsTime(data, TIMER_STARTTRANSFER); Curl_pgrsTime(data, TIMER_STARTTRANSFER);
if(k->wait100_after_headers) if(k->exp100 > EXP100_SEND_DATA)
/* set time stamp to compare with when waiting for the 100 */ /* set time stamp to compare with when waiting for the 100 */
k->start100 = Curl_tvnow(); k->start100 = Curl_tvnow();
} }
@ -584,10 +584,10 @@ CURLcode Curl_readwrite(struct connectdata *conn,
*/ */
k->header = TRUE; k->header = TRUE;
k->headerline = 0; /* restart the header line counter */ k->headerline = 0; /* restart the header line counter */
/* if we did wait for this do enable write now! */
if(k->write_after_100_header) {
k->write_after_100_header = FALSE; /* if we did wait for this do enable write now! */
if(k->exp100) {
k->exp100 = EXP100_SEND_DATA;
k->keepon |= KEEP_WRITE; k->keepon |= KEEP_WRITE;
} }
} }
@ -614,7 +614,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
* seems to cause a problem => abort the write operations * seems to cause a problem => abort the write operations
* (or prevent them from starting). * (or prevent them from starting).
*/ */
k->write_after_100_header = FALSE; k->exp100 = EXP100_FAILED;
k->keepon &= ~KEEP_WRITE; k->keepon &= ~KEEP_WRITE;
} }
@ -1429,13 +1429,12 @@ CURLcode Curl_readwrite(struct connectdata *conn,
protocol agnostic. */ protocol agnostic. */
int fillcount; int fillcount;
if(k->wait100_after_headers && if((k->exp100 == EXP100_SENDING_REQUEST) &&
(data->state.proto.http->sending == HTTPSEND_BODY)) { (data->state.proto.http->sending == HTTPSEND_BODY)) {
/* If this call is to send body data, we must take some action: /* If this call is to send body data, we must take some action:
We have sent off the full HTTP 1.1 request, and we shall now We have sent off the full HTTP 1.1 request, and we shall now
go into the Expect: 100 state and await such a header */ go into the Expect: 100 state and await such a header */
k->wait100_after_headers = FALSE; /* headers sent */ k->exp100 = EXP100_AWAITING_CONTINUE; /* wait for the header */
k->write_after_100_header = TRUE; /* wait for the header */
k->keepon &= ~KEEP_WRITE; /* disable writing */ k->keepon &= ~KEEP_WRITE; /* disable writing */
k->start100 = Curl_tvnow(); /* timeout count starts now */ k->start100 = Curl_tvnow(); /* timeout count starts now */
didwhat &= ~KEEP_WRITE; /* we didn't write anything actually */ didwhat &= ~KEEP_WRITE; /* we didn't write anything actually */
@ -1578,9 +1577,9 @@ CURLcode Curl_readwrite(struct connectdata *conn,
} }
else { else {
/* no read no write, this is a timeout? */ /* no read no write, this is a timeout? */
if(k->write_after_100_header) { if(k->exp100 == EXP100_AWAITING_CONTINUE) {
/* This should allow some time for the header to arrive, but only a /* This should allow some time for the header to arrive, but only a
very short time as otherwise it'll be too much wasted times too very short time as otherwise it'll be too much wasted time too
often. */ often. */
/* Quoting RFC2616, section "8.2.3 Use of the 100 (Continue) Status": /* Quoting RFC2616, section "8.2.3 Use of the 100 (Continue) Status":
@ -1595,7 +1594,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
long ms = Curl_tvdiff(k->now, k->start100); long ms = Curl_tvdiff(k->now, k->start100);
if(ms > CURL_TIMEOUT_EXPECT_100) { if(ms > CURL_TIMEOUT_EXPECT_100) {
/* we've waited long enough, continue anyway */ /* we've waited long enough, continue anyway */
k->write_after_100_header = FALSE; k->exp100 = EXP100_SEND_DATA;
k->keepon |= KEEP_WRITE; k->keepon |= KEEP_WRITE;
} }
} }
@ -2502,21 +2501,23 @@ Curl_setup_transfer(
Thus, we must check if the request has been sent before we set the Thus, we must check if the request has been sent before we set the
state info where we wait for the 100-return code state info where we wait for the 100-return code
*/ */
if(data->state.expect100header && if((data->state.expect100header) &&
(data->state.proto.http->sending == HTTPSEND_BODY)) { (data->state.proto.http->sending == HTTPSEND_BODY)) {
/* wait with write until we either got 100-continue or a timeout */ /* wait with write until we either got 100-continue or a timeout */
k->write_after_100_header = TRUE; k->exp100 = EXP100_AWAITING_CONTINUE;
k->start100 = k->start; k->start100 = k->start;
} }
else { else {
if(data->state.expect100header) if(data->state.expect100header)
/* when we've sent off the rest of the headers, we must await a /* when we've sent off the rest of the headers, we must await a
100-continue */ 100-continue but first finish sending the request */
k->wait100_after_headers = TRUE; k->exp100 = EXP100_SENDING_REQUEST;
/* enable the write bit when we're not waiting for continue */
k->keepon |= KEEP_WRITE; k->keepon |= KEEP_WRITE;
} }
} } /* if(conn->writesockfd != CURL_SOCKET_BAD) */
} } /* if(k->getheader || !data->set.opt_no_body) */
return CURLE_OK; return CURLE_OK;
} }

View File

@ -672,6 +672,14 @@ typedef CURLcode (*Curl_do_more_func)(struct connectdata *);
typedef CURLcode (*Curl_done_func)(struct connectdata *, CURLcode, bool); typedef CURLcode (*Curl_done_func)(struct connectdata *, CURLcode, bool);
enum expect100 {
EXP100_SEND_DATA, /* enough waiting, just send the body now */
EXP100_AWAITING_CONTINUE, /* waiting for the 100 Continue header */
EXP100_SENDING_REQUEST, /* still sending the request but will wait for
the 100 header once done with the request */
EXP100_FAILED /* used on 417 Expectation Failed */
};
/* /*
* Request specific data in the easy handle (SessionHandle). Previously, * Request specific data in the easy handle (SessionHandle). Previously,
* these members were on the connectdata struct but since a conn struct may * these members were on the connectdata struct but since a conn struct may
@ -721,12 +729,8 @@ struct SingleRequest {
int httpcode; /* error code from the 'HTTP/1.? XXX' line */ int httpcode; /* error code from the 'HTTP/1.? XXX' line */
int httpversion; /* the HTTP version*10 */ int httpversion; /* the HTTP version*10 */
struct timeval start100; /* time stamp to wait for the 100 code from */ struct timeval start100; /* time stamp to wait for the 100 code from */
bool write_after_100_header; /* TRUE = we enable the write after we enum expect100 exp100; /* expect 100 continue state */
received a 100-continue/timeout or
FALSE = directly */
bool wait100_after_headers; /* TRUE = after the request-headers have been
sent off properly, we go into the wait100
state, FALSE = don't */
int content_encoding; /* What content encoding. sec 3.5, RFC2616. */ int content_encoding; /* What content encoding. sec 3.5, RFC2616. */
#define IDENTITY 0 /* No encoding */ #define IDENTITY 0 /* No encoding */