Hook up AsyncSocket with WebSocket
This commit is contained in:
@@ -28,6 +28,7 @@ namespace uWS {
|
||||
template <bool SSL>
|
||||
struct AsyncSocket : StaticDispatch<SSL> {
|
||||
template <bool> friend struct HttpContext;
|
||||
template <bool> friend struct WebSocketContext;
|
||||
protected:
|
||||
using SOCKET_TYPE = typename StaticDispatch<SSL>::SOCKET_TYPE;
|
||||
using StaticDispatch<SSL>::static_dispatch;
|
||||
@@ -40,8 +41,13 @@ protected:
|
||||
);
|
||||
}
|
||||
|
||||
// we need a type safe realType = getData<MiddleType>
|
||||
|
||||
/* Get socket extension */
|
||||
void *getExt() {
|
||||
|
||||
// we might have multiple inheritance so need to know the middle type
|
||||
|
||||
return static_dispatch(us_ssl_socket_ext, us_socket_ext)((SOCKET_TYPE *) this);
|
||||
}
|
||||
|
||||
|
||||
+5
-6
@@ -2,31 +2,30 @@
|
||||
#define WEBSOCKET_H
|
||||
|
||||
#include "WebSocketData.h"
|
||||
|
||||
#include "WebSocketProtocol.h"
|
||||
#include "AsyncSocket.h"
|
||||
|
||||
#include <string_view>
|
||||
|
||||
namespace uWS {
|
||||
|
||||
template <bool SSL, bool isServer>
|
||||
struct WebSocket {
|
||||
struct WebSocket : AsyncSocket<SSL> {
|
||||
private:
|
||||
|
||||
typedef AsyncSocket<SSL> Super;
|
||||
public:
|
||||
|
||||
void send(std::string_view message) {
|
||||
|
||||
// this path should use AsyncSocket with cork and everything
|
||||
// if corkAllocate(size) then corkFree(unused)
|
||||
|
||||
// format the response
|
||||
char buf[100];
|
||||
int writeLength = WebSocketProtocol<isServer, WebSocket<SSL, isServer>>::formatMessage(buf, message.data(), message.length(), uWS::OpCode::TEXT, message.length(), false);
|
||||
|
||||
|
||||
us_socket_write((us_socket *) this, buf, writeLength, false);
|
||||
|
||||
|
||||
Super::write(buf, writeLength);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
#include "WebSocketData.h"
|
||||
|
||||
#include "AsyncSocket.h"
|
||||
|
||||
namespace uWS {
|
||||
|
||||
template <bool SSL>
|
||||
@@ -75,12 +77,20 @@ private:
|
||||
/* Handle HTTP data streams */
|
||||
static_dispatch(us_ssl_socket_context_on_data, us_socket_context_on_data)(getSocketContext(), [](auto *s, char *data, int length) {
|
||||
|
||||
|
||||
AsyncSocket<SSL> *webSocket = (AsyncSocket<SSL> *) s;
|
||||
|
||||
webSocket->cork();
|
||||
|
||||
// get the data
|
||||
WebSocketData *wsState = (WebSocketData *) us_socket_ext(s);
|
||||
|
||||
// this parser requires almost no time -> 215k req/sec of 215k possible
|
||||
uWS::WebSocketProtocol<true, WebSocketProtcolImplementation<true>>::consume(data, length, wsState, s);
|
||||
|
||||
|
||||
webSocket->uncork();
|
||||
|
||||
return s;
|
||||
});
|
||||
|
||||
|
||||
+3
-1
@@ -2,10 +2,12 @@
|
||||
#define WEBSOCKETDATA_H
|
||||
|
||||
#include "WebSocketProtocol.h"
|
||||
#include "AsyncSocketData.h"
|
||||
|
||||
namespace uWS {
|
||||
|
||||
struct WebSocketData : WebSocketState<true> {
|
||||
// take care with get_ext here !
|
||||
struct WebSocketData : AsyncSocketData<false>, WebSocketState<true> {
|
||||
private:
|
||||
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user