rhebok 0.0.4 → 0.0.5
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/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
|