ethon 0.8.0 → 0.8.1
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 +1 -0
- data/CHANGELOG.md +10 -1
- data/lib/ethon.rb +5 -1
- data/lib/ethon/easy.rb +1 -0
- data/lib/ethon/easy/http/actionable.rb +15 -6
- data/lib/ethon/easy/http/postable.rb +1 -1
- data/lib/ethon/easy/mirror.rb +5 -9
- data/lib/ethon/easy/options.rb +10 -1
- data/lib/ethon/easy/queryable.rb +9 -0
- data/lib/ethon/version.rb +1 -1
- data/spec/ethon/easy/http/get_spec.rb +37 -1
- data/spec/ethon/easy/http/post_spec.rb +36 -0
- data/spec/ethon/easy/mirror_spec.rb +3 -3
- data/spec/ethon/easy/options_spec.rb +29 -0
- data/spec/ethon/easy/queryable_spec.rb +2 -1
- data/spec/ethon/easy_spec.rb +6 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a8e3e2daabb0f28d13cfec209027f4a3dfb588f
|
4
|
+
data.tar.gz: b5dc230d462c0972fa15bb811906e70ca4b6d8a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba31326c9c9dd60a8635a32edde9b4936307e602097b2ca696333410aea60746fbda37b7c2d179ac2be01a46ccee66debfdd014deb073f87ffeb1fdeae00540b
|
7
|
+
data.tar.gz: 9f2b01584a1f175f9032febbd0fbc1b80a56dcda094a2825746e6e7ccca8254f07fc3ae7bf5c5249e7b75f52914a9229201dfb1a0e26fb17af457a6cfae5efe9
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,16 @@
|
|
2
2
|
|
3
3
|
## Master
|
4
4
|
|
5
|
-
[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.
|
5
|
+
[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.8.1...master)
|
6
|
+
|
7
|
+
## 0.8.1
|
8
|
+
|
9
|
+
* Support optional escaping of params.
|
10
|
+
([Tasos Laskos](https://github.com/zapotek)
|
11
|
+
* `Easy::Mirror`: Reduced object allocations and method calls during info handling.
|
12
|
+
([Tasos Laskos](https://github.com/zapotek)
|
13
|
+
|
14
|
+
## 0.8.0
|
6
15
|
|
7
16
|
## 0.7.4
|
8
17
|
|
data/lib/ethon.rb
CHANGED
data/lib/ethon/easy.rb
CHANGED
@@ -93,13 +93,18 @@ module Ethon
|
|
93
93
|
def setup(easy)
|
94
94
|
@easy = easy
|
95
95
|
|
96
|
+
# Order is important, @easy will be used to provide access to options
|
97
|
+
# relevant to the following operations (like whether or not to escape
|
98
|
+
# values).
|
99
|
+
easy.set_attributes(options)
|
100
|
+
|
101
|
+
set_form(easy) unless form.empty?
|
102
|
+
|
96
103
|
if params.empty?
|
97
104
|
easy.url = url
|
98
105
|
else
|
99
106
|
set_params(easy)
|
100
107
|
end
|
101
|
-
set_form(easy) unless form.empty?
|
102
|
-
easy.set_attributes(options)
|
103
108
|
end
|
104
109
|
|
105
110
|
# Setup request with params.
|
@@ -109,12 +114,16 @@ module Ethon
|
|
109
114
|
#
|
110
115
|
# @param [ Easy ] easy The easy to setup.
|
111
116
|
def set_params(easy)
|
112
|
-
params.escape =
|
117
|
+
params.escape = easy.escape?
|
113
118
|
params.params_encoding = params_encoding
|
114
119
|
|
115
|
-
base_url, base_params = url.split(
|
116
|
-
|
117
|
-
|
120
|
+
base_url, base_params = url.split('?')
|
121
|
+
base_url << '?'
|
122
|
+
base_url << base_params.to_s
|
123
|
+
base_url << '&' if base_params
|
124
|
+
base_url << params.to_s
|
125
|
+
|
126
|
+
easy.url = base_url
|
118
127
|
end
|
119
128
|
|
120
129
|
# Setup request with form.
|
data/lib/ethon/easy/mirror.rb
CHANGED
@@ -4,18 +4,14 @@ module Ethon
|
|
4
4
|
attr_reader :options
|
5
5
|
alias_method :to_hash, :options
|
6
6
|
|
7
|
-
|
8
|
-
Informations::AVAILABLE_INFORMATIONS.keys +
|
7
|
+
INFORMATIONS_TO_MIRROR = Informations::AVAILABLE_INFORMATIONS.keys +
|
9
8
|
[:return_code, :response_headers, :response_body, :debug_info]
|
10
|
-
end
|
11
9
|
|
12
|
-
|
13
|
-
[:effective_url, :response_code, :return_code, :total_time]
|
14
|
-
end
|
10
|
+
INFORMATIONS_TO_LOG = [:effective_url, :response_code, :return_code, :total_time]
|
15
11
|
|
16
12
|
def self.from_easy(easy)
|
17
13
|
options = {}
|
18
|
-
|
14
|
+
INFORMATIONS_TO_MIRROR.each do |info|
|
19
15
|
options[info] = easy.send(info)
|
20
16
|
end
|
21
17
|
new(options)
|
@@ -26,12 +22,12 @@ module Ethon
|
|
26
22
|
end
|
27
23
|
|
28
24
|
def log_informations
|
29
|
-
Hash[*
|
25
|
+
Hash[*INFORMATIONS_TO_LOG.map do |info|
|
30
26
|
[info, options[info]]
|
31
27
|
end.flatten]
|
32
28
|
end
|
33
29
|
|
34
|
-
|
30
|
+
INFORMATIONS_TO_MIRROR.each do |info|
|
35
31
|
eval %Q|def #{info}; options[#{info}]; end|
|
36
32
|
end
|
37
33
|
end
|
data/lib/ethon/easy/options.rb
CHANGED
@@ -10,7 +10,16 @@ module Ethon
|
|
10
10
|
@url = value
|
11
11
|
Curl.set_option(:url, value, handle)
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
|
+
def escape=( b )
|
15
|
+
@escape = b
|
16
|
+
end
|
17
|
+
|
18
|
+
def escape?
|
19
|
+
return true if @escape
|
20
|
+
@escape.nil? ? true : false
|
21
|
+
end
|
22
|
+
|
14
23
|
Curl.easy_options.each do |opt,props|
|
15
24
|
eval %Q<
|
16
25
|
def #{opt}=(value)
|
data/lib/ethon/easy/queryable.rb
CHANGED
@@ -100,6 +100,8 @@ module Ethon
|
|
100
100
|
when Array
|
101
101
|
if params_encoding == :rack
|
102
102
|
encode_rack_array_pairs(h, prefix, pairs)
|
103
|
+
elsif params_encoding == :multi
|
104
|
+
encode_multi_array_pairs(h, prefix, pairs)
|
103
105
|
else
|
104
106
|
encode_indexed_array_pairs(h, prefix, pairs)
|
105
107
|
end
|
@@ -126,6 +128,13 @@ module Ethon
|
|
126
128
|
pairs_for(v, key, pairs)
|
127
129
|
end
|
128
130
|
end
|
131
|
+
|
132
|
+
def encode_multi_array_pairs(h, prefix, pairs)
|
133
|
+
h.each_with_index do |v, i|
|
134
|
+
key = prefix
|
135
|
+
pairs_for(v, key, pairs)
|
136
|
+
end
|
137
|
+
end
|
129
138
|
|
130
139
|
def pairs_for(v, key, pairs)
|
131
140
|
case v
|
data/lib/ethon/version.rb
CHANGED
@@ -5,7 +5,8 @@ describe Ethon::Easy::Http::Get do
|
|
5
5
|
let(:url) { "http://localhost:3001/" }
|
6
6
|
let(:params) { nil }
|
7
7
|
let(:form) { nil }
|
8
|
-
let(:
|
8
|
+
let(:options) { {} }
|
9
|
+
let(:get) { described_class.new(url, {:params => params, :body => form}.merge(options)) }
|
9
10
|
|
10
11
|
describe "#setup" do
|
11
12
|
it "sets url" do
|
@@ -84,6 +85,41 @@ describe Ethon::Easy::Http::Get do
|
|
84
85
|
expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2")
|
85
86
|
end
|
86
87
|
end
|
88
|
+
|
89
|
+
context "with :escape" do
|
90
|
+
let(:params) { {:a => "1&b=2"} }
|
91
|
+
|
92
|
+
context 'missing' do
|
93
|
+
it "escapes values" do
|
94
|
+
expect(easy.url).to eq("#{url}?a=1%26b%3D2")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'nil' do
|
99
|
+
let(:options) { {:escape => nil} }
|
100
|
+
|
101
|
+
it "escapes values" do
|
102
|
+
expect(easy.url).to eq("#{url}?a=1%26b%3D2")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'true' do
|
107
|
+
let(:options) { {:escape => true} }
|
108
|
+
|
109
|
+
it "escapes values" do
|
110
|
+
expect(easy.url).to eq("#{url}?a=1%26b%3D2")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context 'false' do
|
115
|
+
let(:options) { {:escape => false} }
|
116
|
+
|
117
|
+
it "sends raw values" do
|
118
|
+
expect(easy.url).to eq("#{url}?a=1&b=2")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
87
123
|
end
|
88
124
|
end
|
89
125
|
end
|
@@ -59,6 +59,42 @@ describe Ethon::Easy::Http::Post do
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
context "with :escape" do
|
63
|
+
context 'missing' do
|
64
|
+
it "escapes values" do
|
65
|
+
post.setup(easy)
|
66
|
+
expect(easy.url).to eq("#{url}?a=1%26")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'nil' do
|
71
|
+
let(:options) { {:escape => nil} }
|
72
|
+
|
73
|
+
it "escapes values" do
|
74
|
+
post.setup(easy)
|
75
|
+
expect(easy.url).to eq("#{url}?a=1%26")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'true' do
|
80
|
+
let(:options) { {:escape => true} }
|
81
|
+
|
82
|
+
it "escapes values" do
|
83
|
+
post.setup(easy)
|
84
|
+
expect(easy.url).to eq("#{url}?a=1%26")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'false' do
|
89
|
+
let(:options) { {:escape => false} }
|
90
|
+
|
91
|
+
it "sends raw values" do
|
92
|
+
post.setup(easy)
|
93
|
+
expect(easy.url).to eq("#{url}?a=1&")
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
62
98
|
it "sets postfieldsize" do
|
63
99
|
expect(easy).to receive(:postfieldsize=).with(0)
|
64
100
|
post.setup(easy)
|
@@ -4,7 +4,7 @@ describe Ethon::Easy::Mirror do
|
|
4
4
|
let(:options) { nil }
|
5
5
|
let(:mirror) { described_class.new(options) }
|
6
6
|
|
7
|
-
describe "
|
7
|
+
describe "::INFORMATIONS_TO_LOG" do
|
8
8
|
[
|
9
9
|
:return_code, :response_code, :response_body, :response_headers,
|
10
10
|
:total_time, :starttransfer_time, :appconnect_time,
|
@@ -12,7 +12,7 @@ describe Ethon::Easy::Mirror do
|
|
12
12
|
:effective_url, :primary_ip, :redirect_count, :debug_info
|
13
13
|
].each do |name|
|
14
14
|
it "contains #{name}" do
|
15
|
-
expect(described_class
|
15
|
+
expect(described_class::INFORMATIONS_TO_MIRROR).to include(name)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -33,7 +33,7 @@ describe Ethon::Easy::Mirror do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
it "only calls methods that exist" do
|
36
|
-
described_class.
|
36
|
+
described_class::INFORMATIONS_TO_LOG.each do |method_name|
|
37
37
|
expect(mirror.respond_to? method_name).to eql(true)
|
38
38
|
end
|
39
39
|
end
|
@@ -45,6 +45,35 @@ describe Ethon::Easy::Options do
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
+
describe '#escape?' do
|
49
|
+
context 'by default' do
|
50
|
+
it 'returns true' do
|
51
|
+
expect(easy.escape?).to be_truthy
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when #escape=nil' do
|
56
|
+
it 'returns true' do
|
57
|
+
easy.escape = nil
|
58
|
+
expect(easy.escape?).to be_truthy
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'when #escape=true' do
|
63
|
+
it 'returns true' do
|
64
|
+
easy.escape = true
|
65
|
+
expect(easy.escape?).to be_truthy
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when #escape=false' do
|
70
|
+
it 'returns true' do
|
71
|
+
easy.escape = false
|
72
|
+
expect(easy.escape?).to be_falsey
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
48
77
|
describe "#httppost=" do
|
49
78
|
it "raises unless given a FFI::Pointer" do
|
50
79
|
expect{ easy.httppost = 1 }.to raise_error(Ethon::Errors::InvalidValue)
|
@@ -162,13 +162,14 @@ describe Ethon::Easy::Queryable do
|
|
162
162
|
let(:file) { Tempfile.new("fubar") }
|
163
163
|
|
164
164
|
it "sets mime type to default application/octet-stream" do
|
165
|
-
Object.send(:remove_const, :MIME)
|
166
165
|
expect(mime_type).to eq("application/octet-stream")
|
167
166
|
end
|
168
167
|
end
|
169
168
|
end
|
170
169
|
|
171
170
|
context "when no MIME" do
|
171
|
+
before { hide_const("MIME") }
|
172
|
+
|
172
173
|
it "sets mime type to default application/octet-stream" do
|
173
174
|
expect(mime_type).to eq("application/octet-stream")
|
174
175
|
end
|
data/spec/ethon/easy_spec.rb
CHANGED
@@ -64,6 +64,12 @@ describe Ethon::Easy do
|
|
64
64
|
expect(easy.url).to be_nil
|
65
65
|
end
|
66
66
|
|
67
|
+
it "resets escape?" do
|
68
|
+
easy.escape = false
|
69
|
+
easy.reset
|
70
|
+
expect(easy.escape?).to be_truthy
|
71
|
+
end
|
72
|
+
|
67
73
|
it "resets hash" do
|
68
74
|
easy.reset
|
69
75
|
expect(easy.instance_variable_get(:@hash)).to be_nil
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ethon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hans Hasselberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|