manticore 0.4.3-java → 0.4.4-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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +12 -1
- data/README.md +3 -2
- data/lib/manticore.rb +0 -1
- data/lib/manticore/client.rb +37 -23
- data/lib/manticore/stubbed_response.rb +2 -2
- data/lib/manticore/version.rb +1 -1
- data/manticore.gemspec +0 -1
- data/spec/manticore/client_spec.rb +32 -0
- data/spec/spec_helper.rb +3 -0
- metadata +3 -16
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e35496eb223648d01aea2dbe4132d88102b599f6
|
4
|
+
data.tar.gz: d87ffe86b45313d8836354c9df4419e3c91c9fd9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e03381476da9b771bf8961c0767312639147d4bc15435879144f4d37960dcac693bc07c43ab9c963fefe846df76163569483040230d852e1038dcff58157fd7a
|
7
|
+
data.tar.gz: 011f97038fd79f71cb3b734639fa468f3395073efe5697d838543ecbe38f26da94ee005726379fedd54cfac9789d9271169a168b0930b1096568d8d98e5a4901
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,20 @@
|
|
1
1
|
## v0.5
|
2
2
|
|
3
|
-
### v0.5.0 (pending)
|
3
|
+
### v0.5.0 (pending, hc-4.5 branch)
|
4
|
+
|
5
|
+
* Upgrade to HTTPClient and HTTPCore 4.5
|
4
6
|
|
5
7
|
## v0.4
|
6
8
|
|
9
|
+
## v0.4.5 (pending, master branch)
|
10
|
+
|
11
|
+
## v0.4.4
|
12
|
+
|
13
|
+
* Manticore now treats post bodies with binary encodings as binary byte lists rather than strings with an encoding
|
14
|
+
* Manticore now treats :params as :query for GET, HEAD, and DELETE requests, where :query is not specified, in order to minimize confusion.
|
15
|
+
* Deprecated dependency on the Addressable gem. URI building is now done with HTTPClient's utils package instead.
|
16
|
+
* Manticore no longer always sets a body and content-length for stubbed responses
|
17
|
+
|
7
18
|
### v0.4.3
|
8
19
|
|
9
20
|
* Manticore no longer automatically retries all request types. Only non-idempotent requests will be automatically retried by default.
|
data/README.md
CHANGED
@@ -46,11 +46,12 @@ Or install it yourself as:
|
|
46
46
|
If you don't want to worry about setting up and maintaining client pools, Manticore comes with a facade that you can use to start making requests right away:
|
47
47
|
|
48
48
|
```ruby
|
49
|
-
|
49
|
+
get_body = Manticore.get("http://www.google.com/", query: {q: "kittens"}).body
|
50
|
+
post_body = Manticore.post("http://www.google.com/", params: {q: "kittens"}).body
|
50
51
|
|
51
52
|
# Or
|
52
53
|
|
53
|
-
|
54
|
+
get_body = Manticore.http(:get, "http://www.google.com/").body
|
54
55
|
```
|
55
56
|
|
56
57
|
This is threadsafe and automatically backed with a pool, so you can execute `Manticore.get` in multiple threads without harming performance.
|
data/lib/manticore.rb
CHANGED
@@ -17,7 +17,6 @@ require_relative "./jar/manticore-ext"
|
|
17
17
|
org.manticore.Manticore.new.load(JRuby.runtime, false)
|
18
18
|
|
19
19
|
require_relative "./manticore/version"
|
20
|
-
require "addressable/uri"
|
21
20
|
|
22
21
|
# HTTP client with the body of a lion and the head of a man. Or more simply, the power of Java
|
23
22
|
# with the beauty of Ruby.
|
data/lib/manticore/client.rb
CHANGED
@@ -6,7 +6,9 @@ module Manticore
|
|
6
6
|
# @!macro [new] http_method_shared
|
7
7
|
# @param url [String] URL to request
|
8
8
|
# @param options [Hash]
|
9
|
-
# @option options [Hash]
|
9
|
+
# @option options [Hash] query Hash of options to be added to the URL as part of the query string
|
10
|
+
# @option options [Hash] params Hash of options to pass as a request body. For GET, HEAD, and DELETE requests,
|
11
|
+
# :params will be treated as :query if :query is not present.
|
10
12
|
# @option options [Hash] headers Hash of options to pass as additional request headers
|
11
13
|
# @option options [String] proxy Proxy host in form: http://proxy.org:1234
|
12
14
|
# @option options [Hash] proxy Proxy host in form: {host: 'proxy.org'[, port: 80[, scheme: 'http']]}
|
@@ -81,6 +83,7 @@ module Manticore
|
|
81
83
|
include_package "java.security.cert"
|
82
84
|
include_package "java.security.spec"
|
83
85
|
include_package "java.security"
|
86
|
+
include_package "org.apache.http.client.utils"
|
84
87
|
java_import "org.apache.http.HttpHost"
|
85
88
|
java_import "javax.net.ssl.SSLContext"
|
86
89
|
java_import "org.manticore.HttpGetWithEntity"
|
@@ -219,6 +222,7 @@ module Manticore
|
|
219
222
|
# Perform a HTTP GET request
|
220
223
|
# @macro http_method_shared_sync
|
221
224
|
def get(url, options = {}, &block)
|
225
|
+
options = treat_params_as_query(options)
|
222
226
|
request HttpGetWithEntity, url, options, &block
|
223
227
|
end
|
224
228
|
|
@@ -231,6 +235,7 @@ module Manticore
|
|
231
235
|
# Perform a HTTP HEAD request
|
232
236
|
# @macro http_method_shared_sync
|
233
237
|
def head(url, options = {}, &block)
|
238
|
+
options = treat_params_as_query(options)
|
234
239
|
request HttpHead, url, options, &block
|
235
240
|
end
|
236
241
|
|
@@ -243,6 +248,7 @@ module Manticore
|
|
243
248
|
# Perform a HTTP DELETE request
|
244
249
|
# @macro http_method_shared_sync
|
245
250
|
def delete(url, options = {}, &block)
|
251
|
+
options = treat_params_as_query(options)
|
246
252
|
request HttpDelete, url, options, &block
|
247
253
|
end
|
248
254
|
|
@@ -406,19 +412,10 @@ module Manticore
|
|
406
412
|
end
|
407
413
|
|
408
414
|
def uri_from_url_and_options(url, options)
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
when Hash
|
414
|
-
uri.query_values = v.merge options[:query]
|
415
|
-
when String
|
416
|
-
uri.query_values = v.merge CGI.parse(options[:query])
|
417
|
-
else
|
418
|
-
raise "Queries must be hashes or strings"
|
419
|
-
end
|
420
|
-
end
|
421
|
-
uri
|
415
|
+
builder = URIBuilder.new(url)
|
416
|
+
pairs = struct_to_name_value_pairs(options[:query])
|
417
|
+
builder.add_parameters pairs unless pairs.empty?
|
418
|
+
builder.to_string
|
422
419
|
end
|
423
420
|
|
424
421
|
def request_from_options(klass, url, options)
|
@@ -427,9 +424,15 @@ module Manticore
|
|
427
424
|
if ( options[:params] || options[:body] || options[:entity]) &&
|
428
425
|
( req.instance_of?(HttpPost) || req.instance_of?(HttpPatch) || req.instance_of?(HttpPut) || req.instance_of?(HttpGetWithEntity))
|
429
426
|
if options[:params]
|
430
|
-
|
427
|
+
pairs = struct_to_name_value_pairs(options[:params])
|
428
|
+
encoding = minimum_encoding_for options[:params].to_s
|
429
|
+
req.set_entity UrlEncodedFormEntity.new(pairs, encoding)
|
431
430
|
elsif options[:body]
|
432
|
-
|
431
|
+
if options[:body].encoding == Encoding::ASCII_8BIT
|
432
|
+
req.set_entity ByteArrayEntity.new(options[:body].to_java_bytes)
|
433
|
+
else
|
434
|
+
req.set_entity StringEntity.new(options[:body], minimum_encoding_for(options[:body]))
|
435
|
+
end
|
433
436
|
elsif options[:entity]
|
434
437
|
req.set_entity options[:entity]
|
435
438
|
end
|
@@ -520,14 +523,17 @@ module Manticore
|
|
520
523
|
end
|
521
524
|
end
|
522
525
|
|
523
|
-
def
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
526
|
+
def struct_to_name_value_pairs(value, namespace = nil)
|
527
|
+
case value
|
528
|
+
when nil
|
529
|
+
[]
|
530
|
+
when Hash
|
531
|
+
value.flat_map {|key, val| struct_to_name_value_pairs val, namespace ? "#{namespace}[#{key}]" : key }
|
532
|
+
when Array
|
533
|
+
value.flat_map {|val| struct_to_name_value_pairs val, namespace }
|
534
|
+
else
|
535
|
+
BasicNameValuePair.new(namespace, value.to_s)
|
529
536
|
end
|
530
|
-
UrlEncodedFormEntity.new(pairs, encoding)
|
531
537
|
end
|
532
538
|
|
533
539
|
# Apache HTTP assumes ISO_8859_1 for StringEntities; we'll try to be nice and pass that when possible
|
@@ -640,6 +646,14 @@ module Manticore
|
|
640
646
|
KeyStore.get_default_type
|
641
647
|
end
|
642
648
|
end
|
649
|
+
|
650
|
+
def treat_params_as_query(options)
|
651
|
+
if options.key?(:params) && !options.key?(:query)
|
652
|
+
options.dup.tap {|o| o[:query] = o.delete(:params) }
|
653
|
+
else
|
654
|
+
options
|
655
|
+
end
|
656
|
+
end
|
643
657
|
end
|
644
658
|
|
645
659
|
class LoggingStandardRetryHandler < Java::OrgApacheHttpImplClient::StandardHttpRequestRetryHandler
|
@@ -36,11 +36,11 @@ module Manticore
|
|
36
36
|
stubs[:cookies].keys.each {|key| stubs[:cookies][key] = Array(stubs[:cookies][key]) }
|
37
37
|
end
|
38
38
|
stubs[:code] ||= 200
|
39
|
-
stubs[:body] ||= "" if stubs[:code] == 200
|
40
39
|
|
41
40
|
stubs[:headers] ||= {}
|
42
41
|
stubs[:headers] = Hash[*stubs[:headers].flat_map {|k, v| [k.downcase, v] }]
|
43
|
-
stubs[:headers]["content-length"]
|
42
|
+
stubs[:headers]["content-length"] ||= stubs[:body].length.to_s if stubs.key?(:body)
|
43
|
+
|
44
44
|
@stubs = stubs
|
45
45
|
|
46
46
|
self
|
data/lib/manticore/version.rb
CHANGED
data/manticore.gemspec
CHANGED
@@ -377,6 +377,32 @@ describe Manticore::Client do
|
|
377
377
|
response = client.get(local_server, body: "This is a post body")
|
378
378
|
expect(JSON.load(response.body)["body"]).to eq "This is a post body"
|
379
379
|
end
|
380
|
+
|
381
|
+
it "can send an array of parameters as :params" do
|
382
|
+
response = client.get(local_server, params: {"foo" => ["baz", "bar"], "bar" => {"baz" => ["bin", 1, :b]}})
|
383
|
+
j = JSON.load(response.body)
|
384
|
+
expect(j["body"]).to eq ""
|
385
|
+
expect(j["uri"]["query"]).to include("foo=baz")
|
386
|
+
end
|
387
|
+
|
388
|
+
it "can send an array of parameters as :query" do
|
389
|
+
response = client.get(local_server, query: {"foo" => ["baz", "bar"]})
|
390
|
+
j = JSON.load(response.body)
|
391
|
+
expect(j["body"]).to eq ""
|
392
|
+
expect(j["uri"]["query"]).to include("foo=baz")
|
393
|
+
end
|
394
|
+
|
395
|
+
it "sends non-ASCII params" do
|
396
|
+
response = client.get(local_server, query: {"∑" => "√"})
|
397
|
+
j = JSON.load(response.body)
|
398
|
+
expect(CGI.unescape j["uri"]["query"]).to eq "∑=√"
|
399
|
+
end
|
400
|
+
|
401
|
+
it "merges implicit query parameters with explicit ones" do
|
402
|
+
response = client.get(local_server + "?foo=bar", query: {"baz" => "bin"})
|
403
|
+
j = JSON.load(response.body)
|
404
|
+
expect(CGI.parse j["uri"]["query"]).to eq({"foo" => ["bar"], "baz" => ["bin"]})
|
405
|
+
end
|
380
406
|
end
|
381
407
|
|
382
408
|
describe "#post" do
|
@@ -405,6 +431,12 @@ describe Manticore::Client do
|
|
405
431
|
expect(CGI.unescape(JSON.load(response.body)["body"])).to eq "∑=√"
|
406
432
|
end
|
407
433
|
|
434
|
+
it "sends a binary body" do
|
435
|
+
bytes = [145, 167, 116, 101, 115, 116, 49, 50, 51].pack("c*").encode("binary")
|
436
|
+
response = client.post(local_server, body: bytes, headers: {"X-Base64" => "1"})
|
437
|
+
expect(Base64.decode64(JSON.load(response.body)["body"])).to eq bytes
|
438
|
+
end
|
439
|
+
|
408
440
|
it "sends an arbitrary entity" do
|
409
441
|
f = open(__FILE__, "r").to_inputstream
|
410
442
|
multipart_entity = MultipartEntityBuilder.create.add_text_body("foo", "bar").add_binary_body("whatever", f , ContentType::TEXT_PLAIN, __FILE__)
|
data/spec/spec_helper.rb
CHANGED
@@ -72,6 +72,9 @@ def start_server(port = PORT)
|
|
72
72
|
if request[:headers]["Accept-Encoding"] && request[:headers]["Accept-Encoding"].match("gzip")
|
73
73
|
out = StringIO.new('', "w")
|
74
74
|
io = Zlib::GzipWriter.new(out, 2)
|
75
|
+
|
76
|
+
request[:body] = Base64.encode64(request[:body]) if request[:headers]["X-Base64"]
|
77
|
+
|
75
78
|
io.write JSON.dump(request)
|
76
79
|
io.close
|
77
80
|
payload = out.string
|
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.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Chris Heald
|
@@ -30,22 +30,8 @@ cert_chain:
|
|
30
30
|
cnyabLOcGIKZNxvnSfwOuCBnjgoSOyJi/n48n1s+OPB/OmPJoWmhKu2DO4sUb4+K
|
31
31
|
/3Mhp5UWSl9SmDR1
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2015-08-
|
33
|
+
date: 2015-08-20 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
requirement: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '2.3'
|
41
|
-
name: addressable
|
42
|
-
prerelease: false
|
43
|
-
type: :runtime
|
44
|
-
version_requirements: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - "~>"
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: '2.3'
|
49
35
|
- !ruby/object:Gem::Dependency
|
50
36
|
requirement: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
@@ -150,3 +136,4 @@ test_files:
|
|
150
136
|
- spec/manticore/stubbed_response_spec.rb
|
151
137
|
- spec/spec_helper.rb
|
152
138
|
- spec/ssl/.keepme
|
139
|
+
has_rdoc:
|
metadata.gz.sig
CHANGED
Binary file
|