mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-23 00:07:59 +02:00
feat(Net): Non-blocking WebSocket #4773
This commit is contained in:
@@ -58,9 +58,9 @@ namespace
|
||||
do
|
||||
{
|
||||
n = ws.receiveFrame(buffer.begin(), static_cast<int>(buffer.size()), flags);
|
||||
ws.sendFrame(buffer.begin(), n, flags);
|
||||
if (n > 0) ws.sendFrame(buffer.begin(), n, flags);
|
||||
}
|
||||
while (n > 0 || (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
|
||||
while (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
|
||||
}
|
||||
catch (WebSocketException& exc)
|
||||
{
|
||||
@@ -199,6 +199,7 @@ void WebSocketTest::testWebSocket()
|
||||
assertTrue (n == 2);
|
||||
assertTrue ((flags & WebSocket::FRAME_OP_BITMASK) == WebSocket::FRAME_OP_CLOSE);
|
||||
|
||||
ws.close();
|
||||
server.stop();
|
||||
}
|
||||
|
||||
@@ -234,6 +235,9 @@ void WebSocketTest::testWebSocketLarge()
|
||||
|
||||
assertTrue (n == payload.size());
|
||||
assertTrue (payload.compare(0, payload.size(), buffer, n) == 0);
|
||||
|
||||
ws.close();
|
||||
server.stop();
|
||||
}
|
||||
|
||||
|
||||
@@ -270,6 +274,9 @@ void WebSocketTest::testOneLargeFrame(int msgSize)
|
||||
n = ws.receiveFrame(pocobuffer, flags);
|
||||
assertTrue (n == payload.size());
|
||||
assertTrue (payload.compare(0, payload.size(), pocobuffer.begin(), n) == 0);
|
||||
|
||||
ws.close();
|
||||
server.stop();
|
||||
}
|
||||
|
||||
|
||||
@@ -280,6 +287,74 @@ void WebSocketTest::testWebSocketLargeInOneFrame()
|
||||
}
|
||||
|
||||
|
||||
void WebSocketTest::testWebSocketNB()
|
||||
{
|
||||
Poco::Net::ServerSocket ss(0);
|
||||
Poco::Net::HTTPServer server(new WebSocketRequestHandlerFactory(256*1024), ss, new Poco::Net::HTTPServerParams);
|
||||
server.start();
|
||||
|
||||
Poco::Thread::sleep(200);
|
||||
|
||||
HTTPClientSession cs("127.0.0.1", ss.address().port());
|
||||
HTTPRequest request(HTTPRequest::HTTP_GET, "/ws", HTTPRequest::HTTP_1_1);
|
||||
HTTPResponse response;
|
||||
WebSocket ws(cs, request, response);
|
||||
ws.setBlocking(false);
|
||||
|
||||
int flags;
|
||||
char buffer[256*1024] = {};
|
||||
int n = ws.receiveFrame(buffer, sizeof(buffer), flags);
|
||||
assertTrue (n < 0);
|
||||
|
||||
std::string payload("x");
|
||||
n = ws.sendFrame(payload.data(), (int) payload.size());
|
||||
assertTrue (n > 0);
|
||||
if (ws.poll(1000000, Poco::Net::Socket::SELECT_READ))
|
||||
{
|
||||
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
|
||||
while (n < 0)
|
||||
{
|
||||
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
|
||||
}
|
||||
}
|
||||
assertTrue (n == payload.size());
|
||||
assertTrue (payload.compare(0, payload.size(), buffer, n) == 0);
|
||||
assertTrue (flags == WebSocket::FRAME_TEXT);
|
||||
|
||||
ws.setSendBufferSize(256*1024);
|
||||
ws.setReceiveBufferSize(256*1024);
|
||||
|
||||
payload.assign(256000, 'z');
|
||||
n = ws.sendFrame(payload.data(), (int) payload.size());
|
||||
assertTrue (n > 0);
|
||||
if (ws.poll(1000000, Poco::Net::Socket::SELECT_READ))
|
||||
{
|
||||
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
|
||||
while (n < 0)
|
||||
{
|
||||
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
|
||||
}
|
||||
}
|
||||
assertTrue (n == payload.size());
|
||||
assertTrue (payload.compare(0, payload.size(), buffer, n) == 0);
|
||||
assertTrue (flags == WebSocket::FRAME_TEXT);
|
||||
|
||||
n = ws.shutdown();
|
||||
assertTrue (n > 0);
|
||||
|
||||
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
|
||||
while (n < 0)
|
||||
{
|
||||
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
|
||||
}
|
||||
assertTrue (n == 2);
|
||||
assertTrue ((flags & WebSocket::FRAME_OP_BITMASK) == WebSocket::FRAME_OP_CLOSE);
|
||||
|
||||
ws.close();
|
||||
server.stop();
|
||||
}
|
||||
|
||||
|
||||
void WebSocketTest::setUp()
|
||||
{
|
||||
}
|
||||
@@ -297,6 +372,7 @@ CppUnit::Test* WebSocketTest::suite()
|
||||
CppUnit_addTest(pSuite, WebSocketTest, testWebSocket);
|
||||
CppUnit_addTest(pSuite, WebSocketTest, testWebSocketLarge);
|
||||
CppUnit_addTest(pSuite, WebSocketTest, testWebSocketLargeInOneFrame);
|
||||
CppUnit_addTest(pSuite, WebSocketTest, testWebSocketNB);
|
||||
|
||||
return pSuite;
|
||||
}
|
||||
|
@@ -27,6 +27,7 @@ public:
|
||||
void testWebSocket();
|
||||
void testWebSocketLarge();
|
||||
void testWebSocketLargeInOneFrame();
|
||||
void testWebSocketNB();
|
||||
|
||||
void setUp();
|
||||
void tearDown();
|
||||
|
Reference in New Issue
Block a user