libfetch: fixups to packetization socket option setting
- split the code to a helper function - do not set sockets to corked state when putting back to cache so socket state is always deterministic - cork/uncork also when sending CONNECT to a proxy, this can reduce a little bit the latency how fast the packet gets sent out - also pair corking with uncorking in http_request to make it more obvious pairingcute-signatures
parent
09dbe46a76
commit
eae92bbacf
|
@ -107,8 +107,6 @@
|
||||||
|
|
||||||
#define HTTP_ERROR(xyz) ((xyz) > 400 && (xyz) < 599)
|
#define HTTP_ERROR(xyz) ((xyz) > 400 && (xyz) < 599)
|
||||||
|
|
||||||
static int val_yes = 1, val_no = 0;
|
|
||||||
|
|
||||||
static int http_cmd(conn_t *, const char *, ...) LIBFETCH_PRINTFLIKE(2, 3);
|
static int http_cmd(conn_t *, const char *, ...) LIBFETCH_PRINTFLIKE(2, 3);
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
@ -299,14 +297,6 @@ http_closefn(void *v)
|
||||||
conn_t *conn = io->conn;
|
conn_t *conn = io->conn;
|
||||||
|
|
||||||
if (io->keep_alive) {
|
if (io->keep_alive) {
|
||||||
#if defined(TCP_CORK)
|
|
||||||
setsockopt(conn->sd, IPPROTO_TCP, TCP_CORK, &val_yes, sizeof val_yes);
|
|
||||||
#else
|
|
||||||
setsockopt(conn->sd, IPPROTO_TCP, TCP_NODELAY, &val_no, sizeof val_no);
|
|
||||||
#if defined(TCP_NOPUSH) && !defined(__APPLE__)
|
|
||||||
setsockopt(conn->sd, IPPROTO_TCP, TCP_NOPUSH, &val_yes, sizeof val_yes);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
fetch_cache_put(conn, fetch_close);
|
fetch_cache_put(conn, fetch_close);
|
||||||
} else {
|
} else {
|
||||||
fetch_close(conn);
|
fetch_close(conn);
|
||||||
|
@ -673,11 +663,27 @@ http_authorize(conn_t *conn, const char *hdr, const char *p)
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Helper functions for connecting to a server or proxy
|
* Helper functions for connecting to a server or proxy
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper for setting socket options regarding packetization
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
http_cork(conn_t *conn, int val)
|
||||||
|
{
|
||||||
|
#if defined(TCP_CORK)
|
||||||
|
setsockopt(conn->sd, IPPROTO_TCP, TCP_CORK, &val, sizeof val);
|
||||||
|
#else
|
||||||
|
#if defined(TCP_NOPUSH) && !defined(__APPLE__)
|
||||||
|
setsockopt(conn->sd, IPPROTO_TCP, TCP_NOPUSH, &val, sizeof val);
|
||||||
|
#endif
|
||||||
|
val = !val;
|
||||||
|
setsockopt(conn->sd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof val);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Connect to the correct HTTP server or proxy.
|
* Connect to the correct HTTP server or proxy.
|
||||||
*/
|
*/
|
||||||
|
@ -711,8 +717,10 @@ http_connect(struct url *URL, struct url *purl, const char *flags, int *cached)
|
||||||
/* fetch_connect() has already set an error code */
|
/* fetch_connect() has already set an error code */
|
||||||
return (NULL);
|
return (NULL);
|
||||||
if (strcasecmp(URL->scheme, SCHEME_HTTPS) == 0 && purl) {
|
if (strcasecmp(URL->scheme, SCHEME_HTTPS) == 0 && purl) {
|
||||||
|
http_cork(conn, 1);
|
||||||
http_cmd(conn, "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n\r\n",
|
http_cmd(conn, "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n\r\n",
|
||||||
URL->host, URL->port, URL->host, URL->port);
|
URL->host, URL->port, URL->host, URL->port);
|
||||||
|
http_cork(conn, 0);
|
||||||
if (http_get_reply(conn) != HTTP_OK) {
|
if (http_get_reply(conn) != HTTP_OK) {
|
||||||
http_seterr(conn->err);
|
http_seterr(conn->err);
|
||||||
goto ouch;
|
goto ouch;
|
||||||
|
@ -746,13 +754,6 @@ http_connect(struct url *URL, struct url *purl, const char *flags, int *cached)
|
||||||
fetch_syserr();
|
fetch_syserr();
|
||||||
goto ouch;
|
goto ouch;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TCP_CORK)
|
|
||||||
setsockopt(conn->sd, IPPROTO_TCP, TCP_CORK, &val_yes, sizeof val_yes);
|
|
||||||
#elif defined(TCP_NOPUSH) && !defined(__APPLE__)
|
|
||||||
setsockopt(conn->sd, IPPROTO_TCP, TCP_NOPUSH, &val_yes, sizeof val_yes);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return (conn);
|
return (conn);
|
||||||
ouch:
|
ouch:
|
||||||
fetch_close(conn);
|
fetch_close(conn);
|
||||||
|
@ -906,6 +907,8 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
|
||||||
if (verbose)
|
if (verbose)
|
||||||
fetch_info("requesting %s://%s%s",
|
fetch_info("requesting %s://%s%s",
|
||||||
url->scheme, host, url->doc);
|
url->scheme, host, url->doc);
|
||||||
|
|
||||||
|
http_cork(conn, 1);
|
||||||
if (purl && strcasecmp(URL->scheme, SCHEME_HTTPS) != 0) {
|
if (purl && strcasecmp(URL->scheme, SCHEME_HTTPS) != 0) {
|
||||||
http_cmd(conn, "%s %s://%s%s HTTP/1.1\r\n",
|
http_cmd(conn, "%s %s://%s%s HTTP/1.1\r\n",
|
||||||
op, url->scheme, host, url->doc);
|
op, url->scheme, host, url->doc);
|
||||||
|
@ -968,14 +971,7 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
|
||||||
* be compatible with such configurations, fiddle with socket
|
* be compatible with such configurations, fiddle with socket
|
||||||
* options to force the pending data to be written.
|
* options to force the pending data to be written.
|
||||||
*/
|
*/
|
||||||
#if defined(TCP_CORK)
|
http_cork(conn, 0);
|
||||||
setsockopt(conn->sd, IPPROTO_TCP, TCP_CORK, &val_no, sizeof val_no);
|
|
||||||
#else
|
|
||||||
#if defined(TCP_NOPUSH) && !defined(__APPLE__)
|
|
||||||
setsockopt(conn->sd, IPPROTO_TCP, TCP_NOPUSH, &val_no, sizeof val_no);
|
|
||||||
#endif
|
|
||||||
setsockopt(conn->sd, IPPROTO_TCP, TCP_NODELAY, &val_yes, sizeof val_yes);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* get reply */
|
/* get reply */
|
||||||
switch (http_get_reply(conn)) {
|
switch (http_get_reply(conn)) {
|
||||||
|
|
Loading…
Reference in New Issue