diff options
author | Daniel Stenberg <daniel@haxx.se> | 2018-08-05 11:51:07 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2018-09-08 15:36:11 +0200 |
commit | fb30ac5a2d63773c529c19259754e2b306ac2e2e (patch) | |
tree | 0e26d4e3f085a2f50b19f3eba53bafce509e3826 /lib/url.c | |
parent | 17ca0ccff4aeacc63bf7fa90314ea58d23464617 (diff) | |
download | curl-fb30ac5a2d63773c529c19259754e2b306ac2e2e.tar.gz |
URL-API
See header file and man pages for API. All documented API details work
and are tested in the 1560 test case.
Closes #2842
Diffstat (limited to 'lib/url.c')
-rw-r--r-- | lib/url.c | 44 |
1 files changed, 25 insertions, 19 deletions
@@ -1944,30 +1944,37 @@ static struct connectdata *allocate_conn(struct Curl_easy *data) return NULL; } -static CURLcode findprotocol(struct Curl_easy *data, - struct connectdata *conn, - const char *protostr) +/* returns the handdler if the given scheme is built-in */ +const struct Curl_handler *Curl_builtin_scheme(const char *scheme) { const struct Curl_handler * const *pp; const struct Curl_handler *p; - - /* Scan protocol handler table and match against 'protostr' to set a few - variables based on the URL. Now that the handler may be changed later - when the protocol specific setup function is called. */ - for(pp = protocols; (p = *pp) != NULL; pp++) { - if(strcasecompare(p->scheme, protostr)) { + /* Scan protocol handler table and match against 'scheme'. The handler may + be changed later when the protocol specific setup function is called. */ + for(pp = protocols; (p = *pp) != NULL; pp++) + if(strcasecompare(p->scheme, scheme)) /* Protocol found in table. Check if allowed */ - if(!(data->set.allowed_protocols & p->protocol)) - /* nope, get out */ - break; + return p; + return NULL; /* not found */ +} - /* it is allowed for "normal" request, now do an extra check if this is - the result of a redirect */ - if(data->state.this_is_a_follow && - !(data->set.redir_protocols & p->protocol)) - /* nope, get out */ - break; +static CURLcode findprotocol(struct Curl_easy *data, + struct connectdata *conn, + const char *protostr) +{ + const struct Curl_handler *p = Curl_builtin_scheme(protostr); + + if(p && /* Protocol found in table. Check if allowed */ + (data->set.allowed_protocols & p->protocol)) { + + /* it is allowed for "normal" request, now do an extra check if this is + the result of a redirect */ + if(data->state.this_is_a_follow && + !(data->set.redir_protocols & p->protocol)) + /* nope, get out */ + ; + else { /* Perform setup complement if some. */ conn->handler = conn->given = p; @@ -1976,7 +1983,6 @@ static CURLcode findprotocol(struct Curl_easy *data, } } - /* The protocol was not found in the table, but we don't have to assign it to anything since it is already assigned to a dummy-struct in the create_conn() function when the connectdata struct is allocated. */ |