Skip to content
This repository has been archived by the owner on Jan 14, 2020. It is now read-only.

Commit

Permalink
HTTP: Add TCP_NODELAY to accepted connections
Browse files Browse the repository at this point in the history
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: http://svn.asterisk.org/svn/asterisk/trunk@412750 f38db490-d61c-443f-a65b-d21fe96a405b
  • Loading branch information
Kinsey Moore committed Apr 21, 2014
1 parent 863c972 commit a810bf4
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
16 changes: 16 additions & 0 deletions main/http.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
2 changes: 1 addition & 1 deletion main/manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -5866,7 +5866,7 @@ static void *session_do(void *data)

/* 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 peices. */
* write to the socket in bits and pieces. */
p = getprotobyname("tcp");
if (p) {
int arg = 1;
Expand Down

0 comments on commit a810bf4

Please sign in to comment.