Changelog
+Daniel Stenberg (2 Feb 2009)
+- Craig A West brought us: libcurl now defaults to do CONNECT with HTTP
+ version 1.1 instead of 1.0 like before. This change also introduces the new
+ proxy type for libcurl called 'CURLPROXY_HTTP_1_0' that then allows apps to
+ switch (back) to CONNECT 1.0 requests. The curl tool also got a --proxy1.0
+ option that works exactly like --proxy but sets CURLPROXY_HTTP_1_0.
+
+ I updated all test cases cases that use CONNECT and I tried to do some using
+ --proxy1.0 and some updated to do CONNECT 1.1 to get both versions run.
+
Daniel Stenberg (31 Jan 2009)
- When building with c-ares 1.6.1 (not yet released) or later and IPv6 support
enabled, we can now take advantage of its brand new AF_UNSPEC support in
Curl and libcurl 7.19.4
Public curl releases: 110
- Command line options: 131
+ Command line options: 132
curl_easy_setopt() options: 161
Public functions in libcurl: 58
Known libcurl bindings: 37
the corresponding curl options --socks5-gssapi-service and
--socks5-gssapi-nec
o Improved IPv6 support when built with with c-ares >= 1.6.1
+ o Added CURLPROXY_HTTP_1_0 and --proxy1.0
This release includes the following bugfixes:
curl --noproxy localhost,get.this -x my-proxy:888 http://www.get.this/
+ If the proxy is specified with --proxy1.0 instead of --proxy or -x, then
+ curl will use HTTP/1.0 instead of HTTP/1.1 for any CONNECT attempts.
+
curl also supports SOCKS4 and SOCKS5 proxies with --socks4 and --socks5.
See also the environment variables Curl support that offer further proxy
.IP "--proxy-ntlm"
Tells curl to use HTTP NTLM authentication when communicating with the given
proxy. Use \fI--ntlm\fP for enabling NTLM with a remote host.
+.IP "--proxy1.0 <proxyhost[:port]>"
+Use the specified HTTP 1.0 proxy. If the port number is not specified, it is
+assumed at port 1080.
+
+The only difference between this and the HTTP proxy option (\fI-x/--proxy\fP),
+is that attempts to use CONNECT through the proxy will specify an HTTP 1.0
+protocol instead of the default HTTP 1.1.
.IP "-p/--proxytunnel"
When an HTTP proxy is used (\fI-x/--proxy\fP), this option will cause non-HTTP
protocols to attempt to tunnel through the proxy instead of merely using it to
specified in the proxy string \fICURLOPT_PROXY\fP.
.IP CURLOPT_PROXYTYPE
Pass a long with this option to set type of the proxy. Available options for
-this are \fICURLPROXY_HTTP\fP, \fICURLPROXY_SOCKS4\fP (added in 7.15.2),
-\fICURLPROXY_SOCKS5\fP, \fICURLPROXY_SOCKS4A\fP (added in 7.18.0) and
-\fICURLPROXY_SOCKS5_HOSTNAME\fP (added in 7.18.0). The HTTP type is
-default. (Added in 7.10)
+this are \fICURLPROXY_HTTP\fP, \fICURLPROXY_HTTP_1_0\fP (added in 7.19.4),
+\fICURLPROXY_SOCKS4\fP (added in 7.15.2), \fICURLPROXY_SOCKS5\fP,
+\fICURLPROXY_SOCKS4A\fP (added in 7.18.0) and \fICURLPROXY_SOCKS5_HOSTNAME\fP
+(added in 7.18.0). The HTTP type is default. (Added in 7.10)
.IP CURLOPT_NOPROXY
Pass a pointer to a zero terminated string. The should be a comma- separated
list of hosts which do not use a proxy, if one is specified. The only
void *userptr);
typedef enum {
- CURLPROXY_HTTP = 0, /* added in 7.10 */
+ CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use
+ CONNECT HTTP/1.1 */
+ CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT
+ HTTP/1.0 */
CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already
in 7.10 */
CURLPROXY_SOCKS5 = 5, /* added in 7.10 */
break;
#endif /* CURL_DISABLE_PROXY */
case CURLPROXY_HTTP:
+ case CURLPROXY_HTTP_1_0:
/* do nothing here. handled later. */
break;
default:
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
char *host=(char *)"";
const char *proxyconn="";
const char *useragent="";
+ const char *http = (conn->proxytype == CURLPROXY_HTTP_1_0) ?
+ "1.0" : "1.1";
if(!checkheaders(data, "Host:")) {
host = aprintf("Host: %s\r\n", host_port);
/* BLOCKING */
result =
add_bufferf(req_buffer,
- "CONNECT %s:%d HTTP/1.0\r\n"
+ "CONNECT %s:%d HTTP/%s\r\n"
"%s" /* Host: */
"%s" /* Proxy-Authorization */
"%s" /* User-Agent */
"%s", /* Proxy-Connection */
- hostname, remote_port,
+ hostname, remote_port, http,
host,
conn->allocptr.proxyuserpwd?
conn->allocptr.proxyuserpwd:"",
case CURLOPT_PROXYTYPE:
/*
- * Set proxy type. HTTP/SOCKS4/SOCKS4a/SOCKS5/SOCKS5_HOSTNAME
+ * Set proxy type. HTTP/HTTP_1_0/SOCKS4/SOCKS4a/SOCKS5/SOCKS5_HOSTNAME
*/
data->set.proxytype = (curl_proxytype)va_arg(param, long);
break;
break;
#endif /* CURL_DISABLE_PROXY */
case CURLPROXY_HTTP:
+ case CURLPROXY_HTTP_1_0:
/* do nothing here. handled later. */
break;
default:
conn->bits.proxy = (bool)(data->set.str[STRING_PROXY] &&
*data->set.str[STRING_PROXY]);
- conn->bits.httpproxy = (bool)(conn->bits.proxy
- && (conn->proxytype == CURLPROXY_HTTP));
- conn->bits.proxy_user_passwd = (bool)(NULL != data->set.str[STRING_PROXYUSERNAME]);
+ conn->bits.httpproxy = (bool)(conn->bits.proxy &&
+ (conn->proxytype == CURLPROXY_HTTP ||
+ conn->proxytype == CURLPROXY_HTTP_1_0));
+ conn->bits.proxy_user_passwd =
+ (bool)(NULL != data->set.str[STRING_PROXYUSERNAME]);
conn->bits.tunnel_proxy = data->set.tunnel_thru_httpproxy;
#endif /* CURL_DISABLE_PROXY */
if(proxy && *proxy) {
long bits = conn->protocol & (PROT_HTTPS|PROT_SSL|PROT_MISSING);
- if(conn->proxytype == CURLPROXY_HTTP) {
+ if((conn->proxytype == CURLPROXY_HTTP) ||
+ (conn->proxytype == CURLPROXY_HTTP_1_0)) {
/* force this connection's protocol to become HTTP */
conn->protocol = PROT_HTTP | bits;
conn->bits.httpproxy = TRUE;
char *userpwd;
char *proxyuserpwd;
char *proxy;
+ int proxyver; /* set to CURLPROXY_HTTP* define */
char *noproxy;
bool proxytunnel;
bool ftp_append; /* APPE on ftp */
" --proxy-negotiate Use Negotiate authentication on the proxy (H)",
" --proxy-ntlm Use NTLM authentication on the proxy (H)",
" -U/--proxy-user <user[:password]> Set proxy user and password",
+ " --proxy1.0 <host[:port]> Use HTTP/1.0 proxy on given port",
" -p/--proxytunnel Operate through a HTTP proxy tunnel (using CONNECT)",
" --pubkey <key> Public key file name (SSH)",
" -Q/--quote <cmd> Send command(s) to server before file transfer (F/SFTP)",
{"$6", "socks5-gssapi-service", TRUE},
{"$7", "socks5-gssapi-nec", FALSE},
#endif
+ {"$8", "proxy1.0", TRUE},
{"0", "http1.0", FALSE},
{"1", "tlsv1", FALSE},
config->socks5_gssapi_nec = TRUE;
break;
#endif
+ case '8': /* --proxy1.0 */
+ /* http 1.0 proxy */
+ GetStr(&config->proxy, nextarg);
+ config->proxyver = CURLPROXY_HTTP_1_0;
+ break;
}
break;
case '#': /* --progress-bar */
case 'x':
/* proxy */
GetStr(&config->proxy, nextarg);
+ config->proxyver = CURLPROXY_HTTP;
break;
case 'X':
/* set custom request */
my_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
my_setopt(curl, CURLOPT_URL, url); /* what to fetch */
my_setopt(curl, CURLOPT_PROXY, config->proxy); /* proxy to use */
+ if(config->proxy)
+ my_setopt(curl, CURLOPT_PROXYTYPE, config->proxyver);
my_setopt(curl, CURLOPT_NOPROGRESS, config->noprogress);
if(config->no_body) {
my_setopt(curl, CURLOPT_NOBODY, 1);
s/^(Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAA).*/$1/
</strippart>
<protocol>
-CONNECT test.remote.server.com:1008 HTTP/1.0\r
+CONNECT test.remote.server.com:1008 HTTP/1.1\r
Host: test.remote.server.com:1008\r
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
Proxy-Connection: Keep-Alive\r
\r
-CONNECT test.remote.server.com:1008 HTTP/1.0\r
+CONNECT test.remote.server.com:1008 HTTP/1.1\r
Host: test.remote.server.com:1008\r
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAA
Proxy-Connection: Keep-Alive\r
s/^(Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAA).*/$1/
</strippart>
<protocol>
-CONNECT test.remote.server.com:1021 HTTP/1.0\r
+CONNECT test.remote.server.com:1021 HTTP/1.1\r
Host: test.remote.server.com:1021\r
Proxy-Connection: Keep-Alive\r
\r
-CONNECT test.remote.server.com:1021 HTTP/1.0\r
+CONNECT test.remote.server.com:1021 HTTP/1.1\r
Host: test.remote.server.com:1021\r
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
Proxy-Connection: Keep-Alive\r
\r
-CONNECT test.remote.server.com:1021 HTTP/1.0\r
+CONNECT test.remote.server.com:1021 HTTP/1.1\r
Host: test.remote.server.com:1021\r
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAA
Proxy-Connection: Keep-Alive\r
^User-Agent:.*
</strip>
<protocol>
-CONNECT test-number:1059 HTTP/1.0\r
+CONNECT test-number:1059 HTTP/1.1\r
Host: test-number:1059\r
Proxy-Connection: Keep-Alive\r
\r
^User-Agent: curl/.*
</strip>
<protocol>
-CONNECT test.remote.server.com:1060 HTTP/1.0\r
+CONNECT test.remote.server.com:1060 HTTP/1.1\r
Host: test.remote.server.com:1060\r
Proxy-Connection: Keep-Alive\r
\r
-CONNECT test.remote.server.com:1060 HTTP/1.0\r
+CONNECT test.remote.server.com:1060 HTTP/1.1\r
Host: test.remote.server.com:1060\r
Proxy-Authorization: Digest username="silly", realm="weirdorealm", nonce="12345", uri="test.remote.server.com:1060", response="b527d164630481e2cc48c04d18ed2212"\r
Proxy-Connection: Keep-Alive\r
^User-Agent: curl/.*
</strip>
<protocol>
-CONNECT test.remote.server.com:1061 HTTP/1.0\r
+CONNECT test.remote.server.com:1061 HTTP/1.1\r
Host: test.remote.server.com:1061\r
Proxy-Connection: Keep-Alive\r
\r
-CONNECT test.remote.server.com:1061 HTTP/1.0\r
+CONNECT test.remote.server.com:1061 HTTP/1.1\r
Host: test.remote.server.com:1061\r
Proxy-Authorization: Digest username="silly", realm="weirdorealm", nonce="12345", uri="test.remote.server.com:1061", response="244a8caab5f343a1a20d2425e4d6e951"\r
Proxy-Connection: Keep-Alive\r
http
</server>
<name>
-HTTP CONNECT with proxytunnel and downgrade to HTTP/1.0
+HTTP 1.0 CONNECT with proxytunnel and downgrade GET to HTTP/1.0
</name>
<command>
--x %HOSTIP:%HTTPPORT -p http://%HOSTIP:%HTTPPORT/we/want/that/page/1078 http://%HOSTIP:%HTTPPORT/we/want/that/page/1078
+--proxy1.0 %HOSTIP:%HTTPPORT -p http://%HOSTIP:%HTTPPORT/we/want/that/page/1078 http://%HOSTIP:%HTTPPORT/we/want/that/page/1078
</command>
</client>
^User-Agent: curl/.*
</strip>
<protocol>
-CONNECT test.remote.server.com:206 HTTP/1.0\r
+CONNECT test.remote.server.com:206 HTTP/1.1\r
Host: test.remote.server.com:206\r
Proxy-Connection: Keep-Alive\r
\r
-CONNECT test.remote.server.com:206 HTTP/1.0\r
+CONNECT test.remote.server.com:206 HTTP/1.1\r
Host: test.remote.server.com:206\r
Proxy-Authorization: Digest username="silly", realm="weirdorealm", nonce="12345", uri="test.remote.server.com:206", response="5059a96c954981ceb94e17d667c8d3f8"\r
Proxy-Connection: Keep-Alive\r
s/^(Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAA).*/$1/
</strippart>
<protocol>
-CONNECT test.remote.server.com:209 HTTP/1.0\r
+CONNECT test.remote.server.com:209 HTTP/1.1\r
Host: test.remote.server.com:209\r
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
Proxy-Connection: Keep-Alive\r
\r
-CONNECT test.remote.server.com:209 HTTP/1.0\r
+CONNECT test.remote.server.com:209 HTTP/1.1\r
Host: test.remote.server.com:209\r
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAA
Proxy-Connection: Keep-Alive\r
NTLM
</features>
<name>
-HTTP proxy CONNECT auth NTLM and then POST
+HTTP 1.0 proxy CONNECT auth NTLM and then POST
</name>
<command>
-http://test.remote.server.com:213/path/2130002 --proxy http://%HOSTIP:%HTTPPORT --proxy-user silly:person --proxy-ntlm --proxytunnel -d "postit"
+http://test.remote.server.com:213/path/2130002 --proxy1.0 http://%HOSTIP:%HTTPPORT --proxy-user silly:person --proxy-ntlm --proxytunnel -d "postit"
</command>
</client>
^User-Agent: curl/.*
</strip>
<protocol>
-CONNECT test.remote.server.com:217 HTTP/1.0\r
+CONNECT test.remote.server.com:217 HTTP/1.1\r
Host: test.remote.server.com:217\r
Proxy-Connection: Keep-Alive\r
\r
s/^(Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAA).*/$1/
</strippart>
<protocol nonewline="yes">
-CONNECT test.remote.server.com:265 HTTP/1.0\r
+CONNECT test.remote.server.com:265 HTTP/1.1\r
Host: test.remote.server.com:265\r
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=\r
Proxy-Connection: Keep-Alive\r
\r
-CONNECT test.remote.server.com:265 HTTP/1.0\r
+CONNECT test.remote.server.com:265 HTTP/1.1\r
Host: test.remote.server.com:265\r
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAABQAFAHAAAAA
Proxy-Connection: Keep-Alive\r
^User-Agent:.*
</strip>
<protocol>
-CONNECT remotesite.com:80 HTTP/1.0\r
+CONNECT remotesite.com:80 HTTP/1.1\r
Host: remotesite.com:80\r
Proxy-Authorization: Basic eW91YXJlOnlvdXJzZWxm\r
User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3\r
# Verify data after the test has been "shot"
<verify>
<protocol>
-CONNECT test.remote.server.com:287 HTTP/1.0\r
+CONNECT test.remote.server.com:287 HTTP/1.1\r
Host: test.remote.server.com:287\r
Proxy-Connection: Keep-Alive\r
User-Agent: looser/2007\r
# Verify data after the test has been "shot"
<verify>
<protocol>
-CONNECT %HOSTIP:%HTTPSPORT HTTP/1.0\r
+CONNECT %HOSTIP:%HTTPSPORT HTTP/1.1\r
Host: %HOSTIP:%HTTPSPORT\r
Proxy-Authorization: Basic dGVzdDppbmc=\r
Proxy-Connection: Keep-Alive\r
http
</server>
<name>
-HTTP CONNECT with proxytunnel and host Basic authentication
+HTTP 1.0 CONNECT with proxytunnel and host Basic authentication
</name>
<command>
-http://%HOSTIP:%HTTPPORT/we/want/that/page/80 -p -x %HOSTIP:%HTTPPORT --user iam:myself --proxy-user youare:yourself
+http://%HOSTIP:%HTTPPORT/we/want/that/page/80 -p --proxy1.0 %HOSTIP:%HTTPPORT --user iam:myself --proxy-user youare:yourself
</command>
</client>
^User-Agent:.*
</strip>
<protocol>
-CONNECT %HOSTIP:%HTTPPORT HTTP/1.0\r
+CONNECT %HOSTIP:%HTTPPORT HTTP/1.1\r
User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3\r
Host: %HOSTIP:%HTTPPORT\r
Proxy-Connection: Keep-Alive\r
SSL
</features>
<name>
-HTTPS GET with failed proxy auth
+HTTPS GET with failed proxy auth (CONNECT 1.0)
</name>
<command>
-https://test.anything.really.com:94 -x %HOSTIP:%HTTPPORT
+https://test.anything.really.com:94 --proxy1.0 %HOSTIP:%HTTPPORT
</command>
</client>
^User-Agent:.*
</strip>
<protocol nonewline="yes">
-CONNECT %HOSTIP:%HTTPPORT HTTP/1.0\r
+CONNECT %HOSTIP:%HTTPPORT HTTP/1.1\r
User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3\r
Host: %HOSTIP:%HTTPPORT\r
Proxy-Connection: Keep-Alive\r