mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
[svn] Improved comments for the persistent connections feature.
This commit is contained in:
parent
6f7fd37186
commit
7302e69dc2
27
src/http.c
27
src/http.c
@ -264,27 +264,28 @@ http_process_connection (const char *hdr, void *arg)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Persistent connections (pc). Currently, we cache the most recently
|
/* Persistent connections. Currently, we cache the most recently used
|
||||||
used connection as persistent, provided that the HTTP server agrees
|
connection as persistent, provided that the HTTP server agrees to
|
||||||
to make it such. The persistence data is stored in the variables
|
make it such. The persistence data is stored in the variables
|
||||||
below. Ideally, it would be in a structure, and it should be
|
below. Ideally, it would be in a structure, and it should be
|
||||||
possible to cache an arbitrary fixed number of these connections.
|
possible to cache an arbitrary fixed number of these connections.
|
||||||
|
|
||||||
I think the code is quite easy to extend in that direction. */
|
I think the code is quite easy to extend in that direction. */
|
||||||
|
|
||||||
/* Whether the persistent connection is active. */
|
/* Whether a persistent connection is active. */
|
||||||
static int pc_active_p;
|
static int pc_active_p;
|
||||||
|
|
||||||
/* Host and port of the last persistent connection. */
|
/* Host and port of currently active persistent connection. */
|
||||||
static unsigned char pc_last_host[4];
|
static unsigned char pc_last_host[4];
|
||||||
static unsigned short pc_last_port;
|
static unsigned short pc_last_port;
|
||||||
|
|
||||||
/* File descriptor of the last persistent connection. */
|
/* File descriptor of the currently active persistent connection. */
|
||||||
static int pc_last_fd;
|
static int pc_last_fd;
|
||||||
|
|
||||||
/* Mark the persistent connection as invalid. This is used by the
|
/* Mark the persistent connection as invalid. This is used by the
|
||||||
CLOSE_* macros after they forcefully close a registered persistent
|
CLOSE_* macros after they forcefully close a registered persistent
|
||||||
connection. */
|
connection. This does not close the file descriptor -- it is left
|
||||||
|
to the caller to do that. (Maybe it should, though.) */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
invalidate_persistent (void)
|
invalidate_persistent (void)
|
||||||
@ -343,16 +344,28 @@ static int
|
|||||||
persistent_available_p (const char *host, unsigned short port)
|
persistent_available_p (const char *host, unsigned short port)
|
||||||
{
|
{
|
||||||
unsigned char this_host[4];
|
unsigned char this_host[4];
|
||||||
|
/* First, check whether a persistent connection is active at all. */
|
||||||
if (!pc_active_p)
|
if (!pc_active_p)
|
||||||
return 0;
|
return 0;
|
||||||
|
/* Second, check if the active connection pertains to the correct
|
||||||
|
(HOST, PORT) ordered pair. */
|
||||||
if (port != pc_last_port)
|
if (port != pc_last_port)
|
||||||
return 0;
|
return 0;
|
||||||
if (!store_hostaddress (this_host, host))
|
if (!store_hostaddress (this_host, host))
|
||||||
return 0;
|
return 0;
|
||||||
if (memcmp (pc_last_host, this_host, 4))
|
if (memcmp (pc_last_host, this_host, 4))
|
||||||
return 0;
|
return 0;
|
||||||
|
/* Third: check whether the connection is still open. This is
|
||||||
|
important because most server implement a liberal (short) timeout
|
||||||
|
on persistent connections. Wget can of course always reconnect
|
||||||
|
if the connection doesn't work out, but it's nicer to know in
|
||||||
|
advance. This test is a logical followup of the first test, but
|
||||||
|
is "expensive" and therefore placed at the end of the list. */
|
||||||
if (!test_socket_open (pc_last_fd))
|
if (!test_socket_open (pc_last_fd))
|
||||||
{
|
{
|
||||||
|
/* Oops, the socket is no longer open. Now that we know that,
|
||||||
|
let's invalidate the persistent connection before returning
|
||||||
|
0. */
|
||||||
CLOSE (pc_last_fd);
|
CLOSE (pc_last_fd);
|
||||||
invalidate_persistent ();
|
invalidate_persistent ();
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user