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