On Wed, Oct 30, 2013 at 04:45:10AM -0400, Jeff King wrote:
> However, we do reuse the curl handles. And in the case of rpc case, we
> are only doing one request at a time, so the handle you get is
> guaranteed to be the last one used.  So it works in practice, but it
> would break if the curl handle code breaks any of these assumptions.
> 
> I think the clean way to do it would be to teach the slot code to pull
> out the available auth methods, and pass them up through the call chain.
> Like this on top of your patch:
> 
> diff --git a/http.c b/http.c
> index 0ddb164..32fa998 100644
> --- a/http.c
> +++ b/http.c
> @@ -761,6 +761,12 @@ void finish_active_slot(struct active_request_slot *slot)
>       if (slot->results != NULL) {
>               slot->results->curl_result = slot->curl_result;
>               slot->results->http_code = slot->http_code;
> +#if LIBCURL_VERSION_NUM >= 0x070a08
> +             curl_easy_getinfo(slot->curl, CURLINFO_HTTPAUTH_AVAIL,
> +                               &slot->results->authtype);
> +#else
> +             slot->results->authtype = 0;
> +#endif
>       }
>  
>       /* Run callback if appropriate */
> diff --git a/http.h b/http.h
> index d77c1b5..4b32b9b 100644
> --- a/http.h
> +++ b/http.h
> @@ -54,6 +54,7 @@
>  struct slot_results {
>       CURLcode curl_result;
>       long http_code;
> +     long authtype;
>  };
>  
>  struct active_request_slot {
> diff --git a/remote-curl.c b/remote-curl.c
> index eaa286c..d026f05 100644
> --- a/remote-curl.c
> +++ b/remote-curl.c
> @@ -383,25 +383,29 @@ static size_t rpc_in(char *ptr, size_t eltsize,
>       return size;
>  }
>  
> -static int run_slot(struct active_request_slot *slot)
> +static int run_slot(struct active_request_slot *slot,
> +                 struct slot_results *results)
>  {
>       int err;
> -     struct slot_results results;
> +     struct slot_results results_buf;
>  
> -     slot->results = &results;
> +     if (!results)
> +             results = &results_buf;
> +
> +     slot->results = results;
>       slot->curl_result = curl_easy_perform(slot->curl);
>       finish_active_slot(slot);
>  
> -     err = handle_curl_result(&results);
> +     err = handle_curl_result(results);
>       if (err != HTTP_OK && err != HTTP_REAUTH) {
>               error("RPC failed; result=%d, HTTP code = %ld",
> -                   results.curl_result, results.http_code);
> +                   results->curl_result, results->http_code);
>       }
>  
>       return err;
>  }
>  
> -static int probe_rpc(struct rpc_state *rpc)
> +static int probe_rpc(struct rpc_state *rpc, struct slot_results *results)
>  {
>       struct active_request_slot *slot;
>       struct curl_slist *headers = NULL;
> @@ -423,7 +427,7 @@ static int probe_rpc(struct rpc_state *rpc)
>       curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
>       curl_easy_setopt(slot->curl, CURLOPT_FILE, &buf);
>  
> -     err = run_slot(slot);
> +     err = run_slot(slot, results);
>  
>       curl_slist_free_all(headers);
>       strbuf_release(&buf);
> @@ -462,20 +466,16 @@ static int post_rpc(struct rpc_state *rpc)
>       }
>  
>       if (large_request) {
> -             long authtype = 0;
> +             struct slot_results results;
>  
>               do {
> -                     err = probe_rpc(rpc);
> +                     err = probe_rpc(rpc, &results);
>               } while (err == HTTP_REAUTH);
>               if (err != HTTP_OK)
>                       return -1;
>  
> -#if LIBCURL_VERSION_NUM >= 0x070a08
> -             slot = get_active_slot();
> -             curl_easy_getinfo(slot->curl, CURLINFO_HTTPAUTH_AVAIL, 
> &authtype);
> -             if (authtype & CURLAUTH_GSSNEGOTIATE)
> +             if (results.authtype & CURLAUTH_GSSNEGOTIATE)
>                       needs_100_continue = 1;
> -#endif
>       }
>  
>       headers = curl_slist_append(headers, rpc->hdr_content_type);
> @@ -572,7 +572,7 @@ retry:
>       curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, rpc_in);
>       curl_easy_setopt(slot->curl, CURLOPT_FILE, rpc);
>  
> -     err = run_slot(slot);
> +     err = run_slot(slot, NULL);
>       if (err == HTTP_REAUTH && !large_request)
>               goto retry;
>       if (err != HTTP_OK)
> 
> That's note tested beyond compiling, but I think it should work. Feel
> free to squash it into your patch, or if you'd like, I can split out the
> refactoring steps with a commit message for you.

If you would split it out, that would be great.  Then I'll simply rebase
my patch on top of yours and go from there.

-- 
brian m. carlson / brian with sandals: Houston, Texas, US
+1 832 623 2791 | http://www.crustytoothpaste.net/~bmc | My opinion only
OpenPGP: RSA v4 4096b: 88AC E9B2 9196 305B A994 7552 F1BA 225C 0223 B187

Attachment: signature.asc
Description: Digital signature

Reply via email to