ds9 1.3.1 → 1.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +35 -0
- data/Gemfile +2 -0
- data/Rakefile +6 -0
- data/ext/ds9/ds9.c +48 -31
- data/ext/ds9/ds9.h +1 -0
- data/ext/ds9/ds9_frames.c +2 -2
- data/ext/ds9/ds9_option.c +183 -0
- data/ext/ds9/ds9_option.h +19 -0
- data/ext/ds9/extconf.rb +7 -6
- data/lib/ds9.rb +3 -2
- data/lib/ds9/version.rb +1 -1
- data/test/helper.rb +1 -1
- data/test/test_ds9_option.rb +107 -0
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e8b2fb157e8388f8d381c77c4676c9d179217648a1712a96e036eebfe1fdd17d
|
4
|
+
data.tar.gz: 73283b1afcac1e5703a1d121c0dbe76c17b965b950eae9207ec0d62cf03bcecb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8df87ef9a3b64d895c28f73c102cf4269ef5018b338e873d1f990142deaeca2ec94f6a429610f9ba45d2f3c86807c5009290abe79ee88e46adc77dd8ff86fbbb
|
7
|
+
data.tar.gz: ab524840e37027405339a7e9a64c58503322b82ce56893237abe818507229ad3930adaabfbc4cf29e4ab57238f98bb6cf3a0dfb24a32893b588d4bcac77bac86
|
@@ -0,0 +1,35 @@
|
|
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
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
|
19
|
+
runs-on: ubuntu-latest
|
20
|
+
strategy:
|
21
|
+
matrix:
|
22
|
+
ruby-version: ['2.6', '2.7', '3.0']
|
23
|
+
|
24
|
+
steps:
|
25
|
+
- uses: actions/checkout@v2
|
26
|
+
- name: Set up Ruby
|
27
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
28
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
29
|
+
# uses: ruby/setup-ruby@v1
|
30
|
+
uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
|
31
|
+
with:
|
32
|
+
ruby-version: ${{ matrix.ruby-version }}
|
33
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
34
|
+
- name: Run tests
|
35
|
+
run: bundle exec rake test
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rake/extensiontask"
|
3
|
+
require "rake/testtask"
|
3
4
|
|
4
5
|
task default: :compile
|
5
6
|
|
@@ -9,4 +10,9 @@ Rake::ExtensionTask.new("ds9") do |t|
|
|
9
10
|
t.lib_dir = "lib"
|
10
11
|
end
|
11
12
|
|
13
|
+
Rake::TestTask.new('test' => 'compile') do |t|
|
14
|
+
t.libs << 'test'
|
15
|
+
t.verbose = true
|
16
|
+
end
|
17
|
+
|
12
18
|
# vim: syntax=ruby
|
data/ext/ds9/ds9.c
CHANGED
@@ -23,7 +23,8 @@ ID id_on_header,
|
|
23
23
|
id_on_stream_close,
|
24
24
|
id_on_data_chunk_recv,
|
25
25
|
id_on_data_source_read,
|
26
|
-
id_before_frame_send
|
26
|
+
id_before_frame_send,
|
27
|
+
id_eof_p;
|
27
28
|
|
28
29
|
#define CheckSelf(ptr) \
|
29
30
|
if (NULL == (ptr)) \
|
@@ -157,7 +158,7 @@ static ssize_t recv_callback(nghttp2_session *session, uint8_t *buf,
|
|
157
158
|
VALUE ret;
|
158
159
|
ssize_t len;
|
159
160
|
|
160
|
-
ret = rb_funcall(self, id_recv_event, 1,
|
161
|
+
ret = rb_funcall(self, id_recv_event, 1, ULONG2NUM(length));
|
161
162
|
|
162
163
|
if (FIXNUM_P(ret)) {
|
163
164
|
return NUM2INT(ret);
|
@@ -270,7 +271,7 @@ static ssize_t rb_data_read_callback(nghttp2_session *session,
|
|
270
271
|
ssize_t len;
|
271
272
|
|
272
273
|
ret = rb_funcall(self, id_on_data_source_read, 2, INT2NUM(stream_id),
|
273
|
-
|
274
|
+
ULONG2NUM(length));
|
274
275
|
|
275
276
|
if (NIL_P(ret)) {
|
276
277
|
*data_flags |= NGHTTP2_DATA_FLAG_EOF;
|
@@ -320,8 +321,9 @@ struct hash_copy_ctx {
|
|
320
321
|
};
|
321
322
|
|
322
323
|
static int
|
323
|
-
hash_copy_i(VALUE name, VALUE value,
|
324
|
+
hash_copy_i(VALUE name, VALUE value, VALUE arg)
|
324
325
|
{
|
326
|
+
struct hash_copy_ctx *ctx = (struct hash_copy_ctx *)arg;
|
325
327
|
nghttp2_nv * head = ctx->head;
|
326
328
|
|
327
329
|
head->name = (uint8_t *)StringValuePtr(name);
|
@@ -341,7 +343,7 @@ static void copy_hash_to_nv(VALUE hash, nghttp2_nv * head, size_t niv)
|
|
341
343
|
struct hash_copy_ctx copy_ctx;
|
342
344
|
copy_ctx.head = head;
|
343
345
|
|
344
|
-
rb_hash_foreach(hash, hash_copy_i, ©_ctx);
|
346
|
+
rb_hash_foreach(hash, hash_copy_i, (VALUE)©_ctx);
|
345
347
|
}
|
346
348
|
|
347
349
|
static VALUE allocate_session(VALUE klass)
|
@@ -349,10 +351,11 @@ static VALUE allocate_session(VALUE klass)
|
|
349
351
|
return TypedData_Wrap_Struct(klass, &ds9_session_type, 0);
|
350
352
|
}
|
351
353
|
|
352
|
-
static VALUE client_init_internals(VALUE self, VALUE cb)
|
354
|
+
static VALUE client_init_internals(VALUE self, VALUE cb, VALUE opt)
|
353
355
|
{
|
354
356
|
nghttp2_session_callbacks *callbacks;
|
355
357
|
nghttp2_session *session;
|
358
|
+
nghttp2_option *option;
|
356
359
|
nghttp2_mem mem = {
|
357
360
|
NULL,
|
358
361
|
wrap_xmalloc,
|
@@ -362,17 +365,18 @@ static VALUE client_init_internals(VALUE self, VALUE cb)
|
|
362
365
|
};
|
363
366
|
|
364
367
|
TypedData_Get_Struct(cb, nghttp2_session_callbacks, &ds9_callbacks_type, callbacks);
|
365
|
-
|
366
|
-
nghttp2_session_client_new3(&session, callbacks, (void *)self,
|
368
|
+
option = UnwrapDS9Option(opt);
|
369
|
+
nghttp2_session_client_new3(&session, callbacks, (void *)self, option, &mem);
|
367
370
|
DATA_PTR(self) = session;
|
368
371
|
|
369
372
|
return self;
|
370
373
|
}
|
371
374
|
|
372
|
-
static VALUE server_init_internals(VALUE self, VALUE cb)
|
375
|
+
static VALUE server_init_internals(VALUE self, VALUE cb, VALUE opt)
|
373
376
|
{
|
374
377
|
nghttp2_session_callbacks *callbacks;
|
375
378
|
nghttp2_session *session;
|
379
|
+
nghttp2_option *option;
|
376
380
|
nghttp2_mem mem = {
|
377
381
|
NULL,
|
378
382
|
wrap_xmalloc,
|
@@ -382,8 +386,8 @@ static VALUE server_init_internals(VALUE self, VALUE cb)
|
|
382
386
|
};
|
383
387
|
|
384
388
|
TypedData_Get_Struct(cb, nghttp2_session_callbacks, &ds9_callbacks_type, callbacks);
|
385
|
-
|
386
|
-
nghttp2_session_server_new3(&session, callbacks, (void *)self,
|
389
|
+
option = UnwrapDS9Option(opt);
|
390
|
+
nghttp2_session_server_new3(&session, callbacks, (void *)self, option, &mem);
|
387
391
|
DATA_PTR(self) = session;
|
388
392
|
|
389
393
|
return self;
|
@@ -487,6 +491,7 @@ static VALUE session_submit_trailer(VALUE self, VALUE stream_id, VALUE trailers)
|
|
487
491
|
break;
|
488
492
|
default:
|
489
493
|
Check_Type(trailers, T_ARRAY);
|
494
|
+
UNREACHABLE;
|
490
495
|
}
|
491
496
|
|
492
497
|
nva = xcalloc(niv, sizeof(nghttp2_nv));
|
@@ -538,7 +543,7 @@ static VALUE session_receive(VALUE self)
|
|
538
543
|
|
539
544
|
static VALUE session_mem_receive(VALUE self, VALUE buf)
|
540
545
|
{
|
541
|
-
|
546
|
+
ssize_t rv;
|
542
547
|
nghttp2_session *session;
|
543
548
|
|
544
549
|
TypedData_Get_Struct(self, nghttp2_session, &ds9_session_type, session);
|
@@ -546,10 +551,10 @@ static VALUE session_mem_receive(VALUE self, VALUE buf)
|
|
546
551
|
|
547
552
|
rv = nghttp2_session_mem_recv(session, (const uint8_t *)StringValuePtr(buf), RSTRING_LEN(buf));
|
548
553
|
if (rv < 0) {
|
549
|
-
explode(rv);
|
554
|
+
explode((int)rv);
|
550
555
|
}
|
551
556
|
|
552
|
-
return
|
557
|
+
return ULONG2NUM(rv);
|
553
558
|
}
|
554
559
|
|
555
560
|
static VALUE session_mem_send(VALUE self)
|
@@ -568,7 +573,7 @@ static VALUE session_mem_send(VALUE self)
|
|
568
573
|
}
|
569
574
|
|
570
575
|
if (rv < 0) {
|
571
|
-
explode(rv);
|
576
|
+
explode((int)rv);
|
572
577
|
}
|
573
578
|
|
574
579
|
return rb_str_new((const char *)data, rv);
|
@@ -581,27 +586,33 @@ static VALUE session_outbound_queue_size(VALUE self)
|
|
581
586
|
TypedData_Get_Struct(self, nghttp2_session, &ds9_session_type, session);
|
582
587
|
CheckSelf(session);
|
583
588
|
|
584
|
-
return
|
589
|
+
return ULONG2NUM(nghttp2_session_get_outbound_queue_size(session));
|
585
590
|
}
|
586
591
|
|
587
592
|
static ssize_t
|
588
593
|
ruby_read(nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length,
|
589
594
|
uint32_t *data_flags, nghttp2_data_source *source, void *user_data)
|
590
595
|
{
|
591
|
-
VALUE
|
596
|
+
VALUE body = (VALUE)source->ptr;
|
597
|
+
VALUE ret = rb_funcall(body, rb_intern("read"), 1, ULONG2NUM(length));
|
592
598
|
|
593
|
-
if (
|
594
|
-
VALUE self = (VALUE)user_data;
|
595
|
-
rb_funcall(self, rb_intern("remove_post_buffer"), 1, INT2NUM(stream_id));
|
596
|
-
*data_flags |= NGHTTP2_DATA_FLAG_EOF;
|
597
|
-
return 0;
|
598
|
-
} else if (FIXNUM_P(ret)) {
|
599
|
+
if (FIXNUM_P(ret)) {
|
599
600
|
ssize_t err = NUM2INT(ret);
|
600
601
|
if (err == NGHTTP2_ERR_DEFERRED) {
|
601
602
|
return err;
|
602
603
|
}
|
603
604
|
}
|
604
605
|
|
606
|
+
if (NIL_P(ret) || (rb_respond_to(body, id_eof_p) && RTEST(rb_funcall(body, id_eof_p, 0)))) {
|
607
|
+
VALUE self = (VALUE)user_data;
|
608
|
+
rb_funcall(self, rb_intern("remove_post_buffer"), 1, INT2NUM(stream_id));
|
609
|
+
*data_flags |= NGHTTP2_DATA_FLAG_EOF;
|
610
|
+
}
|
611
|
+
|
612
|
+
if (NIL_P(ret)) {
|
613
|
+
return 0;
|
614
|
+
}
|
615
|
+
|
605
616
|
Check_Type(ret, T_STRING);
|
606
617
|
memcpy(buf, RSTRING_PTR(ret), RSTRING_LEN(ret));
|
607
618
|
return RSTRING_LEN(ret);
|
@@ -633,8 +644,8 @@ file_read(nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t leng
|
|
633
644
|
|
634
645
|
static VALUE session_submit_request(VALUE self, VALUE settings, VALUE body)
|
635
646
|
{
|
636
|
-
size_t niv
|
637
|
-
nghttp2_nv *nva
|
647
|
+
size_t niv;
|
648
|
+
nghttp2_nv *nva;
|
638
649
|
nghttp2_session *session;
|
639
650
|
nghttp2_data_provider provider;
|
640
651
|
int rv;
|
@@ -655,6 +666,7 @@ static VALUE session_submit_request(VALUE self, VALUE settings, VALUE body)
|
|
655
666
|
break;
|
656
667
|
default:
|
657
668
|
Check_Type(settings, T_ARRAY);
|
669
|
+
UNREACHABLE;
|
658
670
|
}
|
659
671
|
|
660
672
|
nva = xcalloc(niv, sizeof(nghttp2_nv));
|
@@ -671,7 +683,7 @@ static VALUE session_submit_request(VALUE self, VALUE settings, VALUE body)
|
|
671
683
|
provider.source.ptr = rb_file;
|
672
684
|
provider.read_callback = file_read;
|
673
685
|
} else {
|
674
|
-
provider.source.ptr = body;
|
686
|
+
provider.source.ptr = (void *)body;
|
675
687
|
provider.read_callback = ruby_read;
|
676
688
|
}
|
677
689
|
|
@@ -826,7 +838,7 @@ static VALUE server_submit_response(VALUE self, VALUE stream_id, VALUE headers)
|
|
826
838
|
{
|
827
839
|
nghttp2_session *session;
|
828
840
|
size_t niv;
|
829
|
-
nghttp2_nv *nva
|
841
|
+
nghttp2_nv *nva;
|
830
842
|
nghttp2_data_provider provider;
|
831
843
|
int rv;
|
832
844
|
copy_header_func_t copy_func;
|
@@ -846,6 +858,7 @@ static VALUE server_submit_response(VALUE self, VALUE stream_id, VALUE headers)
|
|
846
858
|
break;
|
847
859
|
default:
|
848
860
|
Check_Type(headers, T_ARRAY);
|
861
|
+
UNREACHABLE;
|
849
862
|
}
|
850
863
|
|
851
864
|
nva = xcalloc(niv, sizeof(nghttp2_nv));
|
@@ -868,7 +881,7 @@ static VALUE server_submit_response(VALUE self, VALUE stream_id, VALUE headers)
|
|
868
881
|
static VALUE server_submit_headers(VALUE self, VALUE stream_id, VALUE headers) {
|
869
882
|
nghttp2_session *session;
|
870
883
|
size_t niv;
|
871
|
-
nghttp2_nv *nva
|
884
|
+
nghttp2_nv *nva;
|
872
885
|
int rv;
|
873
886
|
copy_header_func_t copy_func;
|
874
887
|
|
@@ -887,6 +900,7 @@ static VALUE server_submit_headers(VALUE self, VALUE stream_id, VALUE headers) {
|
|
887
900
|
break;
|
888
901
|
default:
|
889
902
|
Check_Type(headers, T_ARRAY);
|
903
|
+
UNREACHABLE;
|
890
904
|
}
|
891
905
|
|
892
906
|
nva = xcalloc(niv, sizeof(nghttp2_nv));
|
@@ -1010,6 +1024,7 @@ void Init_ds9(void)
|
|
1010
1024
|
mDS9 = rb_define_module("DS9");
|
1011
1025
|
|
1012
1026
|
Init_ds9_frames(mDS9);
|
1027
|
+
Init_ds9_option(mDS9);
|
1013
1028
|
|
1014
1029
|
rb_define_const(mDS9, "PROTO_VERSION_ID", rb_str_new(NGHTTP2_PROTO_VERSION_ID, NGHTTP2_PROTO_VERSION_ID_LEN));
|
1015
1030
|
|
@@ -1027,6 +1042,7 @@ void Init_ds9(void)
|
|
1027
1042
|
rb_define_const(mDS9, "ERR_WOULDBLOCK", INT2NUM(NGHTTP2_ERR_WOULDBLOCK));
|
1028
1043
|
rb_define_const(mDS9, "ERR_EOF", INT2NUM(NGHTTP2_ERR_EOF));
|
1029
1044
|
rb_define_const(mDS9, "ERR_DEFERRED", INT2NUM(NGHTTP2_ERR_DEFERRED));
|
1045
|
+
rb_define_const(mDS9, "ERR_BAD_CLIENT_MAGIC", INT2NUM(NGHTTP2_ERR_BAD_CLIENT_MAGIC));
|
1030
1046
|
rb_define_const(mDS9, "NO_ERROR", INT2NUM(NGHTTP2_NO_ERROR));
|
1031
1047
|
rb_define_const(mDS9, "DEFAULT_WEIGHT", INT2NUM(NGHTTP2_DEFAULT_WEIGHT));
|
1032
1048
|
rb_define_const(mDS9, "MAX_WEIGHT", INT2NUM(NGHTTP2_MAX_WEIGHT));
|
@@ -1039,7 +1055,7 @@ void Init_ds9(void)
|
|
1039
1055
|
|
1040
1056
|
rb_define_singleton_method(mDS9, "nghttp_version", rb_nghttp_version, 0);
|
1041
1057
|
|
1042
|
-
cDS9Callbacks = rb_define_class_under(mDS9, "Callbacks",
|
1058
|
+
cDS9Callbacks = rb_define_class_under(mDS9, "Callbacks", rb_cObject);
|
1043
1059
|
|
1044
1060
|
cDS9Session = rb_define_class_under(mDS9, "Session", rb_cObject);
|
1045
1061
|
cDS9Client = rb_define_class_under(mDS9, "Client", cDS9Session);
|
@@ -1065,8 +1081,8 @@ void Init_ds9(void)
|
|
1065
1081
|
|
1066
1082
|
rb_define_private_method(cDS9Session, "submit_request", session_submit_request, 2);
|
1067
1083
|
rb_define_private_method(cDS9Session, "make_callbacks", make_callbacks, 0);
|
1068
|
-
rb_define_private_method(cDS9Client, "init_internals", client_init_internals,
|
1069
|
-
rb_define_private_method(cDS9Server, "init_internals", server_init_internals,
|
1084
|
+
rb_define_private_method(cDS9Client, "init_internals", client_init_internals, 2);
|
1085
|
+
rb_define_private_method(cDS9Server, "init_internals", server_init_internals, 2);
|
1070
1086
|
|
1071
1087
|
rb_define_method(cDS9Server, "submit_response", server_submit_response, 2);
|
1072
1088
|
rb_define_method(cDS9Server, "submit_push_promise", server_submit_push_promise, 2);
|
@@ -1089,6 +1105,7 @@ void Init_ds9(void)
|
|
1089
1105
|
id_on_data_chunk_recv = rb_intern("on_data_chunk_recv");
|
1090
1106
|
id_before_frame_send = rb_intern("before_frame_send");
|
1091
1107
|
id_on_data_source_read = rb_intern("on_data_source_read");
|
1108
|
+
id_eof_p = rb_intern("eof?");
|
1092
1109
|
}
|
1093
1110
|
|
1094
1111
|
/* vim: set noet sws=4 sw=4: */
|
data/ext/ds9/ds9.h
CHANGED
data/ext/ds9/ds9_frames.c
CHANGED
@@ -45,7 +45,7 @@ VALUE WrapDS9FrameHeader(const nghttp2_frame_hd *hd)
|
|
45
45
|
{
|
46
46
|
VALUE klass = rb_const_get(cDS9FramesFrame, rb_intern("Header"));
|
47
47
|
return rb_funcall(klass, rb_intern("new"), 4,
|
48
|
-
|
48
|
+
ULONG2NUM(hd->length),
|
49
49
|
INT2NUM(hd->stream_id),
|
50
50
|
INT2NUM(hd->type),
|
51
51
|
INT2NUM(hd->flags));
|
@@ -127,7 +127,7 @@ static VALUE goaway_error_code(VALUE self)
|
|
127
127
|
void Init_ds9_frames(VALUE mDS9)
|
128
128
|
{
|
129
129
|
mDS9Frames = rb_define_module_under(mDS9, "Frames");
|
130
|
-
cDS9FramesFrame = rb_define_class_under(mDS9Frames, "Frame",
|
130
|
+
cDS9FramesFrame = rb_define_class_under(mDS9Frames, "Frame", rb_cObject);
|
131
131
|
|
132
132
|
mDS9FramesFlags = rb_define_module_under(cDS9FramesFrame, "Flags");
|
133
133
|
|
@@ -0,0 +1,183 @@
|
|
1
|
+
#include <ds9_option.h>
|
2
|
+
|
3
|
+
VALUE cDS9Option;
|
4
|
+
|
5
|
+
static VALUE allocate_option(VALUE klass)
|
6
|
+
{
|
7
|
+
nghttp2_option *option;
|
8
|
+
|
9
|
+
nghttp2_option_new(&option);
|
10
|
+
|
11
|
+
return TypedData_Wrap_Struct(klass, &ds9_option_type, option);
|
12
|
+
}
|
13
|
+
|
14
|
+
static VALUE option_set_no_auto_ping_ack(VALUE self)
|
15
|
+
{
|
16
|
+
nghttp2_option *option;
|
17
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
18
|
+
|
19
|
+
nghttp2_option_set_no_auto_ping_ack(option, 1);
|
20
|
+
|
21
|
+
return self;
|
22
|
+
}
|
23
|
+
|
24
|
+
static VALUE option_set_no_auto_window_update(VALUE self)
|
25
|
+
{
|
26
|
+
nghttp2_option *option;
|
27
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
28
|
+
|
29
|
+
nghttp2_option_set_no_auto_window_update(option, 1);
|
30
|
+
|
31
|
+
return self;
|
32
|
+
}
|
33
|
+
|
34
|
+
static VALUE option_set_no_closed_streams(VALUE self)
|
35
|
+
{
|
36
|
+
nghttp2_option *option;
|
37
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
38
|
+
|
39
|
+
nghttp2_option_set_no_closed_streams(option, 1);
|
40
|
+
|
41
|
+
return self;
|
42
|
+
}
|
43
|
+
|
44
|
+
static VALUE option_set_no_http_messaging(VALUE self)
|
45
|
+
{
|
46
|
+
nghttp2_option *option;
|
47
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
48
|
+
|
49
|
+
nghttp2_option_set_no_http_messaging(option, 1);
|
50
|
+
|
51
|
+
return self;
|
52
|
+
}
|
53
|
+
|
54
|
+
static VALUE option_set_no_recv_client_magic(VALUE self)
|
55
|
+
{
|
56
|
+
nghttp2_option *option;
|
57
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
58
|
+
|
59
|
+
nghttp2_option_set_no_recv_client_magic(option, 1);
|
60
|
+
|
61
|
+
return self;
|
62
|
+
}
|
63
|
+
|
64
|
+
|
65
|
+
static VALUE option_set_builtin_recv_extension_type(VALUE self, VALUE size)
|
66
|
+
{
|
67
|
+
nghttp2_option *option;
|
68
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
69
|
+
|
70
|
+
nghttp2_option_set_builtin_recv_extension_type(option, NUM2INT(size));
|
71
|
+
|
72
|
+
return self;
|
73
|
+
}
|
74
|
+
|
75
|
+
static VALUE option_set_max_deflate_dynamic_table_size(VALUE self, VALUE size)
|
76
|
+
{
|
77
|
+
nghttp2_option *option;
|
78
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
79
|
+
|
80
|
+
nghttp2_option_set_max_deflate_dynamic_table_size(option, NUM2INT(size));
|
81
|
+
|
82
|
+
return self;
|
83
|
+
}
|
84
|
+
|
85
|
+
static VALUE option_set_max_send_header_block_length(VALUE self, VALUE size)
|
86
|
+
{
|
87
|
+
nghttp2_option *option;
|
88
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
89
|
+
|
90
|
+
nghttp2_option_set_max_send_header_block_length(option, NUM2INT(size));
|
91
|
+
|
92
|
+
return self;
|
93
|
+
}
|
94
|
+
|
95
|
+
static VALUE option_set_max_reserved_remote_streams(VALUE self, VALUE size)
|
96
|
+
{
|
97
|
+
nghttp2_option *option;
|
98
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
99
|
+
|
100
|
+
nghttp2_option_set_max_reserved_remote_streams(option, NUM2INT(size));
|
101
|
+
|
102
|
+
return self;
|
103
|
+
}
|
104
|
+
|
105
|
+
static VALUE option_set_peer_max_concurrent_streams(VALUE self, VALUE size)
|
106
|
+
{
|
107
|
+
nghttp2_option *option;
|
108
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
109
|
+
|
110
|
+
nghttp2_option_set_peer_max_concurrent_streams(option, NUM2INT(size));
|
111
|
+
|
112
|
+
return self;
|
113
|
+
}
|
114
|
+
|
115
|
+
static VALUE option_set_user_recv_extension_type(VALUE self, VALUE size)
|
116
|
+
{
|
117
|
+
nghttp2_option *option;
|
118
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
119
|
+
|
120
|
+
nghttp2_option_set_user_recv_extension_type(option, NUM2INT(size));
|
121
|
+
|
122
|
+
return self;
|
123
|
+
}
|
124
|
+
|
125
|
+
#if NGHTTP2_VERSION_NUM >= 0x012800 /* 1.40.0 */
|
126
|
+
static VALUE option_set_max_outbound_ack(VALUE self, VALUE size)
|
127
|
+
{
|
128
|
+
nghttp2_option *option;
|
129
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
130
|
+
|
131
|
+
nghttp2_option_set_max_outbound_ack(option, NUM2INT(size));
|
132
|
+
|
133
|
+
return self;
|
134
|
+
}
|
135
|
+
#endif
|
136
|
+
|
137
|
+
#if NGHTTP2_VERSION_NUM >= 0x012900 /* 1.41.0 */
|
138
|
+
static VALUE option_set_max_settings(VALUE self, VALUE size)
|
139
|
+
{
|
140
|
+
nghttp2_option *option;
|
141
|
+
TypedData_Get_Struct(self, nghttp2_option, &ds9_option_type, option);
|
142
|
+
|
143
|
+
nghttp2_option_set_max_settings(option, NUM2INT(size));
|
144
|
+
|
145
|
+
return self;
|
146
|
+
}
|
147
|
+
#endif
|
148
|
+
|
149
|
+
nghttp2_option* UnwrapDS9Option(VALUE opt)
|
150
|
+
{
|
151
|
+
nghttp2_option* option = NULL;
|
152
|
+
|
153
|
+
if (!NIL_P(opt)) {
|
154
|
+
TypedData_Get_Struct(opt, nghttp2_option, &ds9_option_type, option);
|
155
|
+
}
|
156
|
+
|
157
|
+
return option;
|
158
|
+
}
|
159
|
+
|
160
|
+
void Init_ds9_option(VALUE mDS9)
|
161
|
+
{
|
162
|
+
cDS9Option = rb_define_class_under(mDS9, "Option", rb_cObject);
|
163
|
+
rb_define_alloc_func(cDS9Option, allocate_option);
|
164
|
+
|
165
|
+
rb_define_method(cDS9Option, "set_no_auto_ping_ack", option_set_no_auto_ping_ack, 0);
|
166
|
+
rb_define_method(cDS9Option, "set_no_auto_window_update", option_set_no_auto_window_update, 0);
|
167
|
+
rb_define_method(cDS9Option, "set_no_closed_streams", option_set_no_closed_streams, 0);
|
168
|
+
rb_define_method(cDS9Option, "set_no_http_messaging", option_set_no_http_messaging, 0);
|
169
|
+
rb_define_method(cDS9Option, "set_no_recv_client_magic", option_set_no_recv_client_magic, 0);
|
170
|
+
|
171
|
+
rb_define_method(cDS9Option, "set_builtin_recv_extension_type", option_set_builtin_recv_extension_type, 1);
|
172
|
+
rb_define_method(cDS9Option, "set_max_deflate_dynamic_table_size", option_set_max_deflate_dynamic_table_size, 1);
|
173
|
+
rb_define_method(cDS9Option, "set_max_send_header_block_length", option_set_max_send_header_block_length, 1);
|
174
|
+
rb_define_method(cDS9Option, "set_max_reserved_remote_streams", option_set_max_reserved_remote_streams, 1);
|
175
|
+
rb_define_method(cDS9Option, "set_peer_max_concurrent_streams", option_set_peer_max_concurrent_streams, 1);
|
176
|
+
rb_define_method(cDS9Option, "set_user_recv_extension_type", option_set_user_recv_extension_type, 1);
|
177
|
+
#if NGHTTP2_VERSION_NUM >= 0x012800 /* 1.40.0 */
|
178
|
+
rb_define_method(cDS9Option, "set_max_outbound_ack", option_set_max_outbound_ack, 1);
|
179
|
+
#endif
|
180
|
+
#if NGHTTP2_VERSION_NUM >= 0x012900 /* 1.41.0 */
|
181
|
+
rb_define_method(cDS9Option, "set_max_settings", option_set_max_settings, 1);
|
182
|
+
#endif
|
183
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#ifndef DS9_OPTION_H
|
2
|
+
#define DS9_OPTION_H
|
3
|
+
|
4
|
+
#include <ruby.h>
|
5
|
+
#include <nghttp2/nghttp2.h>
|
6
|
+
|
7
|
+
static const rb_data_type_t ds9_option_type = {
|
8
|
+
"DS9/option",
|
9
|
+
{0, (void (*)(void *))nghttp2_option_del, 0,},
|
10
|
+
0, 0,
|
11
|
+
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
12
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
13
|
+
#endif
|
14
|
+
};
|
15
|
+
|
16
|
+
void Init_ds9_option(VALUE mDS9);
|
17
|
+
nghttp2_option* UnwrapDS9Option(VALUE opt);
|
18
|
+
|
19
|
+
#endif
|
data/ext/ds9/extconf.rb
CHANGED
@@ -4,6 +4,8 @@ def using_system_libraries?
|
|
4
4
|
arg_config('--use-system-libraries', !!ENV['DS9_USE_SYSTEM_LIBRARIES'])
|
5
5
|
end
|
6
6
|
|
7
|
+
dir_config('ds9')
|
8
|
+
|
7
9
|
if using_system_libraries?
|
8
10
|
if with_config("static")
|
9
11
|
ldflags = pkg_config 'libnghttp2', 'libs-only-L'
|
@@ -21,20 +23,19 @@ else
|
|
21
23
|
message "Building nghttp2\n"
|
22
24
|
require 'rubygems'
|
23
25
|
require 'mini_portile2'
|
24
|
-
recipe = MiniPortile.new('nghttp2', 'v1.
|
25
|
-
|
26
|
-
recipe.configure_options = ['--enable-lib-only', '--enable-static', "--host=#{recipe.host}"]
|
26
|
+
recipe = MiniPortile.new('nghttp2', 'v1.43.0')
|
27
|
+
recipe.configure_options = recipe.configure_options + ['--with-pic', '--enable-lib-only']
|
27
28
|
|
28
29
|
recipe.files << {
|
29
|
-
url: 'https://github.com/nghttp2/nghttp2/releases/download/v1.
|
30
|
-
sha1: '
|
30
|
+
url: 'https://github.com/nghttp2/nghttp2/releases/download/v1.43.0/nghttp2-1.43.0.tar.gz',
|
31
|
+
sha1: '8686c8ceee769de8b9e304739b223981df9df104',
|
31
32
|
}
|
32
33
|
recipe.cook
|
33
34
|
|
34
35
|
# `recipe.activate` uses invalid path for this package.
|
35
36
|
$LIBPATH = ["#{recipe.path}/lib"] + $LIBPATH
|
36
37
|
$CPPFLAGS << " -I#{recipe.path}/include"
|
37
|
-
$LIBS << " -
|
38
|
+
$LIBS << " -lstdc++"
|
38
39
|
end
|
39
40
|
|
40
41
|
abort 'nghttp2/nghttp2.h not found' unless have_header('nghttp2/nghttp2.h')
|
data/lib/ds9.rb
CHANGED
data/lib/ds9/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestMeme < Minitest::Test
|
4
|
+
def setup
|
5
|
+
@option = DS9::Option.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_set_no_auto_ping_ack
|
9
|
+
assert @option.set_no_auto_ping_ack
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_set_no_auto_window_update
|
13
|
+
assert @option.set_no_auto_window_update
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_set_no_closed_streams
|
17
|
+
assert @option.set_no_closed_streams
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_set_no_http_messaging
|
21
|
+
assert @option.set_no_http_messaging
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_set_no_recv_client_magic
|
25
|
+
assert @option.set_no_recv_client_magic
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_set_builtin_recv_extension_type
|
29
|
+
assert @option.set_builtin_recv_extension_type(1)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_set_builtin_recv_extension_type_with_not_num
|
33
|
+
assert_raises TypeError do
|
34
|
+
assert @option.set_builtin_recv_extension_type('invalid')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_set_max_deflate_dynamic_table_size
|
39
|
+
assert @option.set_max_deflate_dynamic_table_size(1)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_set_max_deflate_dynamic_table_size_with_not_num
|
43
|
+
assert_raises TypeError do
|
44
|
+
@option.set_max_deflate_dynamic_table_size('invalid')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_set_max_send_header_block_length
|
49
|
+
assert @option.set_max_send_header_block_length(1)
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_set_max_send_header_block_length_with_not_num
|
53
|
+
assert_raises TypeError do
|
54
|
+
assert @option.set_max_send_header_block_length('invalid')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_set_max_reserved_remote_streams
|
59
|
+
assert @option.set_max_reserved_remote_streams(100)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_set_max_reserved_remote_streams_not_num
|
63
|
+
assert_raises TypeError do
|
64
|
+
@option.set_max_reserved_remote_streams('invalid')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_set_peer_max_concurrent_streams
|
69
|
+
assert @option.set_peer_max_concurrent_streams(1)
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_set_peer_max_concurrent_stream_with_not_num
|
73
|
+
assert_raises TypeError do
|
74
|
+
assert @option.set_peer_max_concurrent_streams('invalid')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_set_user_recv_extension_type
|
79
|
+
assert @option.set_user_recv_extension_type(1)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_set_user_recv_extension_type_with_not_num
|
83
|
+
assert_raises TypeError do
|
84
|
+
assert @option.set_user_recv_extension_type('invalid')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_set_max_outbound_ack
|
89
|
+
assert @option.set_max_outbound_ack(100)
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_set_max_outbound_ack_with_not_num
|
93
|
+
assert_raises TypeError do
|
94
|
+
assert @option.set_max_outbound_ack('invalid')
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_set_max_settings
|
99
|
+
assert @option.set_max_settings(16)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_set_max_settings_with_not_num
|
103
|
+
assert_raises TypeError do
|
104
|
+
assert @option.set_max_settings('invalid')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ds9
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Patterson
|
8
8
|
- Yuta Iwama
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
date: 2015-07-06 00:00:00.000000000 Z
|
@@ -95,6 +95,7 @@ extra_rdoc_files:
|
|
95
95
|
- README.md
|
96
96
|
files:
|
97
97
|
- ".autotest"
|
98
|
+
- ".github/workflows/ruby.yml"
|
98
99
|
- ".gitignore"
|
99
100
|
- CHANGELOG.md
|
100
101
|
- Gemfile
|
@@ -104,18 +105,21 @@ files:
|
|
104
105
|
- ext/ds9/ds9.c
|
105
106
|
- ext/ds9/ds9.h
|
106
107
|
- ext/ds9/ds9_frames.c
|
108
|
+
- ext/ds9/ds9_option.c
|
109
|
+
- ext/ds9/ds9_option.h
|
107
110
|
- ext/ds9/extconf.rb
|
108
111
|
- lib/ds9.rb
|
109
112
|
- lib/ds9/version.rb
|
110
113
|
- test/helper.rb
|
111
114
|
- test/test_client.rb
|
112
115
|
- test/test_ds9.rb
|
116
|
+
- test/test_ds9_option.rb
|
113
117
|
- test/test_server.rb
|
114
118
|
homepage: https://github.com/tenderlove/ds9
|
115
119
|
licenses:
|
116
120
|
- MIT
|
117
121
|
metadata: {}
|
118
|
-
post_install_message:
|
122
|
+
post_install_message:
|
119
123
|
rdoc_options:
|
120
124
|
- "--main"
|
121
125
|
- README.md
|
@@ -132,9 +136,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
136
|
- !ruby/object:Gem::Version
|
133
137
|
version: '0'
|
134
138
|
requirements: []
|
135
|
-
|
136
|
-
|
137
|
-
signing_key:
|
139
|
+
rubygems_version: 3.2.14
|
140
|
+
signing_key:
|
138
141
|
specification_version: 4
|
139
142
|
summary: This library allows you to write HTTP/2 clients and servers
|
140
143
|
test_files: []
|