manticore 0.4.4-java → 0.5.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +11 -1
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -10
- data/README.md +64 -50
- data/Rakefile +12 -8
- data/ext/manticore/org/manticore/HttpDeleteWithEntity.java +27 -0
- data/ext/manticore/org/manticore/HttpGetWithEntity.java +10 -4
- data/lib/manticore.rb +9 -12
- data/lib/manticore/client.rb +24 -52
- data/lib/manticore/client/proxies.rb +3 -2
- data/lib/manticore/facade.rb +15 -6
- data/lib/manticore/response.rb +18 -10
- data/lib/manticore/version.rb +1 -1
- data/lib/manticore_jars.rb +8 -0
- data/lib/org/manticore/manticore-ext.jar +0 -0
- data/manticore.gemspec +4 -0
- data/spec/manticore/client_proxy_spec.rb +19 -4
- data/spec/manticore/client_spec.rb +88 -9
- data/spec/manticore/facade_spec.rb +9 -4
- data/spec/manticore/response_spec.rb +41 -0
- data/spec/spec_helper.rb +6 -3
- metadata +30 -18
- metadata.gz.sig +0 -0
- data/lib/jar/commons-codec-1.6.jar +0 -0
- data/lib/jar/commons-logging-1.1.3.jar +0 -0
- data/lib/jar/httpclient-4.3.6.jar +0 -0
- data/lib/jar/httpcore-4.3.3.jar +0 -0
- data/lib/jar/httpmime-4.3.6.jar +0 -0
- data/lib/jar/manticore-ext.jar +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9cf2ddebb1afdaa3ee6044c1796c7ec917ba6485
|
4
|
+
data.tar.gz: 452f05d5e780e13b05f2fd7c004c4cc1c858c67f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53c89c946b6d9ec034dc14282b6bd415cac0dba8c82ffee2f0508d3db17f123c874bce492f79efbc6813111767459f942fc902cf2b6a8a1fd3480f670262d8c6
|
7
|
+
data.tar.gz: 0ecd5d823d6e778e57ebfcf5ee63209f5cf5e67620348a18616ea80ca5751054d577c283ad99392b580933849e2bac9cae1dfa3d277e87be24b6e1da12625b50
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,13 +1,23 @@
|
|
1
1
|
## v0.5
|
2
2
|
|
3
|
-
### v0.5.
|
3
|
+
### v0.5.1 (pending)
|
4
|
+
|
5
|
+
### v0.5.0
|
4
6
|
|
5
7
|
* Upgrade to HTTPClient and HTTPCore 4.5
|
8
|
+
* BREAKING CHANGE: Background request usage has changed. See [this commit](https://github.com/cheald/manticore/commit/174e2004d1865c201daf77494d50ab66527c12aa) for details.
|
9
|
+
* Client#async is now soft-deprecated in favor of Client#parallel or Client#batch, as the latter two more accurately reflect the intended usage. Client#background is for
|
10
|
+
"don't block the calling thread"-style asynchronous calls.
|
11
|
+
* Manticore now uses jar-dependencies to install the HTTPComponents et al jars during gem installation, rather than shipping them in the gem
|
12
|
+
* DELETEs may now post entity bodies to allow spec-violate behavior similar to GETs (thanks @hobodave)
|
6
13
|
|
7
14
|
## v0.4
|
8
15
|
|
9
16
|
## v0.4.5 (pending, master branch)
|
10
17
|
|
18
|
+
* If you pass a block to background request creation, the background request is yielded before being queued on the executor. This allows you to attach
|
19
|
+
on_success, etc handlers. This is a stopgap change that is backwards compatible with 0.4.x and will be changing in the 0.5.x release.
|
20
|
+
|
11
21
|
## v0.4.4
|
12
22
|
|
13
23
|
* Manticore now treats post bodies with binary encodings as binary byte lists rather than strings with an encoding
|
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
@@ -1,13 +1,4 @@
|
|
1
|
-
Copyright (c)
|
2
|
-
|
3
|
-
Some JARs distributed with this project are licensed under the Apache 2.0 License. See APACHE-LICENSE-2.0.txt for details:
|
4
|
-
|
5
|
-
lib/jar/commons-logging-1.1.3.jar
|
6
|
-
lib/jar/httpclient-4.3.2.jar
|
7
|
-
lib/jar/httpcore-4.3.1.jar
|
8
|
-
lib/jar/commons-codec-1.6.jar
|
9
|
-
|
10
|
-
All other code distributed with this project is licensed under the MIT License as follows:
|
1
|
+
Copyright (c) 2015 Chris Heald
|
11
2
|
|
12
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
13
4
|
a copy of this software and associated documentation files (the
|
data/README.md
CHANGED
@@ -136,36 +136,41 @@ internal CA, and would proxy all requests through an internal server.
|
|
136
136
|
Creating pools is expensive, so you don't want to be doing it for each request. Instead, you should set up your pools once and then re-use them.
|
137
137
|
Clients and their backing pools are thread-safe, so feel free to set them up once before you start performing parallel operations.
|
138
138
|
|
139
|
+
### Background requests
|
140
|
+
|
141
|
+
You might want to fire off requests without blocking your calling thread. You can do this with `Client#background`:
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
response = client.background.get("http://google.com")
|
145
|
+
.on_success {|response| puts response.code }
|
146
|
+
response.call # The request is now running, but the calling thread isn't blocked. The on_success handler will be evaluated whenever
|
147
|
+
# the request completes.
|
148
|
+
```
|
139
149
|
|
140
150
|
### Parallel execution
|
141
151
|
|
142
|
-
Manticore can perform concurrent execution of multiple requests.
|
152
|
+
Manticore can perform concurrent execution of multiple requests. In previous versions of Manticore, this was called "async". We now call these
|
153
|
+
"parallel" or "batch" requests. `Client#async`, `Client#parallel`, and `Client#batch` are equivalent.
|
143
154
|
|
144
155
|
```ruby
|
145
156
|
client = Manticore::Client.new
|
146
157
|
|
147
158
|
# These aren't actually executed until #execute! is called.
|
148
|
-
# You can define response handlers
|
149
|
-
client.
|
150
|
-
req.on_success do |response|
|
151
|
-
puts response.body
|
152
|
-
end
|
153
|
-
|
154
|
-
req.on_failure do |exception|
|
155
|
-
puts "Boom! #{exception.message}"
|
156
|
-
end
|
157
|
-
}
|
158
|
-
|
159
|
-
# ...or by invoking the method on the queued response returned:
|
160
|
-
response = client.async.get("http://www.yahoo.com")
|
159
|
+
# You can define response handlers on the not-yet-resolved response object:
|
160
|
+
response = client.parallel.get("http://www.yahoo.com")
|
161
161
|
response.on_success do |response|
|
162
162
|
puts "The length of the Yahoo! homepage is #{response.body.length}"
|
163
163
|
end
|
164
164
|
|
165
|
+
response.on_failure do |response|
|
166
|
+
puts "http://www.nooooooooooooooo.com/"
|
167
|
+
end
|
168
|
+
|
165
169
|
# ...or even by chaining them onto the call
|
166
|
-
client.
|
167
|
-
on_success
|
168
|
-
on_failure
|
170
|
+
client.parallel.get("http://bing.com")
|
171
|
+
.on_success {|r| puts r.code }
|
172
|
+
.on_failure {|e| puts "on noes!" }
|
173
|
+
.on_complete { puts "Job's done!" }
|
169
174
|
|
170
175
|
client.execute!
|
171
176
|
```
|
@@ -175,36 +180,56 @@ client.execute!
|
|
175
180
|
Manticore attempts to avoid doing any actual work until right before you need results. As a result,
|
176
181
|
responses are lazy-evaluated as late as possible. The following rules apply:
|
177
182
|
|
178
|
-
1. Synchronous responses are evaluted when you call an accessor on them, like `#body` or `#headers
|
179
|
-
2. Synchronous responses which pass a handler block are evaluated immediately.
|
180
|
-
|
181
|
-
|
183
|
+
1. Synchronous and parallel/batch responses are synchronously evaluted when you call an accessor on them, like `#body` or `#headers`, or invoke them with `#call`
|
184
|
+
2. Synchronous and background responses which pass a handler block are evaluated immediately. Sync responses will block the calling thread until complete,
|
185
|
+
while background responses will not block the calling thread.
|
186
|
+
3. Parallel/batch responses are evaluated when you call `Client#execute!`. Responses which have been previously evaluted by calling an accessor like `#body` or
|
187
|
+
which have been manually called with `#call` will not be re-requested.
|
188
|
+
4. Background responses are evaluated when you call `#call` and return a `Future`, on which you can call `#get` to synchronously get the resolved response.
|
182
189
|
|
183
|
-
As a result,
|
184
|
-
and asynchronous responses in the same fashion:
|
190
|
+
As a result, this allows you to attach handlers to synchronous, background, and parallel responses in the same fashion:
|
185
191
|
|
186
192
|
```ruby
|
187
|
-
|
188
|
-
response = client.get("http://google.com")
|
189
|
-
|
190
|
-
body = response.body
|
191
|
-
|
192
|
-
|
193
|
-
client.
|
194
|
-
|
193
|
+
## Standard/sync requests
|
194
|
+
response = client.get("http://google.com")
|
195
|
+
response.on_success {|r| puts "Success!" } # Because the response isn't running yet, we can attach a handler
|
196
|
+
body = response.body # When you access information from the response, the request finally runs
|
197
|
+
|
198
|
+
## Parallel requests
|
199
|
+
response1 = client.parallel.get("http://google.com")
|
200
|
+
response2 = client.parallel.get("http://yahoo.com")
|
201
|
+
response1.on_success {|response| puts "Yay!" }
|
202
|
+
response2.on_failure {|exception| puts "Whoops!" }
|
203
|
+
client.execute! # Nothing runs until we call Client#execute!
|
204
|
+
body = response1.body # Now the responses are resolved and we can get information from them
|
205
|
+
|
206
|
+
## Background requests
|
207
|
+
request = client.background.get("http://google.com")
|
208
|
+
request.on_success {|r| puts "Success!" } # We can attach handlers before the request is kicked off
|
209
|
+
future = request.call # We invoke #call on it to fire it off.
|
210
|
+
response = future.get # You can get the Response via Future#get. This will block the calling thread until it resolves, though.
|
195
211
|
```
|
196
212
|
|
197
|
-
If you want to
|
198
|
-
call `#call` on the resulting response:
|
213
|
+
If you want to immediately evaluate a request, you can either pass a handler block to it, or you can call `#call` to fire it off:
|
199
214
|
|
200
215
|
```ruby
|
201
216
|
# This will evaluate immediately
|
202
|
-
client.get("http://google.com") {r| r.body }
|
217
|
+
client.get("http://google.com") {|r| r.body }
|
203
218
|
|
204
219
|
# As will this, via explicit invocation of #call
|
205
220
|
client.get("http://google.com").call
|
206
221
|
```
|
207
222
|
|
223
|
+
For batch/parallel/async requests, a passed block will be treated as the on_success handler, but will not cause the
|
224
|
+
request to be immediately invoked:
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
# This will not evaluate yet
|
228
|
+
client.batch.get("http://google.com") {|r| puts "Fetched Google" }
|
229
|
+
# ...but now it does.
|
230
|
+
client.execute!
|
231
|
+
```
|
232
|
+
|
208
233
|
### Stubbing
|
209
234
|
|
210
235
|
Manticore provides a stubbing interface somewhat similar to Typhoeus'
|
@@ -217,18 +242,18 @@ end
|
|
217
242
|
client.clear_stubs!
|
218
243
|
```
|
219
244
|
|
220
|
-
This works for async requests as well:
|
245
|
+
This works for parallel/batch/async requests as well:
|
221
246
|
|
222
247
|
```ruby
|
223
248
|
client.stub("http://google.com", body: "response body", code: 200)
|
224
249
|
|
225
250
|
# The request to google.com returns a stub as expected
|
226
|
-
client.
|
251
|
+
client.parallel.get("http://google.com").on_success do |response|
|
227
252
|
response.should be_a Manticore::ResponseStub
|
228
253
|
end
|
229
254
|
|
230
255
|
# Since yahoo.com isn't stubbed, a full request will be performed
|
231
|
-
client.
|
256
|
+
client.parallel.get("http://yahoo.com").on_success do |response|
|
232
257
|
response.should be_a Manticore::Response
|
233
258
|
end
|
234
259
|
client.clear_stubs!
|
@@ -243,10 +268,10 @@ client.respond_with(body: "body").get("http://google.com") do |response|
|
|
243
268
|
end
|
244
269
|
```
|
245
270
|
|
246
|
-
You can also chain proxies to, say, stub an
|
271
|
+
You can also chain proxies to, say, stub an parallel request:
|
247
272
|
|
248
273
|
```ruby
|
249
|
-
response = client.
|
274
|
+
response = client.parallel.respond_with(body: "response body").get("http://google.com")
|
250
275
|
client.execute!
|
251
276
|
|
252
277
|
response.body.should == "response body"
|
@@ -266,17 +291,6 @@ end
|
|
266
291
|
client.unstub("http://google.com")
|
267
292
|
```
|
268
293
|
|
269
|
-
### Background requests
|
270
|
-
|
271
|
-
You might want to fire-and-forget requests without blocking your calling thread. You can do this with `Client#background`:
|
272
|
-
|
273
|
-
```ruby
|
274
|
-
future = client.background.get("http://google.com")
|
275
|
-
# The request is now running, but the calling thread isn't blocked
|
276
|
-
# Do whatever stuff you need to right now. At some point, if you want the result of the request, you can call `Future#get`:
|
277
|
-
response = future.get
|
278
|
-
```
|
279
|
-
|
280
294
|
### Faraday Adapter
|
281
295
|
|
282
296
|
Manticore includes a Faraday adapter. To use it:
|
data/Rakefile
CHANGED
@@ -7,20 +7,24 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
|
|
7
7
|
end
|
8
8
|
task :default => [:generate_certs, :spec]
|
9
9
|
|
10
|
-
|
10
|
+
# Download and vendor the jars needed
|
11
|
+
require 'jar_installer'
|
12
|
+
task :install_jars do
|
13
|
+
Jars::JarInstaller.new.send :do_install, true, true
|
14
|
+
end
|
11
15
|
|
12
|
-
|
13
|
-
jars
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
]
|
16
|
+
## Build the Manticore extensions into a jar. You may need to install_jars first
|
17
|
+
# Dependency jars for the Manticore ext build
|
18
|
+
require 'rake/javaextensiontask'
|
19
|
+
jars = ["#{ENV['MY_RUBY_HOME']}/lib/jruby.jar"] + Dir.glob("lib/**/*.jar")
|
20
|
+
jars.reject! {|j| j.match("manticore-ext") }
|
18
21
|
Rake::JavaExtensionTask.new do |ext|
|
19
22
|
ext.name = "manticore-ext"
|
20
|
-
ext.lib_dir = "lib/
|
23
|
+
ext.lib_dir = "lib/org/manticore"
|
21
24
|
ext.classpath = jars.map {|x| File.expand_path x}.join ':'
|
22
25
|
end
|
23
26
|
|
27
|
+
# Generate all the stuff we need for a full test run
|
24
28
|
task :generate_certs do
|
25
29
|
root = File.expand_path("../spec/ssl", __FILE__)
|
26
30
|
openssl = `which openssl`.strip
|
@@ -0,0 +1,27 @@
|
|
1
|
+
package org.manticore;
|
2
|
+
|
3
|
+
import java.net.URI;
|
4
|
+
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
|
5
|
+
|
6
|
+
public class HttpDeleteWithEntity extends HttpEntityEnclosingRequestBase {
|
7
|
+
public final static String METHOD_NAME = "DELETE";
|
8
|
+
|
9
|
+
public HttpDeleteWithEntity() {
|
10
|
+
super();
|
11
|
+
}
|
12
|
+
|
13
|
+
public HttpDeleteWithEntity(URI url) {
|
14
|
+
super();
|
15
|
+
setURI(url);
|
16
|
+
}
|
17
|
+
|
18
|
+
public HttpDeleteWithEntity(String url) {
|
19
|
+
super();
|
20
|
+
setURI(URI.create(url));
|
21
|
+
}
|
22
|
+
|
23
|
+
@Override
|
24
|
+
public String getMethod() {
|
25
|
+
return METHOD_NAME;
|
26
|
+
}
|
27
|
+
}
|
@@ -1,17 +1,23 @@
|
|
1
1
|
package org.manticore;
|
2
2
|
|
3
3
|
import java.net.URI;
|
4
|
-
import org.apache.http.client.methods.
|
4
|
+
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
|
5
5
|
|
6
|
-
public class HttpGetWithEntity extends
|
6
|
+
public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase {
|
7
7
|
public final static String METHOD_NAME = "GET";
|
8
8
|
|
9
|
+
public HttpGetWithEntity() {
|
10
|
+
super();
|
11
|
+
}
|
12
|
+
|
9
13
|
public HttpGetWithEntity(URI url) {
|
10
|
-
super(
|
14
|
+
super();
|
15
|
+
setURI(url);
|
11
16
|
}
|
12
17
|
|
13
18
|
public HttpGetWithEntity(String url) {
|
14
|
-
super(
|
19
|
+
super();
|
20
|
+
setURI(URI.create(url));
|
15
21
|
}
|
16
22
|
|
17
23
|
@Override
|
data/lib/manticore.rb
CHANGED
@@ -2,17 +2,8 @@ require 'java'
|
|
2
2
|
require 'uri'
|
3
3
|
require 'cgi'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
begin
|
8
|
-
require_relative "./jar/#{jar}"
|
9
|
-
rescue LoadError
|
10
|
-
raise "Unable to load #{jar}; is there another version of it in your classpath?"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
# 4.3.x
|
15
|
-
require_relative "./jar/manticore-ext"
|
5
|
+
require_relative "./manticore_jars.rb"
|
6
|
+
require_relative "./org/manticore/manticore-ext"
|
16
7
|
|
17
8
|
org.manticore.Manticore.new.load(JRuby.runtime, false)
|
18
9
|
|
@@ -57,4 +48,10 @@ module Manticore
|
|
57
48
|
|
58
49
|
include Facade
|
59
50
|
include_http_client
|
60
|
-
|
51
|
+
|
52
|
+
def self.disable_httpcomponents_logging!
|
53
|
+
props = Java::JavaLang::System.properties
|
54
|
+
props.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog")
|
55
|
+
props.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "error")
|
56
|
+
end
|
57
|
+
end
|
data/lib/manticore/client.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'thread'
|
2
|
-
require 'singleton'
|
3
2
|
require 'base64'
|
4
3
|
|
5
4
|
module Manticore
|
@@ -87,6 +86,7 @@ module Manticore
|
|
87
86
|
java_import "org.apache.http.HttpHost"
|
88
87
|
java_import "javax.net.ssl.SSLContext"
|
89
88
|
java_import "org.manticore.HttpGetWithEntity"
|
89
|
+
java_import "org.manticore.HttpDeleteWithEntity"
|
90
90
|
java_import "org.apache.http.auth.UsernamePasswordCredentials"
|
91
91
|
|
92
92
|
include ProxiesInterface
|
@@ -101,6 +101,8 @@ module Manticore
|
|
101
101
|
DEFAULT_EXPECT_CONTINUE = false
|
102
102
|
DEFAULT_STALE_CHECK = false
|
103
103
|
|
104
|
+
attr_reader :client
|
105
|
+
|
104
106
|
# Create a new HTTP client with a backing request pool. if you pass a block to the initializer, the underlying
|
105
107
|
# {http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/HttpClientBuilder.html HttpClientBuilder}
|
106
108
|
# and {http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/config/RequestConfig.Builder.html RequestConfig.Builder}
|
@@ -134,6 +136,7 @@ module Manticore
|
|
134
136
|
# on GET, HEAD, PUT, DELETE, OPTIONS, and TRACE
|
135
137
|
# @option options [boolean] expect_continue (false) Enable support for HTTP 100
|
136
138
|
# @option options [boolean] stale_check (false) Enable support for stale connection checking. Adds overhead.
|
139
|
+
# @option options [integer] check_connection_timeout (15_000) Connections that haven't been used in this many milliseconds will be validated before being used. Set to a negative number to disable.
|
137
140
|
# @option options [String] proxy Proxy host in form: http://proxy.org:1234
|
138
141
|
# @option options [Hash] proxy Proxy host in form: {host: 'proxy.org'[, port: 80[, scheme: 'http'[, user: 'username@host', password: 'password']]]}
|
139
142
|
# @option options [Hash] proxy Proxy host in form: {url: 'http://proxy.org:1234'[, user: 'username@host', password: 'password']]]}
|
@@ -249,7 +252,7 @@ module Manticore
|
|
249
252
|
# @macro http_method_shared_sync
|
250
253
|
def delete(url, options = {}, &block)
|
251
254
|
options = treat_params_as_query(options)
|
252
|
-
request
|
255
|
+
request HttpDeleteWithEntity, url, options, &block
|
253
256
|
end
|
254
257
|
|
255
258
|
# Perform a HTTP OPTIONS request
|
@@ -361,11 +364,11 @@ module Manticore
|
|
361
364
|
def pool(options = {})
|
362
365
|
@pool ||= begin
|
363
366
|
@max_pool_size = options.fetch(:pool_max, DEFAULT_MAX_POOL_SIZE)
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
367
|
+
pool_builder(options).tap do |cm|
|
368
|
+
cm.set_validate_after_inactivity options.fetch(:check_connection_timeout, 15_000)
|
369
|
+
cm.set_default_max_per_route options.fetch(:pool_max_per_route, @max_pool_size)
|
370
|
+
cm.set_max_total @max_pool_size
|
371
|
+
end
|
369
372
|
end
|
370
373
|
end
|
371
374
|
|
@@ -377,37 +380,32 @@ module Manticore
|
|
377
380
|
|
378
381
|
def request(klass, url, options, &block)
|
379
382
|
req, context = request_from_options(klass, url, options)
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
383
|
+
async = options.delete(:async)
|
384
|
+
background = options.delete(:async_background)
|
385
|
+
create_executor_if_needed if (background || async)
|
386
|
+
response = response_object_for(req, context, &block)
|
387
|
+
|
388
|
+
if async
|
389
|
+
@async_requests << response
|
390
|
+
elsif background
|
391
|
+
response.background = true
|
384
392
|
end
|
385
|
-
end
|
386
393
|
|
387
|
-
|
388
|
-
create_executor_if_needed
|
389
|
-
response = response_object_for(@client, request, context)
|
390
|
-
@async_requests << response
|
391
|
-
response
|
392
|
-
end
|
393
|
-
|
394
|
-
def sync_request(request, context, &block)
|
395
|
-
response = response_object_for(@client, request, context, &block)
|
396
|
-
if block_given?
|
394
|
+
if block_given? && (background || !async)
|
397
395
|
response.call
|
398
396
|
else
|
399
397
|
response
|
400
398
|
end
|
401
399
|
end
|
402
400
|
|
403
|
-
def response_object_for(
|
401
|
+
def response_object_for(request, context, &block)
|
404
402
|
request_uri = request.getURI.to_s
|
405
403
|
|
406
404
|
match_key = @stubs.keys.find { |k| request_uri.match(k) }
|
407
405
|
if match_key
|
408
|
-
StubbedResponse.new(
|
406
|
+
StubbedResponse.new(self, request, context, &block).stub( @stubs[match_key] )
|
409
407
|
else
|
410
|
-
Response.new(
|
408
|
+
Response.new(self, request, context, &block)
|
411
409
|
end
|
412
410
|
end
|
413
411
|
|
@@ -421,8 +419,7 @@ module Manticore
|
|
421
419
|
def request_from_options(klass, url, options)
|
422
420
|
req = klass.new uri_from_url_and_options(url, options).to_s
|
423
421
|
|
424
|
-
if ( options[:params] || options[:body] || options[:entity]) &&
|
425
|
-
( req.instance_of?(HttpPost) || req.instance_of?(HttpPatch) || req.instance_of?(HttpPut) || req.instance_of?(HttpGetWithEntity))
|
422
|
+
if ( options[:params] || options[:body] || options[:entity]) && req.kind_of?(HttpEntityEnclosingRequestBase)
|
426
423
|
if options[:params]
|
427
424
|
pairs = struct_to_name_value_pairs(options[:params])
|
428
425
|
encoding = minimum_encoding_for options[:params].to_s
|
@@ -662,29 +659,4 @@ module Manticore
|
|
662
659
|
super(exception, executionCount, context)
|
663
660
|
end
|
664
661
|
end
|
665
|
-
|
666
|
-
class IdleConnectionReaper
|
667
|
-
include Singleton
|
668
|
-
def initialize
|
669
|
-
@mutex = Mutex.new
|
670
|
-
@pools = []
|
671
|
-
@running = Java::JavaUtilConcurrentAtomic::AtomicBoolean.new(true)
|
672
|
-
@thread = Thread.new do
|
673
|
-
while @running.get
|
674
|
-
@mutex.synchronize { @pools.each(&:closeExpiredConnections) }
|
675
|
-
sleep 5000
|
676
|
-
end
|
677
|
-
end
|
678
|
-
at_exit { shutdown }
|
679
|
-
end
|
680
|
-
|
681
|
-
def monitor(pool)
|
682
|
-
@mutex.synchronize { @pools << pool }
|
683
|
-
end
|
684
|
-
|
685
|
-
def shutdown
|
686
|
-
@running.set(false)
|
687
|
-
@thread.wakeup
|
688
|
-
end
|
689
|
-
end
|
690
662
|
end
|
@@ -9,6 +9,8 @@ module Manticore
|
|
9
9
|
def async
|
10
10
|
AsyncProxy.new(self)
|
11
11
|
end
|
12
|
+
alias_method :parallel, :async
|
13
|
+
alias_method :batch, :async
|
12
14
|
|
13
15
|
# Causes the next request to be made immediately in the background
|
14
16
|
def background
|
@@ -48,8 +50,7 @@ module Manticore
|
|
48
50
|
class BackgroundProxy < BaseProxy
|
49
51
|
%w(get put head post delete options patch).each do |func|
|
50
52
|
define_method func do |url, options = {}, &block|
|
51
|
-
|
52
|
-
@client.executor.java_method(:submit, [java.util.concurrent.Callable.java_class]).call request
|
53
|
+
@client.send(func, url, options.merge(async_background: true), &block)
|
53
54
|
end
|
54
55
|
end
|
55
56
|
end
|
data/lib/manticore/facade.rb
CHANGED
@@ -24,17 +24,26 @@ module Manticore
|
|
24
24
|
# @param options Hash Options to be passed to the underlying shared client, if it has not been created yet.
|
25
25
|
# @return nil
|
26
26
|
def include_http_client(options = {}, &block)
|
27
|
-
|
28
|
-
@manticore_facade = Manticore.instance_variable_get("@manticore_facade")
|
29
|
-
else
|
30
|
-
@manticore_facade = Manticore::Client.new(options, &block)
|
31
|
-
end
|
27
|
+
@__manticore_facade_options = [options, block]
|
32
28
|
class << self
|
33
29
|
extend Forwardable
|
34
|
-
def_delegators "
|
30
|
+
def_delegators "__manticore_facade", :get, :head, :put, :post, :delete, :options, :patch, :http
|
35
31
|
end
|
36
32
|
nil
|
37
33
|
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def __manticore_facade
|
38
|
+
@manticore_facade ||= begin
|
39
|
+
options, block = *@__manticore_facade_options
|
40
|
+
if shared_pool = options.delete(:shared_pool)
|
41
|
+
Manticore.send(:__manticore_facade)
|
42
|
+
else
|
43
|
+
Manticore::Client.new(options, &block)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
38
47
|
end
|
39
48
|
end
|
40
49
|
end
|
data/lib/manticore/response.rb
CHANGED
@@ -20,10 +20,12 @@ module Manticore
|
|
20
20
|
include ResponseHandler
|
21
21
|
include Callable
|
22
22
|
|
23
|
-
|
23
|
+
attr_accessor :background
|
24
|
+
attr_reader :context, :request, :callback_result, :called, :future
|
24
25
|
|
25
26
|
# Creates a new Response
|
26
27
|
#
|
28
|
+
# @param client [Manticore::Client] The client that was used to create this response
|
27
29
|
# @param request [HttpRequestBase] The underlying request object
|
28
30
|
# @param context [HttpContext] The underlying HttpContext
|
29
31
|
def initialize(client, request, context, &block)
|
@@ -41,10 +43,11 @@ module Manticore
|
|
41
43
|
# Implementation of Callable#call
|
42
44
|
# Used by Manticore::Client to invoke the request tied to this response.
|
43
45
|
def call
|
46
|
+
return background! if @background
|
44
47
|
raise "Already called" if @called
|
45
48
|
@called = true
|
46
49
|
begin
|
47
|
-
@client.execute @request, self, @context
|
50
|
+
@client.client.execute @request, self, @context
|
48
51
|
rescue Java::JavaNet::SocketTimeoutException => e
|
49
52
|
ex = Manticore::SocketTimeout
|
50
53
|
rescue Java::OrgApacheHttpConn::ConnectTimeoutException => e
|
@@ -76,10 +79,6 @@ module Manticore
|
|
76
79
|
end
|
77
80
|
end
|
78
81
|
|
79
|
-
def fire_and_forget
|
80
|
-
@client.executor.submit self
|
81
|
-
end
|
82
|
-
|
83
82
|
# Fetch the final resolved URL for this response. Will call the request if it has not been called yet.
|
84
83
|
#
|
85
84
|
# @return [String]
|
@@ -200,7 +199,7 @@ module Manticore
|
|
200
199
|
alias_method :failure, :on_failure
|
201
200
|
alias_method :fail, :on_failure
|
202
201
|
|
203
|
-
# Set handler for cancelled requests
|
202
|
+
# Set handler for cancelled requests. NB: Not actually used right now?
|
204
203
|
# @param block Proc which will be invoked on a on a cancelled response.
|
205
204
|
#
|
206
205
|
# @return self
|
@@ -212,9 +211,9 @@ module Manticore
|
|
212
211
|
alias_method :cancellation, :on_cancelled
|
213
212
|
alias_method :on_cancellation, :on_cancelled
|
214
213
|
|
215
|
-
# Set handler for
|
216
|
-
# @param block Proc which will be invoked on a on a
|
217
|
-
#
|
214
|
+
# Set handler for completed requests
|
215
|
+
# @param block Proc which will be invoked on a on a completed response. This handler will be called
|
216
|
+
# regardless of request success/failure.
|
218
217
|
# @return self
|
219
218
|
def on_complete(&block)
|
220
219
|
@handlers[:complete] = Array(@handlers[:complete]).compact + [block]
|
@@ -230,6 +229,11 @@ module Manticore
|
|
230
229
|
|
231
230
|
private
|
232
231
|
|
232
|
+
def background!
|
233
|
+
@background = false
|
234
|
+
@future ||= @client.executor.java_method(:submit, [java.util.concurrent.Callable.java_class]).call(self)
|
235
|
+
end
|
236
|
+
|
233
237
|
# Implementation of {http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/ResponseHandler.html#handleResponse(org.apache.http.HttpResponse) ResponseHandler#handleResponse}
|
234
238
|
# @param response [Response] The underlying Java Response object
|
235
239
|
def handleResponse(response)
|
@@ -242,7 +246,11 @@ module Manticore
|
|
242
246
|
end
|
243
247
|
|
244
248
|
def call_once
|
249
|
+
is_background = @background
|
245
250
|
call unless called?
|
251
|
+
# If this is a background request, then we don't want to allow the usage of sync methods, as it's probably a semantic error. We could resolve the future
|
252
|
+
# but that'll probably result in blocking foreground threads unintentionally. Fail loudly.
|
253
|
+
raise RuntimeError.new("Cannot call synchronous methods on a background response. Use an on_success handler instead.") if is_background && @future
|
246
254
|
@called = true
|
247
255
|
end
|
248
256
|
|
data/lib/manticore/version.rb
CHANGED
@@ -0,0 +1,8 @@
|
|
1
|
+
# this is a generated file, to avoid over-writing it just delete this comment
|
2
|
+
require 'jar_dependencies'
|
3
|
+
|
4
|
+
require_jar( 'org.apache.httpcomponents', 'httpclient', '4.5' )
|
5
|
+
require_jar( 'org.apache.httpcomponents', 'httpcore', '4.4.1' )
|
6
|
+
require_jar( 'commons-codec', 'commons-codec', '1.9' )
|
7
|
+
require_jar( 'commons-logging', 'commons-logging', '1.2' )
|
8
|
+
require_jar( 'org.apache.httpcomponents', 'httpmime', '4.5' )
|
Binary file
|
data/manticore.gemspec
CHANGED
@@ -27,4 +27,8 @@ Gem::Specification.new do |spec|
|
|
27
27
|
|
28
28
|
spec.add_development_dependency "bundler", "~> 1.3"
|
29
29
|
spec.add_development_dependency "rake"
|
30
|
+
|
31
|
+
spec.add_runtime_dependency "jar-dependencies"
|
32
|
+
spec.requirements << "jar org.apache.httpcomponents:httpclient, 4.5"
|
33
|
+
spec.requirements << "jar org.apache.httpcomponents:httpmime, 4.5"
|
30
34
|
end
|
@@ -75,7 +75,7 @@ describe Manticore::Client do
|
|
75
75
|
describe Manticore::Client::BackgroundProxy do
|
76
76
|
it "does not block execution" do
|
77
77
|
anchor = Time.now.to_f
|
78
|
-
future = client.background.get("http://localhost:55441/?sleep=1.5")
|
78
|
+
future = client.background.get("http://localhost:55441/?sleep=1.5").call
|
79
79
|
expect(Time.now.to_f - anchor).to be < 1.0
|
80
80
|
|
81
81
|
response = future.get
|
@@ -83,10 +83,25 @@ describe Manticore::Client do
|
|
83
83
|
expect(response.body).to match(/sleep=1.5/)
|
84
84
|
end
|
85
85
|
|
86
|
-
it "returns a
|
86
|
+
it "returns a response proxy" do
|
87
87
|
response = client.background.get("http://localhost:55441/")
|
88
|
-
expect(response).to be_a
|
89
|
-
|
88
|
+
expect(response).to be_a Manticore::Response
|
89
|
+
|
90
|
+
success = false
|
91
|
+
response.on_success do
|
92
|
+
success = true
|
93
|
+
end
|
94
|
+
|
95
|
+
response.call.get
|
96
|
+
expect(success).to eq true
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "#call" do
|
100
|
+
it "returns a future" do
|
101
|
+
response = client.background.get("http://localhost:55441/").call
|
102
|
+
expect(response).to be_a Java::JavaUtilConcurrent::FutureTask
|
103
|
+
response.get
|
104
|
+
end
|
90
105
|
end
|
91
106
|
end
|
92
107
|
end
|
@@ -462,6 +462,18 @@ describe Manticore::Client do
|
|
462
462
|
end
|
463
463
|
end
|
464
464
|
|
465
|
+
describe "#delete" do
|
466
|
+
it "works" do
|
467
|
+
response = client.delete(local_server)
|
468
|
+
expect(JSON.load(response.body)["method"]).to eq "DELETE"
|
469
|
+
end
|
470
|
+
|
471
|
+
it "sends a body" do
|
472
|
+
response = client.delete(local_server, body: "This is a delete body")
|
473
|
+
expect(JSON.load(response.body)["body"]).to eq "This is a delete body"
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
465
477
|
describe "#head" do
|
466
478
|
it "works" do
|
467
479
|
response = client.head(local_server)
|
@@ -634,15 +646,18 @@ describe Manticore::Client do
|
|
634
646
|
@server = Thread.new do
|
635
647
|
loop do
|
636
648
|
client = @socket.accept
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
649
|
+
begin
|
650
|
+
client.puts([
|
651
|
+
"HTTP/1.1 200 OK",
|
652
|
+
"Keep-Alive: timeout=3000",
|
653
|
+
"Connection: Keep-Alive",
|
654
|
+
"Content-Length: 6",
|
655
|
+
"",
|
656
|
+
"Hello!"
|
657
|
+
].join("\n"))
|
658
|
+
client.close
|
659
|
+
rescue StandardError => e
|
660
|
+
end
|
646
661
|
end
|
647
662
|
end
|
648
663
|
end
|
@@ -707,6 +722,70 @@ describe Manticore::Client do
|
|
707
722
|
end
|
708
723
|
end
|
709
724
|
|
725
|
+
describe "request types:" do
|
726
|
+
describe "sync" do
|
727
|
+
it "returns a response" do
|
728
|
+
expect(client.get(local_server)).to be_a Manticore::Response
|
729
|
+
end
|
730
|
+
|
731
|
+
it "evaluates immediately when given a block" do
|
732
|
+
called = false
|
733
|
+
expect { client.get(local_server) { called = true } }.to change { called }.to(true)
|
734
|
+
end
|
735
|
+
|
736
|
+
it "can be evaluated synchronously on-demand" do
|
737
|
+
expect(client.get(local_server).body).to be_a String
|
738
|
+
end
|
739
|
+
end
|
740
|
+
|
741
|
+
describe "async" do
|
742
|
+
it "returns a response" do
|
743
|
+
expect(client.async.get(local_server)).to be_a Manticore::Response
|
744
|
+
end
|
745
|
+
|
746
|
+
it "works with `parallel`" do
|
747
|
+
expect(client.parallel.get(local_server)).to be_a Manticore::Response
|
748
|
+
end
|
749
|
+
|
750
|
+
it "works with `batch`" do
|
751
|
+
expect(client.parallel.get(local_server)).to be_a Manticore::Response
|
752
|
+
end
|
753
|
+
|
754
|
+
it "does not evaluate immediately when given a block" do
|
755
|
+
called = false
|
756
|
+
expect { client.async.get(local_server) { called = true }; sleep 0.5 }.to_not change { called }
|
757
|
+
end
|
758
|
+
|
759
|
+
it "can be evaluated synchronously on-demand" do
|
760
|
+
expect(client.async.get(local_server).body).to be_a String
|
761
|
+
end
|
762
|
+
end
|
763
|
+
|
764
|
+
describe "background" do
|
765
|
+
it "returns a response" do
|
766
|
+
expect( client.background.get(local_server) ).to be_a Manticore::Response
|
767
|
+
end
|
768
|
+
|
769
|
+
it "has the background flag set" do
|
770
|
+
expect( client.background.get(local_server).background ).to eq true
|
771
|
+
end
|
772
|
+
|
773
|
+
it "returns a future when called" do
|
774
|
+
expect( client.background.get(local_server).call ).to be_a Java::JavaUtilConcurrent::FutureTask
|
775
|
+
end
|
776
|
+
|
777
|
+
it "evaluates immediately when given a block" do
|
778
|
+
called = false
|
779
|
+
expect { (client.background.get(local_server) { called = true }).get }.to change { called }.to(true)
|
780
|
+
end
|
781
|
+
|
782
|
+
it "raises an exception when a sync method is called on it" do
|
783
|
+
called = false
|
784
|
+
expect { client.background.get(local_server).body }.to raise_exception(RuntimeError)
|
785
|
+
end
|
786
|
+
end
|
787
|
+
end
|
788
|
+
|
710
789
|
def get_connection(client, uri, &block)
|
711
790
|
java_import "java.util.concurrent.TimeUnit"
|
712
791
|
host = URI.parse(uri).host
|
@@ -22,13 +22,18 @@ describe Manticore::Facade do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it "does not use the shared client by default" do
|
25
|
-
expect(extended_class.
|
26
|
-
Manticore.
|
25
|
+
expect(extended_class.send(:__manticore_facade).object_id).to_not eq \
|
26
|
+
Manticore.send(:__manticore_facade).object_id
|
27
27
|
end
|
28
28
|
|
29
29
|
it "is able to use the shared client" do
|
30
|
-
expect(extended_shared_class.
|
31
|
-
Manticore.
|
30
|
+
expect(extended_shared_class.send(:__manticore_facade).object_id).to eq \
|
31
|
+
Manticore.send(:__manticore_facade).object_id
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should work with #http" do
|
35
|
+
result = JSON.parse extended_class.http(:get, local_server).body
|
36
|
+
expect(result["method"]).to eq "GET"
|
32
37
|
end
|
33
38
|
end
|
34
39
|
|
@@ -46,4 +46,45 @@ describe Manticore::Response do
|
|
46
46
|
expect { client.get(local_server).call rescue nil }.to_not change { client.pool_stats[:available] }
|
47
47
|
end
|
48
48
|
end
|
49
|
+
|
50
|
+
context "given a success handler" do
|
51
|
+
let(:responses) { {} }
|
52
|
+
let(:response) do
|
53
|
+
client.get(url)
|
54
|
+
.on_success {|resp| responses[:success] = true }
|
55
|
+
.on_failure {responses[:failure] = true }
|
56
|
+
.on_complete {responses[:complete] = true }
|
57
|
+
end
|
58
|
+
|
59
|
+
context "a succeeded request" do
|
60
|
+
let(:url) { local_server }
|
61
|
+
it "runs the success handler" do
|
62
|
+
expect { response.call }.to change { responses[:success] }.to true
|
63
|
+
end
|
64
|
+
|
65
|
+
it "does not run the failure handler" do
|
66
|
+
expect { response.call }.to_not change { responses[:failure] }
|
67
|
+
end
|
68
|
+
|
69
|
+
it "runs the completed handler" do
|
70
|
+
expect { response.call }.to change { responses[:complete] }.to true
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "a failed request" do
|
75
|
+
let(:url) { local_server("/failearly") }
|
76
|
+
it "does not run the success handler" do
|
77
|
+
expect { response.call }.to_not change { responses[:success] }
|
78
|
+
end
|
79
|
+
|
80
|
+
it "runs the failure handler" do
|
81
|
+
expect { response.call }.to change { responses[:failure] }.to true
|
82
|
+
end
|
83
|
+
|
84
|
+
it "runs the completed handler" do
|
85
|
+
expect { response.call }.to change { responses[:complete] }.to true
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
49
90
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,6 +8,7 @@ require 'webrick'
|
|
8
8
|
require 'webrick/https'
|
9
9
|
require 'openssl'
|
10
10
|
require 'rspec/its'
|
11
|
+
require 'logger'
|
11
12
|
|
12
13
|
PORT = 55441
|
13
14
|
|
@@ -31,7 +32,7 @@ end
|
|
31
32
|
def start_server(port = PORT)
|
32
33
|
@servers ||= {}
|
33
34
|
@servers[port] = Thread.new {
|
34
|
-
Net::HTTP::Server.run(port: port) do |request, stream|
|
35
|
+
Net::HTTP::Server.run(port: port, log: Logger.new("/dev/null")) do |request, stream|
|
35
36
|
|
36
37
|
query = Rack::Utils.parse_query(request[:uri][:query].to_s)
|
37
38
|
if query["sleep"]
|
@@ -72,9 +73,9 @@ def start_server(port = PORT)
|
|
72
73
|
if request[:headers]["Accept-Encoding"] && request[:headers]["Accept-Encoding"].match("gzip")
|
73
74
|
out = StringIO.new('', "w")
|
74
75
|
io = Zlib::GzipWriter.new(out, 2)
|
75
|
-
|
76
|
+
|
76
77
|
request[:body] = Base64.encode64(request[:body]) if request[:headers]["X-Base64"]
|
77
|
-
|
78
|
+
|
78
79
|
io.write JSON.dump(request)
|
79
80
|
io.close
|
80
81
|
payload = out.string
|
@@ -127,6 +128,8 @@ RSpec.configure do |c|
|
|
127
128
|
start_server 55442
|
128
129
|
start_ssl_server 55444
|
129
130
|
start_ssl_server 55445, :SSLVerifyClient => OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT, :SSLCACertificateFile => File.expand_path("../ssl/root-ca.crt", __FILE__)
|
131
|
+
|
132
|
+
Manticore.disable_httpcomponents_logging!
|
130
133
|
}
|
131
134
|
|
132
135
|
c.after(:suite) { stop_servers }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: manticore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Chris Heald
|
@@ -30,12 +30,12 @@ cert_chain:
|
|
30
30
|
cnyabLOcGIKZNxvnSfwOuCBnjgoSOyJi/n48n1s+OPB/OmPJoWmhKu2DO4sUb4+K
|
31
31
|
/3Mhp5UWSl9SmDR1
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2015-
|
33
|
+
date: 2015-10-07 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.3'
|
41
41
|
name: bundler
|
@@ -43,13 +43,13 @@ dependencies:
|
|
43
43
|
type: :development
|
44
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ~>
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '1.3'
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
name: rake
|
@@ -57,7 +57,21 @@ dependencies:
|
|
57
57
|
type: :development
|
58
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
name: jar-dependencies
|
70
|
+
prerelease: false
|
71
|
+
type: :runtime
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
61
75
|
- !ruby/object:Gem::Version
|
62
76
|
version: '0'
|
63
77
|
description: Manticore is an HTTP client built on the Apache HttpCore components
|
@@ -67,24 +81,19 @@ executables: []
|
|
67
81
|
extensions: []
|
68
82
|
extra_rdoc_files: []
|
69
83
|
files:
|
70
|
-
-
|
71
|
-
-
|
84
|
+
- .gitignore
|
85
|
+
- .travis.yml
|
72
86
|
- APACHE-LICENSE-2.0.txt
|
73
87
|
- CHANGELOG.md
|
74
88
|
- Gemfile
|
75
89
|
- LICENSE.txt
|
76
90
|
- README.md
|
77
91
|
- Rakefile
|
92
|
+
- ext/manticore/org/manticore/HttpDeleteWithEntity.java
|
78
93
|
- ext/manticore/org/manticore/HttpGetWithEntity.java
|
79
94
|
- ext/manticore/org/manticore/Manticore.java
|
80
95
|
- gem-public_cert.pem
|
81
96
|
- lib/faraday/adapter/manticore.rb
|
82
|
-
- lib/jar/commons-codec-1.6.jar
|
83
|
-
- lib/jar/commons-logging-1.1.3.jar
|
84
|
-
- lib/jar/httpclient-4.3.6.jar
|
85
|
-
- lib/jar/httpcore-4.3.3.jar
|
86
|
-
- lib/jar/httpmime-4.3.6.jar
|
87
|
-
- lib/jar/manticore-ext.jar
|
88
97
|
- lib/manticore.rb
|
89
98
|
- lib/manticore/client.rb
|
90
99
|
- lib/manticore/client/proxies.rb
|
@@ -94,6 +103,8 @@ files:
|
|
94
103
|
- lib/manticore/response.rb
|
95
104
|
- lib/manticore/stubbed_response.rb
|
96
105
|
- lib/manticore/version.rb
|
106
|
+
- lib/manticore_jars.rb
|
107
|
+
- lib/org/manticore/manticore-ext.jar
|
97
108
|
- manticore.gemspec
|
98
109
|
- spec/manticore/client_proxy_spec.rb
|
99
110
|
- spec/manticore/client_spec.rb
|
@@ -113,15 +124,17 @@ require_paths:
|
|
113
124
|
- lib
|
114
125
|
required_ruby_version: !ruby/object:Gem::Requirement
|
115
126
|
requirements:
|
116
|
-
- -
|
127
|
+
- - '>='
|
117
128
|
- !ruby/object:Gem::Version
|
118
129
|
version: '0'
|
119
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
131
|
requirements:
|
121
|
-
- -
|
132
|
+
- - '>='
|
122
133
|
- !ruby/object:Gem::Version
|
123
134
|
version: '0'
|
124
|
-
requirements:
|
135
|
+
requirements:
|
136
|
+
- jar org.apache.httpcomponents:httpclient, 4.5
|
137
|
+
- jar org.apache.httpcomponents:httpmime, 4.5
|
125
138
|
rubyforge_project:
|
126
139
|
rubygems_version: 2.4.8
|
127
140
|
signing_key:
|
@@ -136,4 +149,3 @@ test_files:
|
|
136
149
|
- spec/manticore/stubbed_response_spec.rb
|
137
150
|
- spec/spec_helper.rb
|
138
151
|
- spec/ssl/.keepme
|
139
|
-
has_rdoc:
|
metadata.gz.sig
CHANGED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/jar/httpcore-4.3.3.jar
DELETED
Binary file
|
data/lib/jar/httpmime-4.3.6.jar
DELETED
Binary file
|
data/lib/jar/manticore-ext.jar
DELETED
Binary file
|