From: Justin Erenkrantz Date: Tue, 15 Mar 2005 20:04:58 +0000 (+0000) Subject: Add ReceiveBufferSize directive to control the TCP receive buffer. X-Git-Tag: 2.1.4~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a80f8410bddb01e733c8fd0ed60266800088d5d9;p=thirdparty%2Fapache%2Fhttpd.git Add ReceiveBufferSize directive to control the TCP receive buffer. Submitted by: Eric Covener Reviewed by: Justin Erenkrantz (with minor formatting tweaks) git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@157583 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 8b6b46e86d5..cdfa2b53ea5 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.1.4 [Remove entries to the current 2.0 section below, when backported] + *) Add ReceiveBufferSize directive to control the TCP receive buffer. + [Eric Covener ] + *) mod_proxy: Add proxy-sendextracrlf option to send an extra CRLF at the end of the request body to work with really old HTTP servers. [Justin Erenkrantz] @@ -9,7 +12,7 @@ Changes with Apache 2.1.4 *) util_ldap: Keep track of the number of attributes retrieved from LDAP so that all the values can be properly cached even if the value is NULL. PR 33901 [Brad Nicholes] - + *) mod_cache: Fix error where incoming Cache-Control would be ignored. [Justin Erenkrantz] diff --git a/include/ap_listen.h b/include/ap_listen.h index bdcea6a53dc..312e87fb63b 100644 --- a/include/ap_listen.h +++ b/include/ap_listen.h @@ -88,6 +88,9 @@ AP_DECLARE_NONSTD(const char *) ap_set_listenbacklog(cmd_parms *cmd, void *dummy AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy, const char *ips); AP_DECLARE_NONSTD(const char *) ap_set_send_buffer_size(cmd_parms *cmd, void *dummy, const char *arg); +AP_DECLARE_NONSTD(const char *) ap_set_receive_buffer_size(cmd_parms *cmd, + void *dummy, + const char *arg); #define LISTEN_COMMANDS \ AP_INIT_TAKE1("ListenBacklog", ap_set_listenbacklog, NULL, RSRC_CONF, \ @@ -95,6 +98,8 @@ AP_INIT_TAKE1("ListenBacklog", ap_set_listenbacklog, NULL, RSRC_CONF, \ AP_INIT_TAKE1("Listen", ap_set_listener, NULL, RSRC_CONF, \ "A port number or a numeric IP address and a port number"), \ AP_INIT_TAKE1("SendBufferSize", ap_set_send_buffer_size, NULL, RSRC_CONF, \ - "Send buffer size in bytes") + "Send buffer size in bytes"), \ +AP_INIT_TAKE1("ReceiveBufferSize", ap_set_receive_buffer_size, NULL, \ + RSRC_CONF, "Receive buffer size in bytes") #endif diff --git a/server/listen.c b/server/listen.c index b5b4490a93c..6a17e43dd84 100644 --- a/server/listen.c +++ b/server/listen.c @@ -34,6 +34,7 @@ AP_DECLARE_DATA ap_listen_rec *ap_listeners = NULL; static ap_listen_rec *old_listeners; static int ap_listenbacklog; static int send_buffer_size; +static int receive_buffer_size; /* TODO: make_sock is just begging and screaming for APR abstraction */ static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server) @@ -112,6 +113,17 @@ static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server) /* not a fatal error */ } } + if (receive_buffer_size) { + stat = apr_socket_opt_set(s, APR_SO_RCVBUF, receive_buffer_size); + if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) { + ap_log_perror(APLOG_MARK, APLOG_WARNING, stat, p, + "make_sock: failed to set ReceiveBufferSize for " + "address %pI, using default", + server->bind_addr); + strerror(errno); + /* not a fatal error */ + } + } #if APR_TCP_NODELAY_INHERITED ap_sock_disable_nagle(s); @@ -534,3 +546,22 @@ AP_DECLARE_NONSTD(const char *) ap_set_send_buffer_size(cmd_parms *cmd, send_buffer_size = s; return NULL; } + +AP_DECLARE_NONSTD(const char *) ap_set_receive_buffer_size(cmd_parms *cmd, + void *dummy, + const char *arg) +{ + int s = atoi(arg); + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + if (s < 512 && s != 0) { + return "ReceiveBufferSize must be >= 512 bytes, or 0 for system default."; + } + + receive_buffer_size = s; + return NULL; +}