From 1f9b0e70ab2131315744d0eedf9c5e29f34c8cb4 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Thu, 4 Sep 2003 10:55:20 +0000
Subject: Based on Joerg Mueller-Tolk's patch, this introduces support for
 CURLINFO_HTTPAUTH_AVAIL and CURLINFO_PROXYAUTH_AVAIL

---
 lib/getinfo.c |  6 ++++++
 lib/http.c    | 18 +++++++++++++++---
 lib/urldata.h |  3 +++
 3 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/lib/getinfo.c b/lib/getinfo.c
index 29da0dc3c..a505eb1e8 100644
--- a/lib/getinfo.c
+++ b/lib/getinfo.c
@@ -166,6 +166,12 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
   case CURLINFO_PRIVATE:
     *param_charp = data->set.private;
     break;
+  case CURLINFO_HTTPAUTH_AVAIL:
+    *param_longp = data->info.httpauthavail;
+    break;
+  case CURLINFO_PROXYAUTH_AVAIL:
+    *param_longp = data->info.proxyauthavail;
+    break;
   default:
     return CURLE_BAD_FUNCTION_ARGUMENT;
   }
diff --git a/lib/http.c b/lib/http.c
index e757a828d..c1fc9552a 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -287,9 +287,17 @@ CURLcode Curl_http_auth(struct connectdata *conn,
    */
   struct SessionHandle *data = conn->data;
 
-  char *start = (httpcode == 407) ? 
-    header+strlen("Proxy-authenticate:"): 
-    header+strlen("WWW-Authenticate:");
+  long *availp;
+  char *start;
+
+  if (httpcode == 407) {
+    start = header+strlen("Proxy-authenticate:");
+    availp = &data->info.proxyauthavail;
+  }
+  else {
+    start = header+strlen("WWW-Authenticate:");
+    availp = &data->info.httpauthavail;
+  }
   /*
    * Switch from proxy to web authentication and back if needed
    */
@@ -305,6 +313,7 @@ CURLcode Curl_http_auth(struct connectdata *conn,
 
 #ifdef GSSAPI
   if (checkprefix("GSS-Negotiate", start)) {
+    *availp |= CURLAUTH_GSSNEGOTIATE;
     if(data->state.authwant == CURLAUTH_GSSNEGOTIATE) {
       /* if exactly this is wanted, go */
       int neg = Curl_input_negotiate(conn, start);
@@ -320,6 +329,7 @@ CURLcode Curl_http_auth(struct connectdata *conn,
 #ifdef USE_SSLEAY
     /* NTLM support requires the SSL crypto libs */
     if(checkprefix("NTLM", start)) {
+      *availp |= CURLAUTH_NTLM;
       if(data->state.authwant == CURLAUTH_NTLM) {
         /* NTLM authentication is activated */
         CURLntlm ntlm =
@@ -337,6 +347,7 @@ CURLcode Curl_http_auth(struct connectdata *conn,
     else
 #endif
       if(checkprefix("Digest", start)) {
+        *availp |= CURLAUTH_DIGEST;
         if(data->state.authwant == CURLAUTH_DIGEST) {
           /* Digest authentication is activated */
           CURLdigest dig = CURLDIGEST_BAD;
@@ -363,6 +374,7 @@ CURLcode Curl_http_auth(struct connectdata *conn,
           }
       }
       else if(checkprefix("Basic", start)) {
+        *availp |= CURLAUTH_BASIC;
         if((data->state.authwant == CURLAUTH_BASIC) && (httpcode == 401)) {
           /* We asked for Basic authentication but got a 401 back
              anyway, which basicly means our name+password isn't
diff --git a/lib/urldata.h b/lib/urldata.h
index 2a7198055..d5dc2e1f8 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -575,6 +575,9 @@ struct PureInfo {
   long header_size;  /* size of read header(s) in bytes */
   long request_size; /* the amount of bytes sent in the request(s) */
 
+  long proxyauthavail;
+  long httpauthavail;
+
   char *contenttype; /* the content type of the object */
 };
 
-- 
cgit v1.2.3