[asterisk-commits] rmudgett: branch rmudgett/http_persistent r417398 - in /team/rmudgett/http_pe...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Jun 26 11:07:03 CDT 2014


Author: rmudgett
Date: Thu Jun 26 11:06:58 2014
New Revision: 417398

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=417398
Log:
Resolve, reset automerge.

Modified:
    team/rmudgett/http_persistent/   (props changed)
    team/rmudgett/http_persistent/UPGRADE.txt
    team/rmudgett/http_persistent/channels/chan_sip.c
    team/rmudgett/http_persistent/channels/sip/include/sip.h
    team/rmudgett/http_persistent/configs/ari.conf.sample
    team/rmudgett/http_persistent/configs/pjsip.conf.sample
    team/rmudgett/http_persistent/configs/sip.conf.sample
    team/rmudgett/http_persistent/include/asterisk/http_websocket.h
    team/rmudgett/http_persistent/include/asterisk/res_pjsip.h
    team/rmudgett/http_persistent/main/udptl.c
    team/rmudgett/http_persistent/res/ari/ari_websockets.c
    team/rmudgett/http_persistent/res/ari/config.c
    team/rmudgett/http_persistent/res/ari/internal.h
    team/rmudgett/http_persistent/res/res_ari.c
    team/rmudgett/http_persistent/res/res_http_websocket.c
    team/rmudgett/http_persistent/res/res_pjsip.c
    team/rmudgett/http_persistent/res/res_pjsip/config_transport.c
    team/rmudgett/http_persistent/res/res_pjsip_transport_websocket.c

Propchange: team/rmudgett/http_persistent/
------------------------------------------------------------------------------
    automerge = *

Propchange: team/rmudgett/http_persistent/
------------------------------------------------------------------------------
Binary property 'branch-11-merged' - no diff available.

Propchange: team/rmudgett/http_persistent/
------------------------------------------------------------------------------
--- http_persistent-integrated (original)
+++ http_persistent-integrated Thu Jun 26 11:06:58 2014
@@ -1,1 +1,1 @@
-/branches/12:1-417308
+/branches/12:1-417397

Modified: team/rmudgett/http_persistent/UPGRADE.txt
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/UPGRADE.txt?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/UPGRADE.txt (original)
+++ team/rmudgett/http_persistent/UPGRADE.txt Thu Jun 26 11:06:58 2014
@@ -34,6 +34,12 @@
    accordingly. The changed strings are:
    - "Exited on signal $EXITSIGNAL" => "Asterisk exited on signal $EXITSIGNAL."
    - "Asterisk Died" => "Asterisk on $MACHINE died (sig $EXITSIGNAL)"
+
+ - Added a compatibility option for ari, chan_sip, and chan_pjsip
+   'websocket_write_timeout'. When a websocket connection exists where Asterisk
+   writes a substantial amount of data to the connected client, and the connected
+   client is slow to process the received data, the socket may be disconnected.
+   In such cases, it may be necessary to adjust this value. Default is 100 ms.
 
 HTTP:
  - Added support for persistent HTTP connections.  To enable persistent

Modified: team/rmudgett/http_persistent/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/channels/chan_sip.c?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/channels/chan_sip.c (original)
+++ team/rmudgett/http_persistent/channels/chan_sip.c Thu Jun 26 11:06:58 2014
@@ -2668,6 +2668,10 @@
 		goto end;
 	}
 
+	if (ast_websocket_set_timeout(session, sip_cfg.websocket_write_timeout)) {
+		goto end;
+	}
+
 	while ((res = ast_wait_for_input(ast_websocket_fd(session), -1)) > 0) {
 		char *payload;
 		uint64_t payload_len;
@@ -32217,6 +32221,12 @@
 			ast_copy_string(default_parkinglot, v->value, sizeof(default_parkinglot));
 		} else if (!strcasecmp(v->name, "refer_addheaders")) {
 			global_refer_addheaders = ast_true(v->value);
+		} else if (!strcasecmp(v->name, "websocket_write_timeout")) {
+			if (sscanf(v->value, "%30d", &sip_cfg.websocket_write_timeout) != 1
+				|| sip_cfg.websocket_write_timeout < 0) {
+				ast_log(LOG_WARNING, "'%s' is not a valid websocket_write_timeout value at line %d. Using default '%d'.\n", v->value, v->lineno, AST_DEFAULT_WEBSOCKET_WRITE_TIMEOUT);
+				sip_cfg.websocket_write_timeout = AST_DEFAULT_WEBSOCKET_WRITE_TIMEOUT;
+			}
 		}
 	}
 

Modified: team/rmudgett/http_persistent/channels/sip/include/sip.h
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/channels/sip/include/sip.h?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/channels/sip/include/sip.h (original)
+++ team/rmudgett/http_persistent/channels/sip/include/sip.h Thu Jun 26 11:06:58 2014
@@ -771,6 +771,7 @@
 	struct ast_format_cap *caps; /*!< Supported codecs */
 	int tcp_enabled;
 	int default_max_forwards;    /*!< Default max forwards (SIP Anti-loop) */
+	int websocket_write_timeout; /*!< Socket write timeout for websocket transports, in ms */
 };
 
 struct ast_websocket;

Modified: team/rmudgett/http_persistent/configs/ari.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/configs/ari.conf.sample?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/configs/ari.conf.sample (original)
+++ team/rmudgett/http_persistent/configs/ari.conf.sample Thu Jun 26 11:06:58 2014
@@ -1,19 +1,25 @@
 [general]
-enabled = yes		; When set to no, ARI support is disabled.
-;pretty = no		; When set to yes, responses from ARI are
-;			; formatted to be human readable.
-;allowed_origins =	; Comma separated list of allowed origins, for
-;			; Cross-Origin Resource Sharing. May be set to * to
-;			; allow all origins.
-;auth_realm =		; Realm to use for authentication. Defaults to Asterisk
-;			; REST Interface.
+enabled = yes       ; When set to no, ARI support is disabled.
+;pretty = no        ; When set to yes, responses from ARI are
+;                   ; formatted to be human readable.
+;allowed_origins =  ; Comma separated list of allowed origins, for
+;                   ; Cross-Origin Resource Sharing. May be set to * to
+;                   ; allow all origins.
+;auth_realm =       ; Realm to use for authentication. Defaults to Asterisk
+;                   ; REST Interface.
+;
+; Default write timeout to set on websockets. This value may need to be adjusted
+; for connections where Asterisk must write a substantial amount of data and the
+; receiving clients are slow to process the received information. Value is in
+; milliseconds; default is 100 ms.
+;websocket_write_timeout = 100
 
 ;[username]
-;type = user		; Specifies user configuration
-;read_only = no		; When set to yes, user is only authorized for
-;			; read-only requests.
+;type = user        ; Specifies user configuration
+;read_only = no     ; When set to yes, user is only authorized for
+;                   ; read-only requests.
 ;
-;password =		; Crypted or plaintext password (see password_format).
+;password =         ; Crypted or plaintext password (see password_format).
 ;
 ; password_format may be set to plain (the default) or crypt. When set to crypt,
 ; crypt(3) is used to validate the password. A crypted password can be generated
@@ -22,3 +28,4 @@
 ; When set to plain, the password is in plaintext.
 ;
 ;password_format = plain
+

Modified: team/rmudgett/http_persistent/configs/pjsip.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/configs/pjsip.conf.sample?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/configs/pjsip.conf.sample (original)
+++ team/rmudgett/http_persistent/configs/pjsip.conf.sample Thu Jun 26 11:06:58 2014
@@ -616,7 +616,13 @@
                 ; "")
 ;tos=0  ; Enable TOS for the signalling sent over this transport (default: "0")
 ;cos=0  ; Enable COS for the signalling sent over this transport (default: "0")
-
+;websocket_write_timeout=100    ; Default write timeout to set on websocket
+                                ; transports. This value may need to be adjusted
+                                ; for connections where Asterisk must write a
+                                ; substantial amount of data and the receiving
+                                ; clients are slow to process the received
+                                ; information. Value is in milliseconds; default
+                                ; is 100 ms.
 
 ;==========================CONTACT SECTION OPTIONS=========================
 ;[contact]

Modified: team/rmudgett/http_persistent/configs/sip.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/configs/sip.conf.sample?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/configs/sip.conf.sample (original)
+++ team/rmudgett/http_persistent/configs/sip.conf.sample Thu Jun 26 11:06:58 2014
@@ -228,6 +228,12 @@
 ;tcpauthlimit = 100             ; tcpauthlimit specifies the maximum number of
 				; unauthenticated sessions that will be allowed
                                 ; to connect at any given time. (default: 100)
+
+;websocket_write_timeout = 100  ; Default write timeout to set on websocket transports.
+                                ; This value may need to be adjusted for connections where
+                                ; Asterisk must write a substantial amount of data and the
+                                ; receiving clients are slow to process the received information.
+                                ; Value is in milliseconds; default is 100 ms.
 
 transport=udp                   ; Set the default transports.  The order determines the primary default transport.
                                 ; If tcpenable=no and the transport set is tcp, we will fallback to UDP.

Modified: team/rmudgett/http_persistent/include/asterisk/http_websocket.h
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/include/asterisk/http_websocket.h?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/include/asterisk/http_websocket.h (original)
+++ team/rmudgett/http_persistent/include/asterisk/http_websocket.h Thu Jun 26 11:06:58 2014
@@ -23,6 +23,12 @@
 #include "asterisk/optional_api.h"
 
 #include <errno.h>
+
+/*! \brief Default websocket write timeout, in ms */
+#define AST_DEFAULT_WEBSOCKET_WRITE_TIMEOUT 100
+
+/*! \brief Default websocket write timeout, in ms (as a string) */
+#define AST_DEFAULT_WEBSOCKET_WRITE_TIMEOUT_STR "100"
 
 /*!
  * \file http_websocket.h
@@ -234,4 +240,15 @@
  */
 AST_OPTIONAL_API(int, ast_websocket_set_nonblock, (struct ast_websocket *session), { errno = ENOSYS; return -1;});
 
+/*!
+ * \brief Set the timeout on a non-blocking WebSocket session.
+ *
+ * \since 11.11.0
+ * \since 12.4.0
+ *
+ * \retval 0 on success
+ * \retval -1 on failure
+ */
+AST_OPTIONAL_API(int, ast_websocket_set_timeout, (struct ast_websocket *session, int timeout), {return -1;});
+
 #endif

Modified: team/rmudgett/http_persistent/include/asterisk/res_pjsip.h
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/include/asterisk/res_pjsip.h?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/include/asterisk/res_pjsip.h (original)
+++ team/rmudgett/http_persistent/include/asterisk/res_pjsip.h Thu Jun 26 11:06:58 2014
@@ -126,6 +126,8 @@
 	unsigned int tos;
 	/*! QOS COS value */
 	unsigned int cos;
+	/*! Write timeout */
+	int write_timeout;
 };
 
 /*!

Modified: team/rmudgett/http_persistent/main/udptl.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/main/udptl.c?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/main/udptl.c (original)
+++ team/rmudgett/http_persistent/main/udptl.c Thu Jun 26 11:06:58 2014
@@ -535,6 +535,12 @@
 				int k;
 				int which;
 				int limit = (l + m) & UDPTL_BUF_MASK;
+
+				/* only repair buffers that actually exist! */
+				if (seq_no <= (s->rx[l].fec_span * s->rx[l].fec_entries) - m) {
+					continue;
+				}
+
 				for (which = -1, k = (limit - s->rx[l].fec_span * s->rx[l].fec_entries) & UDPTL_BUF_MASK; k != limit; k = (k + s->rx[l].fec_entries) & UDPTL_BUF_MASK) {
 					if (s->rx[k].buf_len <= 0)
 						which = (which == -1) ? k : -2;

Modified: team/rmudgett/http_persistent/res/ari/ari_websockets.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/res/ari/ari_websockets.c?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/res/ari/ari_websockets.c (original)
+++ team/rmudgett/http_persistent/res/ari/ari_websockets.c Thu Jun 26 11:06:58 2014
@@ -56,8 +56,13 @@
 	struct ast_websocket *ws_session, int (*validator)(struct ast_json *))
 {
 	RAII_VAR(struct ast_ari_websocket_session *, session, NULL, ao2_cleanup);
+	RAII_VAR(struct ast_ari_conf *, config, ast_ari_config_get(), ao2_cleanup);
 
 	if (ws_session == NULL) {
+		return NULL;
+	}
+
+	if (config == NULL || config->general == NULL) {
 		return NULL;
 	}
 
@@ -70,6 +75,11 @@
 			"ARI web socket failed to set nonblock; closing: %s\n",
 			strerror(errno));
 		return NULL;
+	}
+
+	if (ast_websocket_set_timeout(ws_session, config->general->write_timeout)) {
+		ast_log(LOG_WARNING, "Failed to set write timeout %d on ARI web socket\n",
+			config->general->write_timeout);
 	}
 
 	session = ao2_alloc(sizeof(*session), websocket_session_dtor);

Modified: team/rmudgett/http_persistent/res/ari/config.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/res/ari/config.c?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/res/ari/config.c (original)
+++ team/rmudgett/http_persistent/res/ari/config.c Thu Jun 26 11:06:58 2014
@@ -27,6 +27,7 @@
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 #include "asterisk/config_options.h"
+#include "asterisk/http_websocket.h"
 #include "internal.h"
 
 /*! \brief Locking container for safe configuration access. */
@@ -320,6 +321,9 @@
 	aco_option_register(&cfg_info, "allowed_origins", ACO_EXACT, general_options,
 		"", OPT_STRINGFIELD_T, 0,
 		STRFLDSET(struct ast_ari_conf_general, allowed_origins));
+	aco_option_register(&cfg_info, "websocket_write_timeout", ACO_EXACT, general_options,
+		AST_DEFAULT_WEBSOCKET_WRITE_TIMEOUT_STR, OPT_INT_T, PARSE_IN_RANGE,
+		FLDSET(struct ast_ari_conf_general, write_timeout), 1, INT_MAX);
 
 	aco_option_register(&cfg_info, "type", ACO_EXACT, user, NULL,
 		OPT_NOOP_T, 0, 0);

Modified: team/rmudgett/http_persistent/res/ari/internal.h
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/res/ari/internal.h?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/res/ari/internal.h (original)
+++ team/rmudgett/http_persistent/res/ari/internal.h Thu Jun 26 11:06:58 2014
@@ -65,6 +65,8 @@
 struct ast_ari_conf_general {
 	/*! Enabled by default, disabled if false. */
 	int enabled;
+	/*! Write timeout for websocket connections */
+	int write_timeout;
 	/*! Encoding format used during output (default compact). */
 	enum ast_json_encoding_format format;
 	/*! Authentication realm */

Modified: team/rmudgett/http_persistent/res/res_ari.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/res/res_ari.c?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/res/res_ari.c (original)
+++ team/rmudgett/http_persistent/res/res_ari.c Thu Jun 26 11:06:58 2014
@@ -94,6 +94,14 @@
 						<ref type="filename">http.conf</ref>
 						<ref type="link">https://wiki.asterisk.org/wiki/display/AST/Asterisk+Builtin+mini-HTTP+Server</ref>
 					</see-also>
+				</configOption>
+				<configOption name="websocket_write_timeout">
+					<synopsis>The timeout (in milliseconds) to set on WebSocket connections.</synopsis>
+					<description>
+						<para>If a websocket connection accepts input slowly, the timeout
+						for writes to it can be increased to keep it from being disconnected.
+						Value is in milliseconds; default is 100 ms.</para>
+					</description>
 				</configOption>
 				<configOption name="pretty">
 					<synopsis>Responses from ARI are formatted to be human readable</synopsis>

Modified: team/rmudgett/http_persistent/res/res_http_websocket.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/res/res_http_websocket.c?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/res/res_http_websocket.c (original)
+++ team/rmudgett/http_persistent/res/res_http_websocket.c Thu Jun 26 11:06:58 2014
@@ -77,6 +77,7 @@
 	size_t payload_len;               /*!< Length of the payload */
 	char *payload;                    /*!< Pointer to the payload */
 	size_t reconstruct;               /*!< Number of bytes before a reconstructed payload will be returned and a new one started */
+	int timeout;                      /*!< The timeout for operations on the socket */
 	unsigned int secure:1;            /*!< Bit to indicate that the transport is secure */
 	unsigned int closing:1;           /*!< Bit to indicate that the session is in the process of being closed */
 	unsigned int close_sent:1;        /*!< Bit to indicate that the session close opcode has been sent and no further data will be sent */
@@ -255,7 +256,7 @@
 	session->close_sent = 1;
 
 	ao2_lock(session);
-	res = (fwrite(frame, 1, 4, session->f) == 4) ? 0 : -1;
+	res = ast_careful_fwrite(session->f, session->fd, frame, 4, session->timeout);
 	ao2_unlock(session);
 	return res;
 }
@@ -298,13 +299,12 @@
 		ao2_unlock(session);
 		return -1;
 	}
-
-	if (fwrite(frame, 1, header_size, session->f) != header_size) {
+	if (ast_careful_fwrite(session->f, session->fd, frame, header_size, session->timeout)) {
 		ao2_unlock(session);
 		return -1;
 	}
 
-	if (fwrite(payload, 1, actual_length, session->f) != actual_length) {
+	if (ast_careful_fwrite(session->f, session->fd, payload, actual_length, session->timeout)) {
 		ao2_unlock(session);
 		return -1;
 	}
@@ -362,6 +362,13 @@
 	if ((flags = fcntl(session->fd, F_SETFL, flags)) == -1) {
 		return -1;
 	}
+
+	return 0;
+}
+
+int AST_OPTIONAL_API_NAME(ast_websocket_set_timeout)(struct ast_websocket *session, int timeout)
+{
+	session->timeout = timeout;
 
 	return 0;
 }
@@ -510,8 +517,10 @@
 		}
 
 		/* Per the RFC for PING we need to send back an opcode with the application data as received */
-		if (*opcode == AST_WEBSOCKET_OPCODE_PING) {
-			ast_websocket_write(session, AST_WEBSOCKET_OPCODE_PONG, *payload, *payload_len);
+		if ((*opcode == AST_WEBSOCKET_OPCODE_PING) && (ast_websocket_write(session, AST_WEBSOCKET_OPCODE_PONG, *payload, *payload_len))) {
+			*payload_len = 0;
+			ast_websocket_close(session, 1009);
+			return 0;
 		}
 
 		session->payload = new_payload;
@@ -685,6 +694,7 @@
 			ao2_ref(protocol_handler, -1);
 			return -1;
 		}
+		session->timeout =  AST_DEFAULT_WEBSOCKET_WRITE_TIMEOUT;
 
 		combined = ast_alloca(combined_length);
 		snprintf(combined, combined_length, "%s%s", key, WEBSOCKET_GUID);

Modified: team/rmudgett/http_persistent/res/res_pjsip.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/res/res_pjsip.c?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/res/res_pjsip.c (original)
+++ team/rmudgett/http_persistent/res/res_pjsip.c Thu Jun 26 11:06:58 2014
@@ -867,6 +867,14 @@
 					for more information on this parameter.</para>
 					<note><para>This option does not apply to the <replaceable>ws</replaceable>
 					or the <replaceable>wss</replaceable> protocols.</para></note>
+					</description>
+				</configOption>
+				<configOption name="websocket_write_timeout">
+					<synopsis>The timeout (in milliseconds) to set on WebSocket connections.</synopsis>
+					<description>
+						<para>If a websocket connection accepts input slowly, the timeout
+						for writes to it can be increased to keep it from being disconnected.
+						Value is in milliseconds; default is 100 ms.</para>
 					</description>
 				</configOption>
 			</configObject>

Modified: team/rmudgett/http_persistent/res/res_pjsip/config_transport.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/res/res_pjsip/config_transport.c?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/res/res_pjsip/config_transport.c (original)
+++ team/rmudgett/http_persistent/res/res_pjsip/config_transport.c Thu Jun 26 11:06:58 2014
@@ -28,6 +28,7 @@
 #include "asterisk/sorcery.h"
 #include "asterisk/acl.h"
 #include "include/res_pjsip_private.h"
+#include "asterisk/http_websocket.h"
 
 static int sip_transport_to_ami(const struct ast_sip_transport *transport,
 				struct ast_str **buf)
@@ -668,6 +669,7 @@
 	ast_sorcery_object_field_register_custom(sorcery, "transport", "local_net", "", transport_localnet_handler, localnet_to_str, localnet_to_vl, 0, 0);
 	ast_sorcery_object_field_register_custom(sorcery, "transport", "tos", "0", transport_tos_handler, tos_to_str, NULL, 0, 0);
 	ast_sorcery_object_field_register(sorcery, "transport", "cos", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_transport, cos));
+	ast_sorcery_object_field_register(sorcery, "transport", "websocket_write_timeout", AST_DEFAULT_WEBSOCKET_WRITE_TIMEOUT_STR, OPT_INT_T, PARSE_IN_RANGE, FLDSET(struct ast_sip_transport, write_timeout), 1, INT_MAX);
 
 	ast_sip_register_endpoint_formatter(&endpoint_transport_formatter);
 

Modified: team/rmudgett/http_persistent/res/res_pjsip_transport_websocket.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/http_persistent/res/res_pjsip_transport_websocket.c?view=diff&rev=417398&r1=417397&r2=417398
==============================================================================
--- team/rmudgett/http_persistent/res/res_pjsip_transport_websocket.c (original)
+++ team/rmudgett/http_persistent/res/res_pjsip_transport_websocket.c Thu Jun 26 11:06:58 2014
@@ -207,6 +207,37 @@
 	return (read_data->payload_len == recvd) ? 0 : -1;
 }
 
+static int get_write_timeout(void)
+{
+	int write_timeout = -1;
+	struct ao2_container *transports;
+
+	transports = ast_sorcery_retrieve_by_fields(ast_sip_get_sorcery(), "transport", AST_RETRIEVE_FLAG_ALL, NULL);
+
+	if (transports) {
+		struct ao2_iterator it_transports = ao2_iterator_init(transports, 0);
+		struct ast_sip_transport *transport;
+
+		for (; (transport = ao2_iterator_next(&it_transports)); ao2_cleanup(transport)) {
+			if (transport->type != AST_TRANSPORT_WS && transport->type != AST_TRANSPORT_WSS) {
+				continue;
+			}
+			ast_debug(5, "Found %s transport with write timeout: %d\n",
+				transport->type == AST_TRANSPORT_WS ? "WS" : "WSS",
+				transport->write_timeout);
+			write_timeout = MAX(write_timeout, transport->write_timeout);
+		}
+		ao2_cleanup(transports);
+	}
+
+	if (write_timeout < 0) {
+		write_timeout = AST_DEFAULT_WEBSOCKET_WRITE_TIMEOUT;
+	}
+
+	ast_debug(1, "Write timeout for WS/WSS transports: %d\n", write_timeout);
+	return write_timeout;
+}
+
 /*!
  \brief WebSocket connection handler.
  */
@@ -218,6 +249,11 @@
 	struct transport_read_data read_data;
 
 	if (ast_websocket_set_nonblock(session)) {
+		ast_websocket_unref(session);
+		return;
+	}
+
+	if (ast_websocket_set_timeout(session, get_write_timeout())) {
 		ast_websocket_unref(session);
 		return;
 	}




More information about the asterisk-commits mailing list