From 0ffa2d00d0dddd9c12da26b9db4ccf043fd8c8d0 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Fri, 19 May 2017 16:41:27 +0800 Subject: [PATCH 1/3] Add a 'websocket_protocol_header' option to fix the missing 'Sec-Websocket-Protocol' header of WeChat WebSocket Connection --- src/emqttd_http.erl | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/emqttd_http.erl b/src/emqttd_http.erl index b2828a853..9cbc10a6f 100644 --- a/src/emqttd_http.erl +++ b/src/emqttd_http.erl @@ -59,7 +59,7 @@ handle_request('POST', "/mqtt/publish", Req) -> handle_request('GET', "/mqtt", Req) -> lager:info("WebSocket Connection from: ~s", [Req:get(peer)]), Upgrade = Req:get_header_value("Upgrade"), - Proto = Req:get_header_value("Sec-WebSocket-Protocol"), + Proto = check_protocol_header(Req), case {is_websocket(Upgrade), Proto} of {true, "mqtt" ++ _Vsn} -> emqttd_ws:handle_request(Req); @@ -83,6 +83,18 @@ handle_request(Method, Path, Req) -> lager:error("Unexpected HTTP Request: ~s ~s", [Method, Path]), Req:not_found(). +check_protocol_header(Req) -> + case emqttd:env(websocket_protocol_header, false) of + true -> get_protocol_header(Req); + false -> "mqtt-v3.1.1" + end. + +get_protocol_header(Req) -> + case Req:get_header_value("Emq-WebSocket-Protocol") of + undefined -> Req:get_header_value("Sec-WebSocket-Protocol"); + Proto -> Proto + end. + %%-------------------------------------------------------------------- %% HTTP Publish %%-------------------------------------------------------------------- From 414f156d4a6517abe82072c710ee7053280a8e98 Mon Sep 17 00:00:00 2001 From: turtled Date: Fri, 19 May 2017 16:46:14 +0800 Subject: [PATCH 2/3] Add websocket_protocol_header config --- etc/emq.conf | 3 +++ priv/emq.schema | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/etc/emq.conf b/etc/emq.conf index 40341b83f..1b78c9ae4 100644 --- a/etc/emq.conf +++ b/etc/emq.conf @@ -119,6 +119,9 @@ mqtt.max_clientid_len = 1024 ## Max Packet Size Allowed, 64K by default. mqtt.max_packet_size = 64KB +## Check Websocket Protocol Header. Enum: on, off +mqtt.websocket_protocol_header = on + ##-------------------------------------------------------------------- ## MQTT Connection ##-------------------------------------------------------------------- diff --git a/priv/emq.schema b/priv/emq.schema index 9b20ea4c2..5d9617e64 100644 --- a/priv/emq.schema +++ b/priv/emq.schema @@ -346,6 +346,11 @@ end}. {max_packet_size, cuttlefish:conf_get("mqtt.max_packet_size", Conf)}] end}. +{mapping, "mqtt.websocket_protocol_header", "emqttd.websocket_protocol_header", [ + {default, on}, + {datatype, flag} +]}. + %%-------------------------------------------------------------------- %% MQTT Connection %%-------------------------------------------------------------------- From c64f172174bb7aad142c4009bdb04b5c199be93a Mon Sep 17 00:00:00 2001 From: turtled Date: Fri, 19 May 2017 16:55:14 +0800 Subject: [PATCH 3/3] Emq-WebSocket-Protocol -> EMQ-WebSocket-Protocol --- src/emqttd_http.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emqttd_http.erl b/src/emqttd_http.erl index 9cbc10a6f..9b50cf34a 100644 --- a/src/emqttd_http.erl +++ b/src/emqttd_http.erl @@ -90,7 +90,7 @@ check_protocol_header(Req) -> end. get_protocol_header(Req) -> - case Req:get_header_value("Emq-WebSocket-Protocol") of + case Req:get_header_value("EMQ-WebSocket-Protocol") of undefined -> Req:get_header_value("Sec-WebSocket-Protocol"); Proto -> Proto end.