boourns-unicorn 4.4.3 → 4.4.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/unicorn/const.rb +4 -4
- data/lib/unicorn/http_request.rb +5 -0
- data/lib/unicorn/http_response.rb +2 -5
- data/lib/unicorn/http_server.rb +4 -2
- data/unicorn.gemspec +1 -1
- metadata +12 -12
data/lib/unicorn/const.rb
CHANGED
@@ -29,10 +29,10 @@ module Unicorn::Const
|
|
29
29
|
|
30
30
|
# :stopdoc:
|
31
31
|
# common errors we'll send back
|
32
|
-
ERROR_400_RESPONSE = "
|
33
|
-
ERROR_414_RESPONSE = "
|
34
|
-
ERROR_413_RESPONSE = "
|
35
|
-
ERROR_500_RESPONSE = "
|
32
|
+
ERROR_400_RESPONSE = "400 Bad Request\r\n\r\n"
|
33
|
+
ERROR_414_RESPONSE = "414 Request-URI Too Long\r\n\r\n"
|
34
|
+
ERROR_413_RESPONSE = "413 Request Entity Too Large\r\n\r\n"
|
35
|
+
ERROR_500_RESPONSE = "500 Internal Server Error\r\n\r\n"
|
36
36
|
|
37
37
|
EXPECT_100_RESPONSE = "HTTP/1.1 100 Continue\r\n\r\n"
|
38
38
|
EXPECT_100_RESPONSE_SUFFIXED = "100 Continue\r\n\r\nHTTP/1.1 "
|
data/lib/unicorn/http_request.rb
CHANGED
@@ -22,6 +22,8 @@ class Unicorn::HttpParser
|
|
22
22
|
|
23
23
|
NULL_IO = StringIO.new("")
|
24
24
|
|
25
|
+
attr_accessor :response_start_sent
|
26
|
+
|
25
27
|
# :stopdoc:
|
26
28
|
# A frozen format for this is about 15% faster
|
27
29
|
REMOTE_ADDR = 'REMOTE_ADDR'.freeze
|
@@ -83,7 +85,10 @@ class Unicorn::HttpParser
|
|
83
85
|
|
84
86
|
# detect if the socket is valid by writing a partial response:
|
85
87
|
if @@check_client_connection && headers?
|
88
|
+
@response_start_sent = true
|
86
89
|
Unicorn::Const::HTTP_RESPONSE_START.each { |c| socket.write(c) }
|
90
|
+
else
|
91
|
+
@response_start_sent = false
|
87
92
|
end
|
88
93
|
|
89
94
|
e[RACK_INPUT] = 0 == content_length ?
|
@@ -17,14 +17,11 @@ module Unicorn::HttpResponse
|
|
17
17
|
}
|
18
18
|
CRLF = "\r\n"
|
19
19
|
|
20
|
-
def http_response_start
|
21
|
-
Unicorn::HttpParser.check_client_connection ? '' : 'HTTP/1.1 '
|
22
|
-
end
|
23
|
-
|
24
20
|
# writes the rack_response to socket as an HTTP response
|
25
|
-
def http_response_write(socket, status, headers, body)
|
21
|
+
def http_response_write(socket, status, headers, body, response_start_sent=false)
|
26
22
|
status = CODES[status.to_i] || status
|
27
23
|
|
24
|
+
http_response_start = response_start_sent ? '' : 'HTTP/1.1 '
|
28
25
|
if headers
|
29
26
|
buf = "#{http_response_start}#{status}\r\n" \
|
30
27
|
"Date: #{httpdate}\r\n" \
|
data/lib/unicorn/http_server.rb
CHANGED
@@ -533,13 +533,14 @@ class Unicorn::HttpServer
|
|
533
533
|
Unicorn.log_error(@logger, "app error", e)
|
534
534
|
Unicorn::Const::ERROR_500_RESPONSE
|
535
535
|
end
|
536
|
+
msg = 'HTTP/1.1 ' + msg unless @request.response_start_sent
|
536
537
|
client.kgio_trywrite(msg)
|
537
538
|
client.close
|
538
539
|
rescue
|
539
540
|
end
|
540
541
|
|
541
542
|
def expect_100_response
|
542
|
-
if
|
543
|
+
if @request.response_start_sent
|
543
544
|
Unicorn::Const::EXPECT_100_RESPONSE_SUFFIXED
|
544
545
|
else
|
545
546
|
Unicorn::Const::EXPECT_100_RESPONSE
|
@@ -549,6 +550,7 @@ class Unicorn::HttpServer
|
|
549
550
|
# once a client is accepted, it is processed in its entirety here
|
550
551
|
# in 3 easy steps: read request, call app, write app response
|
551
552
|
def process_client(client)
|
553
|
+
@request.response_start_sent = false
|
552
554
|
status, headers, body = @app.call(env = @request.read(client))
|
553
555
|
|
554
556
|
if 100 == status.to_i
|
@@ -557,7 +559,7 @@ class Unicorn::HttpServer
|
|
557
559
|
status, headers, body = @app.call(env)
|
558
560
|
end
|
559
561
|
@request.headers? or headers = nil
|
560
|
-
http_response_write(client, status, headers, body)
|
562
|
+
http_response_write(client, status, headers, body, @request.response_start_sent)
|
561
563
|
client.shutdown # in case of fork() in Rack app
|
562
564
|
client.close # flush and uncork socket immediately, no keepalive
|
563
565
|
rescue => e
|
data/unicorn.gemspec
CHANGED
metadata
CHANGED
@@ -3,7 +3,7 @@ name: !binary |-
|
|
3
3
|
Ym9vdXJucy11bmljb3Ju
|
4
4
|
version: !ruby/object:Gem::Version
|
5
5
|
version: !binary |-
|
6
|
-
|
6
|
+
NC40LjQ=
|
7
7
|
prerelease:
|
8
8
|
platform: ruby
|
9
9
|
authors:
|
@@ -11,12 +11,12 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-11-
|
14
|
+
date: 2012-11-03 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: !binary |-
|
18
18
|
cmFjaw==
|
19
|
-
requirement: &
|
19
|
+
requirement: &70186187391540 !ruby/object:Gem::Requirement
|
20
20
|
none: false
|
21
21
|
requirements:
|
22
22
|
- - ! '>='
|
@@ -24,11 +24,11 @@ dependencies:
|
|
24
24
|
version: '0'
|
25
25
|
type: :runtime
|
26
26
|
prerelease: false
|
27
|
-
version_requirements: *
|
27
|
+
version_requirements: *70186187391540
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: !binary |-
|
30
30
|
a2dpbw==
|
31
|
-
requirement: &
|
31
|
+
requirement: &70186187391020 !ruby/object:Gem::Requirement
|
32
32
|
none: false
|
33
33
|
requirements:
|
34
34
|
- - !binary |-
|
@@ -38,11 +38,11 @@ dependencies:
|
|
38
38
|
Mi42
|
39
39
|
type: :runtime
|
40
40
|
prerelease: false
|
41
|
-
version_requirements: *
|
41
|
+
version_requirements: *70186187391020
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: !binary |-
|
44
44
|
cmFpbmRyb3Bz
|
45
|
-
requirement: &
|
45
|
+
requirement: &70186187439620 !ruby/object:Gem::Requirement
|
46
46
|
none: false
|
47
47
|
requirements:
|
48
48
|
- - !binary |-
|
@@ -52,11 +52,11 @@ dependencies:
|
|
52
52
|
MC43
|
53
53
|
type: :runtime
|
54
54
|
prerelease: false
|
55
|
-
version_requirements: *
|
55
|
+
version_requirements: *70186187439620
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: !binary |-
|
58
58
|
aXNvbGF0ZQ==
|
59
|
-
requirement: &
|
59
|
+
requirement: &70186187439160 !ruby/object:Gem::Requirement
|
60
60
|
none: false
|
61
61
|
requirements:
|
62
62
|
- - !binary |-
|
@@ -66,11 +66,11 @@ dependencies:
|
|
66
66
|
My4y
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *70186187439160
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: !binary |-
|
72
72
|
d3Jvbmdkb2M=
|
73
|
-
requirement: &
|
73
|
+
requirement: &70186187438700 !ruby/object:Gem::Requirement
|
74
74
|
none: false
|
75
75
|
requirements:
|
76
76
|
- - !binary |-
|
@@ -80,7 +80,7 @@ dependencies:
|
|
80
80
|
MS42LjE=
|
81
81
|
type: :development
|
82
82
|
prerelease: false
|
83
|
-
version_requirements: *
|
83
|
+
version_requirements: *70186187438700
|
84
84
|
description: ! '\Unicorn is an HTTP server for Rack applications designed to only
|
85
85
|
serve
|
86
86
|
|