iodine 0.7.48 → 0.7.50
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +42 -0
- data/CHANGELOG.md +12 -0
- data/README.md +2 -2
- data/examples/config.ru +3 -0
- data/examples/rack3.ru +12 -0
- data/exe/iodine +14 -11
- data/ext/iodine/extconf.rb +1 -0
- data/ext/iodine/fio.c +4 -2
- data/ext/iodine/iodine_connection.c +10 -6
- data/ext/iodine/iodine_http.c +23 -11
- data/ext/iodine/iodine_mustache.c +1 -1
- data/ext/iodine/iodine_store.c +1 -1
- data/ext/iodine/iodine_tls.c +1 -1
- data/ext/iodine/websocket_parser.h +1 -0
- data/ext/iodine/websockets.c +10 -4
- data/lib/iodine/version.rb +1 -1
- data/lib/rack/handler/iodine.rb +1 -1
- metadata +6 -5
- data/.travis.yml +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 222b90cff0e761d924b2a3f7cba4f8914727cf87619602781a8a6ad3bc824e97
|
4
|
+
data.tar.gz: 3935cf93e8874392560949a07ad990d94501d4b31ddabb2e825ef3c6cbc41539
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 736cac5605c0234d77390184460acc6771abac50de525ea4df9cc48026e5b58312afc55d336026901373f123fab59d6baa86314cf2d5955da094c1bdc669c4ac
|
7
|
+
data.tar.gz: 2229bccab50dd9b530338c3c326c6b52f90983e06210c2beb88ecb27dd57a66fcfca005155ae46c35724e938b62e7aceb47cec939d1fe2ea724235fc48816466
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support documentation.
|
4
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
5
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
6
|
+
|
7
|
+
name: Building iodine
|
8
|
+
|
9
|
+
on:
|
10
|
+
push:
|
11
|
+
branches: [ "master" ]
|
12
|
+
pull_request:
|
13
|
+
branches: [ "master" ]
|
14
|
+
|
15
|
+
permissions:
|
16
|
+
contents: read
|
17
|
+
|
18
|
+
jobs:
|
19
|
+
test:
|
20
|
+
strategy:
|
21
|
+
fail-fast: false
|
22
|
+
matrix:
|
23
|
+
ruby-version: ['2.3', '2.7', '3.0', '3.2']
|
24
|
+
os: [ubuntu-latest, macos-latest] # , windows-latest
|
25
|
+
runs-on: ${{ matrix.os }}
|
26
|
+
steps:
|
27
|
+
- uses: actions/checkout@v3
|
28
|
+
- name: Set up Ruby # see https://github.com/ruby/setup-ruby#versioning)
|
29
|
+
uses: ruby/setup-ruby@v1
|
30
|
+
with:
|
31
|
+
ruby-version: ${{ matrix.ruby-version }}
|
32
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
33
|
+
- name: Build and Test Iodine
|
34
|
+
run: |
|
35
|
+
echo CFLAGS = $CFLAGS
|
36
|
+
echo cflags = $cflags
|
37
|
+
echo HOME = $HOME
|
38
|
+
ruby -e 'puts Gem.default_dir'
|
39
|
+
bundle exec rake install
|
40
|
+
# env VERBOSE=1 bundle exec rspec --format documentation
|
41
|
+
# - name: Run tests
|
42
|
+
# run: bundle exec rake
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,18 @@ 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.50
|
10
|
+
|
11
|
+
**Fix**: Fixes some compatibility issues with Rack 3.0. Credit to @taku0 for opening issue #131.
|
12
|
+
|
13
|
+
**Fix**: Fixes compilation on Ruby 3.x - deprecation of `rc_cData`. Credit to Mohammad A. Ali (@oldmoe) for opening issue #128.
|
14
|
+
|
15
|
+
#### Change log v.0.7.49
|
16
|
+
|
17
|
+
**Fix**: Fixes an issue where named arguments for `subscribe` might not be properly recognized.
|
18
|
+
|
19
|
+
**Security**: Fixes an issue where a malformed WebSocket continuation frame might crash a worker process. Credit to @fabio for exposing this issue and opening issue #127.
|
20
|
+
|
9
21
|
#### Change log v.0.7.48 (2022-06-28)
|
10
22
|
|
11
23
|
**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/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# iodine - Why Settle for a fast HTTP / WebSocket Server with native Pub/Sub?
|
2
2
|
|
3
3
|
[![Gem](https://img.shields.io/gem/dt/iodine.svg)](https://rubygems.org/gems/iodine)
|
4
|
-
[![Build Status](https://
|
4
|
+
[![Build Status](https://github.com/boazsegev/iodine/actions/workflows/ruby.yml/badge.svg)](https://github.com/boazsegev/iodine/actions/workflows/ruby.yml)
|
5
5
|
[![Gem Version](https://badge.fury.io/rb/iodine.svg)](https://badge.fury.io/rb/iodine)
|
6
6
|
[![Inline docs](http://inch-ci.org/github/boazsegev/iodine.svg?branch=master)](http://www.rubydoc.info/github/boazsegev/iodine/master/frames)
|
7
7
|
[![GitHub](https://img.shields.io/badge/GitHub-Open%20Source-blue.svg)](https://github.com/boazsegev/iodine)
|
@@ -37,7 +37,7 @@ Since iodine wraps much of the [C facil.io framework](https://github.com/boazseg
|
|
37
37
|
|
38
38
|
* Iodine is ideal for **Linux/Unix** based systems (i.e. macOS, Ubuntu, FreeBSD etc'), which are ideal for evented IO (while Windows and Solaris are better at IO *completion* events, which are very different).
|
39
39
|
|
40
|
-
Iodine is a C extension for Ruby, developed and optimized for Ruby MRI 2.
|
40
|
+
Iodine is a C extension for Ruby, developed and optimized for Ruby MRI 2.3 and up... it should support the whole Ruby 2.x and 3.x MRI family, but CI tests start at Ruby 2.3.
|
41
41
|
|
42
42
|
**Note**: iodine does **not** support streaming when using Rack. It's recommended to avoid blocking the server when using `body.each` since the `each` loop will block the iodine's thread until it's finished and iodine won't send any data before the loop is done.
|
43
43
|
|
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/examples/rack3.ru
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
# adjusted from the code suggested by @taku0 (GitHub issue #131)
|
4
|
+
require 'rack'
|
5
|
+
require 'iodine'
|
6
|
+
|
7
|
+
run { |env|
|
8
|
+
response = Rack::Response.new(nil, 204)
|
9
|
+
response.set_cookie('aaa', 'aaa')
|
10
|
+
response.set_cookie('bbb', 'bbb')
|
11
|
+
response.finish
|
12
|
+
}
|
data/exe/iodine
CHANGED
@@ -16,6 +16,7 @@ begin
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
rescue LoadError
|
19
|
+
puts "WARNING: The gam `rack` wasn't loaded before iodine started loading the rack app, using custom loader."
|
19
20
|
module Iodine
|
20
21
|
module Base
|
21
22
|
module Rack
|
@@ -133,8 +134,9 @@ rescue LoadError
|
|
133
134
|
# end
|
134
135
|
#
|
135
136
|
# run Heartbeat
|
136
|
-
def run(app)
|
137
|
-
|
137
|
+
def run(app = nil, &block)
|
138
|
+
raise ArgumentError, "Both app and block given!" if app && block_given?
|
139
|
+
@run = app || block
|
138
140
|
end
|
139
141
|
|
140
142
|
# Takes a lambda or block that is used to warm-up the application.
|
@@ -214,28 +216,29 @@ module Iodine
|
|
214
216
|
|
215
217
|
def self.try_file filename
|
216
218
|
return nil unless File.exist? filename
|
217
|
-
|
219
|
+
result = Iodine::Base::Rack::Builder.parse_file filename
|
220
|
+
return result[0] if(result.is_a?(Array))
|
221
|
+
return result
|
218
222
|
end
|
219
223
|
|
220
224
|
def self.get_app_opts
|
221
|
-
app, opt = nil,
|
225
|
+
app, opt = nil, Hash.new
|
222
226
|
filename = Iodine::DEFAULT_SETTINGS[:filename_]
|
223
227
|
if filename
|
224
|
-
app
|
225
|
-
app
|
226
|
-
unless
|
228
|
+
app = try_file(filename)
|
229
|
+
app = try_file("#{filename}.ru") unless app
|
230
|
+
unless app
|
227
231
|
puts "* Couldn't find #{filename}\n testing for config.ru\n"
|
228
|
-
app
|
232
|
+
app = try_file "config.ru"
|
229
233
|
end
|
230
234
|
else
|
231
|
-
app
|
235
|
+
app = try_file "config.ru";
|
232
236
|
end
|
233
237
|
|
234
|
-
unless
|
238
|
+
unless app
|
235
239
|
puts "WARNING: Ruby application not found#{ filename ? " - missing both #{filename} and config.ru" : " - missing config.ru"}."
|
236
240
|
if Iodine::DEFAULT_SETTINGS[:public]
|
237
241
|
puts " Running only static file service."
|
238
|
-
opt = Hash.new
|
239
242
|
app = Proc.new { [404, {}, "Not Found!"] }
|
240
243
|
else
|
241
244
|
puts "\nERROR: Couldn't run Ruby application, check command line arguments."
|
data/ext/iodine/extconf.rb
CHANGED
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
|
}
|
@@ -900,7 +903,8 @@ void iodine_connection_init(void) {
|
|
900
903
|
IodineStore.add(RAWSymbol);
|
901
904
|
|
902
905
|
// define the Connection Class and it's methods
|
903
|
-
ConnectionKlass =
|
906
|
+
ConnectionKlass =
|
907
|
+
rb_define_class_under(IodineModule, "Connection", rb_cObject);
|
904
908
|
rb_define_alloc_func(ConnectionKlass, iodine_connection_data_alloc_c);
|
905
909
|
rb_define_method(ConnectionKlass, "write", iodine_connection_write, 1);
|
906
910
|
rb_define_method(ConnectionKlass, "close", iodine_connection_close, 0);
|
data/ext/iodine/iodine_http.c
CHANGED
@@ -477,6 +477,10 @@ Handling the HTTP response
|
|
477
477
|
static int for_each_header_data(VALUE key, VALUE val, VALUE h_) {
|
478
478
|
http_s *h = (http_s *)h_;
|
479
479
|
// fprintf(stderr, "For_each - headers\n");
|
480
|
+
if (TYPE(val) == T_NIL)
|
481
|
+
return ST_CONTINUE;
|
482
|
+
if (TYPE(val) == T_ARRAY)
|
483
|
+
goto array_style_multi_value;
|
480
484
|
if (TYPE(key) != T_STRING)
|
481
485
|
key = IodineCaller.call(key, iodine_to_s_id);
|
482
486
|
if (TYPE(key) != T_STRING)
|
@@ -515,6 +519,14 @@ static int for_each_header_data(VALUE key, VALUE val, VALUE h_) {
|
|
515
519
|
fiobj_free(name);
|
516
520
|
// no errors, return 0
|
517
521
|
return ST_CONTINUE;
|
522
|
+
|
523
|
+
array_style_multi_value:
|
524
|
+
for (size_t i = 0, end = RARRAY_LEN(val); i < end; ++i) {
|
525
|
+
if (for_each_header_data(key, RARRAY_AREF(val, i), h_) == ST_CONTINUE)
|
526
|
+
continue;
|
527
|
+
return ST_STOP;
|
528
|
+
}
|
529
|
+
return ST_CONTINUE;
|
518
530
|
}
|
519
531
|
|
520
532
|
// writes the body to the response object
|
@@ -940,15 +952,15 @@ intptr_t iodine_http_listen(iodine_connection_args_s args){
|
|
940
952
|
support_xsendfile = 1;
|
941
953
|
}
|
942
954
|
IodineStore.add(args.handler);
|
943
|
-
|
944
|
-
|
955
|
+
#ifdef __MINGW32__
|
956
|
+
intptr_t uuid = http_listen(
|
945
957
|
args.port.data, args.address.data, .on_request = on_rack_request,
|
946
958
|
.on_upgrade = on_rack_upgrade, .udata = (void *)args.handler,
|
947
959
|
.timeout = args.timeout, .ws_timeout = args.ping,
|
948
960
|
.ws_max_msg_size = args.max_msg, .max_header_size = args.max_headers,
|
949
961
|
.on_finish = free_iodine_http, .log = args.log,
|
950
962
|
.max_body_size = args.max_body, .public_folder = args.public.data);
|
951
|
-
|
963
|
+
#else
|
952
964
|
intptr_t uuid = http_listen(
|
953
965
|
args.port.data, args.address.data, .on_request = on_rack_request,
|
954
966
|
.on_upgrade = on_rack_upgrade, .udata = (void *)args.handler,
|
@@ -956,7 +968,7 @@ intptr_t iodine_http_listen(iodine_connection_args_s args){
|
|
956
968
|
.ws_max_msg_size = args.max_msg, .max_header_size = args.max_headers,
|
957
969
|
.on_finish = free_iodine_http, .log = args.log,
|
958
970
|
.max_body_size = args.max_body, .public_folder = args.public.data);
|
959
|
-
|
971
|
+
#endif
|
960
972
|
if (uuid == -1)
|
961
973
|
return uuid;
|
962
974
|
|
@@ -1066,11 +1078,11 @@ intptr_t iodine_ws_connect(iodine_connection_args_s args) {
|
|
1066
1078
|
FIOBJ url_tmp = FIOBJ_INVALID;
|
1067
1079
|
if (!args.url.data) {
|
1068
1080
|
url_tmp = fiobj_str_buf(64);
|
1069
|
-
|
1081
|
+
#ifndef __MINGW32__
|
1070
1082
|
if (args.tls)
|
1071
1083
|
fiobj_str_write(url_tmp, "wss://", 6);
|
1072
1084
|
else
|
1073
|
-
|
1085
|
+
#endif
|
1074
1086
|
fiobj_str_write(url_tmp, "ws://", 5);
|
1075
1087
|
if (!is_unix_socket) {
|
1076
1088
|
fiobj_str_write(url_tmp, args.address.data, args.address.len);
|
@@ -1087,11 +1099,11 @@ intptr_t iodine_ws_connect(iodine_connection_args_s args) {
|
|
1087
1099
|
}
|
1088
1100
|
|
1089
1101
|
#ifdef __MINGW32__
|
1090
|
-
intptr_t uuid =
|
1091
|
-
args.url.data, (is_unix_socket ? args.address.data : NULL),
|
1092
|
-
|
1093
|
-
|
1094
|
-
|
1102
|
+
intptr_t uuid =
|
1103
|
+
http_connect(args.url.data, (is_unix_socket ? args.address.data : NULL),
|
1104
|
+
.udata = request_data_create(&args),
|
1105
|
+
.on_response = ws_client_http_connected,
|
1106
|
+
.on_finish = ws_client_http_connection_finished);
|
1095
1107
|
#else
|
1096
1108
|
intptr_t uuid = http_connect(
|
1097
1109
|
args.url.data, (is_unix_socket ? args.address.data : NULL),
|
@@ -558,7 +558,7 @@ void iodine_init_mustache(void) {
|
|
558
558
|
rb_global_variable(&filename_id);
|
559
559
|
rb_global_variable(&data_id);
|
560
560
|
rb_global_variable(&template_id);
|
561
|
-
VALUE tmp = rb_define_class_under(IodineModule, "Mustache",
|
561
|
+
VALUE tmp = rb_define_class_under(IodineModule, "Mustache", rb_cObject);
|
562
562
|
rb_define_alloc_func(tmp, iodine_mustache_data_alloc_c);
|
563
563
|
rb_define_method(tmp, "initialize", iodine_mustache_new, -1);
|
564
564
|
rb_define_method(tmp, "render", iodine_mustache_render, 1);
|
data/ext/iodine/iodine_store.c
CHANGED
@@ -132,7 +132,7 @@ struct IodineStorage_s IodineStore = {
|
|
132
132
|
void iodine_storage_init(void) {
|
133
133
|
fio_store_capa_require(&iodine_storage, 512);
|
134
134
|
VALUE tmp =
|
135
|
-
rb_define_class_under(rb_cObject, "IodineObjectStorage",
|
135
|
+
rb_define_class_under(rb_cObject, "IodineObjectStorage", rb_cObject);
|
136
136
|
VALUE storage_obj =
|
137
137
|
TypedData_Wrap_Struct(tmp, &storage_type_struct, &iodine_storage);
|
138
138
|
// rb_global_variable(&iodine_storage_obj);
|
data/ext/iodine/iodine_tls.c
CHANGED
@@ -241,7 +241,7 @@ void iodine_init_tls(void) {
|
|
241
241
|
IODINE_MAKE_SYM(private_key);
|
242
242
|
IODINE_MAKE_SYM(password);
|
243
243
|
|
244
|
-
IodineTLSClass = rb_define_class_under(IodineModule, "TLS",
|
244
|
+
IodineTLSClass = rb_define_class_under(IodineModule, "TLS", rb_cObject);
|
245
245
|
rb_define_alloc_func(IodineTLSClass, iodine_tls_data_alloc_c);
|
246
246
|
rb_define_method(IodineTLSClass, "initialize", iodine_tls_new, -1);
|
247
247
|
rb_define_method(IodineTLSClass, "use_certificate",
|
@@ -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
data/lib/rack/handler/iodine.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'iodine' unless defined?(::Iodine::VERSION)
|
2
2
|
|
3
3
|
module Iodine
|
4
|
-
# Iodine's {Iodine::Rack} module provides a Rack
|
4
|
+
# Iodine's {Iodine::Rack} module provides a Rack compliant interface (connecting Iodine to Rack) for an HTTP and Websocket Server.
|
5
5
|
module Rack
|
6
6
|
|
7
7
|
# Runs a Rack app, as par the Rack handler requirements.
|
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.50
|
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-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -122,9 +122,9 @@ extensions:
|
|
122
122
|
extra_rdoc_files: []
|
123
123
|
files:
|
124
124
|
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
125
|
+
- ".github/workflows/ruby.yml"
|
125
126
|
- ".gitignore"
|
126
127
|
- ".rspec"
|
127
|
-
- ".travis.yml"
|
128
128
|
- ".yardopts"
|
129
129
|
- CHANGELOG.md
|
130
130
|
- Gemfile
|
@@ -148,6 +148,7 @@ files:
|
|
148
148
|
- examples/etag.ru
|
149
149
|
- examples/hello.ru
|
150
150
|
- examples/pubsub_engine.ru
|
151
|
+
- examples/rack3.ru
|
151
152
|
- examples/redis.ru
|
152
153
|
- examples/shootout.ru
|
153
154
|
- examples/sub-protocols.ru
|
@@ -245,7 +246,7 @@ licenses:
|
|
245
246
|
metadata:
|
246
247
|
allowed_push_host: https://rubygems.org
|
247
248
|
post_install_message: |-
|
248
|
-
Thank you for installing Iodine 0.7.
|
249
|
+
Thank you for installing Iodine 0.7.50.
|
249
250
|
Remember: if iodine supports your business, it's only fair to give value back (code contributions / donations).
|
250
251
|
rdoc_options: []
|
251
252
|
require_paths:
|
@@ -268,7 +269,7 @@ requirements:
|
|
268
269
|
- Ruby >= 2.5.0 recommended.
|
269
270
|
- TLS requires OpenSSL >= 1.1.0.
|
270
271
|
- Or Windows with Ruby >= 3.0.0 build with MingW and MingW as compiler.
|
271
|
-
rubygems_version: 3.
|
272
|
+
rubygems_version: 3.3.7
|
272
273
|
signing_key:
|
273
274
|
specification_version: 4
|
274
275
|
summary: iodine - a fast HTTP / Websocket Server with Pub/Sub support, optimized for
|
data/.travis.yml
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
arch:
|
3
|
-
- amd64
|
4
|
-
- arm64
|
5
|
-
os:
|
6
|
-
- linux
|
7
|
-
# - osx
|
8
|
-
before_install:
|
9
|
-
- gem install bundler -v 1.10.6
|
10
|
-
- bundle install
|
11
|
-
rvm:
|
12
|
-
- 2.7.1
|
13
|
-
- 2.6.5
|
14
|
-
- 2.5.7
|
15
|
-
- 2.4.9
|
16
|
-
- 2.3.8
|
17
|
-
- 2.2.2
|
18
|
-
notifications:
|
19
|
-
email: false
|
20
|
-
sudo: required
|
21
|
-
dist: xenial
|
22
|
-
addons:
|
23
|
-
apt:
|
24
|
-
sources:
|
25
|
-
- ubuntu-toolchain-r-test
|
26
|
-
packages:
|
27
|
-
- gcc
|
28
|
-
script:
|
29
|
-
- echo CFLAGS = $CFLAGS
|
30
|
-
- echo cflags = $cflags
|
31
|
-
- bundle exec rake install
|
32
|
-
- env VERBOSE=1 bundle exec rspec --format documentation
|