unicorn-camilo 4.8.2.5.19 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.document +0 -1
  3. data/.gitignore +2 -2
  4. data/{.wrongdoc.yml → .olddoc.yml} +7 -2
  5. data/Documentation/unicorn.1.txt +9 -2
  6. data/Documentation/unicorn_rails.1.txt +2 -2
  7. data/FAQ +9 -1
  8. data/GIT-VERSION-GEN +1 -1
  9. data/GNUmakefile +31 -46
  10. data/HACKING +13 -27
  11. data/ISSUES +80 -16
  12. data/KNOWN_ISSUES +10 -10
  13. data/Links +10 -7
  14. data/PHILOSOPHY +1 -1
  15. data/README +8 -13
  16. data/Rakefile +0 -44
  17. data/Sandbox +1 -1
  18. data/TUNING +6 -3
  19. data/archive/.gitignore +3 -0
  20. data/archive/slrnpull.conf +4 -0
  21. data/bin/unicorn +1 -1
  22. data/bin/unicorn_rails +1 -1
  23. data/examples/unicorn.conf.rb +11 -0
  24. data/ext/unicorn_http/httpdate.c +1 -1
  25. data/ext/unicorn_http/unicorn_http.rl +48 -150
  26. data/lib/unicorn.rb +9 -15
  27. data/lib/unicorn/configurator.rb +3 -20
  28. data/lib/unicorn/const.rb +2 -25
  29. data/lib/unicorn/http_request.rb +4 -1
  30. data/lib/unicorn/http_response.rb +1 -3
  31. data/lib/unicorn/http_server.rb +85 -86
  32. data/lib/unicorn/socket_helper.rb +33 -67
  33. data/lib/unicorn/tee_input.rb +8 -1
  34. data/lib/unicorn/tmpio.rb +2 -4
  35. data/lib/unicorn/util.rb +1 -0
  36. data/lib/unicorn/worker.rb +1 -13
  37. data/t/GNUmakefile +1 -5
  38. data/t/README +1 -1
  39. data/t/t0002-parser-error.sh +3 -3
  40. data/test/exec/test_exec.rb +1 -1
  41. data/test/test_helper.rb +2 -2
  42. data/test/unit/test_http_parser.rb +3 -3
  43. data/test/unit/test_http_parser_ng.rb +8 -117
  44. data/test/unit/test_request.rb +1 -1
  45. data/test/unit/test_response.rb +3 -9
  46. data/test/unit/test_server.rb +3 -3
  47. data/test/unit/test_signals.rb +1 -1
  48. data/test/unit/test_socket_helper.rb +5 -5
  49. data/test/unit/test_tee_input.rb +10 -0
  50. data/test/unit/test_upload.rb +1 -1
  51. data/test/unit/test_util.rb +1 -1
  52. data/unicorn.gemspec +7 -10
  53. metadata +15 -33
  54. data/examples/git.ru +0 -13
  55. data/lib/unicorn/app/exec_cgi.rb +0 -154
  56. data/lib/unicorn/app/inetd.rb +0 -109
  57. data/lib/unicorn/ssl_client.rb +0 -11
  58. data/lib/unicorn/ssl_configurator.rb +0 -104
  59. data/lib/unicorn/ssl_server.rb +0 -42
  60. data/local.mk.sample +0 -59
  61. data/script/isolate_for_tests +0 -31
  62. data/t/t0016-trust-x-forwarded-false.sh +0 -30
  63. data/t/t0017-trust-x-forwarded-true.sh +0 -30
  64. data/test/unit/test_http_parser_xftrust.rb +0 -38
  65. data/test/unit/test_sni_hostnames.rb +0 -47
@@ -4,12 +4,6 @@ require 'socket'
4
4
 
5
5
  module Unicorn
6
6
  module SocketHelper
7
- # :stopdoc:
8
- include Socket::Constants
9
-
10
- # prevents IO objects in here from being GC-ed
11
- # kill this when we drop 1.8 support
12
- IO_PURGATORY = []
13
7
 
14
8
  # internal interface, only used by Rainbows!/Zbatery
15
9
  DEFAULTS = {
@@ -22,7 +16,7 @@ module Unicorn
22
16
  :tcp_defer_accept => 1,
23
17
 
24
18
  # FreeBSD, we need to override this to 'dataready' if we
25
- # eventually get HTTPS support
19
+ # eventually support non-HTTP/1.x
26
20
  :accept_filter => 'httpready',
27
21
 
28
22
  # same default value as Mongrel
@@ -32,76 +26,47 @@ module Unicorn
32
26
  :tcp_nopush => nil,
33
27
  :tcp_nodelay => true,
34
28
  }
35
- #:startdoc:
36
29
 
37
30
  # configure platform-specific options (only tested on Linux 2.6 so far)
38
- case RUBY_PLATFORM
39
- when /linux/
40
- # from /usr/include/linux/tcp.h
41
- TCP_DEFER_ACCEPT = 9 unless defined?(TCP_DEFER_ACCEPT)
42
-
43
- # do not send out partial frames (Linux)
44
- TCP_CORK = 3 unless defined?(TCP_CORK)
45
-
46
- # Linux got SO_REUSEPORT in 3.9, BSDs have had it for ages
47
- unless defined?(SO_REUSEPORT)
48
- if RUBY_PLATFORM =~ /(?:alpha|mips|parisc|sparc)/
49
- SO_REUSEPORT = 0x0200 # untested
50
- else
51
- SO_REUSEPORT = 15 # only tested on x86_64 and i686
52
- end
53
- end
54
- when /freebsd/
55
- # do not send out partial frames (FreeBSD)
56
- TCP_NOPUSH = 4 unless defined?(TCP_NOPUSH)
57
-
58
- def accf_arg(af_name)
59
- [ af_name, nil ].pack('a16a240')
60
- end if defined?(SO_ACCEPTFILTER)
61
- end
62
-
63
- def prevent_autoclose(io)
64
- if io.respond_to?(:autoclose=)
65
- io.autoclose = false
66
- else
67
- IO_PURGATORY << io
68
- end
69
- end
31
+ def accf_arg(af_name)
32
+ [ af_name, nil ].pack('a16a240')
33
+ end if RUBY_PLATFORM =~ /freebsd/ && Socket.const_defined?(:SO_ACCEPTFILTER)
70
34
 
71
35
  def set_tcp_sockopt(sock, opt)
72
36
  # just in case, even LANs can break sometimes. Linux sysadmins
73
37
  # can lower net.ipv4.tcp_keepalive_* sysctl knobs to very low values.
74
- sock.setsockopt(SOL_SOCKET, SO_KEEPALIVE, 1) if defined?(SO_KEEPALIVE)
38
+ Socket.const_defined?(:SO_KEEPALIVE) and
39
+ sock.setsockopt(:SOL_SOCKET, :SO_KEEPALIVE, 1)
75
40
 
76
- if defined?(TCP_NODELAY)
41
+ if Socket.const_defined?(:TCP_NODELAY)
77
42
  val = opt[:tcp_nodelay]
78
- val = DEFAULTS[:tcp_nodelay] if nil == val
79
- sock.setsockopt(IPPROTO_TCP, TCP_NODELAY, val ? 1 : 0)
43
+ val = DEFAULTS[:tcp_nodelay] if val.nil?
44
+ sock.setsockopt(:IPPROTO_TCP, :TCP_NODELAY, val ? 1 : 0)
80
45
  end
81
46
 
82
47
  val = opt[:tcp_nopush]
83
48
  unless val.nil?
84
- if defined?(TCP_CORK) # Linux
85
- sock.setsockopt(IPPROTO_TCP, TCP_CORK, val)
86
- elsif defined?(TCP_NOPUSH) # TCP_NOPUSH is lightly tested (FreeBSD)
87
- sock.setsockopt(IPPROTO_TCP, TCP_NOPUSH, val)
49
+ if Socket.const_defined?(:TCP_CORK) # Linux
50
+ sock.setsockopt(:IPPROTO_TCP, :TCP_CORK, val)
51
+ elsif Socket.const_defined?(:TCP_NOPUSH) # FreeBSD
52
+ sock.setsockopt(:IPPROTO_TCP, :TCP_NOPUSH, val)
88
53
  end
89
54
  end
90
55
 
91
- # No good reason to ever have deferred accepts off
92
- # (except maybe benchmarking)
93
- if defined?(TCP_DEFER_ACCEPT)
56
+ # No good reason to ever have deferred accepts off in single-threaded
57
+ # servers (except maybe benchmarking)
58
+ if Socket.const_defined?(:TCP_DEFER_ACCEPT)
94
59
  # this differs from nginx, since nginx doesn't allow us to
95
60
  # configure the the timeout...
96
61
  seconds = opt[:tcp_defer_accept]
97
62
  seconds = DEFAULTS[:tcp_defer_accept] if [true,nil].include?(seconds)
98
63
  seconds = 0 unless seconds # nil/false means disable this
99
- sock.setsockopt(SOL_TCP, TCP_DEFER_ACCEPT, seconds)
64
+ sock.setsockopt(:IPPROTO_TCP, :TCP_DEFER_ACCEPT, seconds)
100
65
  elsif respond_to?(:accf_arg)
101
66
  name = opt[:accept_filter]
102
- name = DEFAULTS[:accept_filter] if nil == name
67
+ name = DEFAULTS[:accept_filter] if name.nil?
103
68
  begin
104
- sock.setsockopt(SOL_SOCKET, SO_ACCEPTFILTER, accf_arg(name))
69
+ sock.setsockopt(:SOL_SOCKET, :SO_ACCEPTFILTER, accf_arg(name))
105
70
  rescue => e
106
71
  logger.error("#{sock_name(sock)} " \
107
72
  "failed to set accept_filter=#{name} (#{e.inspect})")
@@ -114,10 +79,11 @@ module Unicorn
114
79
 
115
80
  TCPSocket === sock and set_tcp_sockopt(sock, opt)
116
81
 
117
- if opt[:rcvbuf] || opt[:sndbuf]
82
+ rcvbuf, sndbuf = opt.values_at(:rcvbuf, :sndbuf)
83
+ if rcvbuf || sndbuf
118
84
  log_buffer_sizes(sock, "before: ")
119
- sock.setsockopt(SOL_SOCKET, SO_RCVBUF, opt[:rcvbuf]) if opt[:rcvbuf]
120
- sock.setsockopt(SOL_SOCKET, SO_SNDBUF, opt[:sndbuf]) if opt[:sndbuf]
85
+ sock.setsockopt(:SOL_SOCKET, :SO_RCVBUF, rcvbuf) if rcvbuf
86
+ sock.setsockopt(:SOL_SOCKET, :SO_SNDBUF, sndbuf) if sndbuf
121
87
  log_buffer_sizes(sock, " after: ")
122
88
  end
123
89
  sock.listen(opt[:backlog])
@@ -126,8 +92,8 @@ module Unicorn
126
92
  end
127
93
 
128
94
  def log_buffer_sizes(sock, pfx = '')
129
- rcvbuf = sock.getsockopt(SOL_SOCKET, SO_RCVBUF).unpack('i')
130
- sndbuf = sock.getsockopt(SOL_SOCKET, SO_SNDBUF).unpack('i')
95
+ rcvbuf = sock.getsockopt(:SOL_SOCKET, :SO_RCVBUF).int
96
+ sndbuf = sock.getsockopt(:SOL_SOCKET, :SO_SNDBUF).int
131
97
  logger.info "#{pfx}#{sock_name(sock)} rcvbuf=#{rcvbuf} sndbuf=#{sndbuf}"
132
98
  end
133
99
 
@@ -172,25 +138,25 @@ module Unicorn
172
138
 
173
139
  def new_tcp_server(addr, port, opt)
174
140
  # n.b. we set FD_CLOEXEC in the workers
175
- sock = Socket.new(opt[:ipv6] ? AF_INET6 : AF_INET, SOCK_STREAM, 0)
141
+ sock = Socket.new(opt[:ipv6] ? :AF_INET6 : :AF_INET, :SOCK_STREAM)
176
142
  if opt.key?(:ipv6only)
177
- defined?(IPV6_V6ONLY) or
143
+ Socket.const_defined?(:IPV6_V6ONLY) or
178
144
  abort "Socket::IPV6_V6ONLY not defined, upgrade Ruby and/or your OS"
179
- sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, opt[:ipv6only] ? 1 : 0)
145
+ sock.setsockopt(:IPPROTO_IPV6, :IPV6_V6ONLY, opt[:ipv6only] ? 1 : 0)
180
146
  end
181
- sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
182
- if defined?(SO_REUSEPORT) && opt[:reuseport]
183
- sock.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
147
+ sock.setsockopt(:SOL_SOCKET, :SO_REUSEADDR, 1)
148
+ if Socket.const_defined?(:SO_REUSEPORT) && opt[:reuseport]
149
+ sock.setsockopt(:SOL_SOCKET, :SO_REUSEPORT, 1)
184
150
  end
185
151
  sock.bind(Socket.pack_sockaddr_in(port, addr))
186
- prevent_autoclose(sock)
152
+ sock.autoclose = false
187
153
  Kgio::TCPServer.for_fd(sock.fileno)
188
154
  end
189
155
 
190
156
  # returns rfc2732-style (e.g. "[::1]:666") addresses for IPv6
191
157
  def tcp_name(sock)
192
158
  port, addr = Socket.unpack_sockaddr_in(sock.getsockname)
193
- /:/ =~ addr ? "[#{addr}]:#{port}" : "#{addr}:#{port}"
159
+ addr.include?(':') ? "[#{addr}]:#{port}" : "#{addr}:#{port}"
194
160
  end
195
161
  module_function :tcp_name
196
162
 
@@ -28,13 +28,20 @@ class Unicorn::TeeInput < Unicorn::StreamInput
28
28
  @@client_body_buffer_size
29
29
  end
30
30
 
31
+ # for Rack::TempfileReaper in rack 1.6+
32
+ def new_tmpio # :nodoc:
33
+ tmpio = Unicorn::TmpIO.new
34
+ (@parser.env['rack.tempfiles'] ||= []) << tmpio
35
+ tmpio
36
+ end
37
+
31
38
  # Initializes a new TeeInput object. You normally do not have to call
32
39
  # this unless you are writing an HTTP server.
33
40
  def initialize(socket, request)
34
41
  @len = request.content_length
35
42
  super
36
43
  @tmp = @len && @len <= @@client_body_buffer_size ?
37
- StringIO.new("") : Unicorn::TmpIO.new
44
+ StringIO.new("") : new_tmpio
38
45
  end
39
46
 
40
47
  # :call-seq:
data/lib/unicorn/tmpio.rb CHANGED
@@ -22,8 +22,6 @@ class Unicorn::TmpIO < File
22
22
  fp
23
23
  end
24
24
 
25
- # for easier env["rack.input"] compatibility with Rack <= 1.1
26
- def size
27
- stat.size
28
- end unless File.method_defined?(:size)
25
+ # pretend we're Tempfile for Rack::TempfileReaper
26
+ alias close! close
29
27
  end
data/lib/unicorn/util.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: binary -*-
2
2
 
3
+ require 'fcntl'
3
4
  module Unicorn::Util
4
5
 
5
6
  # :stopdoc:
@@ -11,7 +11,6 @@ require "raindrops"
11
11
  class Unicorn::Worker
12
12
  # :stopdoc:
13
13
  attr_accessor :nr, :switched
14
- attr_writer :tmp
15
14
  attr_reader :to_io # IO.select-compatible
16
15
 
17
16
  PER_DROP = Raindrops::PAGE_SIZE / Raindrops::SIZE
@@ -23,7 +22,7 @@ class Unicorn::Worker
23
22
  @offset = nr % PER_DROP
24
23
  @raindrop[@offset] = 0
25
24
  @nr = nr
26
- @tmp = @switched = false
25
+ @switched = false
27
26
  @to_io, @master = Unicorn.pipe
28
27
  end
29
28
 
@@ -101,18 +100,8 @@ class Unicorn::Worker
101
100
  @raindrop[@offset]
102
101
  end
103
102
 
104
- # only exists for compatibility
105
- def tmp # :nodoc:
106
- @tmp ||= begin
107
- tmp = Unicorn::TmpIO.new
108
- tmp.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
109
- tmp
110
- end
111
- end
112
-
113
103
  # called in both the master (reaping worker) and worker (SIGQUIT handler)
114
104
  def close # :nodoc:
115
- @tmp.close if @tmp
116
105
  @master.close if @master
117
106
  @to_io.close if @to_io
118
107
  end
@@ -141,7 +130,6 @@ class Unicorn::Worker
141
130
  uid = Etc.getpwnam(user).uid
142
131
  gid = Etc.getgrnam(group).gid if group
143
132
  Unicorn::Util.chown_logs(uid, gid)
144
- @tmp.chown(uid, gid) if @tmp
145
133
  if gid && Process.egid != gid
146
134
  Process.initgroups(user, gid)
147
135
  Process::GID.change_privilege(gid)
data/t/GNUmakefile CHANGED
@@ -17,11 +17,7 @@ endif
17
17
  RUBY_ENGINE := $(shell $(RUBY) -e 'puts((RUBY_ENGINE rescue "ruby"))')
18
18
  export RUBY_ENGINE
19
19
 
20
- isolate_libs := ../tmp/isolate/$(RUBY_ENGINE)-$(RUBY_VERSION).mk
21
- $(isolate_libs): ../script/isolate_for_tests
22
- @cd .. && $(RUBY) script/isolate_for_tests
23
- -include $(isolate_libs)
24
- MYLIBS := $(RUBYLIB):$(ISOLATE_LIBS)
20
+ MYLIBS := $(RUBYLIB)
25
21
 
26
22
  T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)
27
23
 
data/t/README CHANGED
@@ -10,7 +10,7 @@ comfortable writing integration tests with.
10
10
 
11
11
  == Requirements
12
12
 
13
- * {Ruby 1.8 or 1.9}[http://www.ruby-lang.org/] (duh!)
13
+ * {Ruby 1.9.3+}[https://www.ruby-lang.org/] (duh!)
14
14
  * {GNU make}[http://www.gnu.org/software/make/]
15
15
  * {socat}[http://www.dest-unreach.org/socat/]
16
16
  * {curl}[http://curl.haxx.se/]
@@ -42,7 +42,7 @@ t_begin "send a huge Request URI (REQUEST_PATH > (12 * 1024))" && {
42
42
  }
43
43
 
44
44
  t_begin "response should be a 414 (REQUEST_PATH)" && {
45
- grep -F 'HTTP/1.1 414 Request-URI Too Long' $tmp
45
+ grep -F 'HTTP/1.1 414 ' $tmp
46
46
  }
47
47
 
48
48
  t_begin "send a huge Request URI (QUERY_STRING > (10 * 1024))" && {
@@ -63,7 +63,7 @@ t_begin "send a huge Request URI (QUERY_STRING > (10 * 1024))" && {
63
63
  }
64
64
 
65
65
  t_begin "response should be a 414 (QUERY_STRING)" && {
66
- grep -F 'HTTP/1.1 414 Request-URI Too Long' $tmp
66
+ grep -F 'HTTP/1.1 414 ' $tmp
67
67
  }
68
68
 
69
69
  t_begin "send a huge Request URI (FRAGMENT > 1024)" && {
@@ -84,7 +84,7 @@ t_begin "send a huge Request URI (FRAGMENT > 1024)" && {
84
84
  }
85
85
 
86
86
  t_begin "response should be a 414 (FRAGMENT)" && {
87
- grep -F 'HTTP/1.1 414 Request-URI Too Long' $tmp
87
+ grep -F 'HTTP/1.1 414 ' $tmp
88
88
  }
89
89
 
90
90
  t_begin "server stderr should be clean" && check_stderr
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Copyright (c) 2009 Eric Wong
4
4
  FLOCK_PATH = File.expand_path(__FILE__)
5
- require 'test/test_helper'
5
+ require './test/test_helper'
6
6
 
7
7
  do_test = true
8
8
  $unicorn_bin = ENV['UNICORN_TEST_BIN'] || "unicorn"
data/test/test_helper.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  # -*- encoding: binary -*-
2
2
 
3
- # Copyright (c) 2005 Zed A. Shaw
3
+ # Copyright (c) 2005 Zed A. Shaw
4
4
  # You can redistribute it and/or modify it under the same terms as Ruby 1.8 or
5
5
  # the GPLv2+ (GPLv3+ preferred)
6
6
  #
7
- # Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
7
+ # Additional work donated by contributors. See git history
8
8
  # for more information.
9
9
 
10
10
  STDIN.sync = STDOUT.sync = STDERR.sync = true # buffering makes debugging hard
@@ -1,13 +1,13 @@
1
1
  # -*- encoding: binary -*-
2
2
 
3
- # Copyright (c) 2005 Zed A. Shaw
3
+ # Copyright (c) 2005 Zed A. Shaw
4
4
  # You can redistribute it and/or modify it under the same terms as Ruby 1.8 or
5
5
  # the GPLv2+ (GPLv3+ preferred)
6
6
  #
7
- # Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
7
+ # Additional work donated by contributors. See git history
8
8
  # for more information.
9
9
 
10
- require 'test/test_helper'
10
+ require './test/test_helper'
11
11
 
12
12
  include Unicorn
13
13
 
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: binary -*-
2
2
 
3
- require 'test/test_helper'
3
+ require './test/test_helper'
4
4
  require 'digest/md5'
5
5
 
6
6
  include Unicorn
@@ -8,10 +8,15 @@ include Unicorn
8
8
  class HttpParserNgTest < Test::Unit::TestCase
9
9
 
10
10
  def setup
11
- HttpParser.keepalive_requests = HttpParser::KEEPALIVE_REQUESTS_DEFAULT
12
11
  @parser = HttpParser.new
13
12
  end
14
13
 
14
+ def test_parser_max_len
15
+ assert_raises(RangeError) do
16
+ HttpParser.max_header_len = 0xffffffff + 1
17
+ end
18
+ end
19
+
15
20
  def test_next_clear
16
21
  r = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
17
22
  @parser.buf << r
@@ -29,25 +34,6 @@ class HttpParserNgTest < Test::Unit::TestCase
29
34
  assert_equal false, @parser.response_start_sent
30
35
  end
31
36
 
32
- def test_keepalive_requests_default_constant
33
- assert_kind_of Integer, HttpParser::KEEPALIVE_REQUESTS_DEFAULT
34
- assert HttpParser::KEEPALIVE_REQUESTS_DEFAULT >= 0
35
- end
36
-
37
- def test_keepalive_requests_setting
38
- HttpParser.keepalive_requests = 0
39
- assert_equal 0, HttpParser.keepalive_requests
40
- HttpParser.keepalive_requests = nil
41
- assert HttpParser.keepalive_requests >= 0xffffffff
42
- HttpParser.keepalive_requests = 1
43
- assert_equal 1, HttpParser.keepalive_requests
44
- HttpParser.keepalive_requests = 666
45
- assert_equal 666, HttpParser.keepalive_requests
46
-
47
- assert_raises(TypeError) { HttpParser.keepalive_requests = "666" }
48
- assert_raises(TypeError) { HttpParser.keepalive_requests = [] }
49
- end
50
-
51
37
  def test_connection_TE
52
38
  @parser.buf << "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: TE\r\n"
53
39
  @parser.buf << "TE: trailers\r\n\r\n"
@@ -71,41 +57,11 @@ class HttpParserNgTest < Test::Unit::TestCase
71
57
  "REQUEST_METHOD" => "GET",
72
58
  "QUERY_STRING" => ""
73
59
  }.freeze
74
- HttpParser::KEEPALIVE_REQUESTS_DEFAULT.times do |nr|
60
+ 100.times do |nr|
75
61
  @parser.buf << req
76
62
  assert_equal expect, @parser.parse
77
63
  assert @parser.next?
78
64
  end
79
- @parser.buf << req
80
- assert_equal expect, @parser.parse
81
- assert ! @parser.next?
82
- end
83
-
84
- def test_fewer_keepalive_requests_with_next?
85
- HttpParser.keepalive_requests = 5
86
- @parser = HttpParser.new
87
- req = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n".freeze
88
- expect = {
89
- "SERVER_NAME" => "example.com",
90
- "HTTP_HOST" => "example.com",
91
- "rack.url_scheme" => "http",
92
- "REQUEST_PATH" => "/",
93
- "SERVER_PROTOCOL" => "HTTP/1.1",
94
- "PATH_INFO" => "/",
95
- "HTTP_VERSION" => "HTTP/1.1",
96
- "REQUEST_URI" => "/",
97
- "SERVER_PORT" => "80",
98
- "REQUEST_METHOD" => "GET",
99
- "QUERY_STRING" => ""
100
- }.freeze
101
- 5.times do |nr|
102
- @parser.buf << req
103
- assert_equal expect, @parser.parse
104
- assert @parser.next?
105
- end
106
- @parser.buf << req
107
- assert_equal expect, @parser.parse
108
- assert ! @parser.next?
109
65
  end
110
66
 
111
67
  def test_default_keepalive_is_off
@@ -663,69 +619,4 @@ class HttpParserNgTest < Test::Unit::TestCase
663
619
  assert_equal expect, env2
664
620
  assert_equal "", @parser.buf
665
621
  end
666
-
667
- def test_keepalive_requests_disabled
668
- req = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n".freeze
669
- expect = {
670
- "SERVER_NAME" => "example.com",
671
- "HTTP_HOST" => "example.com",
672
- "rack.url_scheme" => "http",
673
- "REQUEST_PATH" => "/",
674
- "SERVER_PROTOCOL" => "HTTP/1.1",
675
- "PATH_INFO" => "/",
676
- "HTTP_VERSION" => "HTTP/1.1",
677
- "REQUEST_URI" => "/",
678
- "SERVER_PORT" => "80",
679
- "REQUEST_METHOD" => "GET",
680
- "QUERY_STRING" => ""
681
- }.freeze
682
- HttpParser.keepalive_requests = 0
683
- @parser = HttpParser.new
684
- @parser.buf << req
685
- assert_equal expect, @parser.parse
686
- assert ! @parser.next?
687
- end
688
-
689
- def test_chunk_only
690
- tmp = ""
691
- assert_equal @parser, @parser.dechunk!
692
- assert_nil @parser.filter_body(tmp, "6\r\n")
693
- assert_equal "", tmp
694
- assert_nil @parser.filter_body(tmp, "abcdef")
695
- assert_equal "abcdef", tmp
696
- assert_nil @parser.filter_body(tmp, "\r\n")
697
- assert_equal "", tmp
698
- src = "0\r\n\r\n"
699
- assert_equal src.object_id, @parser.filter_body(tmp, src).object_id
700
- assert_equal "", tmp
701
- end
702
-
703
- def test_chunk_only_bad_align
704
- tmp = ""
705
- assert_equal @parser, @parser.dechunk!
706
- assert_nil @parser.filter_body(tmp, "6\r\na")
707
- assert_equal "a", tmp
708
- assert_nil @parser.filter_body(tmp, "bcde")
709
- assert_equal "bcde", tmp
710
- assert_nil @parser.filter_body(tmp, "f\r")
711
- assert_equal "f", tmp
712
- src = "\n0\r\n\r\n"
713
- assert_equal src.object_id, @parser.filter_body(tmp, src).object_id
714
- assert_equal "", tmp
715
- end
716
-
717
- def test_chunk_only_reset_ok
718
- tmp = ""
719
- assert_equal @parser, @parser.dechunk!
720
- src = "1\r\na\r\n0\r\n\r\n"
721
- assert_nil @parser.filter_body(tmp, src)
722
- assert_equal "a", tmp
723
- assert_equal src.object_id, @parser.filter_body(tmp, src).object_id
724
-
725
- assert_equal @parser, @parser.dechunk!
726
- src = "0\r\n\r\n"
727
- assert_equal src.object_id, @parser.filter_body(tmp, src).object_id
728
- assert_equal "", tmp
729
- assert_equal src, @parser.filter_body(tmp, src)
730
- end
731
622
  end