aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ldap.c2
-rw-r--r--lib/url.c51
-rw-r--r--lib/urldata.h1
-rw-r--r--tests/data/test5232
4 files changed, 30 insertions, 26 deletions
diff --git a/lib/ldap.c b/lib/ldap.c
index 0152e668c..ec9252f56 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -200,7 +200,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
}
/* Get the URL scheme ( either ldap or ldaps ) */
- if(Curl_raw_equal(conn->protostr, "LDAPS"))
+ if(conn->protocol & PROT_SSL)
ldap_ssl = 1;
infof(data, "LDAP local: trying to establish %s connection\n",
ldap_ssl ? "encrypted" : "cleartext");
diff --git a/lib/url.c b/lib/url.c
index 6e35b666f..b85129a62 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -2752,7 +2752,7 @@ ConnectionExists(struct SessionHandle *data,
it is a non-SSL protocol tunneled over the same http proxy name and
port number */
- if(Curl_raw_equal(needle->protostr, check->protostr) &&
+ if(Curl_raw_equal(needle->handler->scheme, check->handler->scheme) &&
Curl_raw_equal(needle->host.name, check->host.name) &&
(needle->remote_port == check->remote_port) ) {
if(needle->protocol & PROT_SSL) {
@@ -3256,7 +3256,8 @@ static struct connectdata *allocate_conn(void)
}
static CURLcode findprotocol(struct SessionHandle *data,
- struct connectdata *conn)
+ struct connectdata *conn,
+ const char *protostr)
{
const struct Curl_handler * const *pp;
const struct Curl_handler *p;
@@ -3265,7 +3266,7 @@ static CURLcode findprotocol(struct SessionHandle *data,
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(Curl_raw_equal(p->scheme, conn->protostr)) {
+ if(Curl_raw_equal(p->scheme, protostr)) {
/* Protocol found in table. Check if allowed */
if(!(data->set.allowed_protocols & p->protocol))
/* nope, get out */
@@ -3292,7 +3293,7 @@ static CURLcode findprotocol(struct SessionHandle *data,
to anything since it is already assigned to a dummy-struct in the
create_conn() function when the connectdata struct is allocated. */
failf(data, "Protocol %s not supported or disabled in " LIBCURL_NAME,
- conn->protostr);
+ protostr);
return CURLE_UNSUPPORTED_PROTOCOL;
}
@@ -3307,6 +3308,8 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
char *tmp;
char *path = data->state.path;
int rc;
+ char protobuf[16];
+ const char *protop;
/*************************************************************
* Parse the URL.
@@ -3317,8 +3320,8 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
* url ...
************************************************************/
if((2 == sscanf(data->change.url, "%15[^:]:%[^\n]",
- conn->protostr,
- path)) && Curl_raw_equal(conn->protostr, "file")) {
+ protobuf, path)) &&
+ Curl_raw_equal(protobuf, "file")) {
if(path[0] == '/' && path[1] == '/') {
/* Allow omitted hostname (e.g. file:/<path>). This is not strictly
* speaking a valid file: URL by RFC 1738, but treating file:/<path> as
@@ -3364,7 +3367,7 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
}
}
- strcpy(conn->protostr, "file"); /* store protocol string lowercase */
+ protop = "file"; /* protocol string */
}
else {
/* clear path */
@@ -3372,7 +3375,7 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
if(2 > sscanf(data->change.url,
"%15[^\n:]://%[^\n/]%[^\n]",
- conn->protostr,
+ protobuf,
conn->host.name, path)) {
/*
@@ -3404,19 +3407,21 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
* lib/version.c too! */
if(checkprefix("FTP.", conn->host.name))
- strcpy(conn->protostr, "ftp");
+ protop = "ftp";
else if(checkprefix("DICT.", conn->host.name))
- strcpy(conn->protostr, "DICT");
+ protop = "DICT";
else if(checkprefix("LDAP.", conn->host.name))
- strcpy(conn->protostr, "LDAP");
+ protop = "LDAP";
else if(checkprefix("IMAP.", conn->host.name))
- strcpy(conn->protostr, "IMAP");
+ protop = "IMAP";
else {
- strcpy(conn->protostr, "http");
+ protop = "http";
}
conn->protocol |= PROT_MISSING; /* not given in URL */
}
+ else
+ protop = protobuf;
}
/* We search for '?' in the host name (but only on the right side of a
@@ -3493,12 +3498,12 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
/*
* So if the URL was A://B/C,
- * conn->protostr is A
+ * protop is A
* conn->host.name is B
* data->state.path is /C
*/
- return findprotocol(data, conn);
+ return findprotocol(data, conn, protop);
}
static void llist_dtor(void *user, void *element)
@@ -3685,7 +3690,7 @@ static char *detect_proxy(struct connectdata *conn)
if(!check_noproxy(conn->host.name, no_proxy)) {
/* It was not listed as without proxy */
- char *protop = conn->protostr;
+ const char *protop = conn->handler->scheme;
char *envp = proxy_env;
char *prox;
@@ -4036,18 +4041,18 @@ static CURLcode parse_remote_port(struct SessionHandle *data,
if(conn->bits.httpproxy) {
/* we need to create new URL with the new port number */
char *url;
- bool isftp = (bool)(Curl_raw_equal("ftp", conn->protostr) ||
- Curl_raw_equal("ftps", conn->protostr));
+ /* FTPS connections have the FTP bit set too, so they match as well */
+ bool isftp = (bool)conn->protocol & PROT_FTP;
/*
* This synthesized URL isn't always right--suffixes like ;type=A
* are stripped off. It would be better to work directly from the
* original URL and simply replace the port part of it.
*/
- url = aprintf("%s://%s%s%s:%d%s%s", conn->protostr,
- conn->bits.ipv6_ip?"[":"", conn->host.name,
- conn->bits.ipv6_ip?"]":"", conn->remote_port,
- isftp?"/":"", data->state.path);
+ url = aprintf("%s://%s%s%s:%d%s%s", conn->handler->scheme,
+ conn->bits.ipv6_ip?"[":"", conn->host.name,
+ conn->bits.ipv6_ip?"]":"", conn->remote_port,
+ isftp?"/":"", data->state.path);
if(!url)
return CURLE_OUT_OF_MEMORY;
@@ -4456,7 +4461,7 @@ static CURLcode create_conn(struct SessionHandle *data,
part added so that we have a valid URL. */
char *reurl;
- reurl = aprintf("%s://%s", conn->protostr, data->change.url);
+ reurl = aprintf("%s://%s", conn->handler->scheme, data->change.url);
if(!reurl) {
Curl_safefree(proxy);
diff --git a/lib/urldata.h b/lib/urldata.h
index 0d0128a32..8107a9e8f 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -703,7 +703,6 @@ struct connectdata {
unsigned int scope; /* address scope for IPv6 */
- char protostr[16]; /* store the protocol string in this buffer */
int socktype; /* SOCK_STREAM or SOCK_DGRAM */
struct hostname host;
diff --git a/tests/data/test523 b/tests/data/test523
index 4c67cdbd8..6c1efbd5d 100644
--- a/tests/data/test523
+++ b/tests/data/test523
@@ -50,7 +50,7 @@ http://www.haxx.se:999/523 http://%HOSTIP:%HTTPPORT
^User-Agent:.*
</strip>
<protocol>
-GET http://www.haxx.se:19999/523 HTTP/1.1
+GET HTTP://www.haxx.se:19999/523 HTTP/1.1
Authorization: Basic eHh4Onl5eQ==
Host: www.haxx.se:19999
Accept: */*