diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/http.c | 39 | ||||
-rw-r--r-- | lib/transfer.c | 7 |
2 files changed, 32 insertions, 14 deletions
diff --git a/lib/http.c b/lib/http.c index 706cf7e30..a5f29da3b 100644 --- a/lib/http.c +++ b/lib/http.c @@ -251,21 +251,31 @@ static CURLcode perhapsrewind(struct connectdata *conn) if((expectsend == -1) || (expectsend > bytessent)) { /* There is still data left to send */ - if((data->state.authproxy.picked == CURLAUTH_NTLM) ||/* using NTLM */ - (data->state.authhost.picked == CURLAUTH_NTLM) ) { - conn->bits.close = FALSE; /* don't close, keep on sending */ + if((data->state.authproxy.picked == CURLAUTH_NTLM) || + (data->state.authhost.picked == CURLAUTH_NTLM)) { + if(((expectsend - bytessent) < 2000) || + (conn->ntlm.state != NTLMSTATE_NONE)) { + /* The NTLM-negotiation has started *OR* there is just a little (<2K) + data left to send, keep on sending. */ + + /* rewind data when completely done sending! */ + if(!conn->bits.authneg) + conn->bits.rewindaftersend = TRUE; + + return CURLE_OK; + } + if(conn->bits.close) + /* this is already marked to get closed */ + return CURLE_OK; - /* rewind data when completely done sending! */ - conn->bits.rewindaftersend = TRUE; - return CURLE_OK; - } - else { - /* If there is more than just a little data left to send, close the - * current connection by force. - */ - conn->bits.close = TRUE; - conn->size = 0; /* don't download any more than 0 bytes */ + infof(data, "NTLM send, close instead of sending %ld bytes\n", + expectsend - bytessent); } + + /* This is not NTLM or NTLM with many bytes left to send: close + */ + conn->bits.close = TRUE; + conn->size = 0; /* don't download any more than 0 bytes */ } if(bytessent) @@ -310,7 +320,8 @@ CURLcode Curl_http_auth_act(struct connectdata *conn) conn->newurl = strdup(data->change.url); /* clone URL */ if((data->set.httpreq != HTTPREQ_GET) && - (data->set.httpreq != HTTPREQ_HEAD)) { + (data->set.httpreq != HTTPREQ_HEAD) && + !conn->bits.rewindaftersend) { code = perhapsrewind(conn); if(code) return code; diff --git a/lib/transfer.c b/lib/transfer.c index 97a085d54..7142d517b 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -541,6 +541,13 @@ CURLcode Curl_readwrite(struct connectdata *conn, if(result) return result; + + if(conn->bits.rewindaftersend) { + /* We rewind after a complete send, so thus we continue + sending now */ + infof(data, "Keep sending data to get tossed away!\n"); + k->keepon |= KEEP_WRITE; + } } #endif /* CURL_DISABLE_HTTP */ |