rhebok 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changes +5 -0
- data/README.md +3 -3
- data/ext/rhebok/rhebok.c +53 -63
- data/lib/rack/handler/rhebok.rb +3 -2
- data/lib/rhebok/version.rb +1 -1
- data/test/spec_02_server.rb +11 -0
- data/test/testrequest.rb +10 -1
- 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: a836851c9ccb94d821b8987477c7d40fdb1f15b0
|
4
|
+
data.tar.gz: 74aaeb694d767ccf0636110e75eaaf43dbf91d07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cc4fcfc51987e96d998e3e5314c00b8b59c9661169f814e2ed31e7b10f91d4b8b03c45ad04a91946dd919ba2f4a06c0ced3b806a13bd2dbe3338412ab0d4d7e
|
7
|
+
data.tar.gz: e80fb4df159602fe5988983d26661b712ed694388a91b5b6d6c3932abf519ed33800c95a8e1e0c2f5d027ccd0904b5d36bd59d2a383341790fb6811bfe954a11
|
data/Changes
CHANGED
data/README.md
CHANGED
@@ -62,11 +62,11 @@ command line of running Rhebok
|
|
62
62
|
|
63
63
|
### Host
|
64
64
|
|
65
|
-
hostname or ip address to bind
|
65
|
+
hostname or ip address to bind (default: 0.0.0.0)
|
66
66
|
|
67
67
|
### Port
|
68
68
|
|
69
|
-
port to bind
|
69
|
+
port to bind (default: 9292)
|
70
70
|
|
71
71
|
### MaxWorkers
|
72
72
|
|
@@ -75,7 +75,7 @@ number of worker processes (default: 10)
|
|
75
75
|
### MaxRequestPerChild
|
76
76
|
|
77
77
|
max. number of requests to be handled before a worker process exits (default: 1000)
|
78
|
-
This option looks like Apache's MaxRequestPerChild
|
78
|
+
If set to `0`. worker never exists. This option looks like Apache's MaxRequestPerChild
|
79
79
|
|
80
80
|
### MinRequestPerChild
|
81
81
|
|
data/ext/rhebok/rhebok.c
CHANGED
@@ -630,9 +630,31 @@ VALUE rhe_write_all(VALUE self, VALUE fileno, VALUE buf, VALUE offsetv, VALUE ti
|
|
630
630
|
}
|
631
631
|
|
632
632
|
static
|
633
|
-
int
|
634
|
-
|
635
|
-
|
633
|
+
int header_to_array(VALUE key_obj, VALUE val_obj, VALUE ary) {
|
634
|
+
ssize_t val_len;
|
635
|
+
ssize_t val_offset;
|
636
|
+
long val_lf;
|
637
|
+
char * val;
|
638
|
+
|
639
|
+
val = RSTRING_PTR(val_obj);
|
640
|
+
val_len = RSTRING_LEN(val_obj);
|
641
|
+
val_offset = 0;
|
642
|
+
val_lf = find_lf(val, val_offset, val_len);
|
643
|
+
if ( val_lf < val_len ) {
|
644
|
+
/* contain "\n" */
|
645
|
+
while ( val_offset < val_len ) {
|
646
|
+
if ( val_offset != val_lf ) {
|
647
|
+
rb_ary_push(ary, key_obj);
|
648
|
+
rb_ary_push(ary, rb_str_new(&val[val_offset],val_lf - val_offset));
|
649
|
+
}
|
650
|
+
val_offset = val_lf + 1;
|
651
|
+
val_lf = find_lf(val, val_offset, val_len);
|
652
|
+
}
|
653
|
+
}
|
654
|
+
else {
|
655
|
+
rb_ary_push(ary, key_obj);
|
656
|
+
rb_ary_push(ary, val_obj);
|
657
|
+
}
|
636
658
|
return ST_CONTINUE;
|
637
659
|
}
|
638
660
|
|
@@ -647,7 +669,6 @@ VALUE rhe_write_response(VALUE self, VALUE filenov, VALUE timeoutv, VALUE status
|
|
647
669
|
ssize_t hlen = 0;
|
648
670
|
ssize_t blen = 0;
|
649
671
|
|
650
|
-
ssize_t len;
|
651
672
|
ssize_t rv = 0;
|
652
673
|
ssize_t iovcnt;
|
653
674
|
ssize_t vec_offset;
|
@@ -657,27 +678,23 @@ VALUE rhe_write_response(VALUE self, VALUE filenov, VALUE timeoutv, VALUE status
|
|
657
678
|
char status_line[512];
|
658
679
|
char date_line[512];
|
659
680
|
int date_pushed = 0;
|
660
|
-
VALUE
|
681
|
+
VALUE harr;
|
661
682
|
VALUE key_obj;
|
662
683
|
VALUE val_obj;
|
663
684
|
char * key;
|
664
|
-
|
665
|
-
ssize_t val_len;
|
666
|
-
ssize_t val_offset;
|
667
|
-
long val_lf;
|
685
|
+
ssize_t key_len;
|
668
686
|
const char * message;
|
669
687
|
|
670
|
-
|
671
688
|
int fileno = NUM2INT(filenov);
|
672
689
|
double timeout = NUM2DBL(timeoutv);
|
673
690
|
int status_code = NUM2INT(status_codev);
|
674
691
|
|
675
|
-
|
676
|
-
RB_GC_GUARD(
|
677
|
-
rb_hash_foreach(headers,
|
678
|
-
hlen = RARRAY_LEN(
|
692
|
+
harr = rb_ary_new();
|
693
|
+
RB_GC_GUARD(harr);
|
694
|
+
rb_hash_foreach(headers, header_to_array, harr);
|
695
|
+
hlen = RARRAY_LEN(harr);
|
679
696
|
blen = RARRAY_LEN(body);
|
680
|
-
iovcnt =
|
697
|
+
iovcnt = 10 + (hlen * 2) + blen;
|
681
698
|
|
682
699
|
{
|
683
700
|
struct iovec v[iovcnt]; // Needs C99 compiler
|
@@ -709,62 +726,35 @@ VALUE rhe_write_response(VALUE self, VALUE filenov, VALUE timeoutv, VALUE status
|
|
709
726
|
|
710
727
|
date_pushed = 0;
|
711
728
|
for ( i = 0; i < hlen; i++ ) {
|
712
|
-
key_obj = rb_ary_entry(
|
729
|
+
key_obj = rb_ary_entry(harr, i);
|
713
730
|
key = RSTRING_PTR(key_obj);
|
714
|
-
|
715
|
-
if ( strncasecmp(key,"Connection",
|
731
|
+
key_len = RSTRING_LEN(key_obj);
|
732
|
+
if ( strncasecmp(key,"Connection",key_len) == 0 ) {
|
733
|
+
i++;
|
716
734
|
continue;
|
717
735
|
}
|
718
|
-
if ( strncasecmp(key,"Server",
|
736
|
+
if ( strncasecmp(key,"Server",key_len) == 0 ) {
|
719
737
|
v[1].iov_len -= (sizeof("Server: Rhebok\r\n") - 1);
|
720
738
|
}
|
721
|
-
if ( strncasecmp(key,"Date",
|
739
|
+
if ( strncasecmp(key,"Date",key_len) == 0 ) {
|
722
740
|
date_pushed = 1;
|
723
741
|
}
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
if ( val_lf < val_len ) {
|
731
|
-
/* contain "\n" */
|
732
|
-
while ( val_offset < val_len ) {
|
733
|
-
// printf("'%s' val_len:%zd, val_offset:%zd, val_lf:%zd\n", &val[val_offset], val_len, val_offset, val_lf);
|
734
|
-
if ( val_offset != val_lf ) {
|
735
|
-
v[iovcnt].iov_base = key;
|
736
|
-
v[iovcnt].iov_len = len;
|
737
|
-
iovcnt++;
|
738
|
-
v[iovcnt].iov_base = ": ";
|
739
|
-
v[iovcnt].iov_len = sizeof(": ") - 1;
|
740
|
-
iovcnt++;
|
741
|
-
v[iovcnt].iov_base = &val[val_offset];
|
742
|
-
v[iovcnt].iov_len = val_lf - val_offset;
|
743
|
-
iovcnt++;
|
744
|
-
v[iovcnt].iov_base = "\r\n";
|
745
|
-
v[iovcnt].iov_len = sizeof("\r\n") - 1;
|
746
|
-
iovcnt++;
|
747
|
-
}
|
748
|
-
val_offset = val_lf + 1;
|
749
|
-
val_lf = find_lf(val, val_offset, val_len);
|
750
|
-
}
|
751
|
-
}
|
752
|
-
else {
|
753
|
-
v[iovcnt].iov_base = key;
|
754
|
-
v[iovcnt].iov_len = len;
|
755
|
-
iovcnt++;
|
756
|
-
v[iovcnt].iov_base = ": ";
|
757
|
-
v[iovcnt].iov_len = sizeof(": ") - 1;
|
758
|
-
iovcnt++;
|
759
|
-
v[iovcnt].iov_base = val;
|
760
|
-
v[iovcnt].iov_len = val_len;
|
761
|
-
iovcnt++;
|
762
|
-
v[iovcnt].iov_base = "\r\n";
|
763
|
-
v[iovcnt].iov_len = sizeof("\r\n") - 1;
|
764
|
-
iovcnt++;
|
765
|
-
}
|
766
|
-
|
742
|
+
v[iovcnt].iov_base = key;
|
743
|
+
v[iovcnt].iov_len = key_len;
|
744
|
+
iovcnt++;
|
745
|
+
v[iovcnt].iov_base = ": ";
|
746
|
+
v[iovcnt].iov_len = sizeof(": ") - 1;
|
747
|
+
iovcnt++;
|
767
748
|
|
749
|
+
/* value */
|
750
|
+
i++;
|
751
|
+
val_obj = rb_ary_entry(harr, i);
|
752
|
+
v[iovcnt].iov_base = RSTRING_PTR(val_obj);
|
753
|
+
v[iovcnt].iov_len = RSTRING_LEN(val_obj);
|
754
|
+
iovcnt++;
|
755
|
+
v[iovcnt].iov_base = "\r\n";
|
756
|
+
v[iovcnt].iov_len = sizeof("\r\n") - 1;
|
757
|
+
iovcnt++;
|
768
758
|
}
|
769
759
|
|
770
760
|
if ( date_pushed == 0 ) {
|
data/lib/rack/handler/rhebok.rb
CHANGED
@@ -105,9 +105,10 @@ module Rack
|
|
105
105
|
def _calc_reqs_per_child
|
106
106
|
max = @options[:MaxRequestPerChild].to_i
|
107
107
|
if min = @options[:MinRequestPerChild] then
|
108
|
+
return max.to_i if min.to_i >= max
|
108
109
|
return (max - (max - min.to_i + 1) * rand).to_i
|
109
110
|
end
|
110
|
-
return max
|
111
|
+
return max
|
111
112
|
end
|
112
113
|
|
113
114
|
def accept_loop(app)
|
@@ -139,7 +140,7 @@ module Rack
|
|
139
140
|
"rack.input" => NULLIO
|
140
141
|
}
|
141
142
|
|
142
|
-
while proc_req_count < max_reqs
|
143
|
+
while @options[:MaxRequestPerChild].to_i == 0 || proc_req_count < max_reqs
|
143
144
|
@can_exit = true
|
144
145
|
env = env_template.clone
|
145
146
|
connection, buf = ::Rhebok.accept_rack(fileno, @options[:Timeout], @_is_tcp, env)
|
data/lib/rhebok/version.rb
CHANGED
data/test/spec_02_server.rb
CHANGED
@@ -49,6 +49,17 @@ describe Rhebok do
|
|
49
49
|
header["X-Fuga"].should.equal "Fuga"
|
50
50
|
end
|
51
51
|
|
52
|
+
should "date header" do
|
53
|
+
GET("/date")
|
54
|
+
header["Date"].should.equal "Foooo"
|
55
|
+
end
|
56
|
+
|
57
|
+
should "ignore connection header" do
|
58
|
+
GET("/connection")
|
59
|
+
header["Connection"].should.equal "close"
|
60
|
+
header["Content-Type"].should.equal "text/yaml"
|
61
|
+
header["Date"].should.match(/20/)
|
62
|
+
end
|
52
63
|
|
53
64
|
should "have CGI headers on GET" do
|
54
65
|
GET("/")
|
data/test/testrequest.rb
CHANGED
@@ -6,14 +6,23 @@ class TestRequest
|
|
6
6
|
NOSERIALIZE = [Method, Proc, Rack::Lint::InputWrapper]
|
7
7
|
|
8
8
|
def call(env)
|
9
|
+
|
10
|
+
test_header = {};
|
9
11
|
status = env["QUERY_STRING"] =~ /secret/ ? 403 : 200
|
12
|
+
if env["PATH_INFO"] =~ /date/ then
|
13
|
+
test_header["Date"] = "Foooo"
|
14
|
+
end
|
15
|
+
if env["PATH_INFO"] =~ /connection/ then
|
16
|
+
test_header["Connection"] = "keepalive"
|
17
|
+
end
|
10
18
|
env["test.postdata"] = env["rack.input"].read
|
11
19
|
minienv = env.dup
|
12
20
|
# This may in the future want to replace with a dummy value instead.
|
13
21
|
minienv.delete_if { |k,v| NOSERIALIZE.any? { |c| v.kind_of?(c) } }
|
14
22
|
body = minienv.to_yaml
|
15
23
|
size = body.respond_to?(:bytesize) ? body.bytesize : body.size
|
16
|
-
|
24
|
+
res_header = {"Content-Type" => "text/yaml", "Content-Length" => size.to_s, "X-Foo" => "Foo\nBar", "X-Bar"=>"Foo\n\nBar", "X-Baz"=>"\nBaz", "X-Fuga"=>"Fuga\n"}
|
25
|
+
[status, res_header.merge(test_header), [body]]
|
17
26
|
end
|
18
27
|
|
19
28
|
module Helpers
|
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.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masahiro Nagano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|