Changelog
Daniel (22 April 2004)
+- David Byron found and fixed a small bug with the --fail and authentication
+ stuff added a few weeks ago. Turns out that if you specify --proxy-ntlm and
+ communicate with a proxy that requires basic authentication, the proxy
+ properly returns a 407, but the failure detection code doesn't realize it
+ should give up, so curl returns with exit code 0. Test case 162 added to
+ verify the functionality.
+
- If a transfer is found out to be only partial, libcurl will now treat that
as a problem serious enough to skip the final QUIT command before closing
the control connection. To avoid the risk that it will "hang" waiting for
if(data->state.authwant == CURLAUTH_GSSNEGOTIATE) {
/* if exactly this is wanted, go */
int neg = Curl_input_negotiate(conn, start);
- if (neg == 0)
+ if (neg == 0) {
conn->newurl = strdup(data->change.url);
+ data->state.authproblem = (conn->newurl == NULL);
+ else {
+ infof(data, "Authentication problem. Ignoring this.\n");
+ data->state.authproblem = TRUE;
+ }
}
else
if(data->state.authwant & CURLAUTH_GSSNEGOTIATE)
CURLntlm ntlm =
Curl_input_ntlm(conn, (bool)(httpcode == 407), start);
- if(CURLNTLM_BAD != ntlm)
+ if(CURLNTLM_BAD != ntlm) {
conn->newurl = strdup(data->change.url); /* clone string */
- else
+ data->state.authproblem = (conn->newurl == NULL);
+ }
+ else {
infof(data, "Authentication problem. Ignoring this.\n");
+ data->state.authproblem = TRUE;
+ }
}
else
if(data->state.authwant & CURLAUTH_NTLM)
/* Digest authentication is activated */
CURLdigest dig = Curl_input_digest(conn, start);
- if(CURLDIGEST_FINE == dig)
+ if(CURLDIGEST_FINE == dig) {
/* We act on it. Store our new url, which happens to be
the same one we already use! */
conn->newurl = strdup(data->change.url); /* clone string */
- else
+ data->state.authproblem = (conn->newurl == NULL);
+ }
+ else {
infof(data, "Authentication problem. Ignoring this.\n");
+ data->state.authproblem = TRUE;
+ }
}
else
if(data->state.authwant & CURLAUTH_DIGEST) {
valid. */
data->state.authavail = CURLAUTH_NONE;
infof(data, "Authentication problem. Ignoring this.\n");
+ data->state.authproblem = TRUE;
}
else if(data->state.authwant & CURLAUTH_BASIC) {
data->state.authavail |= CURLAUTH_BASIC;
+ } else {
+ /*
+ ** We asked for something besides basic but got
+ ** Basic anyway. This is no good.
+ */
+ infof(data, "Server expects Basic auth, but we're doing something else.\n");
+ data->state.authproblem = TRUE;
}
}
return CURLE_OK;
*/
#if 0 /* set to 1 when debugging this functionality */
infof(data,"%s: authstage = %d\n",__FUNCTION__,data->state.authstage);
+ infof(data,"%s: authwant = 0x%08x\n",__FUNCTION__,data->state.authwant);
+ infof(data,"%s: authavail = 0x%08x\n",__FUNCTION__,data->state.authavail);
infof(data,"%s: httpcode = %d\n",__FUNCTION__,k->httpcode);
infof(data,"%s: authdone = %d\n",__FUNCTION__,data->state.authdone);
+ infof(data,"%s: newurl = %s\n",__FUNCTION__,conn->newurl ? conn->newurl : "(null)");
+ infof(data,"%s: authproblem = %d\n",__FUNCTION__,data->state.authproblem);
#endif
if (data->state.authstage &&
(data->state.authstage == k->httpcode))
- return data->state.authdone;
+ return (data->state.authdone || data->state.authproblem);
/*
** Either we're not authenticating, or we're supposed to
--- /dev/null
+# Server-side
+<reply>
+<data1001 nocheck=1>
+HTTP/1.0 407 BAD BOY
+Proxy-Authenticate: Basic realm="Squid proxy-caching web server"
+Server: swsclose
+Content-Type: text/html
+
+Even though it's the response code that triggers authentication, we're
+using NTLM and the server isn't, so we should fail. We know the server
+isn't because there's no Proxy-Authorization: NTLM header
+</data1001>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP GET asking for --proxy-ntlm when some other authentication is required
+ </name>
+ <command>
+http://%HOSTIP:%HOSTPORT/162 --proxy http://%HOSTIP:%HOSTPORT --proxy-user foo:bar --proxy-ntlm --fail
+</command>
+</test>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent: curl/.*
+</strip>
+<protocol>
+GET http://127.0.0.1:8999/162 HTTP/1.1\r
+Proxy-Authorization: NTLM TlRMTVNTUAABAAAAAgIAAAAAAAAgAAAAAAAAACAAAAA=
+User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)\r
+Host: 127.0.0.1:8999\r
+Pragma: no-cache\r
+Accept: */*\r
+\r
+</protocol>
+<errorcode>
+22
+</errorcode>
+</verify>