boourns-unicorn 4.4.3 → 4.4.4

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.
@@ -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