curl: Replace spaces in URIs with %20

cURL requires the URIs to be URL-encoded. Apparently, some CAs encode CRL
URIs with spaces in them.

Fixes #454.
This commit is contained in:
Tobias Brunner 2013-11-22 10:42:18 +01:00
parent ccb6758e5b
commit 72a92d4f7d

View File

@ -80,7 +80,7 @@ static size_t curl_cb(void *ptr, size_t size, size_t nmemb, cb_data_t *data)
METHOD(fetcher_t, fetch, status_t, METHOD(fetcher_t, fetch, status_t,
private_curl_fetcher_t *this, char *uri, void *userdata) private_curl_fetcher_t *this, char *uri, void *userdata)
{ {
char error[CURL_ERROR_SIZE]; char error[CURL_ERROR_SIZE], *enc_uri;
status_t status; status_t status;
cb_data_t data = { cb_data_t data = {
.cb = this->cb, .cb = this->cb,
@ -92,9 +92,14 @@ METHOD(fetcher_t, fetch, status_t,
*(chunk_t*)userdata = chunk_empty; *(chunk_t*)userdata = chunk_empty;
} }
if (curl_easy_setopt(this->curl, CURLOPT_URL, uri) != CURLE_OK) /* the URI has to be URL-encoded, we only replace spaces as replacing other
* characters (e.g. '/' or ':') would render the URI invalid */
enc_uri = strreplace(uri, " ", "%20");
if (curl_easy_setopt(this->curl, CURLOPT_URL, enc_uri) != CURLE_OK)
{ /* URL type not supported by curl */ { /* URL type not supported by curl */
return NOT_SUPPORTED; status = NOT_SUPPORTED;
goto out;
} }
curl_easy_setopt(this->curl, CURLOPT_ERRORBUFFER, error); curl_easy_setopt(this->curl, CURLOPT_ERRORBUFFER, error);
curl_easy_setopt(this->curl, CURLOPT_FAILONERROR, TRUE); curl_easy_setopt(this->curl, CURLOPT_FAILONERROR, TRUE);
@ -125,6 +130,12 @@ METHOD(fetcher_t, fetch, status_t,
status = FAILED; status = FAILED;
break; break;
} }
out:
if (enc_uri != uri)
{
free(enc_uri);
}
return status; return status;
} }