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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f2f6e28f41bf7d49e71ade28a3c1ff5628d219f
4
- data.tar.gz: b593fa179c4f0e53271f883d82e68ee6fe6e40d7
3
+ metadata.gz: a836851c9ccb94d821b8987477c7d40fdb1f15b0
4
+ data.tar.gz: 74aaeb694d767ccf0636110e75eaaf43dbf91d07
5
5
  SHA512:
6
- metadata.gz: e1c9b47ec3cf7e8b9e1566e0d62f04a0d80bea52d4b5b8a357e0b29253c339199825ff1fa7e4fc8daa1501a47b441034363d4a8e09504bc91d00124e4d21eb8b
7
- data.tar.gz: 288903b31717eb0887605c0dc36e4743d45e3be4f876b20a8c3985cc88141f29913b16f8607576b7a52e89e43e95a597b2d267b832cb9e07ebf8341218ce0b00
6
+ metadata.gz: 4cc4fcfc51987e96d998e3e5314c00b8b59c9661169f814e2ed31e7b10f91d4b8b03c45ad04a91946dd919ba2f4a06c0ced3b806a13bd2dbe3338412ab0d4d7e
7
+ data.tar.gz: e80fb4df159602fe5988983d26661b712ed694388a91b5b6d6c3932abf519ed33800c95a8e1e0c2f5d027ccd0904b5d36bd59d2a383341790fb6811bfe954a11
data/Changes CHANGED
@@ -1,3 +1,8 @@
1
+ 0.0.5 2014-12-19T11:06:28Z
2
+
3
+ - support MaxRequestPerChild=0. worker never exit.
4
+ - refactor around res header
5
+
1
6
  0.0.4 2014-12-19-T01:50:11Z
2
7
 
3
8
  - support multiple line header
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
 
@@ -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 my_hash_keys(VALUE key, VALUE val, VALUE ary) {
634
- char * d = RSTRING_PTR(key);
635
- rb_ary_push(ary, key);
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 arr;
681
+ VALUE harr;
661
682
  VALUE key_obj;
662
683
  VALUE val_obj;
663
684
  char * key;
664
- char * val;
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
- arr = rb_ary_new();
676
- RB_GC_GUARD(arr);
677
- rb_hash_foreach(headers, my_hash_keys, arr);
678
- hlen = RARRAY_LEN(arr);
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 = 128 + (hlen * 4) + blen;
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(arr, i);
729
+ key_obj = rb_ary_entry(harr, i);
713
730
  key = RSTRING_PTR(key_obj);
714
- len = RSTRING_LEN(key_obj);
715
- if ( strncasecmp(key,"Connection",len) == 0 ) {
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",len) == 0 ) {
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",len) == 0 ) {
739
+ if ( strncasecmp(key,"Date",key_len) == 0 ) {
722
740
  date_pushed = 1;
723
741
  }
724
- /* value */
725
- val_obj = rb_hash_aref(headers, key_obj);
726
- val = RSTRING_PTR(val_obj);
727
- val_len = RSTRING_LEN(val_obj);
728
- val_offset = 0;
729
- val_lf = find_lf(val, val_offset, val_len);
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 ) {
@@ -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.to_i
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)
@@ -1,3 +1,3 @@
1
1
  class Rhebok
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -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("/")
@@ -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
- [status, {"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"}, [body]]
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
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-18 00:00:00.000000000 Z
11
+ date: 2014-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler