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 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