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.
@@ -29,10 +29,10 @@ module Unicorn::Const
29
29
 
30
30
  # :stopdoc:
31
31
  # common errors we'll send back
32
- ERROR_400_RESPONSE = "HTTP/1.1 400 Bad Request\r\n\r\n"
33
- ERROR_414_RESPONSE = "HTTP/1.1 414 Request-URI Too Long\r\n\r\n"
34
- ERROR_413_RESPONSE = "HTTP/1.1 413 Request Entity Too Large\r\n\r\n"
35
- ERROR_500_RESPONSE = "HTTP/1.1 500 Internal Server Error\r\n\r\n"
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 "
@@ -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" \
@@ -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 Unicorn::HttpRequest.check_client_connection
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
@@ -14,7 +14,7 @@ end.compact
14
14
 
15
15
  Gem::Specification.new do |s|
16
16
  s.name = %q{boourns-unicorn}
17
- s.version = "4.4.3"
17
+ s.version = "4.4.4"
18
18
  s.authors = ["#{name} hackers"]
19
19
  s.summary = summary
20
20
  s.date = Time.now.utc.strftime('%Y-%m-%d')
metadata CHANGED
@@ -3,7 +3,7 @@ name: !binary |-
3
3
  Ym9vdXJucy11bmljb3Ju
4
4
  version: !ruby/object:Gem::Version
5
5
  version: !binary |-
6
- NC40LjM=
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-02 00:00:00.000000000 Z
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: &70200646381740 !ruby/object:Gem::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: *70200646381740
27
+ version_requirements: *70186187391540
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: !binary |-
30
30
  a2dpbw==
31
- requirement: &70200646380700 !ruby/object:Gem::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: *70200646380700
41
+ version_requirements: *70186187391020
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: !binary |-
44
44
  cmFpbmRyb3Bz
45
- requirement: &70200646379220 !ruby/object:Gem::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: *70200646379220
55
+ version_requirements: *70186187439620
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: !binary |-
58
58
  aXNvbGF0ZQ==
59
- requirement: &70200646378140 !ruby/object:Gem::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: *70200646378140
69
+ version_requirements: *70186187439160
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: !binary |-
72
72
  d3Jvbmdkb2M=
73
- requirement: &70200646376700 !ruby/object:Gem::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: *70200646376700
83
+ version_requirements: *70186187438700
84
84
  description: ! '\Unicorn is an HTTP server for Rack applications designed to only
85
85
  serve
86
86