iodine 0.7.48 → 0.7.49
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/examples/config.ru +3 -0
- data/ext/iodine/fio.c +4 -2
- data/ext/iodine/iodine_connection.c +8 -5
- data/ext/iodine/websocket_parser.h +1 -0
- data/ext/iodine/websockets.c +10 -4
- data/lib/iodine/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1dad2816193abeda90adf195c3c9cfcaa53eb9a1c5f1e4ad8364be45cd10bc2f
|
4
|
+
data.tar.gz: 02e35b8bbdf6516d210bd8cfc012035a1de2ec3a783e4346152bead0186ba668
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bca7fb5be56837c4a729cef3f755ee4fa8a5a289d448961e01f9449a6e3d76865b03956d7525802a2a1c3768da61b4b8cf8a6088ca63ed57e3b966575e95fb51
|
7
|
+
data.tar.gz: f2fcb35e2cd7452dbeb7fb20bbe5deb3f661e8a3f3ec387d878a858732a414d3d383320164a8a3164be0cdebf900a14360e60d87488c5d61e5b8105ada6270d8
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,10 @@ Please notice that this change log contains changes for upcoming releases as wel
|
|
6
6
|
|
7
7
|
## Changes:
|
8
8
|
|
9
|
+
#### Change log v.0.7.49
|
10
|
+
|
11
|
+
**Fix**: Fixes an issue where named arguments for `subscribe` might not be properly recognized.
|
12
|
+
|
9
13
|
#### Change log v.0.7.48 (2022-06-28)
|
10
14
|
|
11
15
|
**Fix**: Fixes an issue with `pong` WebSocket frames when a client sends a WebSocket `ping`. Credit to Lucas Kuan (@lucaskuan) for finding this issue and for PR #124.
|
data/examples/config.ru
CHANGED
@@ -12,6 +12,9 @@
|
|
12
12
|
#
|
13
13
|
# ab -c 2000 -t 5 -n 1000000 -k http://127.0.0.1:3000/
|
14
14
|
# wrk -c2000 -d5 -t12 http://localhost:3000/
|
15
|
+
#
|
16
|
+
# Test websocket echo using the browser. For example:
|
17
|
+
# ws = new WebSocket("ws://localhost:3000"); ws.onmessage = function(e) {console.log("Got message!"); console.log(e.data);}; ws.onclose = function(e) {console.log("closed")}; ws.onopen = function(e) {ws.send("hi");};
|
15
18
|
|
16
19
|
|
17
20
|
# A simple router - Checks for Websocket Upgrade and answers HTTP.
|
data/ext/iodine/fio.c
CHANGED
@@ -3689,7 +3689,8 @@ closed:
|
|
3689
3689
|
return -1;
|
3690
3690
|
|
3691
3691
|
flush_rw_hook:
|
3692
|
-
|
3692
|
+
if(uuid_data(uuid).rw_hooks)
|
3693
|
+
flushed = uuid_data(uuid).rw_hooks->flush(uuid, uuid_data(uuid).rw_udata);
|
3693
3694
|
fio_unlock(&uuid_data(uuid).sock_lock);
|
3694
3695
|
if (!flushed)
|
3695
3696
|
return 0;
|
@@ -3749,7 +3750,8 @@ size_t fio_flush_all(void) {
|
|
3749
3750
|
return 0;
|
3750
3751
|
size_t count = 0;
|
3751
3752
|
for (uintptr_t i = 0; i <= fio_data->max_protocol_fd; ++i) {
|
3752
|
-
if ((fd_data(i).open || fd_data(i).packet) &&
|
3753
|
+
if ((fd_data(i).open || fd_data(i).packet) &&
|
3754
|
+
fd_data(i).rw_hooks && fio_flush(fd2uuid(i)) > 0)
|
3753
3755
|
++count;
|
3754
3756
|
}
|
3755
3757
|
return count;
|
@@ -518,10 +518,10 @@ static iodine_sub_args_s iodine_subscribe_args(int argc, VALUE *argv) {
|
|
518
518
|
/* single argument must be a Hash / channel name */
|
519
519
|
if (TYPE(argv[0]) == T_HASH) {
|
520
520
|
rb_opt = argv[0];
|
521
|
-
ret.channel = rb_hash_aref(argv[0], to_id);
|
521
|
+
ret.channel = rb_hash_aref(argv[0], ID2SYM(to_id));
|
522
522
|
if (ret.channel == Qnil || ret.channel == Qfalse) {
|
523
523
|
/* temporary backport support */
|
524
|
-
ret.channel = rb_hash_aref(argv[0], channel_id);
|
524
|
+
ret.channel = rb_hash_aref(argv[0], ID2SYM(channel_id));
|
525
525
|
if (ret.channel != Qnil) {
|
526
526
|
FIO_LOG_WARNING("use of :channel in subscribe is deprecated.");
|
527
527
|
}
|
@@ -546,13 +546,16 @@ static iodine_sub_args_s iodine_subscribe_args(int argc, VALUE *argv) {
|
|
546
546
|
Check_Type(ret.channel, T_STRING);
|
547
547
|
|
548
548
|
if (rb_opt) {
|
549
|
-
|
549
|
+
VALUE tmp = Qnil;
|
550
|
+
if ((tmp = rb_hash_aref(rb_opt, ID2SYM(as_id))) != Qnil &&
|
551
|
+
TYPE(tmp) == T_SYMBOL && rb_sym2id(tmp) == binary_id) {
|
550
552
|
ret.binary = 1;
|
551
553
|
}
|
552
|
-
if (rb_hash_aref(rb_opt, match_id)
|
554
|
+
if ((tmp = rb_hash_aref(rb_opt, ID2SYM(match_id))) != Qnil &&
|
555
|
+
TYPE(tmp) == T_SYMBOL && rb_sym2id(tmp) == redis_id) {
|
553
556
|
ret.pattern = FIO_MATCH_GLOB;
|
554
557
|
}
|
555
|
-
ret.block = rb_hash_aref(rb_opt, handler_id);
|
558
|
+
ret.block = rb_hash_aref(rb_opt, ID2SYM(handler_id));
|
556
559
|
if (ret.block != Qnil) {
|
557
560
|
IodineStore.add(ret.block);
|
558
561
|
}
|
@@ -453,6 +453,7 @@ static uint64_t websocket_consume(void *buffer, uint64_t len, void *udata,
|
|
453
453
|
fprintf(stderr, "ERROR: WebSocket protocol error - unmasked data.\n");
|
454
454
|
#endif
|
455
455
|
websocket_on_protocol_error(udata);
|
456
|
+
return 0;
|
456
457
|
}
|
457
458
|
/* call callback */
|
458
459
|
switch (pos[0] & 15) {
|
data/ext/iodine/websockets.c
CHANGED
@@ -127,6 +127,8 @@ struct ws_s {
|
|
127
127
|
struct buffer_s buffer;
|
128
128
|
/** data length (how much of the buffer actually used). */
|
129
129
|
size_t length;
|
130
|
+
/** total data length (including continuation frames). */
|
131
|
+
size_t total_length;
|
130
132
|
/** message buffer. */
|
131
133
|
FIOBJ msg;
|
132
134
|
/** latest text state. */
|
@@ -155,20 +157,24 @@ static void websocket_on_unwrapped(void *ws_p, void *msg, uint64_t len,
|
|
155
157
|
char first, char last, char text,
|
156
158
|
unsigned char rsv) {
|
157
159
|
ws_s *ws = ws_p;
|
160
|
+
if (!ws)
|
161
|
+
return;
|
158
162
|
if (last && first) {
|
159
163
|
ws->on_message(ws, (fio_str_info_s){.data = msg, .len = len},
|
160
164
|
(uint8_t)text);
|
161
165
|
return;
|
162
166
|
}
|
167
|
+
if (ws->msg == FIOBJ_INVALID)
|
168
|
+
ws->msg = fiobj_str_buf(len);
|
169
|
+
ws->total_length += len;
|
163
170
|
if (first) {
|
164
171
|
ws->is_text = (uint8_t)text;
|
165
|
-
if (ws->msg == FIOBJ_INVALID)
|
166
|
-
ws->msg = fiobj_str_buf(len);
|
167
|
-
fiobj_str_resize(ws->msg, 0);
|
168
172
|
}
|
169
173
|
fiobj_str_write(ws->msg, msg, len);
|
170
174
|
if (last) {
|
171
175
|
ws->on_message(ws, fiobj_obj2cstr(ws->msg), ws->is_text);
|
176
|
+
fiobj_str_resize(ws->msg, 0);
|
177
|
+
ws->total_length = 0;
|
172
178
|
}
|
173
179
|
|
174
180
|
(void)rsv;
|
@@ -261,7 +267,7 @@ static void on_data(intptr_t sockfd, fio_protocol_s *ws_) {
|
|
261
267
|
websocket_buffer_peek(ws->buffer.data, ws->length);
|
262
268
|
const uint64_t raw_length = info.packet_length + info.head_length;
|
263
269
|
/* test expected data amount */
|
264
|
-
if (ws->max_msg_size < raw_length) {
|
270
|
+
if (ws->max_msg_size < raw_length + ws->total_length) {
|
265
271
|
/* too big */
|
266
272
|
websocket_close(ws);
|
267
273
|
return;
|
data/lib/iodine/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iodine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.49
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Boaz Segev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -245,7 +245,7 @@ licenses:
|
|
245
245
|
metadata:
|
246
246
|
allowed_push_host: https://rubygems.org
|
247
247
|
post_install_message: |-
|
248
|
-
Thank you for installing Iodine 0.7.
|
248
|
+
Thank you for installing Iodine 0.7.49.
|
249
249
|
Remember: if iodine supports your business, it's only fair to give value back (code contributions / donations).
|
250
250
|
rdoc_options: []
|
251
251
|
require_paths:
|