Skip to content

Commit 5f6a859

Browse files
committed
Adding ipv6 support
Changing bool compress to an enum class for cleaner code
1 parent a432a3d commit 5f6a859

File tree

6 files changed

+42
-27
lines changed

6 files changed

+42
-27
lines changed

.appveyor.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
image: Visual Studio 2017
22

33
configuration:
4-
- Debug
4+
- Release
55

66
clone_folder: c:\projects\proj
77

@@ -15,7 +15,7 @@ install:
1515
- ps: If ($env:Platform -Match "x86"){ $env:CMAKE_ARCH="" } Else { $env:CMAKE_ARCH=" Win64"}
1616
- mkdir C:\projects\deps
1717
- cd C:\projects\deps
18-
- set CMAKE_URL="https://cmake.org/files/v3.9/cmake-3.9.3-win64-x64.zip"
18+
- set CMAKE_URL="https://cmake.org/files/v3.9/cmake-3.9.3-win64-x64.zip"
1919
- appveyor DownloadFile %CMAKE_URL% -FileName cmake.zip
2020
- 7z x cmake.zip -oC:\projects\deps > nul
2121
- move C:\projects\deps\cmake-* C:\projects\deps\cmake # Move to a version-agnostic directory
@@ -36,8 +36,8 @@ build_script:
3636
- cd build
3737
- cmake -DBUILD_SHARED_LIBS=OFF -DVCPKG_TARGET_TRIPLET=x86-windows-static "-DCMAKE_TOOLCHAIN_FILE=c:\projects\build\vcpkg\scripts\buildsystems\vcpkg.cmake" ..
3838
- cmake --build .
39-
- ctest -V -C Debug
39+
- ctest -V -C Release
4040
- cmake -DBUILD_SHARED_LIBS=ON "-DCMAKE_TOOLCHAIN_FILE=c:\projects\build\vcpkg\scripts\buildsystems\vcpkg.cmake" ..
4141
- cmake --build .
4242
- cmake --build .
43-
- ctest -V -C Debug
43+
- ctest -V -C Release

Test/main.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void wssautobahntest()
3939
msg.code = message.code;
4040
msg.data = msg.Buffer.get();
4141
memcpy(msg.data, message.data, message.len);
42-
socket->send(msg, false);
42+
socket->send(msg, SL::WS_LITE::CompressionOptions::NO_COMPRESSION);
4343
})
4444
->listen();
4545

@@ -95,7 +95,7 @@ void wssautobahntest()
9595
msg.code = message.code;
9696
msg.data = msg.Buffer.get();
9797
memcpy(msg.data, message.data, message.len);
98-
socket->send(msg, false);
98+
socket->send(msg, SL::WS_LITE::CompressionOptions::NO_COMPRESSION);
9999
})
100100
->listen();
101101

@@ -133,7 +133,7 @@ void generaltest()
133133
msg.code = message.code;
134134
msg.data = msg.Buffer.get();
135135
memcpy(msg.data, message.data, message.len);
136-
socket->send(msg, false);
136+
socket->send(msg, SL::WS_LITE::CompressionOptions::NO_COMPRESSION);
137137
})
138138
->onDisconnection([&](const std::shared_ptr<SL::WS_LITE::IWSocket> &socket, unsigned short code, const std::string &msg) {
139139
lastheard = std::chrono::high_resolution_clock::now();
@@ -214,7 +214,7 @@ void generalTLStest()
214214
msg.code = message.code;
215215
msg.data = msg.Buffer.get();
216216
memcpy(msg.data, message.data, message.len);
217-
socket->send(msg, false);
217+
socket->send(msg, SL::WS_LITE::CompressionOptions::NO_COMPRESSION);
218218
})
219219
->onDisconnection([&](const std::shared_ptr<SL::WS_LITE::IWSocket> &socket, unsigned short code, const std::string &msg) {
220220
lastheard = std::chrono::high_resolution_clock::now();
@@ -286,7 +286,7 @@ void multithreadtest()
286286
msg.code = message.code;
287287
msg.data = msg.Buffer.get();
288288
memcpy(msg.data, message.data, message.len);
289-
socket->send(msg, false);
289+
socket->send(msg, SL::WS_LITE::CompressionOptions::NO_COMPRESSION);
290290
})
291291
->listen();
292292

@@ -307,7 +307,7 @@ void multithreadtest()
307307
msg.code = SL::WS_LITE::OpCode::TEXT;
308308
msg.data = msg.Buffer.get();
309309
memcpy(msg.data, txtmsg.data(), txtmsg.size());
310-
socket->send(msg, false);
310+
socket->send(msg, SL::WS_LITE::CompressionOptions::NO_COMPRESSION);
311311
})
312312
->onDisconnection([&](const std::shared_ptr<SL::WS_LITE::IWSocket> &socket, unsigned short code, const std::string &msg) {
313313
lastheard = std::chrono::high_resolution_clock::now();
@@ -382,7 +382,7 @@ void multithreadthroughputtest()
382382
msg.len = bufferesize; // 10MB
383383
msg.code = SL::WS_LITE::OpCode::BINARY;
384384
msg.data = msg.Buffer.get();
385-
socket->send(msg, false);
385+
socket->send(msg, SL::WS_LITE::CompressionOptions::NO_COMPRESSION);
386386
})
387387
->onDisconnection([&](const std::shared_ptr<SL::WS_LITE::IWSocket> &socket, unsigned short code, const std::string &msg) {
388388
lastheard = std::chrono::high_resolution_clock::now();

include/WS_Lite.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ namespace WS_LITE {
148148
enum OpCode : unsigned char { CONTINUATION = 0, TEXT = 1, BINARY = 2, CLOSE = 8, PING = 9, PONG = 10, INVALID = 255 };
149149
enum SocketStatus : int { CONNECTING, CONNECTED, CLOSING, CLOSED };
150150
enum ExtensionOptions : unsigned char { NO_OPTIONS = 0, DEFLATE = 1, NO_CONTEXT_TAKEOVER = 2 };
151+
enum class CompressionOptions { COMPRESS, NO_COMPRESSION };
152+
enum class NetworkProtocol { IPV4, IPV6 };
153+
151154
struct WSMessage {
152155
unsigned char *data;
153156
size_t len;
@@ -167,7 +170,7 @@ namespace WS_LITE {
167170
virtual bool is_v4() const = 0;
168171
virtual bool is_v6() const = 0;
169172
virtual bool is_loopback() const = 0;
170-
virtual void send(const WSMessage &msg, bool compressmessage) = 0;
173+
virtual void send(const WSMessage &msg, CompressionOptions compressmessage) = 0;
171174
// send a close message and close the socket
172175
virtual void close(unsigned short code = 1000, const std::string &msg = "") = 0;
173176
};
@@ -238,7 +241,7 @@ namespace WS_LITE {
238241
public:
239242
virtual ~IWSContext_Configuration() {}
240243

241-
virtual std::shared_ptr<IWSListener_Configuration> CreateListener(PortNumber port,
244+
virtual std::shared_ptr<IWSListener_Configuration> CreateListener(PortNumber port, NetworkProtocol protocol = NetworkProtocol::IPV4,
242245
ExtensionOptions options = ExtensionOptions::NO_OPTIONS) = 0;
243246
virtual std::shared_ptr<IWSClient_Configuration> CreateClient(ExtensionOptions options = ExtensionOptions::NO_OPTIONS) = 0;
244247
};

include/internal/DataStructures.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ namespace SL {
2121
namespace WS_LITE {
2222
class WSContextImpl;
2323
template <bool isServer, class SOCKETTYPE, class SENDBUFFERTYPE>
24-
void sendImpl(const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, const SENDBUFFERTYPE &msg, bool compressmessage);
24+
void sendImpl(const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, const SENDBUFFERTYPE &msg,
25+
CompressionOptions compressmessage);
2526
template <bool isServer, class SOCKETTYPE>
2627
void sendclosemessage(const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, unsigned short code, const std::string &msg);
2728

@@ -114,7 +115,7 @@ namespace WS_LITE {
114115

115116
struct SendQueueItem {
116117
WSMessage msg;
117-
bool compressmessage;
118+
CompressionOptions compressmessage;
118119
};
119120

120121
template <bool isServer, class SOCKETTYPE> class WSocket : public IWSocket {
@@ -144,13 +145,14 @@ namespace WS_LITE {
144145
virtual bool is_v4() const { return SL::WS_LITE::is_v4(Socket); }
145146
virtual bool is_v6() const { return SL::WS_LITE::is_v6(Socket); }
146147
virtual bool is_loopback() const { return SL::WS_LITE::is_loopback(Socket); }
147-
virtual void send(const WSMessage &msg, bool compressmessage)
148+
virtual void send(const WSMessage &msg, CompressionOptions compressmessage)
148149
{
149-
if (SocketStatus_ == SocketStatus::CONNECTED) { // only send a close to an open socket
150+
if (SocketStatus_ == SocketStatus::CONNECTED) { // only send to a conected socket
150151
auto self(std::static_pointer_cast<WSocket<isServer, SOCKETTYPE>>(shared_from_this()));
151152
auto p(Parent);
152-
if (p)
153+
if (p) {
153154
sendImpl<isServer>(p, self, msg, compressmessage);
155+
}
154156
}
155157
}
156158
// send a close message and close the socket
@@ -159,8 +161,9 @@ namespace WS_LITE {
159161
if (SocketStatus_ == SocketStatus::CONNECTED) { // only send a close to an open socket
160162
auto self(std::static_pointer_cast<WSocket<isServer, SOCKETTYPE>>(shared_from_this()));
161163
auto p(Parent);
162-
if (p)
164+
if (p) {
163165
sendclosemessage<isServer>(p, self, code, msg);
166+
}
164167
}
165168
}
166169
void canceltimers()

include/internal/WebSocketProtocol.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ namespace WS_LITE {
7171
msg.len = sizeof(p);
7272
msg.code = OpCode::PING;
7373
msg.data = msg.Buffer.get();
74-
SL::WS_LITE::sendImpl<isServer>(parent, socket, msg, false);
74+
SL::WS_LITE::sendImpl<isServer>(parent, socket, msg, CompressionOptions::NO_COMPRESSION);
7575
start_ping<isServer>(parent, socket, secs);
7676
}
7777
});
@@ -188,9 +188,10 @@ namespace WS_LITE {
188188
}
189189
}
190190
template <bool isServer, class SOCKETTYPE, class SENDBUFFERTYPE>
191-
void sendImpl(const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, const SENDBUFFERTYPE &msg, bool compressmessage)
191+
void sendImpl(const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, const SENDBUFFERTYPE &msg,
192+
CompressionOptions compressmessage)
192193
{
193-
if (compressmessage) {
194+
if (compressmessage == CompressionOptions::COMPRESS) {
194195
assert(msg.code == OpCode::BINARY || msg.code == OpCode::TEXT);
195196
}
196197

@@ -218,7 +219,7 @@ namespace WS_LITE {
218219
*reinterpret_cast<unsigned short *>(ws.Buffer.get()) = ntoh(code);
219220
memcpy(ws.Buffer.get() + sizeof(code), msg.c_str(), msg.size());
220221
ws.data = ws.Buffer.get();
221-
sendImpl<isServer>(parent, socket, ws, false);
222+
sendImpl<isServer>(parent, socket, ws, CompressionOptions::NO_COMPRESSION);
222223
}
223224

224225
template <class SOCKETTYPE>
@@ -321,7 +322,7 @@ namespace WS_LITE {
321322
msg.code = OpCode::PONG;
322323
msg.data = msg.Buffer.get();
323324

324-
sendImpl<isServer>(parent, socket, msg, false);
325+
sendImpl<isServer>(parent, socket, msg, CompressionOptions::NO_COMPRESSION);
325326
}
326327
template <bool isServer, class SOCKETTYPE>
327328
inline void ProcessClose(const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, const std::shared_ptr<unsigned char> &buffer,

src/WSContext.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,11 +220,19 @@ namespace WS_LITE {
220220
WSContext_Configuration(const std::shared_ptr<WSContextImpl> &c) : WSContextImpl_(c) {}
221221
virtual ~WSContext_Configuration() {}
222222

223-
virtual std::shared_ptr<IWSListener_Configuration> CreateListener(PortNumber port, ExtensionOptions options) override
223+
virtual std::shared_ptr<IWSListener_Configuration> CreateListener(PortNumber port, NetworkProtocol protocol,
224+
ExtensionOptions options) override
224225
{
225226
UNUSED(options);
226-
WSContextImpl_->acceptor =
227-
std::make_unique<asio::ip::tcp::acceptor>(WSContextImpl_->io_service, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port.value));
227+
if (protocol == NetworkProtocol::IPV4) {
228+
WSContextImpl_->acceptor =
229+
std::make_unique<asio::ip::tcp::acceptor>(WSContextImpl_->io_service, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port.value));
230+
}
231+
else {
232+
WSContextImpl_->acceptor =
233+
std::make_unique<asio::ip::tcp::acceptor>(WSContextImpl_->io_service, asio::ip::tcp::endpoint(asio::ip::tcp::v6(), port.value));
234+
}
235+
228236
return std::make_shared<WSListener_Configuration>(WSContextImpl_);
229237
}
230238
virtual std::shared_ptr<IWSClient_Configuration> CreateClient(ExtensionOptions options) override

0 commit comments

Comments
 (0)