diff --git a/CHANGES b/CHANGES index 9b1fd6127..b70d3d77b 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,10 @@ Changelog Daniel (18 April 2005) +- Olivier reported that even though he used CURLOPT_PORT, libcurl clearly + still used the default port. He was right. I fixed the problem and added the + test cases 521, 522 and 523 to verify the fix. + - Toshiyuki Maezawa reported that when doing a POST with a read callback, libcurl didn't properly send an Expect: 100-continue header. It does now. diff --git a/lib/url.c b/lib/url.c index 7174e8cf0..12597311a 100644 --- a/lib/url.c +++ b/lib/url.c @@ -2707,8 +2707,7 @@ static CURLcode CreateConnection(struct SessionHandle *data, if (strequal(conn->protostr, "HTTP")) { #ifndef CURL_DISABLE_HTTP - conn->port = (data->set.use_port && data->state.allow_port)? - data->set.use_port:PORT_HTTP; + conn->port = PORT_HTTP; conn->remote_port = PORT_HTTP; conn->protocol |= PROT_HTTP; conn->curl_do = Curl_http; @@ -2724,8 +2723,7 @@ static CURLcode CreateConnection(struct SessionHandle *data, else if (strequal(conn->protostr, "HTTPS")) { #if defined(USE_SSL) && !defined(CURL_DISABLE_HTTP) - conn->port = (data->set.use_port && data->state.allow_port)? - data->set.use_port:PORT_HTTPS; + conn->port = PORT_HTTPS; conn->remote_port = PORT_HTTPS; conn->protocol |= PROT_HTTP|PROT_HTTPS|PROT_SSL; @@ -2742,8 +2740,7 @@ static CURLcode CreateConnection(struct SessionHandle *data, } else if (strequal(conn->protostr, "GOPHER")) { #ifndef CURL_DISABLE_GOPHER - conn->port = (data->set.use_port && data->state.allow_port)? - data->set.use_port:PORT_GOPHER; + conn->port = PORT_GOPHER; conn->remote_port = PORT_GOPHER; /* Skip // in path if present */ if (isdigit((int)conn->path[1])) { @@ -2779,8 +2776,7 @@ static CURLcode CreateConnection(struct SessionHandle *data, #endif /* !USE_SSL */ } - conn->port = (data->set.use_port && data->state.allow_port)? - data->set.use_port:port; + conn->port = port; conn->remote_port = port; conn->protocol |= PROT_FTP; @@ -2852,8 +2848,7 @@ static CURLcode CreateConnection(struct SessionHandle *data, /* telnet testing factory */ conn->protocol |= PROT_TELNET; - conn->port = (data->set.use_port && data->state.allow_port)? - data->set.use_port: PORT_TELNET; + conn->port = PORT_TELNET; conn->remote_port = PORT_TELNET; conn->curl_do = Curl_telnet; conn->curl_done = Curl_telnet_done; @@ -2865,8 +2860,7 @@ static CURLcode CreateConnection(struct SessionHandle *data, else if (strequal(conn->protostr, "DICT")) { #ifndef CURL_DISABLE_DICT conn->protocol |= PROT_DICT; - conn->port = (data->set.use_port && data->state.allow_port)? - data->set.use_port:PORT_DICT; + conn->port = PORT_DICT; conn->remote_port = PORT_DICT; conn->curl_do = Curl_dict; conn->curl_done = NULL; /* no DICT-specific done */ @@ -2878,8 +2872,7 @@ static CURLcode CreateConnection(struct SessionHandle *data, else if (strequal(conn->protostr, "LDAP")) { #ifndef CURL_DISABLE_LDAP conn->protocol |= PROT_LDAP; - conn->port = (data->set.use_port && data->state.allow_port)? - data->set.use_port:PORT_LDAP; + conn->port = PORT_LDAP; conn->remote_port = PORT_LDAP; conn->curl_do = Curl_ldap; conn->curl_done = NULL; /* no LDAP-specific done */ @@ -3092,7 +3085,31 @@ static CURLcode CreateConnection(struct SessionHandle *data, else tmp = strrchr(conn->host.name, ':'); - if (tmp) { + if(data->set.use_port && data->state.allow_port) { + /* if set, we use this and ignore the port possibly given in the URL */ + conn->remote_port = data->set.use_port; + if(tmp) + *tmp = '\0'; /* cut off the name there anyway - if there was a port + number - since the port number is to be ignored! */ + if(conn->bits.httpproxy) { + /* we need to create new URL with the new port number */ + char *url; + + url = aprintf("http://%s:%d%s", conn->host.name, conn->remote_port, + conn->path); + if(!url) + return CURLE_OUT_OF_MEMORY; + + if(data->change.url_alloc) + free(data->change.url); + + data->change.url = url; + data->change.url_alloc = TRUE; + } + } + else if (tmp) { + /* no CURLOPT_PORT given, extract the one from the URL */ + char *rest; unsigned long port; diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index a1e455efa..0826e2894 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -34,7 +34,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test199 test225 test226 test227 test230 test231 test232 test228 \ test229 test233 test234 test235 test236 test520 test237 test238 \ test239 test243 test245 test246 test247 test248 test249 test250 \ - test251 test252 test253 test254 test255 + test251 test252 test253 test254 test255 test521 test522 test523 # The following tests have been removed from the dist since they no longer # work. We need to fix the test suite's FTPS server first, then bring them diff --git a/tests/data/test521 b/tests/data/test521 new file mode 100644 index 000000000..b3aad9646 --- /dev/null +++ b/tests/data/test521 @@ -0,0 +1,59 @@ + + +FTP +PASV +CURLOPT_PORT + + +# +# Server-side + + +total 20 +drwxr-xr-x 8 98 98 512 Oct 22 13:06 . +drwxr-xr-x 8 98 98 512 Oct 22 13:06 .. +drwxr-xr-x 2 98 98 512 May 2 1996 .NeXT +-r--r--r-- 1 0 1 35 Jul 16 1996 README +lrwxrwxrwx 1 0 1 7 Dec 9 1999 bin -> usr/bin +dr-xr-xr-x 2 0 1 512 Oct 1 1997 dev +drwxrwxrwx 2 98 98 512 May 29 16:04 download.html +dr-xr-xr-x 2 0 1 512 Nov 30 1995 etc +drwxrwxrwx 2 98 1 512 Oct 30 14:33 pub +dr-xr-xr-x 5 0 1 512 Oct 1 1997 usr + + + +# +# Client-side + + +ftp + + +lib521 + + +FTP dir list PASV with CURLOPT_PORT + + +ftp://%HOSTIP/520/ %FTPPORT + + + +# +# Verify data after the test has been "shot" + + +filter off really nothing + + +USER xxx +PASS yyy +PWD +CWD 520 +EPSV +TYPE A +LIST +QUIT + + diff --git a/tests/data/test522 b/tests/data/test522 new file mode 100644 index 000000000..ceff5ecb8 --- /dev/null +++ b/tests/data/test522 @@ -0,0 +1,59 @@ + + +HTTP +HTTP GET +CURLOPT_PORT + + + +# +# Server-side + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 + +hello + + + +# +# Client-side + + +http + + +lib521 + + +HTTP GET with CURLOPT_PORT + + +http://%HOSTIP/522 %HTTPPORT + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /522 HTTP/1.1 +Authorization: Basic eHh4Onl5eQ== +Host: 127.0.0.1:%HTTPPORT +Pragma: no-cache +Accept: */* + + + +hello + + diff --git a/tests/libtest/Makefile.am b/tests/libtest/Makefile.am index acdeb5501..ccbe2aa16 100644 --- a/tests/libtest/Makefile.am +++ b/tests/libtest/Makefile.am @@ -40,7 +40,7 @@ SUPPORTFILES = first.c test.h # These are all libcurl test programs noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506 lib507 \ lib508 lib509 lib510 lib511 lib512 lib513 lib514 lib515 lib516 lib517 \ - lib518 lib519 lib520 + lib518 lib519 lib520 lib521 lib523 lib500_SOURCES = lib500.c $(SUPPORTFILES) lib500_LDADD = $(LIBDIR)/libcurl.la @@ -125,3 +125,11 @@ lib519_DEPENDENCIES = $(LIBDIR)/libcurl.la lib520_SOURCES = lib520.c $(SUPPORTFILES) lib520_LDADD = $(LIBDIR)/libcurl.la lib520_DEPENDENCIES = $(LIBDIR)/libcurl.la + +lib521_SOURCES = lib521.c $(SUPPORTFILES) +lib521_LDADD = $(LIBDIR)/libcurl.la +lib521_DEPENDENCIES = $(LIBDIR)/libcurl.la + +lib523_SOURCES = lib523.c $(SUPPORTFILES) +lib523_LDADD = $(LIBDIR)/libcurl.la +lib523_DEPENDENCIES = $(LIBDIR)/libcurl.la diff --git a/tests/libtest/lib521.c b/tests/libtest/lib521.c new file mode 100644 index 000000000..96630f303 --- /dev/null +++ b/tests/libtest/lib521.c @@ -0,0 +1,16 @@ +#include "test.h" + +int test(char *URL) +{ + CURLcode res; + CURL *curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, URL); + curl_easy_setopt(curl, CURLOPT_PORT, atoi(arg2)); + curl_easy_setopt(curl, CURLOPT_USERPWD, "xxx:yyy"); + curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE); + + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + return (int)res; +} + diff --git a/tests/libtest/lib523.c b/tests/libtest/lib523.c new file mode 100644 index 000000000..d0a41c5f5 --- /dev/null +++ b/tests/libtest/lib523.c @@ -0,0 +1,17 @@ +#include "test.h" + +int test(char *URL) +{ + CURLcode res; + CURL *curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_PROXY, arg2); + curl_easy_setopt(curl, CURLOPT_URL, URL); + curl_easy_setopt(curl, CURLOPT_PORT, 19999); + curl_easy_setopt(curl, CURLOPT_USERPWD, "xxx:yyy"); + curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE); + + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + return (int)res; +} +