Skip to content

Commit 842733b

Browse files
committed
add dtls core-tests, fix enable_ssl_encrypt with DTLS
1 parent 49d3f2a commit 842733b

File tree

3 files changed

+81
-6
lines changed

3 files changed

+81
-6
lines changed

core-tests/src/server/server.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,68 @@ TEST(server, ssl) {
204204

205205
delete lock;
206206
}
207+
208+
TEST(server, dtls) {
209+
Server serv(Server::MODE_BASE);
210+
serv.worker_num = 1;
211+
212+
SwooleG.running = 1;
213+
214+
sw_logger()->set_level(SW_LOG_WARNING);
215+
216+
Mutex *lock = new Mutex(Mutex::PROCESS_SHARED);
217+
lock->lock();
218+
219+
ListenPort *port = serv.add_port((enum swSocket_type )(SW_SOCK_UDP | SW_SOCK_SSL), TEST_HOST, 0);
220+
if (!port) {
221+
swWarn("listen failed, [error=%d]", swoole_get_last_error());
222+
exit(2);
223+
}
224+
225+
port->ssl_set_cert_file(test::get_root_path() + "/tests/include/ssl_certs/server.crt");
226+
port->ssl_set_key_file(test::get_root_path() + "/tests/include/ssl_certs/server.key");
227+
port->ssl_init();
228+
229+
ASSERT_EQ(serv.create(), SW_OK);
230+
231+
serv.onStart = [&lock](Server *serv) {
232+
thread t1([=]() {
233+
swSignal_none();
234+
235+
lock->lock();
236+
237+
ListenPort *port = serv->get_primary_port();
238+
239+
EXPECT_EQ(port->ssl, 1);
240+
241+
swoole::network::SyncClient c(SW_SOCK_UDP);
242+
c.connect(TEST_HOST, port->port);
243+
c.enable_ssl_encrypt();
244+
c.send(packet, strlen(packet));
245+
char buf[1024];
246+
c.recv(buf, sizeof(buf));
247+
c.close();
248+
249+
kill(serv->gs->master_pid, SIGTERM);
250+
});
251+
t1.detach();
252+
};
253+
254+
serv.onWorkerStart = [&lock](Server *serv, int worker_id) { lock->unlock(); };
255+
256+
serv.onReceive = [](Server *serv, RecvData *req) -> int {
257+
EXPECT_EQ(string(req->data, req->info.len), string(packet));
258+
259+
string resp = string("Server: ") + string(packet);
260+
serv->send(req->info.fd, resp.c_str(), resp.length());
261+
262+
return SW_OK;
263+
};
264+
265+
ASSERT_EQ(serv.start(), 0);
266+
267+
delete lock;
268+
}
207269
#endif
208270

209271
TEST(server, task_worker) {

include/swoole_client.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ class SyncClient {
191191
if (connected || !created) {
192192
return false;
193193
}
194-
if (client.connect(&client, host, port, timeout, 0) < 0) {
194+
if (client.connect(&client, host, port, timeout, client.socket->is_dgram()) < 0) {
195195
return false;
196196
}
197197
connected = true;

src/network/client.cc

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,20 @@ int Client::enable_ssl_encrypt() {
267267
}
268268
ssl_context.reset(new swoole::SSLContext());
269269
open_ssl = true;
270+
#ifdef SW_SUPPORT_DTLS
271+
if (socket->is_dgram()) {
272+
ssl_context->protocols = SW_SSL_DTLS;
273+
socket->dtls = 1;
274+
socket->chunk_size = SW_SSL_BUFFER_SIZE;
275+
send = Client_tcp_send_sync;
276+
recv = Client_tcp_recv_no_buffer;
277+
}
278+
#else
279+
{
280+
swWarn("DTLS support require openssl-1.1 or later");
281+
return SW_ERR;
282+
}
283+
#endif
270284
return SW_OK;
271285
}
272286

@@ -961,8 +975,7 @@ static int Client_onStreamRead(Reactor *reactor, Event *event) {
961975
} else {
962976
if (cli->socket->ssl_state == SW_SSL_STATE_READY) {
963977
execute_onConnect(cli);
964-
}
965-
else if (cli->socket->ssl_state == SW_SSL_STATE_WAIT_STREAM && cli->socket->ssl_want_write) {
978+
} else if (cli->socket->ssl_state == SW_SSL_STATE_WAIT_STREAM && cli->socket->ssl_want_write) {
966979
swoole_event_set(event->socket, SW_EVENT_WRITE);
967980
}
968981
}
@@ -984,7 +997,8 @@ static int Client_onStreamRead(Reactor *reactor, Event *event) {
984997
#ifdef SW_USE_OPENSSL
985998
if (cli->open_ssl) {
986999
if (cli->ssl_handshake() < 0) {
987-
_connect_fail: cli->active = 0;
1000+
_connect_fail:
1001+
cli->active = 0;
9881002
cli->close();
9891003
if (cli->onError) {
9901004
cli->onError(cli);
@@ -1008,8 +1022,7 @@ static int Client_onStreamRead(Reactor *reactor, Event *event) {
10081022
}
10091023
if (cli->socket->ssl_state != SW_SSL_STATE_READY) {
10101024
return SW_OK;
1011-
}
1012-
else {
1025+
} else {
10131026
execute_onConnect(cli);
10141027
return SW_OK;
10151028
}

0 commit comments

Comments
 (0)