rhebok 0.8.5 → 0.8.6

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: 63c847aca36084736ee20d2439a2a868f9cfdf09
4
- data.tar.gz: 8a24d9b12665ace439784f2fe5d727da562a17b4
3
+ metadata.gz: 1dbfe9f10796f8d8851faa4f2a642d8e462fed15
4
+ data.tar.gz: 865e2b6464856104ad2cba761e2a82c1967a30f6
5
5
  SHA512:
6
- metadata.gz: e77d3d23898445c851b65b945306c6fe19bdbe6af7332afa8578deca059e11d6204cb33aed2984492d9d05de2d0d682b89e4847bd831d2f958e0800b7bc8c942
7
- data.tar.gz: 430031512ebf4a7a2054dabb651266738eef9ac6051a63b646f87a5b075d63a21ccfb263d2c67786091cf6d97cb9149f0f63b191f6062a0302f55571a5dd7f54
6
+ metadata.gz: 1bdea8576b3aff0eaec288a7e8613e47d8e7efa7a1b54a55f5e84eb5148e9781896b90b559c4e117104d4ea795a36e80a09e7f23c315ff0188fa845f43717216
7
+ data.tar.gz: a7973f26793013d7c208b6578076738102df80e42e8eaf5c8b6a379416fbb10247564de242f6986de9d749e50332df615d46fb8818b78aaf437dbf62065d9a20
data/Changes CHANGED
@@ -1,3 +1,7 @@
1
+ 0.8.6 2015-01-26T14:53:06Z
2
+
3
+ - add some chunked transfer test. refactor around sending chunk
4
+
1
5
  0.8.5 2015-01-26T02:23:08Z
2
6
 
3
7
  - fix bug. send 0byte mark when using a non raw Array body
@@ -637,7 +637,7 @@ static
637
637
  VALUE rhe_write_timeout(VALUE self, VALUE fileno, VALUE buf, VALUE len, VALUE offset, VALUE timeout) {
638
638
  char* d;
639
639
  ssize_t rv;
640
-
640
+ buf = rb_String(buf);
641
641
  d = RSTRING_PTR(buf);
642
642
  rv = _write_timeout(NUM2INT(fileno), NUM2DBL(timeout), &d[NUM2LONG(offset)], NUM2LONG(len));
643
643
  if ( rv < 0 ) {
@@ -654,6 +654,7 @@ VALUE rhe_write_all(VALUE self, VALUE fileno, VALUE buf, VALUE offsetv, VALUE ti
654
654
  ssize_t rv = 0;
655
655
  ssize_t written = 0;
656
656
 
657
+ buf = rb_String(buf);
657
658
  d = RSTRING_PTR(buf);
658
659
  buf_len = RSTRING_LEN(buf);
659
660
 
@@ -671,6 +672,61 @@ VALUE rhe_write_all(VALUE self, VALUE fileno, VALUE buf, VALUE offsetv, VALUE ti
671
672
  return rb_int_new(written);
672
673
  }
673
674
 
675
+ static
676
+ VALUE rhe_write_chunk(VALUE self, VALUE fileno, VALUE buf, VALUE offsetv, VALUE timeout) {
677
+ ssize_t buf_len;
678
+ ssize_t rv = 0;
679
+ ssize_t written = 0;
680
+ ssize_t vec_offset = 0;
681
+ int count =0;
682
+ ssize_t iovcnt = 3;
683
+ char chunked_header_buf[18];
684
+
685
+ buf = rb_String(buf);
686
+ buf_len = RSTRING_LEN(buf);
687
+
688
+ if ( buf_len == 0 ){
689
+ return rb_int_new(0);
690
+ }
691
+
692
+ {
693
+ struct iovec v[iovcnt]; // Needs C99 compiler
694
+ v[0].iov_len = _chunked_header(chunked_header_buf,buf_len);
695
+ v[0].iov_base = chunked_header_buf;
696
+ v[1].iov_len = buf_len;
697
+ v[1].iov_base = RSTRING_PTR(buf);
698
+ v[2].iov_base = "\r\n";
699
+ v[2].iov_len = sizeof("\r\n") -1;
700
+
701
+ vec_offset = 0;
702
+ written = 0;
703
+ while ( iovcnt - vec_offset > 0 ) {
704
+ count = (iovcnt > IOV_MAX) ? IOV_MAX : iovcnt;
705
+ rv = _writev_timeout(NUM2INT(fileno), NUM2DBL(timeout), &v[vec_offset], count - vec_offset, (vec_offset == 0) ? 0 : 1);
706
+ if ( rv <= 0 ) {
707
+ // error or disconnected
708
+ break;
709
+ }
710
+ written += rv;
711
+ while ( rv > 0 ) {
712
+ if ( (unsigned int)rv >= v[vec_offset].iov_len ) {
713
+ rv -= v[vec_offset].iov_len;
714
+ vec_offset++;
715
+ }
716
+ else {
717
+ v[vec_offset].iov_base = (char*)v[vec_offset].iov_base + rv;
718
+ v[vec_offset].iov_len -= rv;
719
+ rv = 0;
720
+ }
721
+ }
722
+ }
723
+ }
724
+ if ( rv < 0 ) {
725
+ return Qnil;
726
+ }
727
+ return rb_int_new(written);
728
+ }
729
+
674
730
  static
675
731
  int header_to_array(VALUE key_obj, VALUE val_obj, VALUE ary) {
676
732
  ssize_t val_len;
@@ -963,6 +1019,7 @@ void Init_rhebok()
963
1019
  rb_define_module_function(cRhebok, "read_timeout", rhe_read_timeout, 5);
964
1020
  rb_define_module_function(cRhebok, "write_timeout", rhe_write_timeout, 5);
965
1021
  rb_define_module_function(cRhebok, "write_all", rhe_write_all, 4);
1022
+ rb_define_module_function(cRhebok, "write_chunk", rhe_write_chunk, 4);
966
1023
  rb_define_module_function(cRhebok, "close_rack", rhe_close, 1);
967
1024
  rb_define_module_function(cRhebok, "write_response", rhe_write_response, 7);
968
1025
  }
@@ -307,7 +307,7 @@ module Rack
307
307
  body.each do |part|
308
308
  ret = nil
309
309
  if use_chunked == 1
310
- ret = ::Rhebok.write_all(connection, part.bytesize.to_s(16) + "\015\012" + part + "\015\012", 0, @options[:Timeout])
310
+ ret = ::Rhebok.write_chunk(connection, part, 0, @options[:Timeout])
311
311
  else
312
312
  ret = ::Rhebok.write_all(connection, part, 0, @options[:Timeout])
313
313
  end
@@ -1,3 +1,3 @@
1
1
  class Rhebok
2
- VERSION = "0.8.5"
2
+ VERSION = "0.8.6"
3
3
  end
@@ -4,27 +4,32 @@ require 'timeout'
4
4
  require 'socket'
5
5
  require 'rack/handler/rhebok'
6
6
 
7
+ class ZeroStreamBody
8
+ def self.each
9
+ yield "Content"
10
+ yield ""
11
+ yield "Again"
12
+ yield nil
13
+ yield 0
14
+ end
15
+ end
16
+
17
+ class VacantStreamBody
18
+ def self.each
19
+ end
20
+ end
21
+
22
+
7
23
  describe Rhebok do
8
24
  extend TestRequest::Helpers
9
- begin
10
-
11
- @host = '127.0.0.1'
12
- @port = 9202
13
- #@app = Rack::Lint.new(TestRequest.new) Lint requires Content-Length or Transfer-Eoncoding
14
- @app = TestRequest.new
15
- @pid = fork
16
- if @pid == nil
17
- #child
18
- Rack::Handler::Rhebok.run(@app, :Host=>'127.0.0.1', :Port=>9202, :MaxWorkers=>1,
19
- :BeforeFork => proc { ENV["TEST_FOO"] = "FOO" },
20
- :AfterFork => proc { ENV["TEST_BAR"] = "BAR" },
21
- )
22
- exit!(true)
23
- end
24
25
 
26
+ @host = '127.0.0.1'
27
+ @port = 9202
28
+
29
+ test_rhebok(TestRequest.new, proc {
25
30
  command = 'curl --stderr - -sv -X POST -T "'+File.expand_path('../testrequest.rb', __FILE__)+'" -H "Content-type: text/plain" --header "Transfer-Encoding: chunked" http://127.0.0.1:9202/remove_length'
26
- curl_command(command)
27
- should "with curl" do
31
+ curl_yaml(command)
32
+ should "chunked with curl" do
28
33
  @request["Transfer-Encoding"].should.equal "chunked"
29
34
  @request["Expect"].should.equal "100-continue"
30
35
  @response.key?("Transfer-Encoding").should.equal false
@@ -35,12 +40,77 @@ describe Rhebok do
35
40
  @header.key?("HTTP/1.1 100 Continue").should.equal true
36
41
  end
37
42
 
38
- ensure
39
- sleep 1
40
- if @pid != nil
41
- Process.kill(:TERM, @pid)
42
- Process.wait()
43
+ command = 'curl --stderr - --http1.0 -sv -X POST -T "'+File.expand_path('../testrequest.rb', __FILE__)+'" -H "Content-type: text/plain" --header "Transfer-Encoding: chunked" http://127.0.0.1:9202/remove_length'
44
+ curl_yaml(command)
45
+ should "chunked with curl http1.0" do
46
+ @response.key?("Transfer-Encoding").should.equal false
47
+ @request.key?("Expect").should.equal false
48
+ @response["CONTENT_LENGTH"].should.equal File.stat(File.expand_path('../testrequest.rb', __FILE__)).size.to_s
49
+ @response["test.postdata"].bytesize.should.equal File.stat(File.expand_path('../testrequest.rb', __FILE__)).size
50
+ @header.key?("Transfer-Encoding").should.equal false
51
+ @header["Connection"].should.equal "close"
52
+ @header.key?("HTTP/1.1 100 Continue").should.equal false
53
+ end
54
+ })
55
+
56
+ test_rhebok( proc {
57
+ [200,{"Content-Type"=>"text/plain"},["Content","","Again",nil,0]]
58
+ }, proc {
59
+ command = 'curl --stderr - -sv http://127.0.0.1:9202/'
60
+ curl_request(command)
61
+ should "zero length with curl" do
62
+ @body.should.equal "ContentAgain0"
43
63
  end
44
- end
64
+ command = 'curl --stderr - -sv --http1.0 http://127.0.0.1:9202/'
65
+ curl_request(command)
66
+ should "zero length with curl http/1.0" do
67
+ @body.should.equal "ContentAgain0"
68
+ end
69
+ })
70
+
71
+ test_rhebok( proc {
72
+ [200,{"Content-Type"=>"text/plain"},[]]
73
+ }, proc {
74
+ command = 'curl --stderr - -sv http://127.0.0.1:9202/'
75
+ curl_request(command)
76
+ should "vacant res with curl" do
77
+ @body.should.equal ""
78
+ end
79
+ command = 'curl --stderr - -sv --http1.0 http://127.0.0.1:9202/'
80
+ curl_request(command)
81
+ should "vacant rew with curl http/1.0" do
82
+ @body.should.equal ""
83
+ end
84
+ })
85
+
86
+ test_rhebok( proc {
87
+ [200,{"Content-Type"=>"text/plain"},ZeroStreamBody]
88
+ }, proc {
89
+ command = 'curl --stderr - -sv http://127.0.0.1:9202/'
90
+ curl_request(command)
91
+ should "zerostream length with curl" do
92
+ @body.should.equal "ContentAgain0"
93
+ end
94
+ command = 'curl --stderr - -sv --http1.0 http://127.0.0.1:9202/'
95
+ curl_request(command)
96
+ should "zerostream length with curl http/1.0" do
97
+ @body.should.equal "ContentAgain0"
98
+ end
99
+ })
100
+
101
+ test_rhebok( proc {
102
+ [200,{"Content-Type"=>"text/plain"},VacantStreamBody]
103
+ }, proc {
104
+ command = 'curl --stderr - -sv http://127.0.0.1:9202/'
105
+ curl_request(command)
106
+ should "vacantstream length with curl" do
107
+ @body.should.equal ""
108
+ end
109
+ command = 'curl --stderr - -sv --http1.0 http://127.0.0.1:9202/'
110
+ curl_request(command)
111
+ should "vacantstream length with curl http/1.0" do
112
+ @body.should.equal ""
113
+ end
114
+ })
45
115
 
46
116
  end
@@ -78,7 +78,26 @@ class TestRequest
78
78
  }
79
79
  end
80
80
 
81
- def curl_command(command)
81
+ def test_rhebok(app,cb)
82
+ begin
83
+ @pid = fork
84
+ if @pid == nil
85
+ # child
86
+ Rack::Handler::Rhebok.run(app, :Host=>@host, :Port=>@port, :MaxWorkers=>1)
87
+ exit!(true)
88
+ end
89
+ cb.call
90
+ ensure
91
+ sleep 1
92
+ if @pid != nil
93
+ Process.kill(:TERM, @pid)
94
+ Process.wait()
95
+ end
96
+ end
97
+ end
98
+
99
+
100
+ def curl_request(command)
82
101
  body = ""
83
102
  header = {}
84
103
  request = {}
@@ -104,9 +123,15 @@ class TestRequest
104
123
  end
105
124
  }
106
125
  @request = request
107
- @response = YAML.load(body)
126
+ @body = body
108
127
  @header = header
109
128
  end
129
+
130
+ def curl_yaml(command)
131
+ curl_request(command)
132
+ @response = YAML.load(@body)
133
+ end
134
+
110
135
  end
111
136
  end
112
137
 
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.8.5
4
+ version: 0.8.6
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-01-25 00:00:00.000000000 Z
11
+ date: 2015-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler