polyphony 0.86 → 0.87
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/CHANGELOG.md +4 -0
- data/Gemfile.lock +1 -1
- data/examples/io/http1_splice_chunked.rb +8 -0
- data/examples/io/static_web_server.rb +46 -0
- data/ext/polyphony/backend_libev.c +3 -0
- data/ext/polyphony/io_extensions.c +32 -0
- data/ext/polyphony/polyphony.c +6 -0
- data/ext/polyphony/polyphony.h +5 -0
- data/lib/polyphony/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 938f929b8373ea094ae045c5acc830f6b848a5018bc5604eab280c740e72f56f
|
4
|
+
data.tar.gz: e0806785ca3b5ea6101640b8bbfba9ece96f5c614e13267e07a1f15c33efeb1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db4f627ab9fd78899711f8eb12c359e038835ada7d43e494cf0377a2a7f6795746a1e877987f32934e94700cb536c27b58e53d7a5cf77161863a4d26c55abcb5
|
7
|
+
data.tar.gz: f7ac358243a16baa8e83923cf46ac7d8ce422a9e0faeea28faa3e0dd523b6b666180fcf1f5182e86c534ced64cfe680895bcdf7bdc9f16e77b641940f439d992
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
|
5
|
+
require 'polyphony'
|
6
|
+
require 'h1p'
|
7
|
+
|
8
|
+
server = Polyphony::Net.tcp_listen('localhost', 1234,
|
9
|
+
reuse_addr: true, reuse_port: true, dont_linger: true
|
10
|
+
)
|
11
|
+
puts 'Serving HTTP on port 1234'
|
12
|
+
|
13
|
+
def respond_default(conn)
|
14
|
+
conn << "HTTP/1.1 204\r\n\r\n"
|
15
|
+
end
|
16
|
+
|
17
|
+
def respond_splice(conn, path)
|
18
|
+
f = File.open(path, 'r') do |f|
|
19
|
+
conn << "HTTP/1.1 200\r\nTransfer-Encoding: chunked\r\n\r\n"
|
20
|
+
IO.http1_splice_chunked(f, conn, 16384)
|
21
|
+
end
|
22
|
+
rescue => e
|
23
|
+
p e
|
24
|
+
# conn << "HTTP/1.1 500\r\nContent-Length: 0\r\n\r\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
def handle_client(conn)
|
28
|
+
parser = H1P::Parser.new(conn, :server)
|
29
|
+
while true
|
30
|
+
headers = parser.parse_headers
|
31
|
+
break unless headers
|
32
|
+
|
33
|
+
case headers[':path']
|
34
|
+
when /^\/splice\/(.+)$/
|
35
|
+
respond_splice(conn, $1)
|
36
|
+
else
|
37
|
+
respond_default(conn)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
rescue Errno::ECONNRESET
|
41
|
+
# ignore
|
42
|
+
end
|
43
|
+
|
44
|
+
server.accept_loop do |conn|
|
45
|
+
handle_client(conn)
|
46
|
+
end
|
@@ -1645,6 +1645,9 @@ void Init_Backend() {
|
|
1645
1645
|
|
1646
1646
|
rb_define_method(cBackend, "splice", Backend_splice, 3);
|
1647
1647
|
rb_define_method(cBackend, "splice_to_eof", Backend_splice_to_eof, 3);
|
1648
|
+
#ifdef POLYPHONY_LINUX
|
1649
|
+
rb_define_method(cBackend, "tee", Backend_tee, 3);
|
1650
|
+
#endif
|
1648
1651
|
|
1649
1652
|
rb_define_method(cBackend, "timeout", Backend_timeout, -1);
|
1650
1653
|
rb_define_method(cBackend, "timer_loop", Backend_timer_loop, 1);
|
@@ -526,12 +526,44 @@ VALUE IO_inflate(VALUE self, VALUE src, VALUE dest) {
|
|
526
526
|
return INT2FIX(ctx.out_total);
|
527
527
|
}
|
528
528
|
|
529
|
+
VALUE IO_http1_splice_chunked(VALUE self, VALUE src, VALUE dest, VALUE maxlen) {
|
530
|
+
enum write_method method = detect_write_method(dest);
|
531
|
+
VALUE backend = BACKEND();
|
532
|
+
VALUE pipe = rb_funcall(cPipe, ID_new, 0);
|
533
|
+
unsigned char out[128];
|
534
|
+
struct raw_buffer buffer = { out, 0 };
|
535
|
+
|
536
|
+
while (1) {
|
537
|
+
int len = FIX2INT(Backend_splice(backend, src, pipe, maxlen));
|
538
|
+
if (!len) break;
|
539
|
+
|
540
|
+
// write chunk header
|
541
|
+
buffer.len += sprintf(buffer.ptr + buffer.len, "%x\r\n", len);
|
542
|
+
write_from_raw_buffer(backend, dest, method, &buffer);
|
543
|
+
buffer.len = 0;
|
544
|
+
while (len) {
|
545
|
+
int spliced = FIX2INT(Backend_splice(backend, pipe, dest, INT2FIX(len)));
|
546
|
+
len -= spliced;
|
547
|
+
}
|
548
|
+
buffer.len += sprintf(buffer.ptr + buffer.len, "\r\n");
|
549
|
+
}
|
550
|
+
buffer.len += sprintf(buffer.ptr + buffer.len, "0\r\n\r\n");
|
551
|
+
write_from_raw_buffer(backend, dest, method, &buffer);
|
552
|
+
|
553
|
+
Pipe_close(pipe);
|
554
|
+
RB_GC_GUARD(pipe);
|
555
|
+
|
556
|
+
return self;
|
557
|
+
}
|
558
|
+
|
529
559
|
void Init_IOExtensions() {
|
530
560
|
rb_define_singleton_method(rb_cIO, "gzip", IO_gzip, -1);
|
531
561
|
rb_define_singleton_method(rb_cIO, "gunzip", IO_gunzip, -1);
|
532
562
|
rb_define_singleton_method(rb_cIO, "deflate", IO_deflate, 2);
|
533
563
|
rb_define_singleton_method(rb_cIO, "inflate", IO_inflate, 2);
|
534
564
|
|
565
|
+
rb_define_singleton_method(rb_cIO, "http1_splice_chunked", IO_http1_splice_chunked, 3);
|
566
|
+
|
535
567
|
ID_at = rb_intern("at");
|
536
568
|
ID_read_method = rb_intern("__read_method__");
|
537
569
|
ID_readpartial = rb_intern("readpartial");
|
data/ext/polyphony/polyphony.c
CHANGED
@@ -94,9 +94,11 @@ VALUE Polyphony_backend_splice_to_eof(VALUE self, VALUE src, VALUE dest, VALUE c
|
|
94
94
|
return Backend_splice_to_eof(BACKEND(), src, dest, chunksize);
|
95
95
|
}
|
96
96
|
|
97
|
+
#ifdef POLYPHONY_LINUX
|
97
98
|
VALUE Polyphony_backend_tee(VALUE self, VALUE src, VALUE dest, VALUE chunksize) {
|
98
99
|
return Backend_tee(BACKEND(), src, dest, chunksize);
|
99
100
|
}
|
101
|
+
#endif
|
100
102
|
|
101
103
|
VALUE Polyphony_backend_timeout(int argc,VALUE *argv, VALUE self) {
|
102
104
|
return Backend_timeout(argc, argv, BACKEND());
|
@@ -190,7 +192,11 @@ void Init_Polyphony() {
|
|
190
192
|
rb_define_singleton_method(mPolyphony, "backend_sleep", Polyphony_backend_sleep, 1);
|
191
193
|
rb_define_singleton_method(mPolyphony, "backend_splice", Polyphony_backend_splice, 3);
|
192
194
|
rb_define_singleton_method(mPolyphony, "backend_splice_to_eof", Polyphony_backend_splice_to_eof, 3);
|
195
|
+
|
196
|
+
#ifdef POLYPHONY_LINUX
|
193
197
|
rb_define_singleton_method(mPolyphony, "backend_tee", Polyphony_backend_tee, 3);
|
198
|
+
#endif
|
199
|
+
|
194
200
|
rb_define_singleton_method(mPolyphony, "backend_timeout", Polyphony_backend_timeout, -1);
|
195
201
|
rb_define_singleton_method(mPolyphony, "backend_timer_loop", Polyphony_backend_timer_loop, 1);
|
196
202
|
rb_define_singleton_method(mPolyphony, "backend_wait_event", Polyphony_backend_wait_event, 1);
|
data/ext/polyphony/polyphony.h
CHANGED
@@ -90,6 +90,7 @@ int Runqueue_should_poll_nonblocking(VALUE self);
|
|
90
90
|
|
91
91
|
void Pipe_verify_blocking_mode(VALUE self, VALUE blocking);
|
92
92
|
int Pipe_get_fd(VALUE self, int write_mode);
|
93
|
+
VALUE Pipe_close(VALUE self);
|
93
94
|
|
94
95
|
#ifdef POLYPHONY_BACKEND_LIBEV
|
95
96
|
#define Backend_recv_loop Backend_read_loop
|
@@ -112,7 +113,11 @@ VALUE Backend_sendv(VALUE self, VALUE io, VALUE ary, VALUE flags);
|
|
112
113
|
VALUE Backend_sleep(VALUE self, VALUE duration);
|
113
114
|
VALUE Backend_splice(VALUE self, VALUE src, VALUE dest, VALUE maxlen);
|
114
115
|
VALUE Backend_splice_to_eof(VALUE self, VALUE src, VALUE dest, VALUE chunksize);
|
116
|
+
|
117
|
+
#ifdef POLYPHONY_LINUX
|
115
118
|
VALUE Backend_tee(VALUE self, VALUE src, VALUE dest, VALUE maxlen);
|
119
|
+
#endif
|
120
|
+
|
116
121
|
VALUE Backend_timeout(int argc,VALUE *argv, VALUE self);
|
117
122
|
VALUE Backend_timer_loop(VALUE self, VALUE interval);
|
118
123
|
VALUE Backend_wait_event(VALUE self, VALUE raise);
|
data/lib/polyphony/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polyphony
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.87'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03-
|
11
|
+
date: 2022-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -262,6 +262,7 @@ files:
|
|
262
262
|
- examples/io/echo_stdin.rb
|
263
263
|
- examples/io/gzip.rb
|
264
264
|
- examples/io/happy-eyeballs.rb
|
265
|
+
- examples/io/http1_splice_chunked.rb
|
265
266
|
- examples/io/httparty.rb
|
266
267
|
- examples/io/https_server.rb
|
267
268
|
- examples/io/irb.rb
|
@@ -274,6 +275,7 @@ files:
|
|
274
275
|
- examples/io/reline.rb
|
275
276
|
- examples/io/splice_chunks.rb
|
276
277
|
- examples/io/splice_echo_server.rb
|
278
|
+
- examples/io/static_web_server.rb
|
277
279
|
- examples/io/stdio.rb
|
278
280
|
- examples/io/system.rb
|
279
281
|
- examples/io/tcp_proxy.rb
|