From: Junio C Hamano Date: Wed, 28 Dec 2011 19:32:37 +0000 (-0800) Subject: Merge branch 'jk/maint-push-over-dav' into maint X-Git-Tag: v1.7.8.2~14 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/f1c12e1b4af2eec4eefff9350b74601b36f51d85?ds=inline;hp=-c Merge branch 'jk/maint-push-over-dav' into maint * jk/maint-push-over-dav: http-push: enable "proactive auth" t5540: test DAV push with authentication --- f1c12e1b4af2eec4eefff9350b74601b36f51d85 diff --combined http.c index 44fcc4d178,7e454f7787..5a10473459 --- a/http.c +++ b/http.c @@@ -4,6 -4,7 +4,6 @@@ #include "run-command.h" #include "url.h" -int data_received; int active_requests; int http_is_verbose; size_t http_post_buffer = 16 * LARGE_PACKET_MAX; @@@ -42,6 -43,7 +42,7 @@@ static int curl_ftp_no_epsv static const char *curl_http_proxy; static const char *curl_cookie_file; static char *user_name, *user_pass, *description; + static int http_proactive_auth; static const char *user_agent; #if LIBCURL_VERSION_NUM >= 0x071700 @@@ -98,11 -100,13 +99,11 @@@ size_t fwrite_buffer(char *ptr, size_t struct strbuf *buffer = buffer_; strbuf_add(buffer, ptr, size); - data_received++; return size; } size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf) { - data_received++; return eltsize * nmemb; } @@@ -276,6 -280,9 +277,9 @@@ static CURL *get_curl_handle(void curl_easy_setopt(result, CURLOPT_HTTPAUTH, CURLAUTH_ANY); #endif + if (http_proactive_auth) + init_curl_http_auth(result); + if (ssl_cert != NULL) curl_easy_setopt(result, CURLOPT_SSLCERT, ssl_cert); if (has_cert_password()) @@@ -364,7 -371,7 +368,7 @@@ static void set_from_env(const char **v *var = val; } - void http_init(struct remote *remote, const char *url) + void http_init(struct remote *remote, const char *url, int proactive_auth) { char *low_speed_limit; char *low_speed_time; @@@ -375,6 -382,8 +379,8 @@@ curl_global_init(CURL_GLOBAL_ALL); + http_proactive_auth = proactive_auth; + if (remote && remote->http_proxy) curl_http_proxy = xstrdup(remote->http_proxy); @@@ -533,6 -542,7 +539,6 @@@ struct active_request_slot *get_active_ active_requests++; slot->in_use = 1; - slot->local = NULL; slot->results = NULL; slot->finished = NULL; slot->callback_data = NULL; @@@ -636,6 -646,8 +642,6 @@@ void step_active_slots(void void run_active_slot(struct active_request_slot *slot) { #ifdef USE_CURL_MULTI - long last_pos = 0; - long current_pos; fd_set readfds; fd_set writefds; fd_set excfds; @@@ -645,33 -657,25 +651,33 @@@ slot->finished = &finished; while (!finished) { - data_received = 0; step_active_slots(); - if (!data_received && slot->local != NULL) { - current_pos = ftell(slot->local); - if (current_pos > last_pos) - data_received++; - last_pos = current_pos; - } + if (slot->in_use) { +#if LIBCURL_VERSION_NUM >= 0x070f04 + long curl_timeout; + curl_multi_timeout(curlm, &curl_timeout); + if (curl_timeout == 0) { + continue; + } else if (curl_timeout == -1) { + select_timeout.tv_sec = 0; + select_timeout.tv_usec = 50000; + } else { + select_timeout.tv_sec = curl_timeout / 1000; + select_timeout.tv_usec = (curl_timeout % 1000) * 1000; + } +#else + select_timeout.tv_sec = 0; + select_timeout.tv_usec = 50000; +#endif - if (slot->in_use && !data_received) { - max_fd = 0; + max_fd = -1; FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&excfds); - select_timeout.tv_sec = 0; - select_timeout.tv_usec = 50000; - select(max_fd, &readfds, &writefds, - &excfds, &select_timeout); + curl_multi_fdset(curlm, &readfds, &writefds, &excfds, &max_fd); + + select(max_fd+1, &readfds, &writefds, &excfds, &select_timeout); } } #else @@@ -816,6 -820,7 +822,6 @@@ static int http_request(const char *url headers = curl_slist_append(headers, buf.buf); strbuf_reset(&buf); } - slot->local = result; } else curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer); @@@ -863,6 -868,7 +869,6 @@@ ret = HTTP_START_FAILED; } - slot->local = NULL; curl_slist_free_all(headers); strbuf_release(&buf); @@@ -1057,6 -1063,7 +1063,6 @@@ void release_http_pack_request(struct h if (preq->packfile != NULL) { fclose(preq->packfile); preq->packfile = NULL; - preq->slot->local = NULL; } if (preq->range_header != NULL) { curl_slist_free_all(preq->range_header); @@@ -1078,6 -1085,7 +1084,6 @@@ int finish_http_pack_request(struct htt fclose(preq->packfile); preq->packfile = NULL; - preq->slot->local = NULL; lst = preq->lst; while (*lst != p) @@@ -1146,6 -1154,7 +1152,6 @@@ struct http_pack_request *new_http_pack } preq->slot = get_active_slot(); - preq->slot->local = preq->packfile; curl_easy_setopt(preq->slot->curl, CURLOPT_FILE, preq->packfile); curl_easy_setopt(preq->slot->curl, CURLOPT_WRITEFUNCTION, fwrite); curl_easy_setopt(preq->slot->curl, CURLOPT_URL, preq->url); @@@ -1202,6 -1211,7 +1208,6 @@@ static size_t fwrite_sha1_file(char *pt git_SHA1_Update(&freq->c, expn, sizeof(expn) - freq->stream.avail_out); } while (freq->stream.avail_in && freq->zret == Z_OK); - data_received++; return size; } diff --combined http.h index ee1606942a,51f6ba73ba..0b61653894 --- a/http.h +++ b/http.h @@@ -49,6 -49,7 +49,6 @@@ struct slot_results struct active_request_slot { CURL *curl; - FILE *local; int in_use; CURLcode curl_result; long http_code; @@@ -85,9 -86,11 +85,10 @@@ extern void add_fill_function(void *dat extern void step_active_slots(void); #endif - extern void http_init(struct remote *remote, const char *url); + extern void http_init(struct remote *remote, const char *url, + int proactive_auth); extern void http_cleanup(void); -extern int data_received; extern int active_requests; extern int http_is_verbose; extern size_t http_post_buffer; diff --combined remote-curl.c index 94dc4886d0,0757b19a80..6a352de7be --- a/remote-curl.c +++ b/remote-curl.c @@@ -200,7 -200,7 +200,7 @@@ static struct ref *parse_git_refs(struc if (start_async(&async)) die("cannot start thread to parse advertised refs"); - get_remote_heads(async.out, &list, 0, NULL, 0, NULL); + get_remote_heads(async.out, &list, 0, NULL); close(async.out); if (finish_async(&async)) die("ref parsing thread failed"); @@@ -859,7 -859,7 +859,7 @@@ int main(int argc, const char **argv url = strbuf_detach(&buf, NULL); - http_init(remote, url); + http_init(remote, url, 0); do { if (strbuf_getline(&buf, stdin, '\n') == EOF) {