[svn-commits] dlee: branch dlee/ari-url-shuffle r391763 - /team/dlee/ari-url-shuffle/res/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Jun 13 21:48:57 CDT 2013


Author: dlee
Date: Thu Jun 13 21:48:55 2013
New Revision: 391763

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=391763
Log:
Allow clients to connect without specifying subprotocol if only one is registered.

Modified:
    team/dlee/ari-url-shuffle/res/res_http_websocket.c

Modified: team/dlee/ari-url-shuffle/res/res_http_websocket.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-url-shuffle/res/res_http_websocket.c?view=diff&rev=391763&r1=391762&r2=391763
==============================================================================
--- team/dlee/ari-url-shuffle/res/res_http_websocket.c (original)
+++ team/dlee/ari-url-shuffle/res/res_http_websocket.c Thu Jun 13 21:48:55 2013
@@ -497,6 +497,27 @@
 	return 0;
 }
 
+/*!
+ * \brief If the server has exactly one configured protocol, return it.
+ */
+static struct websocket_protocol *one_protocol(
+	struct ast_websocket_server *server)
+{
+	struct websocket_protocol *protocol;
+	struct ao2_iterator i;
+	SCOPED_AO2LOCK(lock, server->protocols);
+
+	if (ao2_container_count(server->protocols) != 1) {
+		return NULL;
+	}
+
+	i = ao2_iterator_init(server->protocols, 0);
+	protocol = ao2_iterator_next(&i);
+	ast_assert(protocol != NULL);
+	ao2_iterator_destroy(&i);
+	return protocol;
+}
+
 int ast_websocket_uri_cb(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_vars, struct ast_variable *headers)
 {
 	struct ast_variable *v;
@@ -541,11 +562,18 @@
 		ast_http_error(ser, 426, "Upgrade Required", NULL);
 		return -1;
 	} else if (ast_strlen_zero(requested_protocols)) {
-		ast_log(LOG_WARNING, "WebSocket connection from '%s' could not be accepted - no protocols requested\n",
-			ast_sockaddr_stringify(&ser->remote_address));
-		fputs("HTTP/1.1 400 Bad Request\r\n"
-		      "Sec-WebSocket-Version: 7, 8, 13\r\n\r\n", ser->f);
-		return -1;
+		/* If there's only a single protocol registered, and the
+		 * client doesn't specify what protocol it's using, go ahead
+		 * and accept the connection */
+		protocol_handler = one_protocol(server);
+		if (!protocol_handler) {
+			/* Multiple registered subprotocols; client must specify */
+			ast_log(LOG_WARNING, "WebSocket connection from '%s' could not be accepted - no protocols requested\n",
+				ast_sockaddr_stringify(&ser->remote_address));
+			fputs("HTTP/1.1 400 Bad Request\r\n"
+				"Sec-WebSocket-Version: 7, 8, 13\r\n\r\n", ser->f);
+			return -1;
+		}
 	} else if (key1 && key2) {
 		/* Specification defined in http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76 and
 		 * http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-00 -- not currently supported*/
@@ -557,10 +585,8 @@
 	}
 
 	/* Iterate through the requested protocols trying to find one that we have a handler for */
-	while ((protocol = strsep(&requested_protocols, ","))) {
-		if ((protocol_handler = ao2_find(server->protocols, ast_strip(protocol), OBJ_KEY))) {
-			break;
-		}
+	while (!protocol_handler && (protocol = strsep(&requested_protocols, ","))) {
+		protocol_handler = ao2_find(server->protocols, ast_strip(protocol), OBJ_KEY);
 	}
 
 	/* If no protocol handler exists bump this back to the requester */




More information about the svn-commits mailing list