unicorn 4.0.1 → 4.0.1.4.g406b
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.
@@ -20,6 +20,7 @@
|
|
20
20
|
pchar = (uchar | ":" | "@" | "&" | "=" | "+");
|
21
21
|
tspecials = ("(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\\" | "\"" | "/" | "[" | "]" | "?" | "=" | "{" | "}" | " " | "\t");
|
22
22
|
lws = (" " | "\t");
|
23
|
+
content = ((any -- CTL) | lws);
|
23
24
|
|
24
25
|
# elements
|
25
26
|
token = (ascii -- (CTL | tspecials));
|
@@ -50,9 +51,9 @@
|
|
50
51
|
|
51
52
|
field_name = ( token -- ":" )+ >start_field $snake_upcase_field %write_field;
|
52
53
|
|
53
|
-
field_value =
|
54
|
+
field_value = content* >start_value %write_value;
|
54
55
|
|
55
|
-
value_cont = lws+
|
56
|
+
value_cont = lws+ content* >start_value %write_cont_value;
|
56
57
|
|
57
58
|
message_header = ((field_name ":" lws* field_value)|value_cont) :> CRLF;
|
58
59
|
chunk_ext_val = token*;
|
data/lib/unicorn/http_server.rb
CHANGED
@@ -408,7 +408,13 @@ class Unicorn::HttpServer
|
|
408
408
|
end
|
409
409
|
|
410
410
|
self.reexec_pid = fork do
|
411
|
-
listener_fds = LISTENERS.map
|
411
|
+
listener_fds = LISTENERS.map do |sock|
|
412
|
+
# IO#close_on_exec= will be available on any future version of
|
413
|
+
# Ruby that sets FD_CLOEXEC by default on new file descriptors
|
414
|
+
# ref: http://redmine.ruby-lang.org/issues/5041
|
415
|
+
sock.close_on_exec = false if sock.respond_to?(:close_on_exec=)
|
416
|
+
sock.fileno
|
417
|
+
end
|
412
418
|
ENV['UNICORN_FD'] = listener_fds.join(',')
|
413
419
|
Dir.chdir(START_CTX[:cwd])
|
414
420
|
cmd = [ START_CTX[0] ].concat(START_CTX[:argv])
|
@@ -529,12 +535,17 @@ class Unicorn::HttpServer
|
|
529
535
|
handle_error(client, e)
|
530
536
|
end
|
531
537
|
|
538
|
+
EXIT_SIGS = [ :QUIT, :TERM, :INT ]
|
539
|
+
WORKER_QUEUE_SIGS = QUEUE_SIGS - EXIT_SIGS
|
540
|
+
|
532
541
|
# gets rid of stuff the worker has no business keeping track of
|
533
542
|
# to free some resources and drops all sig handlers.
|
534
543
|
# traps for USR1, USR2, and HUP may be set in the after_fork Proc
|
535
544
|
# by the user.
|
536
545
|
def init_worker_process(worker)
|
537
|
-
|
546
|
+
# we'll re-trap :QUIT later for graceful shutdown iff we accept clients
|
547
|
+
EXIT_SIGS.each { |sig| trap(sig) { exit!(0) } }
|
548
|
+
WORKER_QUEUE_SIGS.each { |sig| trap(sig, nil) }
|
538
549
|
trap(:CHLD, 'DEFAULT')
|
539
550
|
SIG_QUEUE.clear
|
540
551
|
proc_name "worker[#{worker.nr}]"
|
@@ -572,7 +583,6 @@ class Unicorn::HttpServer
|
|
572
583
|
# closing anything we IO.select on will raise EBADF
|
573
584
|
trap(:USR1) { nr = -65536; SELF_PIPE[0].close rescue nil }
|
574
585
|
trap(:QUIT) { worker = nil; LISTENERS.each { |s| s.close rescue nil }.clear }
|
575
|
-
[:TERM, :INT].each { |sig| trap(sig) { exit!(0) } } # instant shutdown
|
576
586
|
logger.info "worker=#{worker.nr} ready"
|
577
587
|
|
578
588
|
begin
|
@@ -813,6 +813,24 @@ class HttpParserTest < Test::Unit::TestCase
|
|
813
813
|
assert_equal "hello\t world", parser.env["HTTP_X_SPACE"]
|
814
814
|
end
|
815
815
|
|
816
|
+
def test_null_byte_header
|
817
|
+
parser = HttpParser.new
|
818
|
+
get = "GET / HTTP/1.1\r\nHost: \0\r\n\r\n"
|
819
|
+
assert_raises(HttpParserError) { parser.add_parse(get) }
|
820
|
+
end
|
821
|
+
|
822
|
+
def test_null_byte_in_middle
|
823
|
+
parser = HttpParser.new
|
824
|
+
get = "GET / HTTP/1.1\r\nHost: hello\0world\r\n\r\n"
|
825
|
+
assert_raises(HttpParserError) { parser.add_parse(get) }
|
826
|
+
end
|
827
|
+
|
828
|
+
def test_null_byte_at_end
|
829
|
+
parser = HttpParser.new
|
830
|
+
get = "GET / HTTP/1.1\r\nHost: hello\0\r\n\r\n"
|
831
|
+
assert_raises(HttpParserError) { parser.add_parse(get) }
|
832
|
+
end
|
833
|
+
|
816
834
|
def test_empty_header
|
817
835
|
parser = HttpParser.new
|
818
836
|
get = "GET / HTTP/1.1\r\nHost: \r\n\r\n"
|
metadata
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unicorn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 1551
|
5
|
+
prerelease: 8
|
6
6
|
segments:
|
7
7
|
- 4
|
8
8
|
- 0
|
9
9
|
- 1
|
10
|
-
|
10
|
+
- 4
|
11
|
+
- g
|
12
|
+
- 406
|
13
|
+
- b
|
14
|
+
version: 4.0.1.4.g406b
|
11
15
|
platform: ruby
|
12
16
|
authors:
|
13
17
|
- Unicorn hackers
|
@@ -15,7 +19,7 @@ autorequire:
|
|
15
19
|
bindir: bin
|
16
20
|
cert_chain: []
|
17
21
|
|
18
|
-
date: 2011-
|
22
|
+
date: 2011-08-03 00:00:00 Z
|
19
23
|
dependencies:
|
20
24
|
- !ruby/object:Gem::Dependency
|
21
25
|
name: rack
|
@@ -414,12 +418,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
414
418
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
415
419
|
none: false
|
416
420
|
requirements:
|
417
|
-
- - "
|
421
|
+
- - ">"
|
418
422
|
- !ruby/object:Gem::Version
|
419
|
-
hash:
|
423
|
+
hash: 25
|
420
424
|
segments:
|
421
|
-
-
|
422
|
-
|
425
|
+
- 1
|
426
|
+
- 3
|
427
|
+
- 1
|
428
|
+
version: 1.3.1
|
423
429
|
requirements: []
|
424
430
|
|
425
431
|
rubyforge_project: mongrel
|