curl-library
Re: Problem using negotiated NTLM authentication with IIS 6 & post-data
Date: Wed, 16 Feb 2005 07:01:53 -0500
Daniel Stenberg wrote:
> On Tue, 15 Feb 2005, Christopher R. Palmer wrote:
>
> Thanks to David Byron who lets me torture his web servers, and to your
> excellent report/trace, I could very easily repeat this problem and
> attached here is my take at a fix. It seems to work for me in my tests.
>
> If there are more than 2000 bytes left to send, it breaks the connection
> and sets up another one to send the first NTLM package.
Thanks! (And this does indeed fix the example I submitted).
Cheers,
Chris.
>
>
> ------------------------------------------------------------------------
>
> Index: lib/http.c
> ===================================================================
> RCS file: /cvsroot/curl/curl/lib/http.c,v
> retrieving revision 1.262
> diff -u -r1.262 http.c
> --- lib/http.c 11 Feb 2005 00:03:49 -0000 1.262
> +++ lib/http.c 15 Feb 2005 22:47:20 -0000
> @@ -252,20 +252,29 @@
> 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 */
> + (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! */
> - 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 */
> + conn->bits.close = FALSE; /* don't close, keep on sending */
> +
> + /* rewind data when completely done sending! */
> + if(!conn->bits.authneg)
> + conn->bits.rewindaftersend = TRUE;
> +
> + return CURLE_OK;
> + }
> +
> + 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 +319,8 @@
> 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;
> Index: lib/transfer.c
> ===================================================================
> RCS file: /cvsroot/curl/curl/lib/transfer.c,v
> retrieving revision 1.270
> diff -u -r1.270 transfer.c
> --- lib/transfer.c 14 Feb 2005 09:30:40 -0000 1.270
> +++ lib/transfer.c 15 Feb 2005 22:47:20 -0000
> @@ -541,6 +541,13 @@
>
> 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 */
>
Received on 2005-02-16