manticore 0.6.1-java → 0.6.2-java
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.
- checksums.yaml +4 -4
- data/.travis.yml +3 -2
- data/CHANGELOG.md +1 -1
- data/README.md +1 -1
- data/Rakefile +14 -12
- data/ext/manticore/org/manticore/Manticore.java +4 -0
- data/lib/faraday/adapter/manticore.rb +11 -10
- data/lib/manticore.rb +10 -10
- data/lib/manticore/client.rb +51 -50
- data/lib/manticore/client/proxies.rb +3 -1
- data/lib/manticore/cookie.rb +12 -12
- data/lib/manticore/facade.rb +2 -2
- data/lib/manticore/java_extensions.rb +1 -1
- data/lib/manticore/response.rb +32 -27
- data/lib/manticore/stubbed_response.rb +6 -5
- data/lib/manticore/version.rb +1 -1
- data/lib/manticore_jars.rb +6 -6
- data/lib/org/manticore/manticore-ext.jar +0 -0
- data/spec/manticore/client_proxy_spec.rb +5 -4
- data/spec/manticore/client_spec.rb +93 -68
- data/spec/manticore/cookie_spec.rb +9 -10
- data/spec/manticore/facade_spec.rb +6 -6
- data/spec/manticore/response_spec.rb +11 -12
- data/spec/manticore/stubbed_response_spec.rb +5 -5
- data/spec/spec_helper.rb +36 -29
- metadata +3 -3
@@ -9,6 +9,7 @@ module Manticore
|
|
9
9
|
def async
|
10
10
|
AsyncProxy.new(self)
|
11
11
|
end
|
12
|
+
|
12
13
|
alias_method :parallel, :async
|
13
14
|
alias_method :batch, :async
|
14
15
|
|
@@ -20,6 +21,7 @@ module Manticore
|
|
20
21
|
|
21
22
|
class BaseProxy
|
22
23
|
include ProxiesInterface
|
24
|
+
|
23
25
|
def initialize(client)
|
24
26
|
@client = client
|
25
27
|
end
|
@@ -55,4 +57,4 @@ module Manticore
|
|
55
57
|
end
|
56
58
|
end
|
57
59
|
end
|
58
|
-
end
|
60
|
+
end
|
data/lib/manticore/cookie.rb
CHANGED
@@ -36,7 +36,7 @@ module Manticore
|
|
36
36
|
value: cookie.get_value,
|
37
37
|
secure: cookie.is_secure,
|
38
38
|
persistent: cookie.is_persistent,
|
39
|
-
spec_version: cookie.get_version
|
39
|
+
spec_version: cookie.get_version,
|
40
40
|
)
|
41
41
|
end
|
42
42
|
|
@@ -63,16 +63,16 @@ module Manticore
|
|
63
63
|
attr_reader :comment, :comment_url, :domain, :expires, :name, :path, :ports, :value, :spec_version
|
64
64
|
|
65
65
|
def initialize(args)
|
66
|
-
@comment
|
67
|
-
@comment_url
|
68
|
-
@domain
|
69
|
-
@expires
|
70
|
-
@name
|
71
|
-
@path
|
72
|
-
@ports
|
73
|
-
@value
|
74
|
-
@secure
|
75
|
-
@persistent
|
66
|
+
@comment = args.fetch(:comment, nil)
|
67
|
+
@comment_url = args.fetch(:comment_url, nil)
|
68
|
+
@domain = args.fetch(:domain, nil)
|
69
|
+
@expires = args.fetch(:expires, nil)
|
70
|
+
@name = args.fetch(:name, nil)
|
71
|
+
@path = args.fetch(:path, nil)
|
72
|
+
@ports = args.fetch(:ports, nil)
|
73
|
+
@value = args.fetch(:value, nil)
|
74
|
+
@secure = args.fetch(:secure, nil)
|
75
|
+
@persistent = args.fetch(:persistent, nil)
|
76
76
|
@spec_version = args.fetch(:spec_version, nil)
|
77
77
|
end
|
78
78
|
|
@@ -104,4 +104,4 @@ module Manticore
|
|
104
104
|
!@persistent
|
105
105
|
end
|
106
106
|
end
|
107
|
-
end
|
107
|
+
end
|
data/lib/manticore/facade.rb
CHANGED
@@ -4,7 +4,7 @@ class Java::OrgApacheHttpClientMethods::HttpRequestBase
|
|
4
4
|
|
5
5
|
# Provides an easy way to get the request headers from any request
|
6
6
|
def headers
|
7
|
-
Hash[*get_all_headers.flat_map {|h| [h.name, h.value] }]
|
7
|
+
Hash[*get_all_headers.flat_map { |h| [h.name, h.value] }]
|
8
8
|
end
|
9
9
|
|
10
10
|
# Get a single request header
|
data/lib/manticore/response.rb
CHANGED
@@ -15,7 +15,7 @@ module Manticore
|
|
15
15
|
include_package "org.apache.http.util"
|
16
16
|
include_package "org.apache.http.protocol"
|
17
17
|
java_import "org.apache.http.client.protocol.HttpClientContext"
|
18
|
-
java_import
|
18
|
+
java_import "java.util.concurrent.Callable"
|
19
19
|
|
20
20
|
include ResponseHandler
|
21
21
|
include Callable
|
@@ -29,14 +29,14 @@ module Manticore
|
|
29
29
|
# @param request [HttpRequestBase] The underlying request object
|
30
30
|
# @param context [HttpContext] The underlying HttpContext
|
31
31
|
def initialize(client, request, context, &block)
|
32
|
-
@client
|
32
|
+
@client = client
|
33
33
|
@request = request
|
34
34
|
@context = context
|
35
35
|
@handlers = {
|
36
|
-
success:
|
37
|
-
failure:
|
38
|
-
cancelled: Proc.new {},
|
39
|
-
complete:
|
36
|
+
success: block || Proc.new { |resp| resp.body },
|
37
|
+
failure: Proc.new { |ex| raise ex },
|
38
|
+
cancelled: Proc.new { },
|
39
|
+
complete: [],
|
40
40
|
}
|
41
41
|
end
|
42
42
|
|
@@ -91,9 +91,9 @@ module Manticore
|
|
91
91
|
def final_url
|
92
92
|
call_once
|
93
93
|
last_request = context.get_attribute ExecutionContext.HTTP_REQUEST
|
94
|
-
last_host
|
95
|
-
host
|
96
|
-
url
|
94
|
+
last_host = context.get_attribute ExecutionContext.HTTP_TARGET_HOST
|
95
|
+
host = last_host.to_uri
|
96
|
+
url = last_request.get_uri
|
97
97
|
URI.join(host, url.to_s)
|
98
98
|
end
|
99
99
|
|
@@ -115,15 +115,16 @@ module Manticore
|
|
115
115
|
def body(&block)
|
116
116
|
call_once
|
117
117
|
@body ||= begin
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
118
|
+
if entity = @response.get_entity
|
119
|
+
EntityConverter.new.read_entity(entity, &block)
|
120
|
+
end
|
121
|
+
rescue Java::JavaIo::IOException, Java::JavaNet::SocketException, IOError => e
|
122
|
+
raise StreamClosedException.new("Could not read from stream: #{e.message}")
|
123
|
+
# ensure
|
124
|
+
# @request.release_connection
|
125
|
+
end
|
126
126
|
end
|
127
|
+
|
127
128
|
alias_method :read_body, :body
|
128
129
|
|
129
130
|
# Returns true if this response has been called (requested and populated) yet
|
@@ -196,6 +197,7 @@ module Manticore
|
|
196
197
|
@handlers[:success] = block
|
197
198
|
self
|
198
199
|
end
|
200
|
+
|
199
201
|
alias_method :success, :on_success
|
200
202
|
|
201
203
|
# Set handler for failure responses
|
@@ -206,8 +208,9 @@ module Manticore
|
|
206
208
|
@handlers[:failure] = block
|
207
209
|
self
|
208
210
|
end
|
211
|
+
|
209
212
|
alias_method :failure, :on_failure
|
210
|
-
alias_method :fail,
|
213
|
+
alias_method :fail, :on_failure
|
211
214
|
|
212
215
|
# Set handler for cancelled requests. NB: Not actually used right now?
|
213
216
|
# @param block Proc which will be invoked on a on a cancelled response.
|
@@ -217,8 +220,9 @@ module Manticore
|
|
217
220
|
@handlers[:cancelled] = block
|
218
221
|
self
|
219
222
|
end
|
220
|
-
|
221
|
-
alias_method :
|
223
|
+
|
224
|
+
alias_method :cancelled, :on_cancelled
|
225
|
+
alias_method :cancellation, :on_cancelled
|
222
226
|
alias_method :on_cancellation, :on_cancelled
|
223
227
|
|
224
228
|
# Set handler for completed requests
|
@@ -229,8 +233,9 @@ module Manticore
|
|
229
233
|
@handlers[:complete] = Array(@handlers[:complete]).compact + [block]
|
230
234
|
self
|
231
235
|
end
|
232
|
-
|
233
|
-
alias_method :
|
236
|
+
|
237
|
+
alias_method :complete, :on_complete
|
238
|
+
alias_method :completed, :on_complete
|
234
239
|
alias_method :on_completed, :on_complete
|
235
240
|
|
236
241
|
def times_retried
|
@@ -247,10 +252,10 @@ module Manticore
|
|
247
252
|
# Implementation of {http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/ResponseHandler.html#handleResponse(org.apache.http.HttpResponse) ResponseHandler#handleResponse}
|
248
253
|
# @param response [Response] The underlying Java Response object
|
249
254
|
def handleResponse(response)
|
250
|
-
@response
|
251
|
-
@code
|
252
|
-
@message
|
253
|
-
@headers
|
255
|
+
@response = response
|
256
|
+
@code = response.get_status_line.get_status_code
|
257
|
+
@message = response.get_status_line.get_reason_phrase
|
258
|
+
@headers = response.get_all_headers.each_with_object({}) do |h, o|
|
254
259
|
key = h.get_name.downcase
|
255
260
|
if o.key?(key)
|
256
261
|
o[key] = Array(o[key]) unless o[key].is_a?(Array)
|
@@ -274,7 +279,7 @@ module Manticore
|
|
274
279
|
end
|
275
280
|
|
276
281
|
def execute_complete
|
277
|
-
@handlers[:complete].each {|h| h.call(self) }
|
282
|
+
@handlers[:complete].each { |h| h.call(self) }
|
278
283
|
end
|
279
284
|
end
|
280
285
|
end
|
@@ -33,12 +33,12 @@ module Manticore
|
|
33
33
|
# @return [Manticore::StubbedResponse] self
|
34
34
|
def stub(stubs)
|
35
35
|
if stubs.key? :cookies
|
36
|
-
stubs[:cookies].keys.each {|key| stubs[:cookies][key] = Array(stubs[:cookies][key]) }
|
36
|
+
stubs[:cookies].keys.each { |key| stubs[:cookies][key] = Array(stubs[:cookies][key]) }
|
37
37
|
end
|
38
38
|
stubs[:code] ||= 200
|
39
39
|
|
40
40
|
stubs[:headers] ||= {}
|
41
|
-
stubs[:headers] = Hash[*stubs[:headers].flat_map {|k, v| [k.downcase, v] }]
|
41
|
+
stubs[:headers] = Hash[*stubs[:headers].flat_map { |k, v| [k.downcase, v] }]
|
42
42
|
stubs[:headers]["content-length"] ||= stubs[:body].length.to_s if stubs.key?(:body)
|
43
43
|
|
44
44
|
@stubs = stubs
|
@@ -69,6 +69,7 @@ module Manticore
|
|
69
69
|
@body
|
70
70
|
end
|
71
71
|
end
|
72
|
+
|
72
73
|
alias_method :read_body, :body
|
73
74
|
|
74
75
|
# Returns the stubbed cookies of this response. This is the union of cookies from the `:cookies`
|
@@ -82,8 +83,8 @@ module Manticore
|
|
82
83
|
|
83
84
|
def handleResponse(response)
|
84
85
|
raise response[:raises] if response.key?(:raises)
|
85
|
-
@body
|
86
|
-
@code
|
86
|
+
@body = response[:body]
|
87
|
+
@code = response[:code]
|
87
88
|
@headers = response[:headers]
|
88
89
|
@cookies = response[:cookies]
|
89
90
|
Array(@headers["set-cookie"]).each do |cookie|
|
@@ -99,4 +100,4 @@ module Manticore
|
|
99
100
|
call unless @called
|
100
101
|
end
|
101
102
|
end
|
102
|
-
end
|
103
|
+
end
|
data/lib/manticore/version.rb
CHANGED
data/lib/manticore_jars.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# this is a generated file, to avoid over-writing it just delete this comment
|
2
|
-
require
|
2
|
+
require "jar_dependencies"
|
3
3
|
|
4
|
-
require_jar(
|
5
|
-
require_jar(
|
6
|
-
require_jar(
|
7
|
-
require_jar(
|
8
|
-
require_jar(
|
4
|
+
require_jar("commons-logging", "commons-logging", "1.2")
|
5
|
+
require_jar("org.apache.httpcomponents", "httpmime", "4.5.2")
|
6
|
+
require_jar("commons-codec", "commons-codec", "1.10")
|
7
|
+
require_jar("org.apache.httpcomponents", "httpclient", "4.5.2")
|
8
|
+
require_jar("org.apache.httpcomponents", "httpcore", "4.4.4")
|
Binary file
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
2
3
|
describe Manticore::Client do
|
3
4
|
let(:client) { Manticore::Client.new }
|
4
5
|
|
@@ -29,7 +30,7 @@ describe Manticore::Client do
|
|
29
30
|
stub.async.get(local_server)
|
30
31
|
stub.async.get(local_server)
|
31
32
|
|
32
|
-
expect(
|
33
|
+
expect(client.execute!.map(&:class)).to eq [Manticore::StubbedResponse, Manticore::StubbedResponse]
|
33
34
|
end
|
34
35
|
end
|
35
36
|
end
|
@@ -58,7 +59,7 @@ describe Manticore::Client do
|
|
58
59
|
end
|
59
60
|
|
60
61
|
it "can chain handlers" do
|
61
|
-
client.async.get("http://localhost:55441/").on_success {|r| r.code }
|
62
|
+
client.async.get("http://localhost:55441/").on_success { |r| r.code }
|
62
63
|
expect(client.execute!.map(&:callback_result)).to eq [200]
|
63
64
|
end
|
64
65
|
end
|
@@ -95,4 +96,4 @@ describe Manticore::Client do
|
|
95
96
|
end
|
96
97
|
end
|
97
98
|
end
|
98
|
-
end
|
99
|
+
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require
|
2
|
+
require "spec_helper"
|
3
3
|
|
4
|
-
java_import
|
5
|
-
java_import
|
4
|
+
java_import "org.apache.http.entity.mime.MultipartEntityBuilder"
|
5
|
+
java_import "org.apache.http.entity.ContentType"
|
6
6
|
|
7
7
|
describe Manticore::Client do
|
8
|
-
|
9
8
|
let(:client) { Manticore::Client.new }
|
10
9
|
|
11
10
|
it "fetches a URL and return a response" do
|
@@ -52,14 +51,19 @@ describe Manticore::Client do
|
|
52
51
|
expect(j["uri"]["port"]).to eq 55441
|
53
52
|
end
|
54
53
|
|
54
|
+
it "automatically decodes application/JSON as UTF-8" do
|
55
|
+
j = JSON.parse client.get(local_server("/json_utf8")).body
|
56
|
+
expect(j["last_name"]).to eq "Töger"
|
57
|
+
end
|
58
|
+
|
55
59
|
context "via an authenticated proxy" do
|
56
60
|
let(:proxy) { "http://localhost:55442" }
|
57
61
|
let(:auth) { nil }
|
58
|
-
let(:req) { client.get(local_server("/authproxy"), proxy: proxy, auth: auth) }
|
59
62
|
let(:j) { JSON.parse req.body }
|
60
63
|
|
61
64
|
context "with authentication as a hash" do
|
62
65
|
let(:auth) { {user: "user", pass: "pass"} }
|
66
|
+
let(:req) { client.get(local_server("/authproxy"), proxy: proxy, auth: auth) }
|
63
67
|
|
64
68
|
it "proxies" do
|
65
69
|
expect(j["server_port"]).to eq 55442
|
@@ -69,7 +73,8 @@ describe Manticore::Client do
|
|
69
73
|
end
|
70
74
|
|
71
75
|
context "with authentication as a string" do
|
72
|
-
let(:proxy) { "http://user:pass@localhost:55442"}
|
76
|
+
let(:proxy) { "http://user:pass@localhost:55442" }
|
77
|
+
let(:req) { client.get(local_server("/authproxy"), proxy: proxy) }
|
73
78
|
|
74
79
|
it "proxies" do
|
75
80
|
expect(j["server_port"]).to eq 55442
|
@@ -78,8 +83,6 @@ describe Manticore::Client do
|
|
78
83
|
end
|
79
84
|
end
|
80
85
|
end
|
81
|
-
it "proxies with authentication as a hash" do
|
82
|
-
end
|
83
86
|
|
84
87
|
describe "with a custom user agent" do
|
85
88
|
let(:client) { Manticore::Client.new user_agent: "test-agent/1.0" }
|
@@ -109,17 +112,21 @@ describe Manticore::Client do
|
|
109
112
|
end
|
110
113
|
end
|
111
114
|
|
112
|
-
describe
|
113
|
-
describe
|
114
|
-
context
|
115
|
+
describe "ssl settings" do
|
116
|
+
describe "verify" do
|
117
|
+
context "default" do
|
115
118
|
let(:client) { Manticore::Client.new }
|
116
119
|
|
117
120
|
it "breaks on SSL validation errors" do
|
118
121
|
expect { client.get("https://localhost:55444/").call }.to raise_exception(Manticore::ClientProtocolException)
|
119
122
|
end
|
123
|
+
|
124
|
+
it "breaks on SSL expiry errors" do
|
125
|
+
expect { client.get("https://localhost:55446/").call }.to raise_exception(Manticore::ClientProtocolException)
|
126
|
+
end
|
120
127
|
end
|
121
128
|
|
122
|
-
context
|
129
|
+
context "when on and no trust store is given" do
|
123
130
|
let(:client) { Manticore::Client.new :ssl => {:verify => :strict} }
|
124
131
|
|
125
132
|
it "breaks on SSL validation errors" do
|
@@ -127,7 +134,7 @@ describe Manticore::Client do
|
|
127
134
|
end
|
128
135
|
end
|
129
136
|
|
130
|
-
context
|
137
|
+
context "when on and custom trust store is given" do
|
131
138
|
let(:client) { Manticore::Client.new :ssl => {verify: :strict, truststore: File.expand_path("../../ssl/truststore.jks", __FILE__), truststore_password: "test123"} }
|
132
139
|
|
133
140
|
it "verifies the request and succeed" do
|
@@ -143,7 +150,7 @@ describe Manticore::Client do
|
|
143
150
|
end
|
144
151
|
end
|
145
152
|
|
146
|
-
context
|
153
|
+
context "when on and custom trust store is given with the wrong password" do
|
147
154
|
let(:client) { Manticore::Client.new :ssl => {verify: :strict, truststore: File.expand_path("../../ssl/truststore.jks", __FILE__), truststore_password: "wrongpass"} }
|
148
155
|
|
149
156
|
it "fails to load the keystore" do
|
@@ -151,22 +158,24 @@ describe Manticore::Client do
|
|
151
158
|
end
|
152
159
|
end
|
153
160
|
|
154
|
-
context
|
155
|
-
let(:client) { Manticore::Client.new :ssl => {verify: :strict, ca_file: File.expand_path("../../ssl/root-ca.crt", __FILE__)
|
161
|
+
context "when ca_file is given" do
|
162
|
+
let(:client) { Manticore::Client.new :ssl => {verify: :strict, ca_file: File.expand_path("../../ssl/root-ca.crt", __FILE__)} }
|
156
163
|
|
157
164
|
it "verifies the request and succeed" do
|
158
165
|
expect { client.get("https://localhost:55444/").body }.to_not raise_exception
|
159
166
|
end
|
160
167
|
end
|
161
168
|
|
162
|
-
context
|
163
|
-
let(:client) {
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
169
|
+
context "when client_cert and client_key are given" do
|
170
|
+
let(:client) {
|
171
|
+
Manticore::Client.new(
|
172
|
+
:ssl => {
|
173
|
+
verify: :strict,
|
174
|
+
ca_file: File.expand_path("../../ssl/root-ca.crt", __FILE__),
|
175
|
+
client_cert: File.expand_path("../../ssl/client.crt", __FILE__),
|
176
|
+
client_key: File.expand_path("../../ssl/client.key", __FILE__),
|
177
|
+
},
|
178
|
+
)
|
170
179
|
}
|
171
180
|
|
172
181
|
it "successfully auths requests" do
|
@@ -174,12 +183,16 @@ describe Manticore::Client do
|
|
174
183
|
end
|
175
184
|
end
|
176
185
|
|
177
|
-
context
|
178
|
-
let(:client) { Manticore::Client.new :ssl => {:verify => :
|
186
|
+
context "when off" do
|
187
|
+
let(:client) { Manticore::Client.new :ssl => {:verify => :disable} }
|
179
188
|
|
180
189
|
it "does not break on SSL validation errors" do
|
181
190
|
expect { client.get("https://localhost:55444/").body }.to_not raise_exception
|
182
191
|
end
|
192
|
+
|
193
|
+
it "does not break on expired SSL certificates" do
|
194
|
+
expect { client.get("https://localhost:55446/").body }.to_not raise_exception
|
195
|
+
end
|
183
196
|
end
|
184
197
|
|
185
198
|
context "against a server that verifies clients" do
|
@@ -190,7 +203,7 @@ describe Manticore::Client do
|
|
190
203
|
truststore_password: "test123",
|
191
204
|
keystore: File.expand_path("../../ssl/client.p12", __FILE__),
|
192
205
|
keystore_password: "test123",
|
193
|
-
verify: :strict
|
206
|
+
verify: :strict,
|
194
207
|
}
|
195
208
|
Manticore::Client.new :ssl => options
|
196
209
|
}
|
@@ -205,7 +218,7 @@ describe Manticore::Client do
|
|
205
218
|
options = {
|
206
219
|
truststore: File.expand_path("../../ssl/truststore.jks", __FILE__),
|
207
220
|
truststore_password: "test123",
|
208
|
-
verify: :strict
|
221
|
+
verify: :strict,
|
209
222
|
}
|
210
223
|
Manticore::Client.new :ssl => options
|
211
224
|
}
|
@@ -241,40 +254,39 @@ describe Manticore::Client do
|
|
241
254
|
expect(subject).to receive(:call).once.and_call_original
|
242
255
|
end
|
243
256
|
|
244
|
-
specify { expect { subject.body }.to change
|
245
|
-
specify { expect { subject.headers }.to change
|
257
|
+
specify { expect { subject.body }.to change { subject.called? } }
|
258
|
+
specify { expect { subject.headers }.to change { subject.called? } }
|
246
259
|
specify { expect { subject.final_url }.to change { subject.called? } }
|
247
|
-
specify { expect { subject.code }.to change
|
248
|
-
specify { expect { subject.length }.to change
|
249
|
-
specify { expect { subject.cookies }.to change
|
260
|
+
specify { expect { subject.code }.to change { subject.called? } }
|
261
|
+
specify { expect { subject.length }.to change { subject.called? } }
|
262
|
+
specify { expect { subject.cookies }.to change { subject.called? } }
|
250
263
|
end
|
251
264
|
|
252
265
|
it "automatically calls synchronous requests that pass a handler block" do
|
253
|
-
req = client.get(local_server) {|r| }
|
266
|
+
req = client.get(local_server) { |r| }
|
254
267
|
expect(req).to be_called
|
255
268
|
end
|
256
269
|
|
257
270
|
it "does not call asynchronous requests even if a block is passed" do
|
258
|
-
req = client.async.get(local_server) {|r| }
|
271
|
+
req = client.async.get(local_server) { |r| }
|
259
272
|
expect(req).to_not be_called
|
260
273
|
end
|
261
274
|
|
262
275
|
it "does not call asynchronous requests when on_success is passed" do
|
263
|
-
req = client.async.get(local_server).on_success {|r| }
|
276
|
+
req = client.async.get(local_server).on_success { |r| }
|
264
277
|
expect(req).to_not be_called
|
265
278
|
end
|
266
279
|
|
267
280
|
it "calls async requests on client execution" do
|
268
|
-
req = client.async.get(local_server).on_success {|r| }
|
281
|
+
req = client.async.get(local_server).on_success { |r| }
|
269
282
|
expect { client.execute! }.to change { req.called? }.from(false).to(true)
|
270
283
|
end
|
271
284
|
|
272
|
-
|
273
285
|
describe "with a bad port number" do
|
274
286
|
it "returns a Manticore::InvalidArgumentException" do
|
275
287
|
failure = nil
|
276
288
|
client.async.get(local_server("/", 65536)).
|
277
|
-
on_failure {|f| failure = f }
|
289
|
+
on_failure { |f| failure = f }
|
278
290
|
client.execute!
|
279
291
|
expect(failure).to be_a(Manticore::InvalidArgumentException)
|
280
292
|
end
|
@@ -286,7 +298,7 @@ describe Manticore::Client do
|
|
286
298
|
# I'm not crazy about reaching into the client via instance_variable_get here, but it works.
|
287
299
|
expect(client.instance_variable_get("@client")).to receive(:execute).and_raise(StandardError.new("Uh oh"))
|
288
300
|
client.async.get(local_server).
|
289
|
-
on_failure {|f| failure = f }
|
301
|
+
on_failure { |f| failure = f }
|
290
302
|
client.execute!
|
291
303
|
expect(failure).to be_a(StandardError)
|
292
304
|
end
|
@@ -479,7 +491,7 @@ describe Manticore::Client do
|
|
479
491
|
|
480
492
|
it "sends an arbitrary entity" do
|
481
493
|
f = open(File.expand_path(File.join(__FILE__, "..", "..", "spec_helper.rb")), "r").to_inputstream
|
482
|
-
multipart_entity = MultipartEntityBuilder.create.add_text_body("foo", "bar").add_binary_body("whatever", f
|
494
|
+
multipart_entity = MultipartEntityBuilder.create.add_text_body("foo", "bar").add_binary_body("whatever", f, ContentType::TEXT_PLAIN, __FILE__)
|
483
495
|
response = client.post(local_server, entity: multipart_entity.build)
|
484
496
|
expect(response.body).to match "RSpec.configure"
|
485
497
|
end
|
@@ -550,8 +562,8 @@ describe Manticore::Client do
|
|
550
562
|
futures = [55441, 55442].map do |port|
|
551
563
|
client.async.get("http://localhost:#{port}/?sleep=1").
|
552
564
|
on_success do |response|
|
553
|
-
|
554
|
-
|
565
|
+
Time.now.to_f
|
566
|
+
end
|
555
567
|
end
|
556
568
|
|
557
569
|
client.execute!
|
@@ -562,7 +574,7 @@ describe Manticore::Client do
|
|
562
574
|
it "returns the results of the handler blocks" do
|
563
575
|
[55441, 55442].each do |port|
|
564
576
|
client.async.get("http://localhost:#{port}/").
|
565
|
-
on_success {|response, request| "Result" }
|
577
|
+
on_success { |response, request| "Result" }
|
566
578
|
end
|
567
579
|
|
568
580
|
expect(client.execute!.map(&:callback_result)).to eq ["Result", "Result"]
|
@@ -572,7 +584,7 @@ describe Manticore::Client do
|
|
572
584
|
describe "#clear_pending" do
|
573
585
|
it "removes pending requests" do
|
574
586
|
ran = false
|
575
|
-
client.async.get("http://google.com").on_success {|r| ran = true }
|
587
|
+
client.async.get("http://google.com").on_success { |r| ran = true }
|
576
588
|
client.clear_pending
|
577
589
|
expect(client.execute!).to be_empty
|
578
590
|
expect(ran).to be false
|
@@ -603,25 +615,25 @@ describe Manticore::Client do
|
|
603
615
|
end
|
604
616
|
end
|
605
617
|
|
606
|
-
context
|
618
|
+
context "stubbing" do
|
607
619
|
it "only the provided URLs" do
|
608
620
|
client.stub local_server, body: "body"
|
609
|
-
client.async.get(local_server).on_success {|r| expect(r).to be_a Manticore::StubbedResponse }
|
610
|
-
client.async.get(local_server("/other")).on_success {|r| expect(r).to_not be_a Manticore::StubbedResponse }
|
621
|
+
client.async.get(local_server).on_success { |r| expect(r).to be_a Manticore::StubbedResponse }
|
622
|
+
client.async.get(local_server("/other")).on_success { |r| expect(r).to_not be_a Manticore::StubbedResponse }
|
611
623
|
client.execute!
|
612
624
|
end
|
613
625
|
|
614
626
|
it "by regex matching" do
|
615
627
|
client.stub %r{#{local_server("/foo")}}, body: "body"
|
616
|
-
client.async.get(local_server("/foo")).on_success {|r| expect(r).to be_a Manticore::StubbedResponse }
|
617
|
-
client.async.get(local_server("/bar")).on_success {|r| expect(r).to_not be_a Manticore::StubbedResponse }
|
628
|
+
client.async.get(local_server("/foo")).on_success { |r| expect(r).to be_a Manticore::StubbedResponse }
|
629
|
+
client.async.get(local_server("/bar")).on_success { |r| expect(r).to_not be_a Manticore::StubbedResponse }
|
618
630
|
client.execute!
|
619
631
|
end
|
620
632
|
|
621
633
|
it "strictly matches string stubs" do
|
622
634
|
client.stub local_server("/foo"), body: "body"
|
623
|
-
client.async.get(local_server("/foo")).on_success {|r| expect(r).to be_a Manticore::StubbedResponse }
|
624
|
-
client.async.get(local_server("/other")).on_success {|r| expect(r).to_not be_a Manticore::StubbedResponse }
|
635
|
+
client.async.get(local_server("/foo")).on_success { |r| expect(r).to be_a Manticore::StubbedResponse }
|
636
|
+
client.async.get(local_server("/other")).on_success { |r| expect(r).to_not be_a Manticore::StubbedResponse }
|
625
637
|
client.execute!
|
626
638
|
end
|
627
639
|
|
@@ -653,10 +665,9 @@ describe Manticore::Client do
|
|
653
665
|
describe "keepalive" do
|
654
666
|
let(:url) { "http://www.facebook.com/" }
|
655
667
|
|
656
|
-
|
657
668
|
context "with keepalive" do
|
658
669
|
it "adds the Connection: Keep-Alive header for http/1.0" do
|
659
|
-
expect(
|
670
|
+
expect(client.get(url).request["Connection"]).to eq "Keep-Alive"
|
660
671
|
end
|
661
672
|
|
662
673
|
let(:client) { Manticore::Client.new keepalive: true, pool_max: 1 }
|
@@ -674,7 +685,7 @@ describe Manticore::Client do
|
|
674
685
|
let(:client) { Manticore::Client.new keepalive: false, pool_max: 1 }
|
675
686
|
|
676
687
|
it "does not add the Connection: Keep-Alive header for http/1.0" do
|
677
|
-
expect(
|
688
|
+
expect(client.get(url).request["Connection"]).to be_nil
|
678
689
|
end
|
679
690
|
|
680
691
|
it "closes the connection after a request" do
|
@@ -689,19 +700,33 @@ describe Manticore::Client do
|
|
689
700
|
end
|
690
701
|
|
691
702
|
context "with a misbehaving endpoint" do
|
703
|
+
let(:port) do
|
704
|
+
p = 4000
|
705
|
+
server = nil
|
706
|
+
begin
|
707
|
+
server = TCPServer.new p
|
708
|
+
rescue Errno::EADDRINUSE
|
709
|
+
p += 1
|
710
|
+
retry
|
711
|
+
ensure
|
712
|
+
server.close
|
713
|
+
end
|
714
|
+
p
|
715
|
+
end
|
716
|
+
|
692
717
|
before do
|
693
|
-
@socket = TCPServer.new
|
718
|
+
@socket = TCPServer.new port
|
694
719
|
@server = Thread.new do
|
695
720
|
loop do
|
696
|
-
client = @socket.accept
|
697
721
|
begin
|
722
|
+
client = @socket.accept
|
698
723
|
client.puts([
|
699
724
|
"HTTP/1.1 200 OK",
|
700
725
|
"Keep-Alive: timeout=3000",
|
701
726
|
"Connection: Keep-Alive",
|
702
727
|
"Content-Length: 6",
|
703
728
|
"",
|
704
|
-
"Hello!"
|
729
|
+
"Hello!",
|
705
730
|
].join("\n"))
|
706
731
|
client.close
|
707
732
|
rescue IOError => e
|
@@ -716,8 +741,8 @@ describe Manticore::Client do
|
|
716
741
|
# The first time, reply with keepalive, then close the connection
|
717
742
|
# The second connection should succeed
|
718
743
|
|
719
|
-
request1 = client.get("http://localhost
|
720
|
-
request2 = client.get("http://localhost
|
744
|
+
request1 = client.get("http://localhost:#{port}/")
|
745
|
+
request2 = client.get("http://localhost:#{port}/")
|
721
746
|
expect { request1.call }.to_not raise_exception
|
722
747
|
expect { request2.call }.to_not raise_exception
|
723
748
|
|
@@ -731,8 +756,8 @@ describe Manticore::Client do
|
|
731
756
|
it "retries 0 times and fail on the second request" do
|
732
757
|
# The first time, reply with keepalive, then close the connection
|
733
758
|
# The second connection should succeed
|
734
|
-
expect { client.get("http://localhost
|
735
|
-
expect { client.get("http://localhost
|
759
|
+
expect { client.get("http://localhost:#{port}/").call }.to_not raise_exception
|
760
|
+
expect { client.get("http://localhost:#{port}/").call }.to raise_exception(Manticore::SocketException)
|
736
761
|
end
|
737
762
|
end
|
738
763
|
|
@@ -742,8 +767,8 @@ describe Manticore::Client do
|
|
742
767
|
it "succeeds without any retries" do
|
743
768
|
# The first time, reply with keepalive, then close the connection
|
744
769
|
# The second connection should succeed
|
745
|
-
request1 = client.get("http://localhost
|
746
|
-
request2 = client.get("http://localhost
|
770
|
+
request1 = client.get("http://localhost:#{port}/")
|
771
|
+
request2 = client.get("http://localhost:#{port}/")
|
747
772
|
expect { request1.call }.to_not raise_exception
|
748
773
|
expect { request2.call }.to_not raise_exception
|
749
774
|
|
@@ -815,15 +840,15 @@ describe Manticore::Client do
|
|
815
840
|
|
816
841
|
describe "background" do
|
817
842
|
it "returns a response" do
|
818
|
-
expect(
|
843
|
+
expect(client.background.get(local_server)).to be_a Manticore::Response
|
819
844
|
end
|
820
845
|
|
821
846
|
it "has the background flag set" do
|
822
|
-
expect(
|
847
|
+
expect(client.background.get(local_server).background).to eq true
|
823
848
|
end
|
824
849
|
|
825
850
|
it "returns a future when called" do
|
826
|
-
expect(
|
851
|
+
expect(client.background.get(local_server).call).to be_a Java::JavaUtilConcurrent::FutureTask
|
827
852
|
end
|
828
853
|
|
829
854
|
it "evaluates immediately when given a block" do
|
@@ -842,7 +867,7 @@ describe Manticore::Client do
|
|
842
867
|
java_import "java.util.concurrent.TimeUnit"
|
843
868
|
host = URI.parse(uri).host
|
844
869
|
pool = client.instance_variable_get("@pool")
|
845
|
-
req = pool.requestConnection(Java::OrgApacheHttpConnRouting::HttpRoute.new(
|
870
|
+
req = pool.requestConnection(Java::OrgApacheHttpConnRouting::HttpRoute.new(Java::OrgApacheHttp::HttpHost.new(host)), nil)
|
846
871
|
conn = req.get(3, TimeUnit::SECONDS)
|
847
872
|
begin
|
848
873
|
yield conn
|