ds9 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/ds9/ds9.c +57 -0
- data/lib/ds9.rb +10 -1
- data/test/helper.rb +29 -7
- data/test/test_client.rb +49 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ddb3bec07f20bfb55e016cdcd831e56f9a94b70f7db63862d7951019e989567
|
4
|
+
data.tar.gz: 36d9dee001423093b24bea5fff33e46d06ac52247f971e23a4e97ede9fb36fcc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5200c393ba44667a62181c95d4943373dff514ed50ac70ab9459b8ad5d156f8be24743ad0c182985ddd77c8cbc41339215881c3d29cc56857118c7346444e590
|
7
|
+
data.tar.gz: d765ceb6ed1cadc9e090a42706d66858419af65c5f079b9a132ad32d6aba3fdd0bf9a95e7f2d249c5119bd336546b301f4778117dc7a033129d7dae21afcaba6
|
data/ext/ds9/ds9.c
CHANGED
@@ -277,6 +277,12 @@ static ssize_t rb_data_read_callback(nghttp2_session *session,
|
|
277
277
|
return 0;
|
278
278
|
}
|
279
279
|
|
280
|
+
if (ret == Qfalse) {
|
281
|
+
*data_flags |= NGHTTP2_DATA_FLAG_EOF;
|
282
|
+
*data_flags |= NGHTTP2_DATA_FLAG_NO_END_STREAM;
|
283
|
+
return 0;
|
284
|
+
}
|
285
|
+
|
280
286
|
Check_Type(ret, T_STRING);
|
281
287
|
len = RSTRING_LEN(ret);
|
282
288
|
memcpy(buf, StringValuePtr(ret), len);
|
@@ -448,6 +454,48 @@ static VALUE session_submit_settings(VALUE self, VALUE settings)
|
|
448
454
|
return self;
|
449
455
|
}
|
450
456
|
|
457
|
+
static VALUE session_submit_trailer(VALUE self, VALUE stream_id, VALUE trailers)
|
458
|
+
{
|
459
|
+
size_t niv;
|
460
|
+
nghttp2_nv *nva;
|
461
|
+
nghttp2_session *session;
|
462
|
+
int rv;
|
463
|
+
int32_t s_id;
|
464
|
+
copy_header_func_t copy_func;
|
465
|
+
|
466
|
+
TypedData_Get_Struct(self, nghttp2_session, &ds9_session_type, session);
|
467
|
+
CheckSelf(session);
|
468
|
+
|
469
|
+
s_id = NUM2INT(stream_id);
|
470
|
+
|
471
|
+
switch(TYPE(trailers))
|
472
|
+
{
|
473
|
+
case T_ARRAY:
|
474
|
+
niv = RARRAY_LEN(trailers);
|
475
|
+
copy_func = copy_list_to_nv;
|
476
|
+
break;
|
477
|
+
case T_HASH:
|
478
|
+
niv = RHASH_SIZE(trailers);
|
479
|
+
copy_func = copy_hash_to_nv;
|
480
|
+
break;
|
481
|
+
default:
|
482
|
+
Check_Type(trailers, T_ARRAY);
|
483
|
+
}
|
484
|
+
|
485
|
+
nva = xcalloc(niv, sizeof(nghttp2_nv));
|
486
|
+
copy_func(trailers, nva, niv);
|
487
|
+
|
488
|
+
rv = nghttp2_submit_trailer(session, s_id, nva, niv);
|
489
|
+
|
490
|
+
xfree(nva);
|
491
|
+
|
492
|
+
if (0 != rv) {
|
493
|
+
explode(rv);
|
494
|
+
}
|
495
|
+
|
496
|
+
return self;
|
497
|
+
}
|
498
|
+
|
451
499
|
static VALUE session_send(VALUE self)
|
452
500
|
{
|
453
501
|
int rv;
|
@@ -536,6 +584,8 @@ ruby_read(nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t leng
|
|
536
584
|
VALUE ret = rb_funcall(source->ptr, rb_intern("read"), 1, INT2NUM(length));
|
537
585
|
|
538
586
|
if (NIL_P(ret)) {
|
587
|
+
VALUE self = (VALUE)user_data;
|
588
|
+
rb_funcall(self, rb_intern("remove_post_buffer"), 1, INT2NUM(stream_id));
|
539
589
|
*data_flags |= NGHTTP2_DATA_FLAG_EOF;
|
540
590
|
return 0;
|
541
591
|
} else {
|
@@ -562,6 +612,8 @@ file_read(nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t leng
|
|
562
612
|
|
563
613
|
if (nread == 0) {
|
564
614
|
*data_flags |= NGHTTP2_DATA_FLAG_EOF;
|
615
|
+
VALUE self = (VALUE)user_data;
|
616
|
+
rb_funcall(self, rb_intern("remove_post_buffer"), 1, INT2NUM(stream_id));
|
565
617
|
}
|
566
618
|
return nread;
|
567
619
|
}
|
@@ -619,6 +671,10 @@ static VALUE session_submit_request(VALUE self, VALUE settings, VALUE body)
|
|
619
671
|
explode(rv);
|
620
672
|
}
|
621
673
|
|
674
|
+
if(!NIL_P(body)) {
|
675
|
+
rb_funcall(self, rb_intern("save_post_buffer"), 2, INT2NUM(rv), body);
|
676
|
+
}
|
677
|
+
|
622
678
|
return INT2NUM(rv);
|
623
679
|
}
|
624
680
|
|
@@ -928,6 +984,7 @@ void Init_ds9(void)
|
|
928
984
|
rb_define_method(cDS9Server, "submit_response", server_submit_response, 2);
|
929
985
|
rb_define_method(cDS9Server, "submit_push_promise", server_submit_push_promise, 2);
|
930
986
|
rb_define_method(cDS9Server, "submit_shutdown", session_submit_shutdown, 0);
|
987
|
+
rb_define_method(cDS9Server, "submit_trailer", session_submit_trailer, 2);
|
931
988
|
|
932
989
|
rb_define_singleton_method(eDS9Exception, "to_string", errors_to_string, 1);
|
933
990
|
|
data/lib/ds9.rb
CHANGED
@@ -2,7 +2,7 @@ require 'ds9.so'
|
|
2
2
|
require 'stringio'
|
3
3
|
|
4
4
|
module DS9
|
5
|
-
VERSION = '1.1.
|
5
|
+
VERSION = '1.1.1'
|
6
6
|
|
7
7
|
module Frames
|
8
8
|
class Frame
|
@@ -73,12 +73,21 @@ module DS9
|
|
73
73
|
|
74
74
|
class Session
|
75
75
|
def initialize
|
76
|
+
@post_buffers = {}
|
76
77
|
cbs = make_callbacks
|
77
78
|
init_internals cbs
|
78
79
|
end
|
79
80
|
|
80
81
|
private
|
81
82
|
|
83
|
+
def save_post_buffer id, stream
|
84
|
+
@post_buffers[id] = stream
|
85
|
+
end
|
86
|
+
|
87
|
+
def remove_post_buffer id
|
88
|
+
@post_buffers.delete id
|
89
|
+
end
|
90
|
+
|
82
91
|
def send_event string
|
83
92
|
raise NotImplementedError
|
84
93
|
end
|
data/test/helper.rb
CHANGED
@@ -78,16 +78,28 @@ module DS9
|
|
78
78
|
include IOEvents
|
79
79
|
|
80
80
|
class Response
|
81
|
-
attr_reader :stream_id, :body
|
81
|
+
attr_reader :stream_id, :body
|
82
82
|
|
83
83
|
def initialize stream_id
|
84
84
|
@stream_id = stream_id
|
85
|
-
@headers = {}
|
85
|
+
@headers = [{}]
|
86
86
|
@body = StringIO.new
|
87
87
|
end
|
88
88
|
|
89
|
-
def
|
90
|
-
|
89
|
+
def headers
|
90
|
+
@headers[0]
|
91
|
+
end
|
92
|
+
|
93
|
+
def trailers
|
94
|
+
@headers[1]
|
95
|
+
end
|
96
|
+
|
97
|
+
def [] k; @headers.last[k]; end
|
98
|
+
def []= k, v; @headers.last[k] = v; end
|
99
|
+
|
100
|
+
def bump
|
101
|
+
@headers << {}
|
102
|
+
end
|
91
103
|
end
|
92
104
|
|
93
105
|
attr_reader :responses, :response_queue, :frames
|
@@ -104,7 +116,11 @@ module DS9
|
|
104
116
|
end
|
105
117
|
|
106
118
|
def on_begin_headers frame
|
107
|
-
@response_streams[frame.stream_id]
|
119
|
+
if @response_streams[frame.stream_id]
|
120
|
+
@response_streams[frame.stream_id].bump
|
121
|
+
else
|
122
|
+
@response_streams[frame.stream_id] = Response.new(frame.stream_id)
|
123
|
+
end
|
108
124
|
end
|
109
125
|
|
110
126
|
def on_header name, value, frame, flags
|
@@ -144,7 +160,13 @@ module DS9
|
|
144
160
|
end
|
145
161
|
|
146
162
|
def on_data_source_read stream_id, length
|
147
|
-
@write_streams[stream_id].body.shift
|
163
|
+
chunk = @write_streams[stream_id].body.shift
|
164
|
+
if chunk.nil? && @write_streams[stream_id].trailers
|
165
|
+
submit_trailer stream_id, @write_streams[stream_id].trailers
|
166
|
+
false
|
167
|
+
else
|
168
|
+
chunk
|
169
|
+
end
|
148
170
|
end
|
149
171
|
|
150
172
|
def on_stream_close id, error_code
|
@@ -172,7 +194,7 @@ module DS9
|
|
172
194
|
end
|
173
195
|
end
|
174
196
|
|
175
|
-
class Response < Struct.new :stream, :stream_id, :body
|
197
|
+
class Response < Struct.new :stream, :stream_id, :body, :trailers
|
176
198
|
def push headers
|
177
199
|
stream.submit_push_promise stream_id, headers
|
178
200
|
end
|
data/test/test_client.rb
CHANGED
@@ -287,4 +287,53 @@ class TestClient < DS9::TestCase
|
|
287
287
|
assert_equal res_hash, responses.first.headers
|
288
288
|
assert_equal ["omglolwut"], responses.map(&:body).map(&:string)
|
289
289
|
end
|
290
|
+
|
291
|
+
def test_trailers
|
292
|
+
body = 'omglolwut'
|
293
|
+
|
294
|
+
req_hash = {
|
295
|
+
':method' => 'GET',
|
296
|
+
':path' => '/',
|
297
|
+
':scheme' => 'https',
|
298
|
+
':authority' => ['localhost', '8080'].join(':'),
|
299
|
+
'accept' => '*/*',
|
300
|
+
'user-agent' => 'test',
|
301
|
+
}
|
302
|
+
|
303
|
+
res_hash = {
|
304
|
+
":status" => '200',
|
305
|
+
"server" => 'test server',
|
306
|
+
"date" => 'Sat, 27 Jun 2015 17:29:21 GMT',
|
307
|
+
"x-whatever" => "blah"
|
308
|
+
}
|
309
|
+
|
310
|
+
trailers = { 'x-foo' => 'bar' }
|
311
|
+
|
312
|
+
server, client = pipe do |req, res|
|
313
|
+
assert_equal req_hash, req.headers
|
314
|
+
|
315
|
+
res.submit_response res_hash
|
316
|
+
res.trailers = trailers
|
317
|
+
res.finish body
|
318
|
+
end
|
319
|
+
|
320
|
+
client.submit_request req_hash
|
321
|
+
|
322
|
+
s = Thread.new { server.run }
|
323
|
+
c = Thread.new { client.run }
|
324
|
+
|
325
|
+
responses = []
|
326
|
+
while response = client.responses.pop
|
327
|
+
responses << response
|
328
|
+
if responses.length == 1
|
329
|
+
client.terminate_session DS9::NO_ERROR
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
s.join
|
334
|
+
c.join
|
335
|
+
assert_equal res_hash, responses.first.headers
|
336
|
+
assert_equal trailers, responses.first.trailers
|
337
|
+
assert_equal ["omglolwut"], responses.map(&:body).map(&:string)
|
338
|
+
end
|
290
339
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ds9
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Patterson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|