Skip to content

Commit ce8cab8

Browse files
committed
Firefox now supported, improved UWP JS client support
Firefox would send "Connection: Keep-Alive, Upgrade" for WebSocket, not "Connection: Upgrade", which is valid, albeit strange as keeping alive is unrelated to WebSocket. Fusion UWP exporter is JS-based, so it's using WebSocket, so server build 33 was already compatible with UWP due to being HTML5-compatbile. So, just added some extra code to make implementation strings/enum fleshed out, and made "HTML5" references clearly HTML5 or WebSocket in general.
1 parent a8e5b49 commit ce8cab8

File tree

4 files changed

+15
-7
lines changed

4 files changed

+15
-7
lines changed

Lacewing/Lacewing.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2048,7 +2048,8 @@ struct relayserver
20482048
Android,
20492049
iOS,
20502050
Macintosh,
2051-
HTML5
2051+
HTML5,
2052+
UWP
20522053
// Edit relayserverinternal::client::getimplementation if you add more lines
20532054
};
20542055

@@ -2116,7 +2117,7 @@ struct relayserver
21162117

21172118
std::string clientImplStr;
21182119

2119-
bool pseudoUDP = true; // Is UDP not supported (e.g. Flash, HTML5) so "faked" by receiver
2120+
bool pseudoUDP = true; // Is UDP not supported (e.g. HTML5, UWP JS) so "faked" by receiver
21202121

21212122
// Got opening null byte, indicating not a HTTP client.
21222123
bool gotfirstbyte = false;

Lacewing/RelayServer.cc

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,8 @@ const char * relayserver::client::getimplementation() const
761761
return "Macintosh";
762762
case clientimpl::HTML5:
763763
return "HTML5";
764+
case clientimpl::UWP:
765+
return "UWP";
764766
default:
765767
return "Unknown [error]";
766768
}
@@ -1154,7 +1156,9 @@ void handlerwebserverget(lacewing::webserver webserver, lacewing::webserver_requ
11541156
relayserverinternal& internal = *(relayserverinternal*)webserver->tag();
11551157
std::string error;
11561158

1157-
if (!strcasecmp(req->header("Connection"), "upgrade"))
1159+
// According to spec Connection must only *include* Upgrade.
1160+
// Firefox sends Keep-Alive as well, for some reason.
1161+
if (strstr(req->header("Connection"), "Upgrade") != NULL)
11581162
{
11591163
do {
11601164
const char* webSocketKey2 = req->header("Sec-WebSocket-Key");
@@ -1205,7 +1209,7 @@ void handlerwebserverget(lacewing::webserver webserver, lacewing::webserver_requ
12051209
} while (false);
12061210

12071211
lacewing::error err = lacewing::error_new();
1208-
err->add("Failed a HTML5 WebSocket connection, due to %s.\n", error.c_str());
1212+
err->add("Failed a HTML5/UWP WebSocket connection, due to %s.\n", error.c_str());
12091213
if (internal.handlererror)
12101214
internal.handlererror(internal.server, err);
12111215
lacewing::error_delete(err);
@@ -2528,6 +2532,9 @@ bool relayserverinternal::client_messagehandler(std::shared_ptr<relayserver::cli
25282532
// First test in client build 99, first release as build 100
25292533
else if (impl.find("HTML5"sv) != std::string_view::npos)
25302534
client->clientImpl = relayserver::client::clientimpl::HTML5;
2535+
// Released in client build 101 - uses HTML5 JS code
2536+
else if (impl.find("UWP"sv) != std::string_view::npos)
2537+
client->clientImpl = relayserver::client::clientimpl::UWP;
25312538
// While supported, Blue Flash never existed, and Relay Flash won't return a implementation response
25322539
else if (impl.find("Flash"sv) != std::string_view::npos)
25332540
client->clientImpl = relayserver::client::clientimpl::Flash;
@@ -3070,7 +3077,7 @@ void relayserver::connect_response(
30703077

30713078
// Force a connect refusal if not hosting server
30723079
// TODO: Is this necessary? Client should've been d/c'd on unhost
3073-
// If it is necessary, the HTML5 server hosting check is borked, client could be on the other server
3080+
// If it is necessary, this WebSocket server hosting check is borked, as connecting client could be on the other WebSocket server
30743081
std::string_view denyReason = passedDenyReason;
30753082
if (denyReason.empty() && (client->socket->is_websocket() ? !websocket->hosting() && !websocket->hosting_secure() : !hosting()))
30763083
denyReason = "Server has shut down."sv;

Lacewing/src/stream.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ size_t lwp_stream_write (lw_stream ctx, const char * buffer, size_t size, int fl
383383
queue_back (ctx, buffer + written, size - written);
384384
}
385385
}
386-
386+
387387
return size;
388388
}
389389

Lacewing/src/webserver/webserver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ size_t lw_webserver_sink_websocket(lw_ws webserver, lwp_ws_httpclient client, co
123123
}
124124

125125
// Packet length is three forms in WebSocket; 8-bit (<126), 16-bit (126), and 64-bit (127).
126-
// We don't expect user to send >65kb message via Bluewing, HTML5 or not.
126+
// We don't expect user to send >65kb message via Bluewing, WebSocket or not.
127127
// It's possible we could read it anyway if it's less than 4GB, but the
128128
// Bluewing level ping timeout will make sending big packets dangerous anyway.
129129
lw_i32 packetLen = data[1] & 0b01111111;

0 commit comments

Comments
 (0)