rhebok 0.9.0 → 0.9.1

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: 7b58143758b183d03af523fa633a56783e030abd
4
- data.tar.gz: 6a44fcfad56efa0fbdf28a595f552bec9dda9842
3
+ metadata.gz: fd12b50300a5e3b8b0c520c1780e4c4739914624
4
+ data.tar.gz: 3ed92d6cb499a00830b9b26e2ce97ec401c85252
5
5
  SHA512:
6
- metadata.gz: ec40342c239b048255213965936191a83b9d4c41a6883783ac49ac9c544d0de677917315651441ce1b3abaaa7ca0d04f37f5642292a12a3311748baa213b09b3
7
- data.tar.gz: 5855c448e72d86aa99fc13eff0a25cf8e3fc70502ce27d44457134715f4d67e3b6be27ca87b356200ef199070fafe3b29f45b82c15ce59e0cfb0df9a1feab654
6
+ metadata.gz: aacc1363c0c7d17800c0789c144cf688d492043f190bb3d2674f48ea8233382e024775d8e7e9777c34acebe70e4c8faa6f4a29b55abf729ad032605dc4d49654
7
+ data.tar.gz: de67014ec7944a6b575ac8fc6a7a9a9120d519b8d53a7ac524d751e2a0f7bd8e41b37da261c98182444f81d0cd6e709372b13e94eecac979aa4375509022e81d
@@ -2,8 +2,9 @@ language: ruby
2
2
  install:
3
3
  - git submodule update --init --recursive
4
4
  - gem install bacon
5
+ - gem install bundler
5
6
  - bundle install --jobs=3 --retry=3
6
7
  rvm:
7
8
  - 2.0.0
8
9
  - 2.1.5
9
- - 2.2.0
10
+ - 2.2.3
data/Changes CHANGED
@@ -1,3 +1,7 @@
1
+ 0.9.1 2015-12-07T10:37:51
2
+
3
+ - disable chunked transfer by default
4
+
1
5
  0.9.0 2015-11-13T23:44:13
2
6
 
3
7
  - safe graceful shutdown
data/README.md CHANGED
@@ -114,6 +114,10 @@ Max number of request before invoking GC (defualt: 5)
114
114
 
115
115
  If set, randomizes the number of request before invoking GC between the number of MaxGCPerRequest (defualt: none)
116
116
 
117
+ ### Chunked_Transfer
118
+
119
+ If set, use chunked transfer for response (default: false)
120
+
117
121
  ### SpawnInterval
118
122
 
119
123
  if set, worker processes will not be spawned more than once than every given seconds. Also, when SIGUSR1 is being received, no more than one worker processes will be collected every given seconds. This feature is useful for doing a "slow-restart". See http://blog.kazuhooku.com/2011/04/web-serverstarter-parallelprefork.html for more information. (default: none)
@@ -165,6 +169,8 @@ Supported options in config file are below.
165
169
 
166
170
  ### min_gc_per_request
167
171
 
172
+ ### chunked_transfer
173
+
168
174
  ### spawn_interval
169
175
 
170
176
  ### before_fork
@@ -241,7 +241,8 @@ VALUE find_common_header(const struct phr_header* header) {
241
241
 
242
242
  static
243
243
  int store_path_info(VALUE env, const char* src, size_t src_len) {
244
- size_t dlen = 0, i = 0;
244
+ int dlen = 0;
245
+ size_t i = 0;
245
246
  char *d;
246
247
  char s2, s3;
247
248
  d = ALLOC_N(char, src_len * 3 + 1);
@@ -294,13 +295,23 @@ int _accept(int fileno, struct sockaddr *addr, unsigned int addrlen) {
294
295
  }
295
296
 
296
297
  static
297
- ssize_t _writev_timeout(const int fileno, const double timeout, struct iovec *iovec, const int iovcnt, const int do_select ) {
298
- int rv;
298
+ ssize_t _writev_timeout(const int fileno, const double timeout, struct iovec *iovec, const long iovcnt, const int do_select ) {
299
+ ssize_t rv;
299
300
  int nfound;
301
+ int iovcnt_len;
300
302
  struct pollfd wfds[1];
303
+ if ( iovcnt < 0 ){
304
+ return -1;
305
+ }
306
+ if ( iovcnt > UINT_MAX ) {
307
+ iovcnt_len = UINT_MAX;
308
+ }
309
+ else {
310
+ iovcnt_len = (int)iovcnt;
311
+ }
301
312
  if ( do_select == 1) goto WAIT_WRITE;
302
313
  DO_WRITE:
303
- rv = writev(fileno, iovec, iovcnt);
314
+ rv = writev(fileno, iovec, iovcnt_len);
304
315
  if ( rv >= 0 ) {
305
316
  return rv;
306
317
  }
@@ -323,8 +334,8 @@ ssize_t _writev_timeout(const int fileno, const double timeout, struct iovec *io
323
334
  }
324
335
 
325
336
  static
326
- ssize_t _read_timeout(const int fileno, const double timeout, char * read_buf, const int read_len ) {
327
- int rv;
337
+ ssize_t _read_timeout(const int fileno, const double timeout, char * read_buf, const ssize_t read_len ) {
338
+ ssize_t rv;
328
339
  int nfound;
329
340
  struct pollfd rfds[1];
330
341
  DO_READ:
@@ -350,12 +361,23 @@ ssize_t _read_timeout(const int fileno, const double timeout, char * read_buf, c
350
361
  }
351
362
 
352
363
  static
353
- ssize_t _write_timeout(const int fileno, const double timeout, char * write_buf, const int write_len ) {
354
- int rv;
364
+ ssize_t _write_timeout(const int fileno, const double timeout, char * write_buf, const long write_len ) {
365
+ ssize_t rv;
355
366
  int nfound;
356
367
  struct pollfd wfds[1];
368
+ size_t write_buf_len;
369
+ if ( write_len < 0 ) {
370
+ return -1;
371
+ }
372
+ if ( write_len > UINT_MAX ) {
373
+ write_buf_len = UINT_MAX;
374
+ }
375
+ else {
376
+ write_buf_len = (unsigned int)write_len;
377
+ }
378
+
357
379
  DO_WRITE:
358
- rv = write(fileno, write_buf, write_len);
380
+ rv = write(fileno, write_buf, write_buf_len);
359
381
  if ( rv >= 0 ) {
360
382
  return rv;
361
383
  }
@@ -377,8 +399,8 @@ ssize_t _write_timeout(const int fileno, const double timeout, char * write_buf,
377
399
  }
378
400
 
379
401
  static
380
- void str_s(char * dst, int *dst_len, const char * src, int src_len) {
381
- int i;
402
+ void str_s(char * dst, int *dst_len, const char * src, const unsigned long src_len) {
403
+ unsigned long i;
382
404
  int dlen = *dst_len;
383
405
  for ( i=0; i<src_len; i++) {
384
406
  dst[dlen++] = src[i];
@@ -691,8 +713,8 @@ VALUE rhe_write_chunk(VALUE self, VALUE fileno, VALUE buf, VALUE offsetv, VALUE
691
713
  ssize_t rv = 0;
692
714
  ssize_t written = 0;
693
715
  ssize_t vec_offset = 0;
694
- int count =0;
695
- int remain;
716
+ ssize_t count =0;
717
+ ssize_t remain;
696
718
  ssize_t iovcnt = 3;
697
719
  char chunked_header_buf[18];
698
720
 
@@ -788,9 +810,9 @@ VALUE rhe_write_response(VALUE self, VALUE filenov, VALUE timeoutv, VALUE status
788
810
  ssize_t iovcnt;
789
811
  ssize_t vec_offset;
790
812
  ssize_t written;
791
- int count;
813
+ ssize_t count;
792
814
  int i;
793
- int remain;
815
+ ssize_t remain;
794
816
  char status_line[512];
795
817
  char date_line[512];
796
818
  char server_line[1032];
@@ -819,7 +841,7 @@ VALUE rhe_write_response(VALUE self, VALUE filenov, VALUE timeoutv, VALUE status
819
841
  use_chunked = 0;
820
842
  }
821
843
 
822
- harr = rb_ary_new();
844
+ harr = rb_ary_new2(RHASH_SIZE(headers) * 2);
823
845
  RB_GC_GUARD(harr);
824
846
  rb_hash_foreach(headers, header_to_array, harr);
825
847
  hlen = RARRAY_LEN(harr);
@@ -41,6 +41,7 @@ module Rack
41
41
  :BeforeFork => nil,
42
42
  :AfterFork => nil,
43
43
  :ReusePort => false,
44
+ :ChunkedTransfer => false,
44
45
  }
45
46
  NULLIO = StringIO.new("").set_encoding('BINARY')
46
47
 
@@ -64,6 +65,9 @@ module Rack
64
65
  if options[:ReusePort].instance_of?(String)
65
66
  options[:ReusePort] = options[:ReusePort].match(/^(true|yes|1)$/i) ? true : false
66
67
  end
68
+ if options[:ChunkedTransfer].instance_of?(String)
69
+ options[:ChunkedTransfer] = options[:ChunkedTransfer].match(/^(true|yes|1)$/i) ? true : false
70
+ end
67
71
 
68
72
  @options = DEFAULT_OPTIONS.merge(options)
69
73
  if @options[:ConfigFile] != nil
@@ -293,9 +297,12 @@ module Rack
293
297
 
294
298
  status_code, headers, body = app.call(env)
295
299
 
296
- use_chunked = env["SERVER_PROTOCOL"] != "HTTP/1.1" ||
297
- headers.key?("Transfer-Encoding") ||
298
- headers.key?("Content-Length") ? 0 : 1
300
+ use_chunked = 0
301
+ if @options[:ChunkedTransfer]
302
+ use_chunked = env["SERVER_PROTOCOL"] != "HTTP/1.1" ||
303
+ headers.key?("Transfer-Encoding") ||
304
+ headers.key?("Content-Length") ? 0 : 1
305
+ end
299
306
 
300
307
  if body.instance_of?(Array)
301
308
  ::Rhebok.write_response(connection, @options[:Timeout], status_code.to_i, headers, body, use_chunked, 0)
@@ -68,6 +68,10 @@ class Rhebok
68
68
  @config[:ReusePort] = block
69
69
  end
70
70
 
71
+ def chunked_transfer(&block)
72
+ @config[:ChunkedTransfer] = block
73
+ end
74
+
71
75
  def retrieve
72
76
  @config
73
77
  end
@@ -1,3 +1,3 @@
1
1
  class Rhebok
2
- VERSION = "0.9.0"
2
+ VERSION = "0.9.1"
3
3
  end
@@ -51,7 +51,7 @@ describe Rhebok do
51
51
  @header["Connection"].should.equal "close"
52
52
  @header.key?("HTTP/1.1 100 Continue").should.equal false
53
53
  end
54
- })
54
+ },1)
55
55
 
56
56
  test_rhebok( proc {
57
57
  [200,{"Content-Type"=>"text/plain"},["Content","","Again",nil,0]]
@@ -66,7 +66,7 @@ describe Rhebok do
66
66
  should "zero length with curl http/1.0" do
67
67
  @body.should.equal "ContentAgain0"
68
68
  end
69
- })
69
+ },1)
70
70
 
71
71
  test_rhebok( proc {
72
72
  [200,{"Content-Type"=>"text/plain"},[]]
@@ -81,7 +81,7 @@ describe Rhebok do
81
81
  should "vacant rew with curl http/1.0" do
82
82
  @body.should.equal ""
83
83
  end
84
- })
84
+ },1)
85
85
 
86
86
  test_rhebok( proc {
87
87
  [200,{"Content-Type"=>"text/plain"},ZeroStreamBody]
@@ -96,7 +96,7 @@ describe Rhebok do
96
96
  should "zerostream length with curl http/1.0" do
97
97
  @body.should.equal "ContentAgain0"
98
98
  end
99
- })
99
+ },1)
100
100
 
101
101
  test_rhebok( proc {
102
102
  [200,{"Content-Type"=>"text/plain"},VacantStreamBody]
@@ -111,6 +111,6 @@ describe Rhebok do
111
111
  should "vacantstream length with curl http/1.0" do
112
112
  @body.should.equal ""
113
113
  end
114
- })
114
+ },1)
115
115
 
116
116
  end
@@ -78,12 +78,12 @@ class TestRequest
78
78
  }
79
79
  end
80
80
 
81
- def test_rhebok(app,cb)
81
+ def test_rhebok(app,cb,chunked=0)
82
82
  begin
83
83
  @pid = fork
84
84
  if @pid == nil
85
85
  # child
86
- Rack::Handler::Rhebok.run(app, :Host=>@host, :Port=>@port, :MaxWorkers=>1)
86
+ Rack::Handler::Rhebok.run(app, :Host=>@host, :Port=>@port, :MaxWorkers=>1, :ChunkedTransfer=>chunked)
87
87
  exit!(true)
88
88
  end
89
89
  cb.call
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.9.0
4
+ version: 0.9.1
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-11-13 00:00:00.000000000 Z
11
+ date: 2015-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler