[sr-dev] git:pd/websocket: modules/websocket: Updated connection reuse and closing flags for WebSocket handshake.

Peter Dunkley peter.dunkley at crocodile-rcs.com
Sat Jun 30 01:47:10 CEST 2012


Module: sip-router
Branch: pd/websocket
Commit: 5456e4e90c6330877e0d25d14fba143f2f98f8c6
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=5456e4e90c6330877e0d25d14fba143f2f98f8c6

Author: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Date:   Sat Jun 30 00:46:20 2012 +0100

modules/websocket: Updated connection reuse and closing flags for WebSocket handshake.

- Updated the sample kamailio.cfg to match too.

---

 modules/websocket/example/kamailio.cfg |    5 ++++
 modules/websocket/ws_handshake.c       |   37 +++++++++++++++++++------------
 2 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/modules/websocket/example/kamailio.cfg b/modules/websocket/example/kamailio.cfg
index 48cfa4a..c4bd83f 100644
--- a/modules/websocket/example/kamailio.cfg
+++ b/modules/websocket/example/kamailio.cfg
@@ -306,6 +306,9 @@ onreply_route[WS_REPLY] {
 }
 
 event_route[xhttp:request] {
+	set_reply_close();
+	set_reply_no_connect();
+	
 	if ($Rp != MY_WS_PORT && $Rp != MY_WSS_PORT) {
 		xlog("L_WARN", "HTTP request received on $Rp\n");
 		xhttp_reply("403", "Forbidden", "", "");
@@ -330,6 +333,8 @@ event_route[xhttp:request] {
 		# Optional... validate Origin
 		# Optional... perform HTTP authentication
 
+		# ws_handle_handshake() exits (no further configuration file
+		# processing of the request) when complete.
 		ws_handle_handshake();
 	}
 
diff --git a/modules/websocket/ws_handshake.c b/modules/websocket/ws_handshake.c
index 4bacd61..bb53ef7 100644
--- a/modules/websocket/ws_handshake.c
+++ b/modules/websocket/ws_handshake.c
@@ -115,6 +115,14 @@ int ws_handle_handshake(struct sip_msg *msg)
 	int version;
 	struct hdr_field *hdr = msg->headers;
 	struct tcp_connection *con;
+	ws_connection_t *wsc;
+
+	/* Make sure that the connection is closed after the response _and_
+	   the existing connection (from the request) is reused for the
+	   response.  The close flag will be unset later if the handshake is
+	   successful. */
+	msg->rpl_send_flags.f |= SND_F_CON_CLOSE;
+	msg->rpl_send_flags.f |= SND_F_FORCE_CON_REUSE;
 
 	if (*ws_enabled == 0)
 	{
@@ -283,7 +291,18 @@ int ws_handle_handshake(struct sip_msg *msg)
 	reply_key.len = base64_enc(sha1, 20,
 				(unsigned char *) reply_key.s, KEY_BUF_LEN);
 
-	/* Build headers for reply */
+	/* Add the connection to the WebSocket connection table */
+	wsconn_add(msg->rcv.proto_reserved1);
+
+	/* Make sure Kamailio core sends future messages on this connection
+	   directly to this module */
+	if (con->type == PROTO_TLS)
+		con->type = con->rcv.proto = PROTO_WSS;
+	else
+		con->type = con->rcv.proto = PROTO_WS;
+
+	/* Now Kamailio is ready to receive WebSocket frames build and send a
+	   101 reply */
 	headers.s = headers_buf;
 	headers.len = snprintf(headers.s, HDR_BUF_LEN,
 			"%.*s: %.*s\r\n"
@@ -299,21 +318,11 @@ int ws_handle_handshake(struct sip_msg *msg)
 			reply_key.s, str_hdr_sec_websocket_protocol.len,
 			str_hdr_sec_websocket_protocol.s, str_sip.len,
 			str_sip.s);
-
-	/* Send reply */
+	msg->rpl_send_flags.f &= ~SND_F_CON_CLOSE;
 	if (ws_send_reply(msg, 101,
 				&str_status_switching_protocols, &headers) < 0)
-		return 0;
-
-	/* Add the connection to the WebSocket connection table */
-	wsconn_add(con->id);
-
-	/* Make sure Kamailio core sends future messages on this connection
-	   directly to this module */
-	if (con->type == PROTO_TLS)
-		con->type = con->rcv.proto = PROTO_WSS;
-	else
-		con->type = con->rcv.proto = PROTO_WS;
+		if ((wsc = wsconn_get(msg->rcv.proto_reserved1)) != NULL)
+			wsconn_rm(wsc);
 
 	return 0;
 }




More information about the sr-dev mailing list