http: factor out curl result code normalization
We make some requests with CURLOPT_FAILONERROR and some without, and then handle_curl_result() normalizes any failures to a uniform CURLcode. There are some other code paths in the dumb-http walker which don't use handle_curl_result(); let's pull the normalization into its own function so it can be reused. Arguably those code paths would benefit from the rest of handle_curl_result(), notably the auth handling. But retro-fitting it now would be a lot of work, and in practice it doesn't matter too much (whatever authentication we needed to make the initial contact with the server is generally sufficient for the rest of the dumb-http requests). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Mar 24, 2019 at 08:08 UTC
a3722bcbbd850bf02aea19d58de112ef513cb2f1
2 files changed
+21
-6
http.c
+12
-6
@@ -1544,7 +1544,8 @@ char *get_remote_object_url(const char *url, const char *hex,
1544
return strbuf_detach(&buf, NULL);
1545
}
1546
1547
-static int handle_curl_result(struct slot_results *results)
1547
+void normalize_curl_result(CURLcode *result, long http_code,
1548
+ char *errorstr, size_t errorlen)
1549
{
1550
/*
1551
* If we see a failing http code with CURLE_OK, we have turned off
@@ -1554,19 +1555,24 @@ static int handle_curl_result(struct slot_results *results)
1555
* Likewise, if we see a redirect (30x code), that means we turned off
1556
* redirect-following, and we should treat the result as an error.
1557
*/
1557
- if (results->curl_result == CURLE_OK &&
1558
- results->http_code >= 300) {
1559
- results->curl_result = CURLE_HTTP_RETURNED_ERROR;
1558
+ if (*result == CURLE_OK && http_code >= 300) {
1559
+ *result = CURLE_HTTP_RETURNED_ERROR;
1560
/*
1561
* Normally curl will already have put the "reason phrase"
1562
* from the server into curl_errorstr; unfortunately without
1563
* FAILONERROR it is lost, so we can give only the numeric
1564
* status code.
1565
*/
1566
- xsnprintf(curl_errorstr, sizeof(curl_errorstr),
1566
+ xsnprintf(errorstr, errorlen,
1567
"The requested URL returned error: %ld",
1568
- results->http_code);
1568
+ http_code);
1569
}
1570
+}
1571
+
1572
+static int handle_curl_result(struct slot_results *results)
1573
+{
1574
+ normalize_curl_result(&results->curl_result, results->http_code,
1575
+ curl_errorstr, sizeof(curl_errorstr));
1576
1577
if (results->curl_result == CURLE_OK) {
1578
credential_approve(&http_auth);
http.h
+9
@@ -136,6 +136,15 @@ static inline int missing__target(int code, int result)
136
137
#define missing_target(a) missing__target((a)->http_code, (a)->curl_result)
138
139
+/*
140
+ * Normalize curl results to handle CURL_FAILONERROR (or lack thereof). Failing
141
+ * http codes have their "result" converted to CURLE_HTTP_RETURNED_ERROR, and
142
+ * an appropriate string placed in the errorstr buffer (pass curl_errorstr if
143
+ * you don't have a custom buffer).
144
+ */
145
+void normalize_curl_result(CURLcode *result, long http_code, char *errorstr,
146
+ size_t errorlen);
147
+
148
/* Helpers for modifying and creating URLs */
149
extern void append_remote_object_url(struct strbuf *buf, const char *url,
150
const char *hex,