summaryrefslogtreecommitdiff
path: root/main/http.c
diff options
context:
space:
mode:
authorKinsey Moore <kmoore@digium.com>2014-04-21 16:16:37 +0000
committerKinsey Moore <kmoore@digium.com>2014-04-21 16:16:37 +0000
commitdcb2ea657c2fc6fb07be584087a1affe799a0646 (patch)
tree4199de225ab67c81533a8ef350c48f5186a3d49b /main/http.c
parente91f65bb9187e3caecedcec1ce44ff33bbd39418 (diff)
HTTP: Add TCP_NODELAY to accepted connections
This adds the TCP_NODELAY option to accepted connections on the HTTP server built into Asterisk. This option disables the Nagle algorithm which controls queueing of outbound data and in some cases can cause delays on receipt of response by the client due to how the Nagle algorithm interacts with TCP delayed ACK. This option is already set on all non-HTTP AMI connections and this change would cover standard HTTP requests, manager HTTP connections, and ARI HTTP requests and websockets in Asterisk 12+ along with any future use of the HTTP server. Review: https://reviewboard.asterisk.org/r/3466/ ........ Merged revisions 412745 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 412748 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 412749 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@412750 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/http.c')
-rw-r--r--main/http.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/main/http.c b/main/http.c
index d6bc006f3..9d213ef61 100644
--- a/main/http.c
+++ b/main/http.c
@@ -1240,11 +1240,27 @@ static void *httpd_helper_thread(void *data)
enum ast_http_method http_method = AST_HTTP_UNKNOWN;
const char *transfer_encoding;
int remaining_headers;
+ struct protoent *p;
if (ast_atomic_fetchadd_int(&session_count, +1) >= session_limit) {
goto done;
}
+ /* here we set TCP_NODELAY on the socket to disable Nagle's algorithm.
+ * This is necessary to prevent delays (caused by buffering) as we
+ * write to the socket in bits and pieces. */
+ p = getprotobyname("tcp");
+ if (p) {
+ int arg = 1;
+ if( setsockopt(ser->fd, p->p_proto, TCP_NODELAY, (char *)&arg, sizeof(arg) ) < 0 ) {
+ ast_log(LOG_WARNING, "Failed to set TCP_NODELAY on HTTP connection: %s\n", strerror(errno));
+ ast_log(LOG_WARNING, "Some HTTP requests may be slow to respond.\n");
+ }
+ } else {
+ ast_log(LOG_WARNING, "Failed to set TCP_NODELAY on HTTP connection, getprotobyname(\"tcp\") failed\n");
+ ast_log(LOG_WARNING, "Some HTTP requests may be slow to respond.\n");
+ }
+
if (!fgets(buf, sizeof(buf), ser->f)) {
goto done;
}