Michal Marek introduced CURLOPT_PROXY_TRANSFER_MODE which is used to control

the appending of the "type=" thing on FTP URLs when they are passed to a
HTTP proxy. Some proxies just don't like that appending (which is done
unconditionally in 7.17.1), and some proxies treat binary/ascii transfers
better with the appending done!
This commit is contained in:
Daniel Stenberg 2007-12-02 23:38:23 +00:00
parent 380ed8bebf
commit 1c93e75375
7 changed files with 54 additions and 15 deletions

View File

@ -7,6 +7,13 @@
Changelog Changelog
Daniel S (3 Dec 2007)
- Michal Marek introduced CURLOPT_PROXY_TRANSFER_MODE which is used to control
the appending of the "type=" thing on FTP URLs when they are passed to a
HTTP proxy. Some proxies just don't like that appending (which is done
unconditionally in 7.17.1), and some proxies treat binary/ascii transfers
better with the appending done!
Daniel S (29 Nov 2007) Daniel S (29 Nov 2007)
- A bug report on the curl-library list showed a HTTP Digest session going on - A bug report on the curl-library list showed a HTTP Digest session going on
with a 700+ letter nonce. Previously libcurl only support 127 letter ones with a 700+ letter nonce. Previously libcurl only support 127 letter ones

View File

@ -2,7 +2,7 @@ Curl and libcurl 7.17.2
Public curl releases: 103 Public curl releases: 103
Command line options: 122 Command line options: 122
curl_easy_setopt() options: 147 curl_easy_setopt() options: 148
Public functions in libcurl: 55 Public functions in libcurl: 55
Public web site mirrors: 42 Public web site mirrors: 42
Known libcurl bindings: 36 Known libcurl bindings: 36
@ -11,6 +11,7 @@ Curl and libcurl 7.17.2
This release includes the following changes: This release includes the following changes:
o --data-urlencode was added o --data-urlencode was added
o CURLOPT_PROXY_TRANSFER_MODE was added
This release includes the following bugfixes: This release includes the following bugfixes:

View File

@ -1064,6 +1064,13 @@ or similar.
libcurl does not do a complete ASCII conversion when doing ASCII transfers libcurl does not do a complete ASCII conversion when doing ASCII transfers
over FTP. This is a known limitation/flaw that nobody has rectified. libcurl over FTP. This is a known limitation/flaw that nobody has rectified. libcurl
simply sets the mode to ascii and performs a standard transfer. simply sets the mode to ascii and performs a standard transfer.
.IP CURLOPT_PROXY_TRANSFER_MODE
Pass a long. If the value is set to 1 (one), it tells libcurl to set the
transfer mode (binary or ASCII) for FTP transfers done via an HTTP proxy, by
appending ;type=a or ;type=i to the URL. Without this setting, or it being
set to 0 (zero, the default), \fICURLOPT_TRANSFERTEXT\fP has no effect when
doing FTP via a proxy. Beware that not all proxies support this feature.
(Added in 7.17.2)
.IP CURLOPT_CRLF .IP CURLOPT_CRLF
Convert Unix newlines to CRLF newlines on transfers. Convert Unix newlines to CRLF newlines on transfers.
.IP CURLOPT_RANGE .IP CURLOPT_RANGE

View File

@ -1182,6 +1182,9 @@ typedef enum {
/* POST volatile input fields. */ /* POST volatile input fields. */
CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165), CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165),
/* set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy */
CINIT(PROXY_TRANSFER_MODE, LONG, 166),
CURLOPT_LASTENTRY /* the last unused */ CURLOPT_LASTENTRY /* the last unused */
} CURLoption; } CURLoption;

View File

@ -2122,6 +2122,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
} }
} }
ppath = data->change.url; ppath = data->change.url;
if (data->set.proxy_transfer_mode) {
/* when doing ftp, append ;type=<a|i> if not present */ /* when doing ftp, append ;type=<a|i> if not present */
if(checkprefix("ftp://", ppath) || checkprefix("ftps://", ppath)) { if(checkprefix("ftp://", ppath) || checkprefix("ftps://", ppath)) {
char *p = strstr(ppath, ";type="); char *p = strstr(ppath, ";type=");
@ -2140,6 +2141,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
data->set.prefer_ascii ? 'a' : 'i'); data->set.prefer_ascii ? 'a' : 'i');
} }
} }
}
if(HTTPREQ_POST_FORM == httpreq) { if(HTTPREQ_POST_FORM == httpreq) {
/* we must build the whole darned post sequence first, so that we have /* we must build the whole darned post sequence first, so that we have
a size of the whole shebang before we start to send it */ a size of the whole shebang before we start to send it */

View File

@ -2036,6 +2036,23 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
*/ */
data->set.new_directory_perms = va_arg(param, long); data->set.new_directory_perms = va_arg(param, long);
break; break;
case CURLOPT_PROXY_TRANSFER_MODE:
/*
* set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy
*/
switch (va_arg(param, long)) {
case 0:
data->set.proxy_transfer_mode = FALSE;
break;
case 1:
data->set.proxy_transfer_mode = TRUE;
break;
default:
/* reserve other values for future use */
result = CURLE_FAILED_INIT;
break;
}
break;
default: default:
/* unknown tag and its companion, just ignore: */ /* unknown tag and its companion, just ignore: */

View File

@ -1439,6 +1439,8 @@ struct UserDefined {
content-encoded (chunked, compressed) */ content-encoded (chunked, compressed) */
long new_file_perms; /* Permissions to use when creating remote files */ long new_file_perms; /* Permissions to use when creating remote files */
long new_directory_perms; /* Permissions to use when creating remote dirs */ long new_directory_perms; /* Permissions to use when creating remote dirs */
bool proxy_transfer_mode; /* set transfer mode (;type=<a|i>) when doing FTP
via an HTTP proxy */
char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */ char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */
}; };