Add upgrade handler
This commit is contained in:
@@ -8,6 +8,7 @@ int main() {
|
|||||||
/* ws->getUserData returns one of these */
|
/* ws->getUserData returns one of these */
|
||||||
struct PerSocketData {
|
struct PerSocketData {
|
||||||
/* Fill with user data */
|
/* Fill with user data */
|
||||||
|
int something;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Keep in mind that uWS::SSLApp({options}) is the same as uWS::App() when compiled without SSL support.
|
/* Keep in mind that uWS::SSLApp({options}) is the same as uWS::App() when compiled without SSL support.
|
||||||
@@ -24,8 +25,15 @@ int main() {
|
|||||||
.idleTimeout = 10,
|
.idleTimeout = 10,
|
||||||
.maxBackpressure = 1 * 1024 * 1204,
|
.maxBackpressure = 1 * 1024 * 1204,
|
||||||
/* Handlers */
|
/* Handlers */
|
||||||
|
.upgrade = [](auto *res, atuo *req) {
|
||||||
|
std::cout << "Upgrade now!" << std::endl;
|
||||||
|
|
||||||
|
/* Pass user data from upgrade to open handler here */
|
||||||
|
//res.upgrade({.something = 15}, req);
|
||||||
|
},
|
||||||
.open = [](auto *ws, auto *req) {
|
.open = [](auto *ws, auto *req) {
|
||||||
/* Open event here, you may access ws->getUserData() which points to a PerSocketData struct */
|
/* Open event here, you may access ws->getUserData() which points to a PerSocketData struct */
|
||||||
|
std::cout << "Something is: " << ws->getUserData().something << std::endl;
|
||||||
},
|
},
|
||||||
.message = [](auto *ws, std::string_view message, uWS::OpCode opCode) {
|
.message = [](auto *ws, std::string_view message, uWS::OpCode opCode) {
|
||||||
ws->send(message, opCode);
|
ws->send(message, opCode);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Authored by Alex Hultman, 2018-2019.
|
* Authored by Alex Hultman, 2018-2020.
|
||||||
* Intellectual property of third-party.
|
* Intellectual property of third-party.
|
||||||
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -87,7 +87,8 @@ public:
|
|||||||
CompressOptions compression = DISABLED;
|
CompressOptions compression = DISABLED;
|
||||||
int maxPayloadLength = 16 * 1024;
|
int maxPayloadLength = 16 * 1024;
|
||||||
int idleTimeout = 120;
|
int idleTimeout = 120;
|
||||||
int maxBackpressure = 1 * 1024 * 1204;
|
int maxBackpressure = 1 * 1024 * 1024;
|
||||||
|
fu2::unique_function<void(HttpResponse<SSL> *, HttpRequest *)> upgrade = nullptr;
|
||||||
fu2::unique_function<void(uWS::WebSocket<SSL, true> *, HttpRequest *)> open = nullptr;
|
fu2::unique_function<void(uWS::WebSocket<SSL, true> *, HttpRequest *)> open = nullptr;
|
||||||
fu2::unique_function<void(uWS::WebSocket<SSL, true> *, std::string_view, uWS::OpCode)> message = nullptr;
|
fu2::unique_function<void(uWS::WebSocket<SSL, true> *, std::string_view, uWS::OpCode)> message = nullptr;
|
||||||
fu2::unique_function<void(uWS::WebSocket<SSL, true> *)> drain = nullptr;
|
fu2::unique_function<void(uWS::WebSocket<SSL, true> *)> drain = nullptr;
|
||||||
@@ -153,6 +154,27 @@ public:
|
|||||||
/* If we have this header set, it's a websocket */
|
/* If we have this header set, it's a websocket */
|
||||||
std::string_view secWebSocketKey = req->getHeader("sec-websocket-key");
|
std::string_view secWebSocketKey = req->getHeader("sec-websocket-key");
|
||||||
if (secWebSocketKey.length() == 24) {
|
if (secWebSocketKey.length() == 24) {
|
||||||
|
|
||||||
|
/* Emit upgrade handler */
|
||||||
|
if (behavior.upgrade) {
|
||||||
|
|
||||||
|
|
||||||
|
// a regular HttpResponse does not know about UserData or any of the Websocket upgrade procedure
|
||||||
|
|
||||||
|
behavior.upgrade(res, req);
|
||||||
|
|
||||||
|
// if upgrade handler does not upgrade or end within the callback, lift a token?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// handle close here
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Note: OpenSSL can be used here to speed this up somewhat */
|
/* Note: OpenSSL can be used here to speed this up somewhat */
|
||||||
char secWebSocketAccept[29] = {};
|
char secWebSocketAccept[29] = {};
|
||||||
WebSocketHandshake::generate(secWebSocketKey.data(), secWebSocketAccept);
|
WebSocketHandshake::generate(secWebSocketKey.data(), secWebSocketAccept);
|
||||||
|
|||||||
@@ -172,6 +172,11 @@ public:
|
|||||||
|
|
||||||
using Super::getRemoteAddress;
|
using Super::getRemoteAddress;
|
||||||
|
|
||||||
|
/* Manually upgrade to WebSocket, called in upgrade handler of a WebSocket route */
|
||||||
|
/*void upgrade() {
|
||||||
|
|
||||||
|
}*/
|
||||||
|
|
||||||
/* Note: Headers are not checked in regards to timeout.
|
/* Note: Headers are not checked in regards to timeout.
|
||||||
* We only check when you actively push data or end the request */
|
* We only check when you actively push data or end the request */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user