diff options
| -rw-r--r-- | http-push.c | 88 | ||||
| -rw-r--r-- | http-walker.c | 80 | ||||
| -rw-r--r-- | http.c | 82 | ||||
| -rw-r--r-- | http.h | 2 | 
4 files changed, 89 insertions, 163 deletions
| diff --git a/http-push.c b/http-push.c index af00ea10b9..64be904921 100644 --- a/http-push.c +++ b/http-push.c @@ -1067,88 +1067,6 @@ static int fetch_indices(void)  	return 0;  } -static inline int needs_quote(int ch) -{ -	if (((ch >= 'A') && (ch <= 'Z')) -			|| ((ch >= 'a') && (ch <= 'z')) -			|| ((ch >= '0') && (ch <= '9')) -			|| (ch == '/') -			|| (ch == '-') -			|| (ch == '.')) -		return 0; -	return 1; -} - -static inline int hex(int v) -{ -	if (v < 10) return '0' + v; -	else return 'A' + v - 10; -} - -static char *quote_ref_url(const char *base, const char *ref) -{ -	const char *cp; -	char *dp, *qref; -	int len, baselen, ch; - -	baselen = strlen(base); -	len = baselen + 1; -	for (cp = ref; (ch = *cp) != 0; cp++, len++) -		if (needs_quote(ch)) -			len += 2; /* extra two hex plus replacement % */ -	qref = xmalloc(len); -	memcpy(qref, base, baselen); -	for (cp = ref, dp = qref + baselen; (ch = *cp) != 0; cp++) { -		if (needs_quote(ch)) { -			*dp++ = '%'; -			*dp++ = hex((ch >> 4) & 0xF); -			*dp++ = hex(ch & 0xF); -		} -		else -			*dp++ = ch; -	} -	*dp = 0; - -	return qref; -} - -int fetch_ref(char *ref, unsigned char *sha1) -{ -	char *url; -	struct strbuf buffer = STRBUF_INIT; -	char *base = remote->url; -	struct active_request_slot *slot; -	struct slot_results results; -	int ret; - -	url = quote_ref_url(base, ref); -	slot = get_active_slot(); -	slot->results = &results; -	curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer); -	curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer); -	curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, NULL); -	curl_easy_setopt(slot->curl, CURLOPT_URL, url); -	if (start_active_slot(slot)) { -		run_active_slot(slot); -		if (results.curl_result == CURLE_OK) { -			strbuf_rtrim(&buffer); -			if (buffer.len == 40) -				ret = get_sha1_hex(buffer.buf, sha1); -			else -				ret = 1; -		} else { -			ret = error("Couldn't get %s for %s\n%s", -				    url, ref, curl_errorstr); -		} -	} else { -		ret = error("Unable to start request"); -	} - -	strbuf_release(&buffer); -	free(url); -	return ret; -} -  static void one_remote_object(const char *hex)  {  	unsigned char sha1[20]; @@ -1834,7 +1752,8 @@ static void one_remote_ref(char *refname)  	struct object *obj;  	int len = strlen(refname) + 1; -	if (fetch_ref(refname, remote_sha1) != 0) { +	if (http_fetch_ref(remote->url, refname + 5 /* "refs/" */, +			   remote_sha1) != 0) {  		fprintf(stderr,  			"Unable to fetch ref %s from %s\n",  			refname, remote->url); @@ -1966,7 +1885,8 @@ static void add_remote_info_ref(struct remote_ls_ctx *ls)  	int len;  	char *ref_info; -	if (fetch_ref(ls->dentry_name, remote_sha1) != 0) { +	if (http_fetch_ref(remote->url, ls->dentry_name + 5 /* "refs/" */, +			   remote_sha1) != 0) {  		fprintf(stderr,  			"Unable to fetch ref %s from %s\n",  			ls->dentry_name, remote->url); diff --git a/http-walker.c b/http-walker.c index 4e878b3c8f..2c3786870e 100644 --- a/http-walker.c +++ b/http-walker.c @@ -888,88 +888,10 @@ static int fetch(struct walker *walker, unsigned char *sha1)  		     data->alt->base);  } -static inline int needs_quote(int ch) -{ -	if (((ch >= 'A') && (ch <= 'Z')) -			|| ((ch >= 'a') && (ch <= 'z')) -			|| ((ch >= '0') && (ch <= '9')) -			|| (ch == '/') -			|| (ch == '-') -			|| (ch == '.')) -		return 0; -	return 1; -} - -static inline int hex(int v) -{ -	if (v < 10) return '0' + v; -	else return 'A' + v - 10; -} - -static char *quote_ref_url(const char *base, const char *ref) -{ -	const char *cp; -	char *dp, *qref; -	int len, baselen, ch; - -	baselen = strlen(base); -	len = baselen + 7; /* "/refs/" + NUL */ -	for (cp = ref; (ch = *cp) != 0; cp++, len++) -		if (needs_quote(ch)) -			len += 2; /* extra two hex plus replacement % */ -	qref = xmalloc(len); -	memcpy(qref, base, baselen); -	memcpy(qref + baselen, "/refs/", 6); -	for (cp = ref, dp = qref + baselen + 6; (ch = *cp) != 0; cp++) { -		if (needs_quote(ch)) { -			*dp++ = '%'; -			*dp++ = hex((ch >> 4) & 0xF); -			*dp++ = hex(ch & 0xF); -		} -		else -			*dp++ = ch; -	} -	*dp = 0; - -	return qref; -} -  static int fetch_ref(struct walker *walker, char *ref, unsigned char *sha1)  { -	char *url; -	struct strbuf buffer = STRBUF_INIT;  	struct walker_data *data = walker->data; -	const char *base = data->alt->base; -	struct active_request_slot *slot; -	struct slot_results results; -	int ret; - -	url = quote_ref_url(base, ref); -	slot = get_active_slot(); -	slot->results = &results; -	curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer); -	curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer); -	curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, NULL); -	curl_easy_setopt(slot->curl, CURLOPT_URL, url); -	if (start_active_slot(slot)) { -		run_active_slot(slot); -		if (results.curl_result == CURLE_OK) { -			strbuf_rtrim(&buffer); -			if (buffer.len == 40) -				ret = get_sha1_hex(buffer.buf, sha1); -			else -				ret = 1; -		} else { -			ret = error("Couldn't get %s for %s\n%s", -				    url, ref, curl_errorstr); -		} -	} else { -		ret = error("Unable to start request"); -	} - -	strbuf_release(&buffer); -	free(url); -	return ret; +	return http_fetch_ref(data->alt->base, ref, sha1);  }  static void cleanup(struct walker *walker) @@ -552,3 +552,85 @@ void finish_all_active_slots(void)  			slot = slot->next;  		}  } + +static inline int needs_quote(int ch) +{ +	if (((ch >= 'A') && (ch <= 'Z')) +			|| ((ch >= 'a') && (ch <= 'z')) +			|| ((ch >= '0') && (ch <= '9')) +			|| (ch == '/') +			|| (ch == '-') +			|| (ch == '.')) +		return 0; +	return 1; +} + +static inline int hex(int v) +{ +	if (v < 10) return '0' + v; +	else return 'A' + v - 10; +} + +static char *quote_ref_url(const char *base, const char *ref) +{ +	const char *cp; +	char *dp, *qref; +	int len, baselen, ch; + +	baselen = strlen(base); +	len = baselen + 7; /* "/refs/" + NUL */ +	for (cp = ref; (ch = *cp) != 0; cp++, len++) +		if (needs_quote(ch)) +			len += 2; /* extra two hex plus replacement % */ +	qref = xmalloc(len); +	memcpy(qref, base, baselen); +	memcpy(qref + baselen, "/refs/", 6); +	for (cp = ref, dp = qref + baselen + 6; (ch = *cp) != 0; cp++) { +		if (needs_quote(ch)) { +			*dp++ = '%'; +			*dp++ = hex((ch >> 4) & 0xF); +			*dp++ = hex(ch & 0xF); +		} +		else +			*dp++ = ch; +	} +	*dp = 0; + +	return qref; +} + +int http_fetch_ref(const char *base, const char *ref, unsigned char *sha1) +{ +	char *url; +	struct strbuf buffer = STRBUF_INIT; +	struct active_request_slot *slot; +	struct slot_results results; +	int ret; + +	url = quote_ref_url(base, ref); +	slot = get_active_slot(); +	slot->results = &results; +	curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer); +	curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer); +	curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, NULL); +	curl_easy_setopt(slot->curl, CURLOPT_URL, url); +	if (start_active_slot(slot)) { +		run_active_slot(slot); +		if (results.curl_result == CURLE_OK) { +			strbuf_rtrim(&buffer); +			if (buffer.len == 40) +				ret = get_sha1_hex(buffer.buf, sha1); +			else +				ret = 1; +		} else { +			ret = error("Couldn't get %s for %s\n%s", +				    url, ref, curl_errorstr); +		} +	} else { +		ret = error("Unable to start request"); +	} + +	strbuf_release(&buffer); +	free(url); +	return ret; +} @@ -96,4 +96,6 @@ static inline int missing__target(int code, int result)  #define missing_target(a) missing__target((a)->http_code, (a)->curl_result) +extern int http_fetch_ref(const char *base, const char *ref, unsigned char *sha1); +  #endif /* HTTP_H */ | 
