rhebok 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/Changes +4 -0
- data/README.md +6 -0
- data/ext/rhebok/rhebok.c +38 -16
- data/lib/rack/handler/rhebok.rb +10 -3
- data/lib/rhebok/config.rb +4 -0
- data/lib/rhebok/version.rb +1 -1
- data/test/spec_06_curl.rb +5 -5
- data/test/testrequest.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd12b50300a5e3b8b0c520c1780e4c4739914624
|
4
|
+
data.tar.gz: 3ed92d6cb499a00830b9b26e2ce97ec401c85252
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aacc1363c0c7d17800c0789c144cf688d492043f190bb3d2674f48ea8233382e024775d8e7e9777c34acebe70e4c8faa6f4a29b55abf729ad032605dc4d49654
|
7
|
+
data.tar.gz: de67014ec7944a6b575ac8fc6a7a9a9120d519b8d53a7ac524d751e2a0f7bd8e41b37da261c98182444f81d0cd6e709372b13e94eecac979aa4375509022e81d
|
data/.travis.yml
CHANGED
data/Changes
CHANGED
data/README.md
CHANGED
@@ -114,6 +114,10 @@ Max number of request before invoking GC (defualt: 5)
|
|
114
114
|
|
115
115
|
If set, randomizes the number of request before invoking GC between the number of MaxGCPerRequest (defualt: none)
|
116
116
|
|
117
|
+
### Chunked_Transfer
|
118
|
+
|
119
|
+
If set, use chunked transfer for response (default: false)
|
120
|
+
|
117
121
|
### SpawnInterval
|
118
122
|
|
119
123
|
if set, worker processes will not be spawned more than once than every given seconds. Also, when SIGUSR1 is being received, no more than one worker processes will be collected every given seconds. This feature is useful for doing a "slow-restart". See http://blog.kazuhooku.com/2011/04/web-serverstarter-parallelprefork.html for more information. (default: none)
|
@@ -165,6 +169,8 @@ Supported options in config file are below.
|
|
165
169
|
|
166
170
|
### min_gc_per_request
|
167
171
|
|
172
|
+
### chunked_transfer
|
173
|
+
|
168
174
|
### spawn_interval
|
169
175
|
|
170
176
|
### before_fork
|
data/ext/rhebok/rhebok.c
CHANGED
@@ -241,7 +241,8 @@ VALUE find_common_header(const struct phr_header* header) {
|
|
241
241
|
|
242
242
|
static
|
243
243
|
int store_path_info(VALUE env, const char* src, size_t src_len) {
|
244
|
-
|
244
|
+
int dlen = 0;
|
245
|
+
size_t i = 0;
|
245
246
|
char *d;
|
246
247
|
char s2, s3;
|
247
248
|
d = ALLOC_N(char, src_len * 3 + 1);
|
@@ -294,13 +295,23 @@ int _accept(int fileno, struct sockaddr *addr, unsigned int addrlen) {
|
|
294
295
|
}
|
295
296
|
|
296
297
|
static
|
297
|
-
ssize_t _writev_timeout(const int fileno, const double timeout, struct iovec *iovec, const
|
298
|
-
|
298
|
+
ssize_t _writev_timeout(const int fileno, const double timeout, struct iovec *iovec, const long iovcnt, const int do_select ) {
|
299
|
+
ssize_t rv;
|
299
300
|
int nfound;
|
301
|
+
int iovcnt_len;
|
300
302
|
struct pollfd wfds[1];
|
303
|
+
if ( iovcnt < 0 ){
|
304
|
+
return -1;
|
305
|
+
}
|
306
|
+
if ( iovcnt > UINT_MAX ) {
|
307
|
+
iovcnt_len = UINT_MAX;
|
308
|
+
}
|
309
|
+
else {
|
310
|
+
iovcnt_len = (int)iovcnt;
|
311
|
+
}
|
301
312
|
if ( do_select == 1) goto WAIT_WRITE;
|
302
313
|
DO_WRITE:
|
303
|
-
rv = writev(fileno, iovec,
|
314
|
+
rv = writev(fileno, iovec, iovcnt_len);
|
304
315
|
if ( rv >= 0 ) {
|
305
316
|
return rv;
|
306
317
|
}
|
@@ -323,8 +334,8 @@ ssize_t _writev_timeout(const int fileno, const double timeout, struct iovec *io
|
|
323
334
|
}
|
324
335
|
|
325
336
|
static
|
326
|
-
ssize_t _read_timeout(const int fileno, const double timeout, char * read_buf, const
|
327
|
-
|
337
|
+
ssize_t _read_timeout(const int fileno, const double timeout, char * read_buf, const ssize_t read_len ) {
|
338
|
+
ssize_t rv;
|
328
339
|
int nfound;
|
329
340
|
struct pollfd rfds[1];
|
330
341
|
DO_READ:
|
@@ -350,12 +361,23 @@ ssize_t _read_timeout(const int fileno, const double timeout, char * read_buf, c
|
|
350
361
|
}
|
351
362
|
|
352
363
|
static
|
353
|
-
ssize_t _write_timeout(const int fileno, const double timeout, char * write_buf, const
|
354
|
-
|
364
|
+
ssize_t _write_timeout(const int fileno, const double timeout, char * write_buf, const long write_len ) {
|
365
|
+
ssize_t rv;
|
355
366
|
int nfound;
|
356
367
|
struct pollfd wfds[1];
|
368
|
+
size_t write_buf_len;
|
369
|
+
if ( write_len < 0 ) {
|
370
|
+
return -1;
|
371
|
+
}
|
372
|
+
if ( write_len > UINT_MAX ) {
|
373
|
+
write_buf_len = UINT_MAX;
|
374
|
+
}
|
375
|
+
else {
|
376
|
+
write_buf_len = (unsigned int)write_len;
|
377
|
+
}
|
378
|
+
|
357
379
|
DO_WRITE:
|
358
|
-
rv = write(fileno, write_buf,
|
380
|
+
rv = write(fileno, write_buf, write_buf_len);
|
359
381
|
if ( rv >= 0 ) {
|
360
382
|
return rv;
|
361
383
|
}
|
@@ -377,8 +399,8 @@ ssize_t _write_timeout(const int fileno, const double timeout, char * write_buf,
|
|
377
399
|
}
|
378
400
|
|
379
401
|
static
|
380
|
-
void str_s(char * dst, int *dst_len, const char * src,
|
381
|
-
|
402
|
+
void str_s(char * dst, int *dst_len, const char * src, const unsigned long src_len) {
|
403
|
+
unsigned long i;
|
382
404
|
int dlen = *dst_len;
|
383
405
|
for ( i=0; i<src_len; i++) {
|
384
406
|
dst[dlen++] = src[i];
|
@@ -691,8 +713,8 @@ VALUE rhe_write_chunk(VALUE self, VALUE fileno, VALUE buf, VALUE offsetv, VALUE
|
|
691
713
|
ssize_t rv = 0;
|
692
714
|
ssize_t written = 0;
|
693
715
|
ssize_t vec_offset = 0;
|
694
|
-
|
695
|
-
|
716
|
+
ssize_t count =0;
|
717
|
+
ssize_t remain;
|
696
718
|
ssize_t iovcnt = 3;
|
697
719
|
char chunked_header_buf[18];
|
698
720
|
|
@@ -788,9 +810,9 @@ VALUE rhe_write_response(VALUE self, VALUE filenov, VALUE timeoutv, VALUE status
|
|
788
810
|
ssize_t iovcnt;
|
789
811
|
ssize_t vec_offset;
|
790
812
|
ssize_t written;
|
791
|
-
|
813
|
+
ssize_t count;
|
792
814
|
int i;
|
793
|
-
|
815
|
+
ssize_t remain;
|
794
816
|
char status_line[512];
|
795
817
|
char date_line[512];
|
796
818
|
char server_line[1032];
|
@@ -819,7 +841,7 @@ VALUE rhe_write_response(VALUE self, VALUE filenov, VALUE timeoutv, VALUE status
|
|
819
841
|
use_chunked = 0;
|
820
842
|
}
|
821
843
|
|
822
|
-
harr =
|
844
|
+
harr = rb_ary_new2(RHASH_SIZE(headers) * 2);
|
823
845
|
RB_GC_GUARD(harr);
|
824
846
|
rb_hash_foreach(headers, header_to_array, harr);
|
825
847
|
hlen = RARRAY_LEN(harr);
|
data/lib/rack/handler/rhebok.rb
CHANGED
@@ -41,6 +41,7 @@ module Rack
|
|
41
41
|
:BeforeFork => nil,
|
42
42
|
:AfterFork => nil,
|
43
43
|
:ReusePort => false,
|
44
|
+
:ChunkedTransfer => false,
|
44
45
|
}
|
45
46
|
NULLIO = StringIO.new("").set_encoding('BINARY')
|
46
47
|
|
@@ -64,6 +65,9 @@ module Rack
|
|
64
65
|
if options[:ReusePort].instance_of?(String)
|
65
66
|
options[:ReusePort] = options[:ReusePort].match(/^(true|yes|1)$/i) ? true : false
|
66
67
|
end
|
68
|
+
if options[:ChunkedTransfer].instance_of?(String)
|
69
|
+
options[:ChunkedTransfer] = options[:ChunkedTransfer].match(/^(true|yes|1)$/i) ? true : false
|
70
|
+
end
|
67
71
|
|
68
72
|
@options = DEFAULT_OPTIONS.merge(options)
|
69
73
|
if @options[:ConfigFile] != nil
|
@@ -293,9 +297,12 @@ module Rack
|
|
293
297
|
|
294
298
|
status_code, headers, body = app.call(env)
|
295
299
|
|
296
|
-
use_chunked =
|
297
|
-
|
298
|
-
|
300
|
+
use_chunked = 0
|
301
|
+
if @options[:ChunkedTransfer]
|
302
|
+
use_chunked = env["SERVER_PROTOCOL"] != "HTTP/1.1" ||
|
303
|
+
headers.key?("Transfer-Encoding") ||
|
304
|
+
headers.key?("Content-Length") ? 0 : 1
|
305
|
+
end
|
299
306
|
|
300
307
|
if body.instance_of?(Array)
|
301
308
|
::Rhebok.write_response(connection, @options[:Timeout], status_code.to_i, headers, body, use_chunked, 0)
|
data/lib/rhebok/config.rb
CHANGED
data/lib/rhebok/version.rb
CHANGED
data/test/spec_06_curl.rb
CHANGED
@@ -51,7 +51,7 @@ describe Rhebok do
|
|
51
51
|
@header["Connection"].should.equal "close"
|
52
52
|
@header.key?("HTTP/1.1 100 Continue").should.equal false
|
53
53
|
end
|
54
|
-
})
|
54
|
+
},1)
|
55
55
|
|
56
56
|
test_rhebok( proc {
|
57
57
|
[200,{"Content-Type"=>"text/plain"},["Content","","Again",nil,0]]
|
@@ -66,7 +66,7 @@ describe Rhebok do
|
|
66
66
|
should "zero length with curl http/1.0" do
|
67
67
|
@body.should.equal "ContentAgain0"
|
68
68
|
end
|
69
|
-
})
|
69
|
+
},1)
|
70
70
|
|
71
71
|
test_rhebok( proc {
|
72
72
|
[200,{"Content-Type"=>"text/plain"},[]]
|
@@ -81,7 +81,7 @@ describe Rhebok do
|
|
81
81
|
should "vacant rew with curl http/1.0" do
|
82
82
|
@body.should.equal ""
|
83
83
|
end
|
84
|
-
})
|
84
|
+
},1)
|
85
85
|
|
86
86
|
test_rhebok( proc {
|
87
87
|
[200,{"Content-Type"=>"text/plain"},ZeroStreamBody]
|
@@ -96,7 +96,7 @@ describe Rhebok do
|
|
96
96
|
should "zerostream length with curl http/1.0" do
|
97
97
|
@body.should.equal "ContentAgain0"
|
98
98
|
end
|
99
|
-
})
|
99
|
+
},1)
|
100
100
|
|
101
101
|
test_rhebok( proc {
|
102
102
|
[200,{"Content-Type"=>"text/plain"},VacantStreamBody]
|
@@ -111,6 +111,6 @@ describe Rhebok do
|
|
111
111
|
should "vacantstream length with curl http/1.0" do
|
112
112
|
@body.should.equal ""
|
113
113
|
end
|
114
|
-
})
|
114
|
+
},1)
|
115
115
|
|
116
116
|
end
|
data/test/testrequest.rb
CHANGED
@@ -78,12 +78,12 @@ class TestRequest
|
|
78
78
|
}
|
79
79
|
end
|
80
80
|
|
81
|
-
def test_rhebok(app,cb)
|
81
|
+
def test_rhebok(app,cb,chunked=0)
|
82
82
|
begin
|
83
83
|
@pid = fork
|
84
84
|
if @pid == nil
|
85
85
|
# child
|
86
|
-
Rack::Handler::Rhebok.run(app, :Host=>@host, :Port=>@port, :MaxWorkers=>1)
|
86
|
+
Rack::Handler::Rhebok.run(app, :Host=>@host, :Port=>@port, :MaxWorkers=>1, :ChunkedTransfer=>chunked)
|
87
87
|
exit!(true)
|
88
88
|
end
|
89
89
|
cb.call
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rhebok
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masahiro Nagano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|