ephemeral_response 0.1.0 → 0.2.0

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.
@@ -1,13 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe EphemeralResponse::Fixture do
4
- let(:fixture_directory) { File.expand_path EphemeralResponse::Configuration.fixture_directory }
5
- let(:uri) { URI.parse("http://example.com") }
6
- let(:fixture) { EphemeralResponse::Fixture.new(uri, 'GET') { |f| f.response = "hello world"} }
4
+ include FakeFS::SpecHelpers
7
5
 
8
- before do
9
- clear_fixtures
10
- end
6
+ let(:fixture_directory) { File.expand_path EphemeralResponse::Configuration.fixture_directory }
7
+ let(:request) { Net::HTTP::Get.new '/' }
8
+ let(:uri) { URI.parse("http://example.com/") }
9
+ let(:fixture) { EphemeralResponse::Fixture.new(uri, request) { |f| f.response = "hello world"} }
11
10
 
12
11
  describe ".load_all" do
13
12
  it "returns the empty fixtures hash when the fixture directory doesn't exist" do
@@ -24,72 +23,273 @@ describe EphemeralResponse::Fixture do
24
23
  before do
25
24
  FileUtils.mkdir_p fixture_directory
26
25
  Dir.chdir(fixture_directory) do
27
- FileUtils.touch %w(1.fixture 2.fixture)
26
+ FileUtils.touch %w(1.yml 2.yml)
28
27
  end
29
28
  end
30
29
 
31
30
  it "calls #load_fixture for each fixture file" do
32
- EphemeralResponse::Fixture.should_receive(:load_fixture).with("#{fixture_directory}/1.fixture")
33
- EphemeralResponse::Fixture.should_receive(:load_fixture).with("#{fixture_directory}/2.fixture")
31
+ EphemeralResponse::Fixture.should_receive(:load_fixture).with("#{fixture_directory}/1.yml")
32
+ EphemeralResponse::Fixture.should_receive(:load_fixture).with("#{fixture_directory}/2.yml")
34
33
  EphemeralResponse::Fixture.load_all
35
34
  end
36
35
  end
37
36
  end
38
37
 
39
38
  describe ".load_fixture" do
39
+ it "loads the yamlized fixture into the fixtures hash" do
40
+ fixture.save
41
+ EphemeralResponse::Fixture.load_fixture(fixture.path)
42
+ EphemeralResponse::Fixture.fixtures.should have_key(fixture.identifier)
43
+ end
44
+ end
45
+
46
+ describe ".register" do
40
47
  context "fixture expired" do
41
48
  before do
42
49
  fixture.instance_variable_set(:@created_at, Time.new - (EphemeralResponse::Configuration.expiration * 2))
43
- fixture.save
50
+ fixture.register
44
51
  end
45
52
 
46
- it "removes the fixture" do
47
- EphemeralResponse::Fixture.load_all
53
+ it "removes the fixture file" do
48
54
  File.exists?(fixture.path).should be_false
49
55
  end
50
56
 
51
- it "does not add the fixture in the fixtures hash" do
52
- EphemeralResponse::Fixture.load_all
57
+ it "does not add the fixture to the fixtures hash" do
53
58
  EphemeralResponse::Fixture.fixtures.should_not have_key(fixture.identifier)
54
59
  end
55
60
  end
56
61
 
57
62
  context "fixture not expired" do
58
63
  before do
59
- fixture.save
64
+ fixture.register
60
65
  end
61
66
 
62
67
  it "adds the the fixture to the fixtures hash" do
63
- EphemeralResponse::Fixture.load_all
64
68
  EphemeralResponse::Fixture.fixtures[fixture.identifier].should == fixture
65
69
  end
66
70
  end
67
71
  end
68
72
 
73
+ describe ".find" do
74
+ context "when fixture registered" do
75
+ it "returns the fixture" do
76
+ fixture.register
77
+ EphemeralResponse::Fixture.find(uri, request).should == fixture
78
+ end
79
+ end
80
+
81
+ context "when fixture not registered" do
82
+ it "returns nil" do
83
+ EphemeralResponse::Fixture.find(uri, request).should be_nil
84
+ end
85
+ end
86
+ end
87
+
88
+ describe ".find_or_initialize" do
89
+ context "when the fixture is registered" do
90
+ it "returns the registered fixture" do
91
+ fixture.register
92
+ EphemeralResponse::Fixture.find_or_initialize(uri, request).should == fixture
93
+ end
94
+ end
95
+
96
+ context "when the fixture doesn't exist" do
97
+ it "processes the block" do
98
+ EphemeralResponse::Fixture.find_or_initialize(uri, request) do |fixture|
99
+ fixture.response = "bah"
100
+ end.response.should == "bah"
101
+ end
102
+
103
+ it "returns the new fixture" do
104
+ fixture = EphemeralResponse::Fixture.find_or_initialize(uri, request)
105
+ EphemeralResponse::Fixture.fixtures[fixture.identifier].should be_nil
106
+ end
107
+ end
108
+ end
109
+
69
110
  describe ".respond_to" do
111
+ context "host included in white list" do
112
+ before do
113
+ EphemeralResponse::Configuration.white_list = uri.host
114
+ end
115
+
116
+ it "returns flow back to net/http" do
117
+ 2.times do
118
+ EphemeralResponse::Fixture.respond_to(fixture.uri, request) {}
119
+ EphemeralResponse::Fixture.fixtures[fixture.identifier].should be_nil
120
+ end
121
+ end
122
+
123
+ context "uri not normalized" do
124
+ let(:uri) { URI.parse("HtTP://ExaMplE.Com/") }
125
+ let(:fixture) { EphemeralResponse::Fixture.new(uri, request) }
126
+
127
+ before do
128
+ EphemeralResponse::Configuration.white_list = "example.com"
129
+ end
130
+
131
+ it "returns flow to net/http when host is not normalized" do
132
+ EphemeralResponse::Fixture.respond_to(uri, request) {}
133
+ EphemeralResponse::Fixture.fixtures[fixture.identifier].should be_nil
134
+ end
135
+ end
136
+
137
+ end
138
+
70
139
  context "fixture loaded" do
71
140
  it "returns the fixture response" do
72
- fixture.save
73
- EphemeralResponse::Fixture.load_all
74
- response = EphemeralResponse::Fixture.respond_to(fixture.uri, fixture.method)
141
+ fixture.register
142
+ response = EphemeralResponse::Fixture.respond_to(fixture.uri, request)
75
143
  response.should == "hello world"
76
144
  end
77
145
  end
78
146
 
79
147
  context "fixture not loaded" do
80
148
  it "sets the response to the block" do
81
- EphemeralResponse::Fixture.respond_to(fixture.uri, fixture.method) do
149
+ EphemeralResponse::Fixture.respond_to(fixture.uri, request) do
82
150
  "new response"
83
151
  end
84
152
  EphemeralResponse::Fixture.fixtures[fixture.identifier].response.should == "new response"
85
153
  end
86
154
 
87
155
  it "saves the fixture" do
88
- EphemeralResponse::Fixture.respond_to(fixture.uri, fixture.method) do
156
+ EphemeralResponse::Fixture.respond_to(fixture.uri, request) do
89
157
  "new response"
90
158
  end
91
159
  File.exists?(fixture.path).should be_true
92
160
  end
93
161
  end
94
162
  end
163
+
164
+ describe "#initialize" do
165
+ let(:uri) { URI.parse("HtTP://ExaMplE.Com/") }
166
+ subject { EphemeralResponse::Fixture }
167
+
168
+ it "normalizes the given uri" do
169
+ fixture = subject.new(uri, request)
170
+ fixture.uri.should == uri.normalize
171
+ end
172
+
173
+ it "duplicates the request" do
174
+ fixture = subject.new(uri, request)
175
+ request['something'] = "anything"
176
+ fixture.request['something'].should be_nil
177
+ request['something'].should == "anything"
178
+ end
179
+
180
+ it "sets created_at to the current time" do
181
+ Time.travel "2010-01-15 10:11:12" do
182
+ fixture = subject.new(uri, request)
183
+ fixture.created_at.should == Time.parse("2010-01-15 10:11:12")
184
+ end
185
+ end
186
+
187
+ it "yields itself" do
188
+ fixture = subject.new(uri, request) do |f|
189
+ f.response = "yielded self"
190
+ end
191
+ fixture.response.should == "yielded self"
192
+ end
193
+ end
194
+
195
+ describe "#identifier" do
196
+ let(:request) { Net::HTTP::Get.new '/?foo=bar' }
197
+ let(:uri) { URI.parse "http://example.com/" }
198
+ subject { EphemeralResponse::Fixture.new uri, request }
199
+
200
+ it "hashes the uri_identifier with request_identifier" do
201
+ Digest::SHA1.should_receive(:hexdigest).with("#{subject.uri_identifier}#{subject.request_identifier}")
202
+ subject.identifier
203
+ end
204
+ end
205
+
206
+ describe "#uri_identifier" do
207
+
208
+ it "returns an array containing the host when there is no query string" do
209
+ request = Net::HTTP::Get.new '/'
210
+ host = URI.parse("http://example.com/")
211
+ fixture = EphemeralResponse::Fixture.new(host, request)
212
+ fixture.uri_identifier.should == "http://example.com/"
213
+ end
214
+
215
+ it "does not incorrectly hash different hosts which sort identically" do
216
+ request = Net::HTTP::Get.new '/?foo=bar'
217
+ host1 = URI.parse("http://a.com/?f=b")
218
+ host2 = URI.parse("http://f.com/?b=a")
219
+ fixture1 = EphemeralResponse::Fixture.new(host1, request)
220
+ fixture2 = EphemeralResponse::Fixture.new(host2, request)
221
+ fixture1.uri_identifier.should_not == fixture2.uri_identifier
222
+ end
223
+
224
+ it "sorts the query strings" do
225
+ uri1 = URI.parse("http://example.com/?foo=bar&baz=qux&f")
226
+ uri2 = URI.parse("http://example.com/?baz=qux&foo=bar&f")
227
+ request1 = Net::HTTP::Get.new uri1.request_uri
228
+ request2 = Net::HTTP::Get.new uri2.request_uri
229
+ fixture1 = EphemeralResponse::Fixture.new(uri1, request1)
230
+ fixture2 = EphemeralResponse::Fixture.new(uri2, request2)
231
+ fixture1.uri_identifier.should == fixture2.uri_identifier
232
+ end
233
+
234
+ it "doesn't mix up the query string key pairs" do
235
+ uri1 = URI.parse("http://example.com/?foo=bar&baz=qux")
236
+ uri2 = URI.parse("http://example.com/?bar=foo&qux=baz")
237
+ request1 = Net::HTTP::Get.new uri1.request_uri
238
+ request2 = Net::HTTP::Get.new uri2.request_uri
239
+ fixture1 = EphemeralResponse::Fixture.new(uri1, request1)
240
+ fixture2 = EphemeralResponse::Fixture.new(uri2, request2)
241
+ fixture1.uri_identifier.should_not == fixture2.uri_identifier
242
+ end
243
+ end
244
+
245
+ describe "#register" do
246
+ context "uri not white listed" do
247
+ it "saves the fixture" do
248
+ fixture.register
249
+ File.exists?(fixture.path).should be_true
250
+ end
251
+
252
+ it "registers the fixture" do
253
+ fixture.register
254
+ EphemeralResponse::Fixture.fixtures.should have_key(fixture.identifier)
255
+ end
256
+ end
257
+
258
+ context "uri is white listed" do
259
+ before do
260
+ EphemeralResponse::Configuration.white_list << uri.host
261
+ end
262
+
263
+ it "doesn't save the fixture" do
264
+ fixture.register
265
+ File.exists?(fixture.path).should be_false
266
+ end
267
+
268
+ it "doesn't register the fixture" do
269
+ fixture.register
270
+ EphemeralResponse::Fixture.fixtures.should_not have_key(fixture.identifier)
271
+ end
272
+ end
273
+ end
274
+
275
+ describe "#file_name" do
276
+ it "chops off the starting slash when accessing '/'" do
277
+ uri = URI.parse("http://example.com/")
278
+ fixture = EphemeralResponse::Fixture.new(uri, request)
279
+ fixture.file_name.should =~ /example-com_GET_[\w]{7}.yml/
280
+ end
281
+
282
+ it "chops off the starting slash when accessing '/index.html'" do
283
+ uri = URI.parse("http://example.com/index.html")
284
+ fixture = EphemeralResponse::Fixture.new(uri, request)
285
+ fixture.file_name.should =~ /example-com_GET_index-html_[\w]{7}.yml/
286
+ end
287
+
288
+ it "looks like on longer paths" do
289
+ uri = URI.parse("http://example.com/users/1/photos/1.html")
290
+ fixture = EphemeralResponse::Fixture.new(uri, request)
291
+ fixture.file_name.should =~ /example-com_GET_users-1-photos-1-html_[\w]{7}.yml/
292
+ end
293
+
294
+ end
95
295
  end
@@ -20,9 +20,15 @@ describe Net::HTTP do
20
20
  describe "#generate_uri" do
21
21
  context "when HTTP" do
22
22
  subject { Net::HTTP.new('example.com') }
23
+
23
24
  it "returns the proper http uri object" do
24
25
  subject.generate_uri(request).should == URI.parse("http://example.com/foo?q=1")
25
26
  end
27
+
28
+ it "sets the uri instance variable" do
29
+ subject.generate_uri(request)
30
+ subject.uri.should == URI.parse("http://example.com/foo?q=1")
31
+ end
26
32
  end
27
33
 
28
34
  context "when HTTPS" do
@@ -31,6 +37,7 @@ describe Net::HTTP do
31
37
  https.use_ssl = true
32
38
  https
33
39
  end
40
+
34
41
  it "returns the proper http uri object" do
35
42
  subject.generate_uri(request).should == URI.parse("https://example.com/foo?q=1")
36
43
  end
@@ -69,5 +76,13 @@ describe Net::HTTP do
69
76
  subject.request(request)
70
77
  end
71
78
  end
79
+
80
+ context "connection not started" do
81
+ it "starts the connection" do
82
+ subject.should_not be_started
83
+ subject.request(request)
84
+ subject.should be_started
85
+ end
86
+ end
72
87
  end
73
88
  end
@@ -24,9 +24,15 @@ describe EphemeralResponse do
24
24
  end
25
25
 
26
26
  it "removes #generate_uri" do
27
- Net::HTTP.instance_methods.sort.should include('generate_uri')
27
+ Net::HTTP.instance_methods.should include('generate_uri')
28
28
  EphemeralResponse.deactivate
29
29
  Net::HTTP.instance_methods.should_not include('generate_uri')
30
30
  end
31
+
32
+ it "removes #uri" do
33
+ Net::HTTP.instance_methods.should include('uri')
34
+ EphemeralResponse.deactivate
35
+ Net::HTTP.instance_methods.should_not include('uri')
36
+ end
31
37
  end
32
38
  end
@@ -1,36 +1,48 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "Integrating with the net" do
4
- before do
3
+ describe "Normal flow" do
4
+ include FakeFS::SpecHelpers
5
+
6
+ after do
5
7
  clear_fixtures
6
8
  end
7
9
 
8
10
  context "example.com" do
9
- let(:uri) { URI.parse('http://example.com') }
11
+ let(:uri) { URI.parse('http://example.com/') }
12
+ let(:http) { Net::HTTP.new uri.host, uri.port }
13
+
14
+ def get
15
+ Net::HTTP::Get.new '/'
16
+ end
17
+
18
+ def send_request(req)
19
+ http.start {|h| h.request(req) }
20
+ end
21
+
10
22
  it "generates a fixture, then uses the fixture" do
11
- real_response = Net::HTTP.get(uri)
12
- fixture = EphemeralResponse::Fixture.new(uri, 'GET')
23
+ real_response = send_request(get)
24
+ fixture = EphemeralResponse::Fixture.new(uri, get)
13
25
  File.exists?(fixture.path).should be_true
14
26
  Net::HTTP.should_not_receive(:connect_without_ephemeral_response)
15
27
  Net::HTTP.should_not_receive(:request_without_ephemeral_response)
16
- fixture_response = Net::HTTP.get(uri)
28
+ fixture_response = send_request(get)
17
29
  real_response.should == fixture_response
18
30
  end
19
31
 
20
32
  it "generates a new fixture when the initial fixture expires" do
21
- Net::HTTP.get(uri)
22
- old_fixture = EphemeralResponse::Fixture.find(uri, 'GET')
33
+ send_request(get)
34
+ old_fixture = EphemeralResponse::Fixture.find(uri, get)
23
35
  Time.travel((Time.now + EphemeralResponse::Configuration.expiration * 2).to_s) do
24
36
  EphemeralResponse::Fixture.load_all
25
- Net::HTTP.get(uri)
37
+ send_request(get)
26
38
  end
27
- new_fixture = EphemeralResponse::Fixture.find(uri, 'GET')
39
+ new_fixture = EphemeralResponse::Fixture.find(uri, get)
28
40
  old_fixture.created_at.should < new_fixture.created_at
29
41
 
30
42
  # use the new fixture
31
43
  Net::HTTP.should_not_receive(:connect_without_ephemeral_response)
32
44
  Net::HTTP.should_not_receive(:request_without_ephemeral_response)
33
- Net::HTTP.get(uri)
45
+ send_request(get)
34
46
  end
35
47
 
36
48
  context "Deactivation" do
@@ -0,0 +1,153 @@
1
+ require 'spec_helper'
2
+
3
+ module UniqueRequests
4
+ VARIATIONS = %w(
5
+ simple_get
6
+ get_with_query_string
7
+ get_with_query_string_and_basic_auth
8
+ get_with_multiple_headers
9
+ simple_post
10
+ post_with_data
11
+ post_with_body
12
+ post_with_data_and_query_string
13
+ post_with_data_and_query_string_and_basic_auth
14
+ )
15
+
16
+ def uri
17
+ @uri ||= URI.parse "http://localhost:#{EphemeralResponse::RackReflector.port}"
18
+ end
19
+
20
+ def responses
21
+ @responses ||= {}
22
+ end
23
+
24
+ def set_up_responses
25
+ VARIATIONS.each do |request|
26
+ responses[request] = send(request)
27
+ end
28
+ end
29
+
30
+ def perform(request)
31
+ http = Net::HTTP.new uri.host, uri.port
32
+ # http.set_debug_output $stdout
33
+ http.start do |http|
34
+ http.request(request)
35
+ end
36
+ end
37
+
38
+ def simple_get
39
+ perform Net::HTTP::Get.new('/foo')
40
+ end
41
+
42
+ def get_with_query_string
43
+ perform Net::HTTP::Get.new('/?foo=bar&baz=qux')
44
+ end
45
+
46
+ def get_with_query_string_and_basic_auth
47
+ request = Net::HTTP::Get.new('/?foo=bar')
48
+ request.basic_auth 'user', 'password'
49
+ perform request
50
+ end
51
+
52
+ def get_with_multiple_headers
53
+ request = Net::HTTP::Get.new('/')
54
+ request['Accept'] = "application/json, text/html"
55
+ request['Accept-Encoding'] = "deflate, gzip"
56
+ perform request
57
+ end
58
+
59
+ def simple_post
60
+ perform Net::HTTP::Post.new('/')
61
+ end
62
+
63
+ def post_with_data
64
+ request = Net::HTTP::Post.new('/')
65
+ request.set_form_data 'hi' => 'there'
66
+ perform request
67
+ end
68
+
69
+ def post_with_body
70
+ request = Net::HTTP::Post.new('/')
71
+ request.body = 'hi=there'
72
+ perform request
73
+ end
74
+
75
+ def post_with_data_and_query_string
76
+ request = Net::HTTP::Post.new('/?foo=bar')
77
+ request.set_form_data 'hi' => 'there'
78
+ perform request
79
+ end
80
+
81
+ def post_with_data_and_query_string_and_basic_auth
82
+ request = Net::HTTP::Post.new('/?foo=bar')
83
+ request.basic_auth 'user', 'password'
84
+ request.set_form_data 'hi' => 'there'
85
+ perform request
86
+ end
87
+
88
+ end
89
+
90
+ describe "Unique fixtures generated for the following requests" do
91
+ include UniqueRequests
92
+
93
+ before :all do
94
+ EphemeralResponse.activate
95
+ clear_fixtures
96
+ EphemeralResponse::RackReflector.while_running do
97
+ set_up_responses
98
+ end
99
+ end
100
+
101
+ after :all do
102
+ EphemeralResponse::RackReflector.stop
103
+ end
104
+
105
+ UniqueRequests::VARIATIONS.each do |request|
106
+ it "restores the correct response from the fixture" do
107
+ send(request).body.should == responses[request].body
108
+ end
109
+ end
110
+
111
+ context "when querystring has different order" do
112
+ it "restores the correct response" do
113
+ new_response = perform Net::HTTP::Get.new('/?baz=qux&foo=bar')
114
+ new_response.body.should == responses['get_with_query_string'].body
115
+ end
116
+ end
117
+
118
+ context "when headers have different order" do
119
+ it "restores the correct response when the headers are exactly reversed" do
120
+ request = Net::HTTP::Get.new('/')
121
+ request['Accept'] = "text/html, application/json"
122
+ request['Accept-Encoding'] = "gzip, deflate"
123
+ new_response = perform request
124
+ new_response.body.should == responses['get_with_multiple_headers'].body
125
+ end
126
+
127
+ it "restores the correct response when some headers are reversed" do
128
+ request = Net::HTTP::Get.new('/')
129
+ request['Accept'] = "text/html, application/json"
130
+ request['Accept-Encoding'] = "deflate, gzip"
131
+ new_response = perform request
132
+ new_response.body.should == responses['get_with_multiple_headers'].body
133
+ end
134
+ end
135
+
136
+ context "when the http service has not been started" do
137
+ def get
138
+ Net::HTTP::Get.new('/foo/bar/baz')
139
+ end
140
+
141
+ it "restores the correct fixture" do
142
+ clear_fixtures
143
+ http = Net::HTTP.new uri.host, uri.port
144
+
145
+
146
+ EphemeralResponse::RackReflector.while_running do
147
+ http.request(get)
148
+ end
149
+
150
+ http.request(get).body.should == EphemeralResponse::Fixture.find(http.uri, get).response.body
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe "White Lists" do
4
+ before do
5
+ clear_fixtures
6
+ end
7
+
8
+ context "localhost added to white list" do
9
+ let(:uri) { URI.parse('http://localhost:9876/') }
10
+ let(:http) { Net::HTTP.new uri.host, uri.port }
11
+ let(:get) { Net::HTTP::Get.new '/' }
12
+
13
+ before do
14
+ EphemeralResponse::Configuration.white_list = "localhost"
15
+ end
16
+
17
+ it "doesn't save a fixture" do
18
+ EphemeralResponse::RackReflector.while_running do
19
+ http.start {|h| h.request(get) }
20
+ EphemeralResponse::Fixture.load_all.should be_empty
21
+ Dir.glob("#{EphemeralResponse::Configuration.fixture_directory}/*").should be_empty
22
+ end
23
+ end
24
+ end
25
+ end
data/spec/spec_helper.rb CHANGED
@@ -7,12 +7,13 @@ require 'spec/autorun'
7
7
  Dir.glob("spec/support/*.rb") {|f| require f}
8
8
 
9
9
  Spec::Runner.configure do |config|
10
- config.include FakeFS::SpecHelpers
11
10
  config.include ClearFixtures
12
11
  config.before(:each) do
12
+ EphemeralResponse::Configuration.reset
13
13
  EphemeralResponse.activate
14
14
  end
15
15
  config.after(:suite) do
16
16
  EphemeralResponse.deactivate
17
+ ClearFixtures.clear_fixtures
17
18
  end
18
19
  end
@@ -1,4 +1,5 @@
1
1
  module ClearFixtures
2
+ module_function
2
3
  def clear_fixtures
3
4
  FileUtils.rm_rf EphemeralResponse::Configuration.fixture_directory
4
5
  EphemeralResponse::Fixture.clear
@@ -0,0 +1,63 @@
1
+ require 'unicorn'
2
+
3
+ module EphemeralResponse::RackReflector
4
+ class Response
5
+ attr_reader :ordered_headers, :rack_input
6
+ def initialize(env={})
7
+ @ordered_headers = []
8
+ set_ordered_headers(env)
9
+ set_rack_input(env)
10
+ end
11
+
12
+ def set_ordered_headers(env)
13
+ env.each do |key, value|
14
+ @ordered_headers << [key, value] if key == key.upcase
15
+ end
16
+ end
17
+
18
+ def headers
19
+ Hash[ordered_headers]
20
+ end
21
+
22
+ def set_rack_input(env)
23
+ @rack_input = env['rack.input'].read
24
+ end
25
+ end
26
+
27
+ extend self
28
+
29
+ def app
30
+ lambda do |env|
31
+ [ 200, {"Content-Type" => "application/x-yaml"}, [ Response.new(env).to_yaml ] ]
32
+ end
33
+ end
34
+
35
+ def new_server
36
+ http_server = Unicorn::HttpServer.new(app, :listeners => ["0.0.0.0:#{port}"])
37
+ http_server.logger.level = Logger::ERROR
38
+ http_server
39
+ end
40
+
41
+ def port
42
+ 9876 || ENV['UNICORN_PORT']
43
+ end
44
+
45
+ def server
46
+ @server ||= new_server
47
+ end
48
+
49
+ def start
50
+ server.start
51
+ end
52
+
53
+ def stop
54
+ server.stop(false)
55
+ end
56
+
57
+ def while_running
58
+ start
59
+ yield
60
+ ensure
61
+ stop
62
+ end
63
+ end