Eric Landes provided the patch (edited by me) that introduces the

--keepalive-time to curl to set the keepalive probe interval. I also took
the opportunity to rename the recently added no-keep-alive option to
no-keepalive to keep a consistent naming and to avoid getting two dashes in
these option names. Eric also provided an update to the man page for the new
option.
This commit is contained in:
Daniel Stenberg 2008-01-12 22:10:53 +00:00
parent 4f00a8db73
commit f866af912d
5 changed files with 71 additions and 18 deletions

View File

@ -6,6 +6,14 @@
Changelog Changelog
Daniel S (12 Jan 2008)
- Eric Landes provided the patch (edited by me) that introduces the
--keepalive-time to curl to set the keepalive probe interval. I also took
the opportunity to rename the recently added no-keep-alive option to
no-keepalive to keep a consistent naming and to avoid getting two dashes in
these option names. Eric also provided an update to the man page for the new
option.
Daniel S (11 Jan 2008) Daniel S (11 Jan 2008)
- Daniel Egger made CURLOPT_RANGE work on file:// URLs the very same way it - Daniel Egger made CURLOPT_RANGE work on file:// URLs the very same way it
already worked for FTP:// URLs. already worked for FTP:// URLs.

View File

@ -1,7 +1,7 @@
Curl and libcurl 7.18.0 Curl and libcurl 7.18.0
Public curl releases: 103 Public curl releases: 103
Command line options: 125 Command line options: 126
curl_easy_setopt() options: 150 curl_easy_setopt() options: 150
Public functions in libcurl: 56 Public functions in libcurl: 56
Public web site mirrors: 42 Public web site mirrors: 42
@ -12,12 +12,13 @@ This release includes the following changes:
o --data-urlencode o --data-urlencode
o CURLOPT_PROXY_TRANSFER_MODE o CURLOPT_PROXY_TRANSFER_MODE
o --no-keep-alive - now curl does connections with keep-alive enabled by o --no-keepalive - now curl does connections with keep-alive enabled by
default default
o --socks4a added (proxy type CURLPROXY_SOCKS4A for libcurl) o --socks4a added (proxy type CURLPROXY_SOCKS4A for libcurl)
o --socks5-hostname added (CURLPROXY_SOCKS5_HOSTNAME for libcurl) o --socks5-hostname added (CURLPROXY_SOCKS5_HOSTNAME for libcurl)
o curl_easy_pause() o curl_easy_pause()
o CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA o CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA
o --keepalive-time
This release includes the following bugfixes: This release includes the following bugfixes:
@ -72,6 +73,6 @@ advice from friends like these:
Emil Romanus, Alessandro Vesely, Ray Pekowski, Spacen Jasset, Andrew Moise, Emil Romanus, Alessandro Vesely, Ray Pekowski, Spacen Jasset, Andrew Moise,
Gilles Blanc, David Wright, Vikram Saxena, Mateusz Loskot, Gary Maxwell, Gilles Blanc, David Wright, Vikram Saxena, Mateusz Loskot, Gary Maxwell,
Dmitry Kurochkin, Mohun Biswas, Richard Atterer, Maxim Perenesenko, Dmitry Kurochkin, Mohun Biswas, Richard Atterer, Maxim Perenesenko,
Daniel Egger, Jeff Johnson, Nikitinskit Dmitriy, Georg Lippitsch Daniel Egger, Jeff Johnson, Nikitinskit Dmitriy, Georg Lippitsch, Eric Landes
Thanks! (and sorry if I forgot to mention someone) Thanks! (and sorry if I forgot to mention someone)

View File

@ -4,9 +4,6 @@ To be addressed before 7.18.0 (planned release: January 2008)
115 - Cleanup debugging messages in test harness, introduced for new minimum 115 - Cleanup debugging messages in test harness, introduced for new minimum
SSH version support for SCP, SFTP and SOCKS tests SSH version support for SCP, SFTP and SOCKS tests
117 - Eric Landes patch for introducing the --tcp-keep* options
http://curl.haxx.se/mail/lib-2008-01/0038.html (review, consider)
Less likely to go in 7.18.0 Less likely to go in 7.18.0
=========================== ===========================

View File

@ -612,6 +612,14 @@ See this online resource for further details:
\fBhttp://curl.haxx.se/docs/sslcerts.html\fP \fBhttp://curl.haxx.se/docs/sslcerts.html\fP
If this option is used twice, the second time will again disable it. If this option is used twice, the second time will again disable it.
.IP "--keepalive-time <seconds>"
This option sets the time a connection needs to remain idle before sending
keepalive probes and the time between individual keepalive probes. It is
currently effective on operating systems offering the TCP_KEEPIDLE and
TCP_KEEPINTVL socket options (meaning Linux, recent AIX, HP-UX and more). This
option has no effect if \fI--no-keepalive\fP is used. (Added in 7.18.0)
If this option is used multiple times, the last occurrence sets the amount.
.IP "--key <key>" .IP "--key <key>"
(SSL/SSH) Private key file name. Allows you to provide your private key in this (SSL/SSH) Private key file name. Allows you to provide your private key in this
separate file. separate file.
@ -820,11 +828,11 @@ will output the data in chunks, not necessarily exactly when the data arrives.
Using this option will disable that buffering. Using this option will disable that buffering.
If this option is used twice, the second will again switch on buffering. If this option is used twice, the second will again switch on buffering.
.IP "--no-keep-alive" .IP "--no-keepalive"
Disables the use of keep-alive messages on the TCP connection, as by default Disables the use of keepalive messages on the TCP connection, as by default
curl enables them. curl enables them.
If this option is used twice, the second will again enable keep-alive. If this option is used twice, the second will again enable keepalive.
.IP "--no-sessionid" .IP "--no-sessionid"
(SSL) Disable curl's use of SSL session-ID caching. By default all transfers (SSL) Disable curl's use of SSL session-ID caching. By default all transfers
are done using the cache. Note that while nothing ever should get hurt by are done using the cache. Note that while nothing ever should get hurt by

View File

@ -104,6 +104,13 @@
#endif #endif
#endif /* CURL_DOES_CONVERSIONS && HAVE_ICONV */ #endif /* CURL_DOES_CONVERSIONS && HAVE_ICONV */
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> /* for IPPROTO_TCP */
#endif
#ifdef HAVE_NETINET_TCP_H
#include <netinet/tcp.h> /* for TCP_KEEPIDLE, TCP_KEEPINTVL */
#endif
/* The last #include file should be: */ /* The last #include file should be: */
#ifdef CURLDEBUG #ifdef CURLDEBUG
#ifndef CURLTOOLDEBUG #ifndef CURLTOOLDEBUG
@ -486,7 +493,9 @@ struct Configurable {
char *libcurl; /* output libcurl code to this file name */ char *libcurl; /* output libcurl code to this file name */
bool raw; bool raw;
bool post301; bool post301;
bool nokeepalive; bool nokeepalive; /* for keepalive needs */
long alivetime;
struct OutStruct *outs; struct OutStruct *outs;
}; };
@ -679,6 +688,7 @@ static void help(void)
" -I/--head Show document info only", " -I/--head Show document info only",
" -j/--junk-session-cookies Ignore session cookies read from file (H)", " -j/--junk-session-cookies Ignore session cookies read from file (H)",
" --interface <interface> Specify network interface/address to use", " --interface <interface> Specify network interface/address to use",
" --keepalive-time <seconds> Interval between keepalive probes",
" --krb <level> Enable kerberos with specified security level (F)", " --krb <level> Enable kerberos with specified security level (F)",
" -k/--insecure Allow connections to SSL sites without certs (H)", " -k/--insecure Allow connections to SSL sites without certs (H)",
" -K/--config Specify which config file to read", " -K/--config Specify which config file to read",
@ -697,7 +707,7 @@ static void help(void)
" --netrc-optional Use either .netrc or URL; overrides -n", " --netrc-optional Use either .netrc or URL; overrides -n",
" --ntlm Use HTTP NTLM authentication (H)", " --ntlm Use HTTP NTLM authentication (H)",
" -N/--no-buffer Disable buffering of the output stream", " -N/--no-buffer Disable buffering of the output stream",
" --no-keep-alive Disable keep-alive use on the connection", " --no-keepalive Disable keepalive use on the connection",
" --no-sessionid Disable SSL session-ID reusing (SSL)", " --no-sessionid Disable SSL session-ID reusing (SSL)",
" -o/--output <file> Write output to <file> instead of stdout", " -o/--output <file> Write output to <file> instead of stdout",
" -O/--remote-name Write output to a file named as the remote file", " -O/--remote-name Write output to a file named as the remote file",
@ -1444,11 +1454,13 @@ static int ftpcccmethod(struct Configurable *config, char *str)
} }
static int set_so_keepalive(void *clientp, curl_socket_t curlfd, static int sockoptcallback(void *clientp, curl_socket_t curlfd,
curlsocktype purpose) curlsocktype purpose)
{ {
struct Configurable *config = (struct Configurable *)clientp; struct Configurable *config = (struct Configurable *)clientp;
int onoff = config->nokeepalive ? 0 : 1; int onoff = 1; /* this callback is only used if we ask for keepalives on the
connection */
long keepidle = config->alivetime;
switch (purpose) { switch (purpose) {
case CURLSOCKTYPE_IPCXN: case CURLSOCKTYPE_IPCXN:
@ -1459,6 +1471,28 @@ static int set_so_keepalive(void *clientp, curl_socket_t curlfd,
warnf(clientp, "Could not set SO_KEEPALIVE!\n"); warnf(clientp, "Could not set SO_KEEPALIVE!\n");
return 0; return 0;
} }
else {
if (config->alivetime) {
#ifdef TCP_KEEPIDLE
if(setsockopt(curlfd, IPPROTO_TCP, TCP_KEEPIDLE, (void *)&keepidle,
sizeof(keepidle)) < 0) {
/* don't abort operation, just issue a warning */
SET_SOCKERRNO(0);
warnf(clientp, "Could not set TCP_KEEPIDLE!\n");
return 0;
}
#endif
#ifdef TCP_KEEPINTVL
if(setsockopt(curlfd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepidle,
sizeof(keepidle)) < 0) {
/* don't abort operation, just issue a warning */
SET_SOCKERRNO(0);
warnf(clientp, "Could not set TCP_KEEPINTVL!\n");
return 0;
}
#endif
}
}
break; break;
default: default:
break; break;
@ -1555,8 +1589,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
{"$z", "libcurl", TRUE}, {"$z", "libcurl", TRUE},
{"$#", "raw", FALSE}, {"$#", "raw", FALSE},
{"$0", "post301", FALSE}, {"$0", "post301", FALSE},
{"$1", "no-keep-alive", FALSE}, {"$1", "no-keepalive", FALSE},
{"$2", "socks5-hostname", TRUE}, {"$2", "socks5-hostname", TRUE},
{"$3", "keepalive-time", TRUE},
{"0", "http1.0", FALSE}, {"0", "http1.0", FALSE},
{"1", "tlsv1", FALSE}, {"1", "tlsv1", FALSE},
@ -2024,9 +2059,13 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
case '0': /* --post301 */ case '0': /* --post301 */
config->post301 ^= TRUE; config->post301 ^= TRUE;
break; break;
case '1': /* --no-keep-alive */ case '1': /* --no-keepalive */
config->nokeepalive ^= TRUE; config->nokeepalive ^= TRUE;
break; break;
case '3': /* --keepalive-time */
if(str2num(&config->alivetime, nextarg))
return PARAM_BAD_NUMERIC;
break;
} }
break; break;
case '#': /* --progress-bar */ case '#': /* --progress-bar */
@ -4590,7 +4629,7 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
/* curl 7.17.1 */ /* curl 7.17.1 */
my_setopt(curl, CURLOPT_POST301, config->post301); my_setopt(curl, CURLOPT_POST301, config->post301);
if (!config->nokeepalive) { if (!config->nokeepalive) {
my_setopt(curl, CURLOPT_SOCKOPTFUNCTION, set_so_keepalive); my_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockoptcallback);
my_setopt(curl, CURLOPT_SOCKOPTDATA, config); my_setopt(curl, CURLOPT_SOCKOPTDATA, config);
} }