curl: Replace spaces in URIs with %20
authorTobias Brunner <tobias@strongswan.org>
Fri, 22 Nov 2013 09:42:18 +0000 (10:42 +0100)
committerTobias Brunner <tobias@strongswan.org>
Thu, 23 Jan 2014 09:19:30 +0000 (10:19 +0100)
cURL requires the URIs to be URL-encoded. Apparently, some CAs encode CRL
URIs with spaces in them.

Fixes #454.

src/libstrongswan/plugins/curl/curl_fetcher.c

index a8cca98..644f277 100644 (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,
        private_curl_fetcher_t *this, char *uri, void *userdata)
 {
-       char error[CURL_ERROR_SIZE];
+       char error[CURL_ERROR_SIZE], *enc_uri;
        status_t status;
        cb_data_t data = {
                .cb = this->cb,
@@ -92,9 +92,14 @@ METHOD(fetcher_t, fetch, status_t,
                *(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 */
-               return NOT_SUPPORTED;
+               status = NOT_SUPPORTED;
+               goto out;
        }
        curl_easy_setopt(this->curl, CURLOPT_ERRORBUFFER, error);
        curl_easy_setopt(this->curl, CURLOPT_FAILONERROR, TRUE);
@@ -125,6 +130,12 @@ METHOD(fetcher_t, fetch, status_t,
                        status = FAILED;
                        break;
        }
+
+out:
+       if (enc_uri != uri)
+       {
+               free(enc_uri);
+       }
        return status;
 }