Olivier reported that even though he used CURLOPT_PORT, libcurl clearly still
authorDaniel Stenberg <daniel@haxx.se>
Mon, 18 Apr 2005 19:41:04 +0000 (19:41 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 18 Apr 2005 19:41:04 +0000 (19:41 +0000)
used the default port. He was right. I fixed the problem and added the test
cases 521, 522 and 523 to verify the fix.

CHANGES
lib/url.c
tests/data/Makefile.am
tests/data/test521 [new file with mode: 0644]
tests/data/test522 [new file with mode: 0644]
tests/libtest/Makefile.am
tests/libtest/lib521.c [new file with mode: 0644]
tests/libtest/lib523.c [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
index 9b1fd61..b70d3d7 100644 (file)
--- 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.
 
index 7174e8c..1259731 100644 (file)
--- 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 /<item-type>/ 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;
 
index a1e455e..0826e28 100644 (file)
@@ -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 (file)
index 0000000..b3aad96
--- /dev/null
@@ -0,0 +1,59 @@
+<info>
+<keywords>
+FTP
+PASV
+CURLOPT_PORT
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+total 20\r
+drwxr-xr-x   8 98       98           512 Oct 22 13:06 .\r
+drwxr-xr-x   8 98       98           512 Oct 22 13:06 ..\r
+drwxr-xr-x   2 98       98           512 May  2  1996 .NeXT\r
+-r--r--r--   1 0        1             35 Jul 16  1996 README\r
+lrwxrwxrwx   1 0        1              7 Dec  9  1999 bin -> usr/bin\r
+dr-xr-xr-x   2 0        1            512 Oct  1  1997 dev\r
+drwxrwxrwx   2 98       98           512 May 29 16:04 download.html\r
+dr-xr-xr-x   2 0        1            512 Nov 30  1995 etc\r
+drwxrwxrwx   2 98       1            512 Oct 30 14:33 pub\r
+dr-xr-xr-x   5 0        1            512 Oct  1  1997 usr\r
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+ftp
+</server>
+<tool>
+lib521
+</tool>
+ <name>
+FTP dir list PASV with CURLOPT_PORT
+ </name>
+ <command>
+ftp://%HOSTIP/520/ %FTPPORT
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+filter off really nothing
+</strip>
+<protocol>
+USER xxx\r
+PASS yyy\r
+PWD\r
+CWD 520\r
+EPSV\r
+TYPE A\r
+LIST\r
+QUIT\r
+</protocol>
+</verify>
diff --git a/tests/data/test522 b/tests/data/test522
new file mode 100644 (file)
index 0000000..ceff5ec
--- /dev/null
@@ -0,0 +1,59 @@
+<info>
+<keywords>
+HTTP
+HTTP GET
+CURLOPT_PORT
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck=1>
+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
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<tool>
+lib521
+</tool>
+ <name>
+HTTP GET with CURLOPT_PORT
+ </name>
+ <command>
+http://%HOSTIP/522 %HTTPPORT
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /522 HTTP/1.1\r
+Authorization: Basic eHh4Onl5eQ==\r
+Host: 127.0.0.1:%HTTPPORT\r
+Pragma: no-cache\r
+Accept: */*\r
+\r
+</protocol>
+<stdout>
+hello
+</stdout>
+</verify>
index acdeb55..ccbe2aa 100644 (file)
@@ -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 (file)
index 0000000..96630f3
--- /dev/null
@@ -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 (file)
index 0000000..d0a41c5
--- /dev/null
@@ -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;
+}
+