manticore 0.6.1-java → 0.6.2-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Manticore::Cookie do
|
4
4
|
context "created from a Client request" do
|
@@ -9,28 +9,27 @@ describe Manticore::Cookie do
|
|
9
9
|
response.cookies["x"].first
|
10
10
|
}
|
11
11
|
|
12
|
-
its(:name)
|
13
|
-
its(:value)
|
14
|
-
its(:path)
|
12
|
+
its(:name) { is_expected.to eq "x" }
|
13
|
+
its(:value) { is_expected.to eq "2" }
|
14
|
+
its(:path) { is_expected.to eq "/" }
|
15
15
|
its(:domain) { is_expected.to eq "localhost" }
|
16
16
|
end
|
17
17
|
|
18
|
-
|
19
|
-
let(:opts) {{}}
|
18
|
+
let(:opts) { {} }
|
20
19
|
subject {
|
21
20
|
Manticore::Cookie.new({name: "foo", value: "bar"}.merge(opts))
|
22
21
|
}
|
23
22
|
|
24
|
-
its(:secure?)
|
23
|
+
its(:secure?) { is_expected.to be nil }
|
25
24
|
its(:persistent?) { is_expected.to be nil }
|
26
25
|
|
27
26
|
context "created as secure" do
|
28
|
-
let(:opts) {{
|
27
|
+
let(:opts) { {secure: true} }
|
29
28
|
its(:secure?) { is_expected.to be true }
|
30
29
|
end
|
31
30
|
|
32
31
|
context "created as persistent" do
|
33
|
-
let(:opts) {{
|
32
|
+
let(:opts) { {persistent: true} }
|
34
33
|
its(:persistent?) { is_expected.to be true }
|
35
34
|
end
|
36
|
-
end
|
35
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Manticore::Facade do
|
4
4
|
context "when extended into an arbitrary class" do
|
5
5
|
let(:extended_class) {
|
6
|
-
|
6
|
+
Class.new do
|
7
7
|
include Manticore::Facade
|
8
8
|
include_http_client
|
9
9
|
end
|
10
10
|
}
|
11
11
|
|
12
12
|
let(:extended_shared_class) {
|
13
|
-
|
13
|
+
Class.new do
|
14
14
|
include Manticore::Facade
|
15
15
|
include_http_client shared_pool: true
|
16
16
|
end
|
@@ -23,12 +23,12 @@ describe Manticore::Facade do
|
|
23
23
|
|
24
24
|
it "does not use the shared client by default" do
|
25
25
|
expect(extended_class.send(:__manticore_facade).object_id).to_not eq \
|
26
|
-
|
26
|
+
Manticore.send(:__manticore_facade).object_id
|
27
27
|
end
|
28
28
|
|
29
29
|
it "is able to use the shared client" do
|
30
30
|
expect(extended_shared_class.send(:__manticore_facade).object_id).to eq \
|
31
|
-
|
31
|
+
Manticore.send(:__manticore_facade).object_id
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should work with #http" do
|
@@ -43,4 +43,4 @@ describe Manticore::Facade do
|
|
43
43
|
expect(result["method"]).to eq "GET"
|
44
44
|
end
|
45
45
|
end
|
46
|
-
end
|
46
|
+
end
|
@@ -1,19 +1,19 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Manticore::Response do
|
4
4
|
let(:client) { Manticore::Client.new }
|
5
|
-
subject { client.get(
|
5
|
+
subject { client.get(local_server) }
|
6
6
|
|
7
7
|
its(:headers) { is_expected.to be_a Hash }
|
8
|
-
its(:body)
|
9
|
-
its(:length)
|
8
|
+
its(:body) { is_expected.to be_a String }
|
9
|
+
its(:length) { is_expected.to be_a Fixnum }
|
10
10
|
|
11
11
|
it "provides response header lookup via #[]" do
|
12
|
-
expect(subject["Content-Type"]).to eq "
|
12
|
+
expect(subject["Content-Type"]).to eq "application/json"
|
13
13
|
end
|
14
14
|
|
15
15
|
context "when a response contains repeated headers" do
|
16
|
-
subject { client.get(
|
16
|
+
subject { client.get(local_server "/repeated_headers") }
|
17
17
|
|
18
18
|
it "returns an array of values for headers with multiple occurrances" do
|
19
19
|
expect(subject.headers["link"]).to eq ["foo", "bar"]
|
@@ -39,14 +39,14 @@ describe Manticore::Response do
|
|
39
39
|
context "when the client is invoked with a block" do
|
40
40
|
it "allows reading the body from a block" do
|
41
41
|
response = client.get(local_server) do |response|
|
42
|
-
expect(response.body).to match
|
42
|
+
expect(response.body).to match "Manticore"
|
43
43
|
end
|
44
44
|
|
45
45
|
expect(response.body).to match "Manticore"
|
46
46
|
end
|
47
47
|
|
48
48
|
it "does not read the body implicitly if called with a block" do
|
49
|
-
response = client.get(local_server) {}
|
49
|
+
response = client.get(local_server) { }
|
50
50
|
expect { response.body }.to raise_exception(Manticore::StreamClosedException)
|
51
51
|
end
|
52
52
|
end
|
@@ -63,9 +63,9 @@ describe Manticore::Response do
|
|
63
63
|
let(:responses) { {} }
|
64
64
|
let(:response) do
|
65
65
|
client.get(url)
|
66
|
-
.on_success {|resp| responses[:success] = true }
|
67
|
-
.on_failure {responses[:failure]
|
68
|
-
.on_complete {responses[:complete]
|
66
|
+
.on_success { |resp| responses[:success] = true }
|
67
|
+
.on_failure { responses[:failure] = true }
|
68
|
+
.on_complete { responses[:complete] = true }
|
69
69
|
end
|
70
70
|
|
71
71
|
context "a succeeded request" do
|
@@ -97,6 +97,5 @@ describe Manticore::Response do
|
|
97
97
|
expect { response.call }.to change { responses[:complete] }.to true
|
98
98
|
end
|
99
99
|
end
|
100
|
-
|
101
100
|
end
|
102
101
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Manticore::StubbedResponse do
|
4
4
|
subject {
|
@@ -7,9 +7,9 @@ describe Manticore::StubbedResponse do
|
|
7
7
|
code: 200,
|
8
8
|
headers: {
|
9
9
|
"Content-Type" => "text/plain",
|
10
|
-
"Set-Cookie" => ["k=v; path=/; domain=localhost", "k=v; path=/sub; domain=sub.localhost", "k2=v2;2 path=/; domain=localhost"]
|
10
|
+
"Set-Cookie" => ["k=v; path=/; domain=localhost", "k=v; path=/sub; domain=sub.localhost", "k2=v2;2 path=/; domain=localhost"],
|
11
11
|
},
|
12
|
-
cookies: {"test" => Manticore::Cookie.new(name: "test", value: "something", path: "/")}
|
12
|
+
cookies: {"test" => Manticore::Cookie.new(name: "test", value: "something", path: "/")},
|
13
13
|
).call
|
14
14
|
}
|
15
15
|
|
@@ -31,7 +31,7 @@ describe Manticore::StubbedResponse do
|
|
31
31
|
|
32
32
|
it "calls on_success handlers" do
|
33
33
|
called = false
|
34
|
-
Manticore::StubbedResponse.stub.on_success {|resp| called = true }.call
|
34
|
+
Manticore::StubbedResponse.stub.on_success { |resp| called = true }.call
|
35
35
|
expect(called).to be true
|
36
36
|
end
|
37
37
|
|
@@ -43,7 +43,7 @@ describe Manticore::StubbedResponse do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
it "passes bodies to blocks for streaming reads" do
|
46
|
-
total = ""; subject.body {|chunk| total << chunk }
|
46
|
+
total = ""; subject.body { |chunk| total << chunk }
|
47
47
|
expect(total).to eq("test body")
|
48
48
|
end
|
49
49
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,21 +1,24 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
1
|
+
# encoding: utf-8
|
2
|
+
require "rubygems"
|
3
|
+
require "bundler/setup"
|
4
|
+
require "manticore"
|
5
|
+
require "zlib"
|
6
|
+
require "json"
|
7
|
+
require "rack"
|
8
|
+
require "webrick"
|
9
|
+
require "webrick/https"
|
10
|
+
require "openssl"
|
11
|
+
require "rspec/its"
|
12
|
+
require "logger"
|
12
13
|
|
13
14
|
PORT = 55441
|
14
15
|
|
15
16
|
def local_server(path = "/", port = PORT)
|
16
17
|
URI.join("http://localhost:#{port}", path).to_s
|
17
18
|
end
|
19
|
+
|
18
20
|
Thread.abort_on_exception = true
|
21
|
+
Thread.report_on_exception = false if Thread.respond_to?(:report_on_exception)
|
19
22
|
|
20
23
|
def read_nonblock(socket)
|
21
24
|
buffer = ""
|
@@ -34,7 +37,6 @@ def start_server(port = PORT)
|
|
34
37
|
@servers ||= {}
|
35
38
|
@servers[port] = Thread.new {
|
36
39
|
Net::HTTP::Server.run(port: port, log: open("/dev/null", "a")) do |request, stream|
|
37
|
-
|
38
40
|
query = Rack::Utils.parse_query(request[:uri][:query].to_s)
|
39
41
|
if query["sleep"]
|
40
42
|
sleep(query["sleep"].to_f)
|
@@ -44,13 +46,13 @@ def start_server(port = PORT)
|
|
44
46
|
request[:body] = read_nonblock(stream.socket)
|
45
47
|
end
|
46
48
|
|
47
|
-
content_type = request[:headers]["X-Content-Type"] || "
|
49
|
+
content_type = request[:headers]["X-Content-Type"] || "application/json"
|
48
50
|
if request[:uri][:path] == "/auth"
|
49
51
|
if request[:headers]["Authorization"] == "Basic dXNlcjpwYXNz"
|
50
52
|
payload = JSON.dump(request)
|
51
|
-
[200, {
|
53
|
+
[200, {"Content-Type" => content_type, "Content-Length" => payload.length}, [payload]]
|
52
54
|
else
|
53
|
-
[401, {
|
55
|
+
[401, {"WWW-Authenticate" => 'Basic realm="test"'}, [""]]
|
54
56
|
end
|
55
57
|
elsif request[:uri][:path] == "/failearly"
|
56
58
|
# Return an invalid HTTP response
|
@@ -64,35 +66,38 @@ def start_server(port = PORT)
|
|
64
66
|
end
|
65
67
|
elsif request[:uri][:path] == "/proxy"
|
66
68
|
payload = JSON.dump(request.merge(server_port: port))
|
67
|
-
[200, {
|
69
|
+
[200, {"Content-Type" => content_type, "Content-Length" => payload.length}, [payload]]
|
70
|
+
elsif request[:uri][:path] == "/json_utf8"
|
71
|
+
payload = JSON.dump("first_name" => "Mark", "last_name" => "Töger")
|
72
|
+
[200, {"Content-Type" => "application/json", "Content-Length" => payload.length}, [payload]]
|
68
73
|
elsif request[:uri][:path] == "/authproxy"
|
69
74
|
payload = JSON.dump(request.merge(server_port: port))
|
70
75
|
if request[:headers]["Proxy-Authorization"] == "Basic dXNlcjpwYXNz"
|
71
|
-
[200, {
|
76
|
+
[200, {"Content-Type" => content_type, "Content-Length" => payload.length}, [payload]]
|
72
77
|
else
|
73
|
-
[407, {
|
78
|
+
[407, {"Proxy-Authenticate" => 'Basic realm="localhost'}, [payload]]
|
74
79
|
end
|
75
80
|
elsif request[:uri][:path] == "/keepalive"
|
76
81
|
payload = JSON.dump(request.merge(server_port: port))
|
77
|
-
[200, {
|
82
|
+
[200, {"Content-Type" => content_type, "Content-Length" => payload.length, "Keep-Alive" => "timeout=60"}, [payload]]
|
78
83
|
elsif request[:uri][:path] == "/repeated_headers"
|
79
84
|
payload = JSON.dump(request.merge(server_port: port))
|
80
|
-
[200, {
|
85
|
+
[200, {"Link" => ["foo", "bar"]}, [payload]]
|
81
86
|
elsif request[:headers]["X-Redirect"] && request[:uri][:path] != request[:headers]["X-Redirect"]
|
82
|
-
[301, {"Location" => local_server(
|
87
|
+
[301, {"Location" => local_server(request[:headers]["X-Redirect"])}, [""]]
|
83
88
|
else
|
84
89
|
if request[:headers]["Accept-Encoding"] && request[:headers]["Accept-Encoding"].match("gzip")
|
85
|
-
out = StringIO.new(
|
90
|
+
out = StringIO.new("", "w")
|
86
91
|
io = Zlib::GzipWriter.new(out, 2)
|
87
92
|
|
88
93
|
request[:body] = Base64.encode64(request[:body]) if request[:headers]["X-Base64"]
|
89
94
|
io.write JSON.dump(request)
|
90
95
|
io.close
|
91
96
|
payload = out.string
|
92
|
-
[200, {
|
97
|
+
[200, {"Content-Type" => content_type, "Content-Encoding" => "gzip", "Content-Length" => payload.length}, [payload]]
|
93
98
|
else
|
94
99
|
payload = JSON.dump(request)
|
95
|
-
[200, {
|
100
|
+
[200, {"Content-Type" => content_type, "Content-Length" => payload.length}, [payload]]
|
96
101
|
end
|
97
102
|
end
|
98
103
|
end
|
@@ -107,9 +112,10 @@ def start_ssl_server(port, options = {})
|
|
107
112
|
cert_name = [
|
108
113
|
%w[CN localhost],
|
109
114
|
]
|
110
|
-
|
115
|
+
cert_file = options[:cert] || File.expand_path("../ssl/host.crt", __FILE__)
|
116
|
+
cert = OpenSSL::X509::Certificate.new File.read(cert_file)
|
111
117
|
cert.version = 0 # HACK: Work around jruby-openssl in jruby-head not setting cert.version
|
112
|
-
pkey = OpenSSL::PKey::RSA.new File.read(File.expand_path(
|
118
|
+
pkey = OpenSSL::PKey::RSA.new File.read(File.expand_path("../ssl/host.key", __FILE__))
|
113
119
|
@servers[port] = Thread.new {
|
114
120
|
server = WEBrick::HTTPServer.new(
|
115
121
|
{
|
@@ -118,7 +124,7 @@ def start_ssl_server(port, options = {})
|
|
118
124
|
:SSLCertificate => cert,
|
119
125
|
:SSLPrivateKey => pkey,
|
120
126
|
:AccessLog => [],
|
121
|
-
:Logger => WEBrick::Log.new("/dev/null")
|
127
|
+
:Logger => WEBrick::Log.new("/dev/null"),
|
122
128
|
}.merge(options)
|
123
129
|
)
|
124
130
|
server.mount_proc "/" do |req, res|
|
@@ -130,7 +136,7 @@ def start_ssl_server(port, options = {})
|
|
130
136
|
end
|
131
137
|
|
132
138
|
RSpec.configure do |c|
|
133
|
-
require
|
139
|
+
require "net/http/server"
|
134
140
|
|
135
141
|
c.before(:suite) {
|
136
142
|
@server = {}
|
@@ -138,9 +144,10 @@ RSpec.configure do |c|
|
|
138
144
|
start_server 55442
|
139
145
|
start_ssl_server 55444
|
140
146
|
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__)
|
147
|
+
start_ssl_server 55446, cert: File.expand_path("../ssl/host-expired.crt", __FILE__)
|
141
148
|
|
142
149
|
Manticore.disable_httpcomponents_logging!
|
143
150
|
}
|
144
151
|
|
145
|
-
c.after(:suite)
|
152
|
+
c.after(:suite) { stop_servers }
|
146
153
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: manticore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Chris Heald
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,7 +122,7 @@ requirements:
|
|
122
122
|
- jar commons-codec:commons-codec, '~> 1.9'
|
123
123
|
- jar org.apache.httpcomponents:httpcore, '~> 4.4.4'
|
124
124
|
rubyforge_project:
|
125
|
-
rubygems_version: 2.
|
125
|
+
rubygems_version: 2.4.8
|
126
126
|
signing_key:
|
127
127
|
specification_version: 4
|
128
128
|
summary: Manticore is an HTTP client built on the Apache HttpCore components
|