ethon 0.7.0 → 0.7.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 +15 -0
- data/CHANGELOG.md +7 -4
- data/lib/ethon/curl.rb +1 -1
- data/lib/ethon/curls/classes.rb +9 -4
- data/lib/ethon/curls/options.rb +8 -1
- data/lib/ethon/easy/callbacks.rb +3 -4
- data/lib/ethon/easy/informations.rb +2 -0
- data/lib/ethon/easy/mirror.rb +1 -1
- data/lib/ethon/easy/response_callbacks.rb +6 -1
- data/lib/ethon/libc.rb +1 -1
- data/lib/ethon/version.rb +1 -1
- data/spec/ethon/curl_spec.rb +4 -4
- data/spec/ethon/easy/callbacks_spec.rb +22 -1
- data/spec/ethon/easy/form_spec.rb +5 -5
- data/spec/ethon/easy/header_spec.rb +2 -2
- data/spec/ethon/easy/http/custom_spec.rb +3 -3
- data/spec/ethon/easy/http/get_spec.rb +2 -2
- data/spec/ethon/easy/http/head_spec.rb +2 -2
- data/spec/ethon/easy/http/options_spec.rb +1 -1
- data/spec/ethon/easy/http/patch_spec.rb +1 -1
- data/spec/ethon/easy/http/post_spec.rb +27 -7
- data/spec/ethon/easy/http/put_spec.rb +7 -7
- data/spec/ethon/easy/http_spec.rb +2 -2
- data/spec/ethon/easy/informations_spec.rb +7 -1
- data/spec/ethon/easy/mirror_spec.rb +6 -0
- data/spec/ethon/easy/operations_spec.rb +3 -3
- data/spec/ethon/easy/options_spec.rb +2 -4
- data/spec/ethon/easy/queryable_spec.rb +2 -2
- data/spec/ethon/easy/response_callbacks_spec.rb +7 -7
- data/spec/ethon/easy_spec.rb +10 -13
- data/spec/ethon/libc_spec.rb +2 -2
- data/spec/ethon/multi/operations_spec.rb +22 -22
- data/spec/ethon/multi/options_spec.rb +1 -3
- data/spec/ethon/multi/stack_spec.rb +5 -5
- data/spec/ethon/multi_spec.rb +2 -2
- metadata +5 -12
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NmNjNTQxNTQxNzI0YTBkMjgyNjYwOWU0YTZjYWIzMDcyYTYyYTdlNw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YTFlM2RhMTE2ZWUxYzY1YzhhMzY2OTEwMGY5ZWMyNGMwNmM4OTViMA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YWEzMGY4NTlhZWM5MGRmOTkyNGE2ZjNkOTVjMjBhMjVjODJjM2Q1MjAzMGZj
|
10
|
+
ZWMyOWIyZjUxNzE3YTBiZDA3N2Q0OWNlNWQwZjFiNmI5M2Y2NDZjOTY5NDQ4
|
11
|
+
ZjM2M2FjMDkwNzczMDQwYjhkMTkxM2U5MmM4MzNjODU2YmFiZDI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OWMxNDk4NWIyZjAxZGNmNjRmMWViMTEzNGI5MGFhNzIwODFiYjYwMGU4NzE0
|
14
|
+
NDYxNjg1NjBlYjk0YzdmNWQ3NGU5ODU5YzcwODdkNDA1MjA1YzBkYTAwZTFh
|
15
|
+
MGE0ZDY5ODM2ZGUzNmIzMDI4YzVlZWFiYjIyZTc0ZWVjYWU5ODY=
|
data/CHANGELOG.md
CHANGED
@@ -2,14 +2,17 @@
|
|
2
2
|
|
3
3
|
## Master
|
4
4
|
|
5
|
-
Not backwards compatible changes:
|
6
|
-
|
7
|
-
* `mime-types` are no longer a dependency. The gem will be still used if available to determine the mime type of a file which is uploaded. That means you have to have take care of the gem installation yourself.
|
8
|
-
|
9
5
|
[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.0...master)
|
10
6
|
|
7
|
+
* MS Windows determination delegated to `Gem.windows?` for better accuracy.
|
8
|
+
* FFI data-types updated to work on MS Windows.
|
9
|
+
|
11
10
|
## 0.7.0
|
12
11
|
|
12
|
+
Not backwards compatible changes:
|
13
|
+
|
14
|
+
* `mime-types` are no longer a dependency. The gem will be still used if available to determine the mime type of a file which is uploaded. That means you have to have take care of the gem installation yourself.
|
15
|
+
|
13
16
|
[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.6.3...v0.7.0)
|
14
17
|
|
15
18
|
## 0.6.3
|
data/lib/ethon/curl.rb
CHANGED
data/lib/ethon/curls/classes.rb
CHANGED
@@ -13,8 +13,8 @@ module Ethon
|
|
13
13
|
# :nodoc:
|
14
14
|
class FDSet < ::FFI::Struct
|
15
15
|
if Curl.windows?
|
16
|
-
layout :fd_count, :
|
17
|
-
:fd_array, [:
|
16
|
+
layout :fd_count, :uint,
|
17
|
+
:fd_array, [:uint, 64] # 2048 FDs
|
18
18
|
|
19
19
|
def clear; self[:fd_count] = 0; end
|
20
20
|
else
|
@@ -29,8 +29,13 @@ module Ethon
|
|
29
29
|
|
30
30
|
# :nodoc:
|
31
31
|
class Timeval < ::FFI::Struct
|
32
|
-
|
33
|
-
|
32
|
+
if Curl.windows?
|
33
|
+
layout :sec, :long,
|
34
|
+
:usec, :long
|
35
|
+
else
|
36
|
+
layout :sec, :time_t,
|
37
|
+
:usec, :suseconds_t
|
38
|
+
end
|
34
39
|
end
|
35
40
|
end
|
36
41
|
end
|
data/lib/ethon/curls/options.rb
CHANGED
@@ -42,6 +42,12 @@ module Ethon
|
|
42
42
|
when :string
|
43
43
|
func=:string
|
44
44
|
value=value.to_s unless value.nil?
|
45
|
+
when :string_as_pointer
|
46
|
+
func = :ffipointer
|
47
|
+
s = ''
|
48
|
+
s = value.to_s unless value.nil?
|
49
|
+
value = FFI::MemoryPointer.new(:char, s.bytesize)
|
50
|
+
value.put_bytes(0, s)
|
45
51
|
when :string_escape_null
|
46
52
|
func=:string
|
47
53
|
value=Util.escape_zero_byte(value) unless value.nil?
|
@@ -107,6 +113,7 @@ module Ethon
|
|
107
113
|
# :all defaults to all bits set
|
108
114
|
:string => :objectpoint,
|
109
115
|
:string_escape_null => :objectpoint,
|
116
|
+
:string_as_pointer => :objectpoint,
|
110
117
|
:ffipointer => :objectpoint, # FFI::Pointer
|
111
118
|
:curl_slist => :objectpoint,
|
112
119
|
:buffer => :objectpoint, # A memory buffer of size defined in the options
|
@@ -302,7 +309,7 @@ module Ethon
|
|
302
309
|
option :easy, :postfields, :string, 15
|
303
310
|
option :easy, :postfieldsize, :int, 60
|
304
311
|
option :easy, :postfieldsize_large, :off_t, 120
|
305
|
-
option :easy, :copypostfields, :
|
312
|
+
option :easy, :copypostfields, :string_as_pointer, 165
|
306
313
|
option :easy, :httppost, :ffipointer, 24
|
307
314
|
option :easy, :referer, :string, 16
|
308
315
|
option :easy, :useragent, :string, 18
|
data/lib/ethon/easy/callbacks.rb
CHANGED
@@ -40,10 +40,9 @@ module Ethon
|
|
40
40
|
@headers_called = true
|
41
41
|
headers
|
42
42
|
end
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
size * num
|
43
|
+
result = body(chunk = stream.read_string(size * num))
|
44
|
+
@response_body << chunk if result == :unyielded
|
45
|
+
result != :abort ? size*num : -1
|
47
46
|
}
|
48
47
|
end
|
49
48
|
|
data/lib/ethon/easy/mirror.rb
CHANGED
@@ -86,7 +86,12 @@ module Ethon
|
|
86
86
|
# @return [ Object ] If there are no on_body callbacks, returns the symbol :unyielded.
|
87
87
|
def body(chunk)
|
88
88
|
if defined?(@on_body) and not @on_body.nil?
|
89
|
-
|
89
|
+
result = nil
|
90
|
+
@on_body.each do |callback|
|
91
|
+
result = callback.call(chunk, self)
|
92
|
+
break if result == :abort
|
93
|
+
end
|
94
|
+
result
|
90
95
|
else
|
91
96
|
:unyielded
|
92
97
|
end
|
data/lib/ethon/libc.rb
CHANGED
data/lib/ethon/version.rb
CHANGED
data/spec/ethon/curl_spec.rb
CHANGED
@@ -6,20 +6,20 @@ describe Ethon::Curl do
|
|
6
6
|
|
7
7
|
context "when global_init fails" do
|
8
8
|
it "raises global init error" do
|
9
|
-
Ethon::Curl.
|
9
|
+
expect(Ethon::Curl).to receive(:global_init).and_return(1)
|
10
10
|
expect{ Ethon::Curl.init }.to raise_error(Ethon::Errors::GlobalInit)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
context "when global_init works" do
|
15
|
-
before { Ethon::Curl.
|
15
|
+
before { expect(Ethon::Curl).to receive(:global_init).and_return(0) }
|
16
16
|
|
17
17
|
it "doesn't raises global init error" do
|
18
|
-
expect{ Ethon::Curl.init }.to_not raise_error
|
18
|
+
expect{ Ethon::Curl.init }.to_not raise_error
|
19
19
|
end
|
20
20
|
|
21
21
|
it "logs" do
|
22
|
-
Ethon.logger.
|
22
|
+
expect(Ethon.logger).to receive(:debug)
|
23
23
|
Ethon::Curl.init
|
24
24
|
end
|
25
25
|
end
|
@@ -5,7 +5,7 @@ describe Ethon::Easy::Callbacks do
|
|
5
5
|
|
6
6
|
describe "#set_callbacks" do
|
7
7
|
before do
|
8
|
-
Ethon::Curl.
|
8
|
+
expect(Ethon::Curl).to receive(:set_option).exactly(3).times
|
9
9
|
end
|
10
10
|
|
11
11
|
it "sets write- and headerfunction" do
|
@@ -26,6 +26,27 @@ describe Ethon::Easy::Callbacks do
|
|
26
26
|
easy.set_callbacks
|
27
27
|
expect(easy.instance_variable_get(:@debug_info).to_a).to eq([])
|
28
28
|
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#body_write_callback" do
|
32
|
+
let(:body_write_callback) { easy.instance_variable_get(:@body_write_callback) }
|
33
|
+
let(:stream) { double(read_string: "") }
|
34
|
+
context "when body returns not :abort" do
|
35
|
+
it "returns number bigger than 0" do
|
36
|
+
expect(body_write_callback.call(stream, 1, 1, nil) > 0).to be(true)
|
37
|
+
end
|
38
|
+
end
|
29
39
|
|
40
|
+
context "when body returns :abort" do
|
41
|
+
before do
|
42
|
+
easy.on_body.clear
|
43
|
+
easy.on_body { :abort }
|
44
|
+
end
|
45
|
+
let(:body_write_callback) { easy.instance_variable_get(:@body_write_callback) }
|
46
|
+
|
47
|
+
it "returns -1 to indicate abort to libcurl" do
|
48
|
+
expect(body_write_callback.call(stream, 1, 1, nil)).to eq(-1)
|
49
|
+
end
|
50
|
+
end
|
30
51
|
end
|
31
52
|
end
|
@@ -30,7 +30,7 @@ describe Ethon::Easy::Form do
|
|
30
30
|
let(:pairs) { [['a', '1'], ['b', '2']] }
|
31
31
|
|
32
32
|
it "returns false" do
|
33
|
-
expect(form.multipart?).to
|
33
|
+
expect(form.multipart?).to be_falsey
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -38,7 +38,7 @@ describe Ethon::Easy::Form do
|
|
38
38
|
let(:pairs) { [['a', '1'], ['b', ['path', 'encoding', 'abs_path']]] }
|
39
39
|
|
40
40
|
it "returns true" do
|
41
|
-
expect(form.multipart?).to
|
41
|
+
expect(form.multipart?).to be_truthy
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -50,7 +50,7 @@ describe Ethon::Easy::Form do
|
|
50
50
|
let(:pairs) { [['a', '1']] }
|
51
51
|
|
52
52
|
it "adds params to form" do
|
53
|
-
Ethon::Curl.
|
53
|
+
expect(Ethon::Curl).to receive(:formadd)
|
54
54
|
form.materialize
|
55
55
|
end
|
56
56
|
end
|
@@ -59,7 +59,7 @@ describe Ethon::Easy::Form do
|
|
59
59
|
let(:pairs) { [['a', nil]] }
|
60
60
|
|
61
61
|
it "adds params to form" do
|
62
|
-
Ethon::Curl.
|
62
|
+
expect(Ethon::Curl).to receive(:formadd)
|
63
63
|
form.materialize
|
64
64
|
end
|
65
65
|
end
|
@@ -68,7 +68,7 @@ describe Ethon::Easy::Form do
|
|
68
68
|
let(:pairs) { [['a', ["file", "type", "path/file"]]] }
|
69
69
|
|
70
70
|
it "adds file to form" do
|
71
|
-
Ethon::Curl.
|
71
|
+
expect(Ethon::Curl).to receive(:formadd)
|
72
72
|
form.materialize
|
73
73
|
end
|
74
74
|
end
|
@@ -7,8 +7,8 @@ describe Ethon::Easy::Header do
|
|
7
7
|
let(:headers) { { 'User-Agent' => 'Ethon' } }
|
8
8
|
|
9
9
|
it "sets header" do
|
10
|
-
Ethon::Easy.
|
11
|
-
Ethon::Curl.
|
10
|
+
expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks)
|
11
|
+
expect(Ethon::Curl).to receive(:set_option)
|
12
12
|
easy.headers = headers
|
13
13
|
end
|
14
14
|
|
@@ -55,7 +55,7 @@ describe Ethon::Easy::Http::Custom do
|
|
55
55
|
let(:form) { {:a => File.open(__FILE__, 'r')} }
|
56
56
|
|
57
57
|
it "sets httppost" do
|
58
|
-
easy.
|
58
|
+
expect(easy).to receive(:httppost=)
|
59
59
|
custom.setup(easy)
|
60
60
|
end
|
61
61
|
|
@@ -93,12 +93,12 @@ describe Ethon::Easy::Http::Custom do
|
|
93
93
|
let(:encoded) { "a=1%26b%3D2" }
|
94
94
|
|
95
95
|
it "sets escaped copypostfields" do
|
96
|
-
easy.
|
96
|
+
expect(easy).to receive(:copypostfields=).with(encoded)
|
97
97
|
custom.setup(easy)
|
98
98
|
end
|
99
99
|
|
100
100
|
it "sets postfieldsize" do
|
101
|
-
easy.
|
101
|
+
expect(easy).to receive(:postfieldsize=).with(encoded.bytesize)
|
102
102
|
custom.setup(easy)
|
103
103
|
end
|
104
104
|
|
@@ -17,14 +17,14 @@ describe Ethon::Easy::Http::Get do
|
|
17
17
|
let(:form) { { :a => 1 } }
|
18
18
|
|
19
19
|
it "sets customrequest" do
|
20
|
-
easy.
|
20
|
+
expect(easy).to receive(:customrequest=).with("GET")
|
21
21
|
get.setup(easy)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
context "when no body" do
|
26
26
|
it "doesn't set customrequest" do
|
27
|
-
easy.
|
27
|
+
expect(easy).to receive(:customrequest=).never
|
28
28
|
get.setup(easy)
|
29
29
|
end
|
30
30
|
end
|
@@ -10,7 +10,7 @@ describe Ethon::Easy::Http::Head do
|
|
10
10
|
describe "#setup" do
|
11
11
|
context "when nothing" do
|
12
12
|
it "sets nobody" do
|
13
|
-
easy.
|
13
|
+
expect(easy).to receive(:nobody=).with(true)
|
14
14
|
head.setup(easy)
|
15
15
|
end
|
16
16
|
|
@@ -24,7 +24,7 @@ describe Ethon::Easy::Http::Head do
|
|
24
24
|
let(:params) { {:a => "1&b=2"} }
|
25
25
|
|
26
26
|
it "sets nobody" do
|
27
|
-
easy.
|
27
|
+
expect(easy).to receive(:nobody=).with(true)
|
28
28
|
head.setup(easy)
|
29
29
|
end
|
30
30
|
|
@@ -15,12 +15,12 @@ describe Ethon::Easy::Http::Post do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it "sets postfield_size" do
|
18
|
-
easy.
|
18
|
+
expect(easy).to receive(:postfieldsize=).with(0)
|
19
19
|
post.setup(easy)
|
20
20
|
end
|
21
21
|
|
22
22
|
it "sets copy_postfields" do
|
23
|
-
easy.
|
23
|
+
expect(easy).to receive(:copypostfields=).with("")
|
24
24
|
post.setup(easy)
|
25
25
|
end
|
26
26
|
|
@@ -40,12 +40,12 @@ describe Ethon::Easy::Http::Post do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it "sets postfieldsize" do
|
43
|
-
easy.
|
43
|
+
expect(easy).to receive(:postfieldsize=).with(0)
|
44
44
|
post.setup(easy)
|
45
45
|
end
|
46
46
|
|
47
47
|
it "sets copypostfields" do
|
48
|
-
easy.
|
48
|
+
expect(easy).to receive(:copypostfields=).with("")
|
49
49
|
post.setup(easy)
|
50
50
|
end
|
51
51
|
|
@@ -99,7 +99,7 @@ describe Ethon::Easy::Http::Post do
|
|
99
99
|
let(:form) { {:a => File.open(__FILE__, 'r')} }
|
100
100
|
|
101
101
|
it "sets httppost" do
|
102
|
-
easy.
|
102
|
+
expect(easy).to receive(:httppost=)
|
103
103
|
post.setup(easy)
|
104
104
|
end
|
105
105
|
|
@@ -137,12 +137,12 @@ describe Ethon::Easy::Http::Post do
|
|
137
137
|
let(:encoded) { "a=1%26b%3D2" }
|
138
138
|
|
139
139
|
it "sets escaped copypostfields" do
|
140
|
-
easy.
|
140
|
+
expect(easy).to receive(:copypostfields=).with(encoded)
|
141
141
|
post.setup(easy)
|
142
142
|
end
|
143
143
|
|
144
144
|
it "sets postfieldsize" do
|
145
|
-
easy.
|
145
|
+
expect(easy).to receive(:postfieldsize=).with(encoded.bytesize)
|
146
146
|
post.setup(easy)
|
147
147
|
end
|
148
148
|
|
@@ -194,6 +194,26 @@ describe Ethon::Easy::Http::Post do
|
|
194
194
|
end
|
195
195
|
end
|
196
196
|
end
|
197
|
+
|
198
|
+
context "when binary with null bytes" do
|
199
|
+
let(:form) { [1, 0, 1].pack('c*') }
|
200
|
+
|
201
|
+
context "when requesting" do
|
202
|
+
before do
|
203
|
+
easy.headers = { 'Expect' => '' }
|
204
|
+
post.setup(easy)
|
205
|
+
easy.perform
|
206
|
+
end
|
207
|
+
|
208
|
+
it "returns ok" do
|
209
|
+
expect(easy.return_code).to eq(:ok)
|
210
|
+
end
|
211
|
+
|
212
|
+
it "sends binary data" do
|
213
|
+
expect(easy.response_body).to include('"body":"\\u0001\\u0000\\u0001"')
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
197
217
|
end
|
198
218
|
|
199
219
|
context "when params and body" do
|
@@ -15,12 +15,12 @@ describe Ethon::Easy::Http::Put do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it "sets upload" do
|
18
|
-
easy.
|
18
|
+
expect(easy).to receive(:upload=).with(true)
|
19
19
|
put.setup(easy)
|
20
20
|
end
|
21
21
|
|
22
22
|
it "sets infilesize" do
|
23
|
-
easy.
|
23
|
+
expect(easy).to receive(:infilesize=).with(0)
|
24
24
|
put.setup(easy)
|
25
25
|
end
|
26
26
|
|
@@ -42,12 +42,12 @@ describe Ethon::Easy::Http::Put do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
it "sets upload" do
|
45
|
-
easy.
|
45
|
+
expect(easy).to receive(:upload=).with(true)
|
46
46
|
put.setup(easy)
|
47
47
|
end
|
48
48
|
|
49
49
|
it "sets infilesize" do
|
50
|
-
easy.
|
50
|
+
expect(easy).to receive(:infilesize=).with(0)
|
51
51
|
put.setup(easy)
|
52
52
|
end
|
53
53
|
|
@@ -67,17 +67,17 @@ describe Ethon::Easy::Http::Put do
|
|
67
67
|
let(:form) { {:a => "1&b=2"} }
|
68
68
|
|
69
69
|
it "sets infilesize" do
|
70
|
-
easy.
|
70
|
+
expect(easy).to receive(:infilesize=).with(11)
|
71
71
|
put.setup(easy)
|
72
72
|
end
|
73
73
|
|
74
74
|
it "sets readfunction" do
|
75
|
-
easy.
|
75
|
+
expect(easy).to receive(:readfunction)
|
76
76
|
put.setup(easy)
|
77
77
|
end
|
78
78
|
|
79
79
|
it "sets upload" do
|
80
|
-
easy.
|
80
|
+
expect(easy).to receive(:upload=).with(true)
|
81
81
|
put.setup(easy)
|
82
82
|
end
|
83
83
|
|
@@ -12,8 +12,8 @@ describe Ethon::Easy::Http do
|
|
12
12
|
let(:get_class) { Ethon::Easy::Http::Get }
|
13
13
|
|
14
14
|
it "instanciates action" do
|
15
|
-
get.
|
16
|
-
get_class.
|
15
|
+
expect(get).to receive(:setup)
|
16
|
+
expect(get_class).to receive(:new).and_return(get)
|
17
17
|
easy.http_request(url, action_name, options)
|
18
18
|
end
|
19
19
|
|
@@ -74,9 +74,15 @@ describe Ethon::Easy::Informations do
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
+
describe "#request_size" do
|
78
|
+
it "returns 53" do
|
79
|
+
expect(easy.request_size).to eq(53)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
77
83
|
describe "#supports_zlib?" do
|
78
84
|
it "returns true" do
|
79
|
-
expect(easy.supports_zlib?).to
|
85
|
+
expect(easy.supports_zlib?).to be_truthy
|
80
86
|
end
|
81
87
|
end
|
82
88
|
end
|
@@ -32,6 +32,12 @@ describe Ethon::Easy::Mirror do
|
|
32
32
|
expect(mirror.log_informations).to be_a(Hash)
|
33
33
|
end
|
34
34
|
|
35
|
+
it "only calls methods that exist" do
|
36
|
+
described_class.informations_to_log.each do |method_name|
|
37
|
+
expect(mirror.respond_to? method_name).to eql(true)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
35
41
|
it "includes return code" do
|
36
42
|
expect(mirror.log_informations).to include(options)
|
37
43
|
end
|
@@ -46,17 +46,17 @@ describe Ethon::Easy::Operations do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
it "calls Curl.easy_perform" do
|
49
|
-
Ethon::Curl.
|
49
|
+
expect(Ethon::Curl).to receive(:easy_perform)
|
50
50
|
easy.perform
|
51
51
|
end
|
52
52
|
|
53
53
|
it "logs" do
|
54
|
-
Ethon.logger.
|
54
|
+
expect(Ethon.logger).to receive(:debug)
|
55
55
|
easy.perform
|
56
56
|
end
|
57
57
|
|
58
58
|
it "doesn't log after completing because completing could reset" do
|
59
|
-
easy.on_complete{ Ethon.logger.
|
59
|
+
easy.on_complete{ expect(Ethon.logger).to receive(:debug).never }
|
60
60
|
easy.perform
|
61
61
|
end
|
62
62
|
|
@@ -20,10 +20,8 @@ describe Ethon::Easy::Options do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "sets option" do
|
23
|
-
Ethon::Easy.
|
24
|
-
Ethon::Curl.
|
25
|
-
expect(option).to be(name)
|
26
|
-
end
|
23
|
+
expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks)
|
24
|
+
expect(Ethon::Curl).to receive(:set_option).with(name, anything, anything)
|
27
25
|
value = case name
|
28
26
|
when :http_version
|
29
27
|
:httpv1_0
|
@@ -197,7 +197,7 @@ describe Ethon::Easy::Queryable do
|
|
197
197
|
describe "#empty?" do
|
198
198
|
context "when params empty" do
|
199
199
|
it "returns true" do
|
200
|
-
expect(params.empty?).to
|
200
|
+
expect(params.empty?).to be_truthy
|
201
201
|
end
|
202
202
|
end
|
203
203
|
|
@@ -205,7 +205,7 @@ describe Ethon::Easy::Queryable do
|
|
205
205
|
let(:hash) { {:a => 1} }
|
206
206
|
|
207
207
|
it "returns false" do
|
208
|
-
expect(params.empty?).to
|
208
|
+
expect(params.empty?).to be_falsey
|
209
209
|
end
|
210
210
|
end
|
211
211
|
end
|
@@ -18,7 +18,7 @@ describe Ethon::Easy::ResponseCallbacks do
|
|
18
18
|
context "when block given" do
|
19
19
|
it "stores" do
|
20
20
|
easy.send(callback_type) { p 1 }
|
21
|
-
expect(easy.instance_variable_get("@#{callback_type}")).to
|
21
|
+
expect(easy.instance_variable_get("@#{callback_type}").size).to eq(1)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -26,7 +26,7 @@ describe Ethon::Easy::ResponseCallbacks do
|
|
26
26
|
it "stores" do
|
27
27
|
easy.send(callback_type) { p 1 }
|
28
28
|
easy.send(callback_type) { p 2 }
|
29
|
-
expect(easy.instance_variable_get("@#{callback_type}")).to
|
29
|
+
expect(easy.instance_variable_get("@#{callback_type}").size).to eq(2)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -38,14 +38,14 @@ describe Ethon::Easy::ResponseCallbacks do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it "executes blocks and passes self" do
|
41
|
-
String.
|
41
|
+
expect(String).to receive(:new).with(easy.url)
|
42
42
|
easy.complete
|
43
43
|
end
|
44
44
|
|
45
45
|
context "when @on_complete nil" do
|
46
46
|
it "doesn't raise" do
|
47
47
|
easy.instance_variable_set(:@on_complete, nil)
|
48
|
-
expect{ easy.complete }.to_not raise_error
|
48
|
+
expect{ easy.complete }.to_not raise_error
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -56,14 +56,14 @@ describe Ethon::Easy::ResponseCallbacks do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
it "executes blocks and passes self" do
|
59
|
-
String.
|
59
|
+
expect(String).to receive(:new).with(easy.url)
|
60
60
|
easy.headers
|
61
61
|
end
|
62
62
|
|
63
63
|
context "when @on_headers nil" do
|
64
64
|
it "doesn't raise" do
|
65
65
|
easy.instance_variable_set(:@on_headers, nil)
|
66
|
-
expect{ easy.headers }.to_not raise_error
|
66
|
+
expect{ easy.headers }.to_not raise_error
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -88,7 +88,7 @@ describe Ethon::Easy::ResponseCallbacks do
|
|
88
88
|
context "when @on_body nil" do
|
89
89
|
it "doesn't raise" do
|
90
90
|
easy.instance_variable_set(:@on_body, nil)
|
91
|
-
expect{ easy.body("the chunk") }.to_not raise_error
|
91
|
+
expect{ easy.body("the chunk") }.to_not raise_error
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
data/spec/ethon/easy_spec.rb
CHANGED
@@ -5,14 +5,14 @@ describe Ethon::Easy do
|
|
5
5
|
|
6
6
|
describe ".new" do
|
7
7
|
it "inits curl" do
|
8
|
-
Ethon::Curl.
|
8
|
+
expect(Ethon::Curl).to receive(:init)
|
9
9
|
easy
|
10
10
|
end
|
11
11
|
|
12
12
|
context "when options are empty" do
|
13
13
|
it "sets only callbacks" do
|
14
|
-
Ethon::Easy.
|
15
|
-
Ethon::Easy.
|
14
|
+
expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks)
|
15
|
+
expect(Ethon::Easy).to receive(:set_option).never
|
16
16
|
easy
|
17
17
|
end
|
18
18
|
end
|
@@ -23,11 +23,8 @@ describe Ethon::Easy do
|
|
23
23
|
let(:easy) { Ethon::Easy.new(options) }
|
24
24
|
|
25
25
|
it "sets followlocation" do
|
26
|
-
Ethon::Easy.
|
27
|
-
Ethon::Curl.
|
28
|
-
expect(option).to be(:followlocation)
|
29
|
-
expect(value).to be(true)
|
30
|
-
end
|
26
|
+
expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks)
|
27
|
+
expect(Ethon::Curl).to receive(:set_option).with(:followlocation, true, anything)
|
31
28
|
easy
|
32
29
|
end
|
33
30
|
end
|
@@ -37,8 +34,8 @@ describe Ethon::Easy do
|
|
37
34
|
describe "#set_attributes" do
|
38
35
|
context "when options are empty" do
|
39
36
|
it "sets only callbacks" do
|
40
|
-
Ethon::Easy.
|
41
|
-
Ethon::Easy.
|
37
|
+
expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks)
|
38
|
+
expect(Ethon::Easy).to receive(:set_option).never
|
42
39
|
easy
|
43
40
|
end
|
44
41
|
end
|
@@ -46,7 +43,7 @@ describe Ethon::Easy do
|
|
46
43
|
context "when options aren't empty" do
|
47
44
|
context "when valid key" do
|
48
45
|
it "sets" do
|
49
|
-
easy.
|
46
|
+
expect(easy).to receive(:verbose=).with(true)
|
50
47
|
easy.set_attributes({:verbose => true})
|
51
48
|
end
|
52
49
|
end
|
@@ -73,7 +70,7 @@ describe Ethon::Easy do
|
|
73
70
|
end
|
74
71
|
|
75
72
|
it "resets easy handle" do
|
76
|
-
Ethon::Curl.
|
73
|
+
expect(Ethon::Curl).to receive(:easy_reset)
|
77
74
|
easy.reset
|
78
75
|
end
|
79
76
|
|
@@ -102,7 +99,7 @@ describe Ethon::Easy do
|
|
102
99
|
end
|
103
100
|
|
104
101
|
it "builds from easy" do
|
105
|
-
Ethon::Easy::Mirror.
|
102
|
+
expect(Ethon::Easy::Mirror).to receive(:from_easy).with(easy)
|
106
103
|
easy.mirror
|
107
104
|
end
|
108
105
|
end
|
data/spec/ethon/libc_spec.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Ethon::Libc do
|
4
|
-
describe "#getdtablesize" do
|
4
|
+
describe "#getdtablesize", :if => !Ethon::Curl.windows? do
|
5
5
|
it "returns an integer" do
|
6
6
|
expect(Ethon::Libc.getdtablesize).to be_a(Integer)
|
7
7
|
end
|
8
8
|
|
9
|
-
it "returns bigger zero" do
|
9
|
+
it "returns bigger zero", :if => !Ethon::Curl.windows? do
|
10
10
|
expect(Ethon::Libc.getdtablesize).to_not be_zero
|
11
11
|
end
|
12
12
|
end
|
@@ -52,7 +52,7 @@ describe Ethon::Multi::Operations do
|
|
52
52
|
let(:timeout) { 1 }
|
53
53
|
|
54
54
|
before do
|
55
|
-
Ethon::Curl.
|
55
|
+
expect(Ethon::Curl).to receive(:multi_timeout).and_return(:ok)
|
56
56
|
multi.instance_variable_set(:@timeout, double(:read_long => timeout))
|
57
57
|
end
|
58
58
|
|
@@ -78,7 +78,7 @@ describe Ethon::Multi::Operations do
|
|
78
78
|
end
|
79
79
|
|
80
80
|
context "when code not ok" do
|
81
|
-
before { Ethon::Curl.
|
81
|
+
before { expect(Ethon::Curl).to receive(:multi_timeout).and_return(:not_ok) }
|
82
82
|
|
83
83
|
it "raises MultiTimeout error" do
|
84
84
|
expect{ multi.send(:get_timeout) }.to raise_error(Ethon::Errors::MultiTimeout)
|
@@ -91,10 +91,10 @@ describe Ethon::Multi::Operations do
|
|
91
91
|
let(:max_fd) { 1 }
|
92
92
|
|
93
93
|
context "when code ok" do
|
94
|
-
before { Ethon::Curl.
|
94
|
+
before { expect(Ethon::Curl).to receive(:multi_fdset).and_return(:ok) }
|
95
95
|
|
96
96
|
it "doesn't raise" do
|
97
|
-
expect{ multi.method(:set_fds).call(timeout) }.to_not raise_error
|
97
|
+
expect{ multi.method(:set_fds).call(timeout) }.to_not raise_error
|
98
98
|
end
|
99
99
|
|
100
100
|
context "when max_fd -1" do
|
@@ -102,7 +102,7 @@ describe Ethon::Multi::Operations do
|
|
102
102
|
|
103
103
|
before do
|
104
104
|
multi.instance_variable_set(:@max_fd, double(:read_int => max_fd))
|
105
|
-
multi.
|
105
|
+
expect(multi).to receive(:sleep).with(0.001)
|
106
106
|
end
|
107
107
|
|
108
108
|
it "waits 100ms" do
|
@@ -112,7 +112,7 @@ describe Ethon::Multi::Operations do
|
|
112
112
|
|
113
113
|
context "when max_fd not -1" do
|
114
114
|
context "when code smaller zero" do
|
115
|
-
before { Ethon::Curl.
|
115
|
+
before { expect(Ethon::Curl).to receive(:select).and_return(-1) }
|
116
116
|
|
117
117
|
it "raises Select error" do
|
118
118
|
expect{ multi.method(:set_fds).call(timeout) }.to raise_error(Ethon::Errors::Select)
|
@@ -120,17 +120,17 @@ describe Ethon::Multi::Operations do
|
|
120
120
|
end
|
121
121
|
|
122
122
|
context "when code bigger or equal zero" do
|
123
|
-
before { Ethon::Curl.
|
123
|
+
before { expect(Ethon::Curl).to receive(:select).and_return(0) }
|
124
124
|
|
125
125
|
it "doesn't raise" do
|
126
|
-
expect{ multi.method(:set_fds).call(timeout) }.to_not raise_error
|
126
|
+
expect{ multi.method(:set_fds).call(timeout) }.to_not raise_error
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
132
|
context "when code not ok" do
|
133
|
-
before { Ethon::Curl.
|
133
|
+
before { expect(Ethon::Curl).to receive(:multi_fdset).and_return(:not_ok) }
|
134
134
|
|
135
135
|
it "raises MultiFdset error" do
|
136
136
|
expect{ multi.method(:set_fds).call(timeout) }.to raise_error(Ethon::Errors::MultiFdset)
|
@@ -145,7 +145,7 @@ describe Ethon::Multi::Operations do
|
|
145
145
|
end
|
146
146
|
|
147
147
|
it "logs" do
|
148
|
-
Ethon.logger.
|
148
|
+
expect(Ethon.logger).to receive(:debug).twice
|
149
149
|
multi.perform
|
150
150
|
end
|
151
151
|
end
|
@@ -182,7 +182,7 @@ describe Ethon::Multi::Operations do
|
|
182
182
|
end
|
183
183
|
|
184
184
|
it "sets response codes" do
|
185
|
-
expect(easies.all?{ |e| e.response_code == 200 }).to
|
185
|
+
expect(easies.all?{ |e| e.response_code == 200 }).to be_truthy
|
186
186
|
end
|
187
187
|
end
|
188
188
|
end
|
@@ -195,7 +195,7 @@ describe Ethon::Multi::Operations do
|
|
195
195
|
before { multi.instance_variable_set(:@running_count, 0) }
|
196
196
|
|
197
197
|
it "returns true" do
|
198
|
-
expect(multi.method(:ongoing?).call).to
|
198
|
+
expect(multi.method(:ongoing?).call).to be_truthy
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
@@ -203,7 +203,7 @@ describe Ethon::Multi::Operations do
|
|
203
203
|
before { multi.instance_variable_set(:@running_count, 1) }
|
204
204
|
|
205
205
|
it "returns true" do
|
206
|
-
expect(multi.method(:ongoing?).call).to
|
206
|
+
expect(multi.method(:ongoing?).call).to be_truthy
|
207
207
|
end
|
208
208
|
end
|
209
209
|
end
|
@@ -213,7 +213,7 @@ describe Ethon::Multi::Operations do
|
|
213
213
|
before { multi.instance_variable_set(:@running_count, 0) }
|
214
214
|
|
215
215
|
it "returns false" do
|
216
|
-
expect(multi.method(:ongoing?).call).to
|
216
|
+
expect(multi.method(:ongoing?).call).to be_falsey
|
217
217
|
end
|
218
218
|
end
|
219
219
|
|
@@ -221,7 +221,7 @@ describe Ethon::Multi::Operations do
|
|
221
221
|
before { multi.instance_variable_set(:@running_count, 1) }
|
222
222
|
|
223
223
|
it "returns true" do
|
224
|
-
expect(multi.method(:ongoing?).call).to
|
224
|
+
expect(multi.method(:ongoing?).call).to be_truthy
|
225
225
|
end
|
226
226
|
end
|
227
227
|
end
|
@@ -257,29 +257,29 @@ describe Ethon::Multi::Operations do
|
|
257
257
|
after { multi.method(:reset_fds).call }
|
258
258
|
|
259
259
|
it "resets @fd_read" do
|
260
|
-
multi.instance_variable_get(:@fd_read).
|
260
|
+
expect(multi.instance_variable_get(:@fd_read)).to receive(:clear)
|
261
261
|
end
|
262
262
|
|
263
263
|
it "resets @fd_write" do
|
264
|
-
multi.instance_variable_get(:@fd_write).
|
264
|
+
expect(multi.instance_variable_get(:@fd_write)).to receive(:clear)
|
265
265
|
end
|
266
266
|
|
267
267
|
it "resets @fd_excep" do
|
268
|
-
multi.instance_variable_get(:@fd_excep).
|
268
|
+
expect(multi.instance_variable_get(:@fd_excep)).to receive(:clear)
|
269
269
|
end
|
270
270
|
end
|
271
271
|
|
272
272
|
describe "#check" do
|
273
|
-
it {
|
273
|
+
it { skip("untested") }
|
274
274
|
end
|
275
275
|
|
276
276
|
describe "#run" do
|
277
|
-
it {
|
277
|
+
it { skip("untested") }
|
278
278
|
end
|
279
279
|
|
280
280
|
describe "#trigger" do
|
281
281
|
it "calls multi perform" do
|
282
|
-
Ethon::Curl.
|
282
|
+
expect(Ethon::Curl).to receive(:multi_perform)
|
283
283
|
multi.send(:trigger, pointer)
|
284
284
|
end
|
285
285
|
|
@@ -290,7 +290,7 @@ describe Ethon::Multi::Operations do
|
|
290
290
|
end
|
291
291
|
|
292
292
|
it "returns multi perform code" do
|
293
|
-
Ethon::Curl.
|
293
|
+
expect(Ethon::Curl).to receive(:multi_perform).and_return(:ok)
|
294
294
|
expect(multi.send(:trigger, pointer)).to eq(:ok)
|
295
295
|
end
|
296
296
|
end
|
@@ -13,9 +13,7 @@ describe Ethon::Multi::Options do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "sets option" do
|
16
|
-
Ethon::Curl.
|
17
|
-
expect(option).to be(name)
|
18
|
-
end
|
16
|
+
expect(Ethon::Curl).to receive(:set_option).with(name, anything, anything, anything)
|
19
17
|
multi.method("#{name}=").call(1)
|
20
18
|
end
|
21
19
|
end
|
@@ -15,7 +15,7 @@ describe Ethon::Multi::Stack do
|
|
15
15
|
|
16
16
|
context "when easy new" do
|
17
17
|
it "adds easy to multi" do
|
18
|
-
Ethon::Curl.
|
18
|
+
expect(Ethon::Curl).to receive(:multi_add_handle).and_return(:ok)
|
19
19
|
multi.add(easy)
|
20
20
|
end
|
21
21
|
|
@@ -27,7 +27,7 @@ describe Ethon::Multi::Stack do
|
|
27
27
|
|
28
28
|
context "when multi_add_handle fails" do
|
29
29
|
it "raises multi add error" do
|
30
|
-
Ethon::Curl.
|
30
|
+
expect(Ethon::Curl).to receive(:multi_add_handle).and_return(:bad_easy_handle)
|
31
31
|
expect{ multi.add(easy) }.to raise_error(Ethon::Errors::MultiAdd)
|
32
32
|
end
|
33
33
|
end
|
@@ -45,7 +45,7 @@ describe Ethon::Multi::Stack do
|
|
45
45
|
before { multi.add(easy) }
|
46
46
|
|
47
47
|
it "deletes easy from multi" do
|
48
|
-
Ethon::Curl.
|
48
|
+
expect(Ethon::Curl).to receive(:multi_remove_handle).and_return(:ok)
|
49
49
|
multi.delete(easy)
|
50
50
|
end
|
51
51
|
|
@@ -57,7 +57,7 @@ describe Ethon::Multi::Stack do
|
|
57
57
|
|
58
58
|
context "when easy is not in easy_handles" do
|
59
59
|
it "does nothing" do
|
60
|
-
Ethon::Curl.
|
60
|
+
expect(Ethon::Curl).to receive(:multi_add_handle).and_return(:ok)
|
61
61
|
multi.add(easy)
|
62
62
|
end
|
63
63
|
|
@@ -71,7 +71,7 @@ describe Ethon::Multi::Stack do
|
|
71
71
|
before { multi.add(easy) }
|
72
72
|
|
73
73
|
it "raises multi remove error" do
|
74
|
-
Ethon::Curl.
|
74
|
+
expect(Ethon::Curl).to receive(:multi_remove_handle).and_return(:bad_easy_handle)
|
75
75
|
expect{ multi.delete(easy) }.to raise_error(Ethon::Errors::MultiRemove)
|
76
76
|
end
|
77
77
|
end
|
data/spec/ethon/multi_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Ethon::Multi do
|
4
4
|
describe ".new" do
|
5
5
|
it "inits curl" do
|
6
|
-
Ethon::Curl.
|
6
|
+
expect(Ethon::Curl).to receive(:init)
|
7
7
|
Ethon::Multi.new
|
8
8
|
end
|
9
9
|
|
@@ -12,7 +12,7 @@ describe Ethon::Multi do
|
|
12
12
|
let(:options) { { :pipelining => true } }
|
13
13
|
|
14
14
|
it "sets pipelining" do
|
15
|
-
Ethon::Multi.
|
15
|
+
expect_any_instance_of(Ethon::Multi).to receive(:pipelining=).with(true)
|
16
16
|
Ethon::Multi.new(options)
|
17
17
|
end
|
18
18
|
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ethon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
5
|
-
prerelease:
|
4
|
+
version: 0.7.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Hans Hasselberg
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-
|
11
|
+
date: 2014-07-01 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: ffi
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ! '>='
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -137,30 +134,26 @@ files:
|
|
137
134
|
homepage: https://github.com/typhoeus/ethon
|
138
135
|
licenses:
|
139
136
|
- MIT
|
137
|
+
metadata: {}
|
140
138
|
post_install_message:
|
141
139
|
rdoc_options: []
|
142
140
|
require_paths:
|
143
141
|
- lib
|
144
142
|
required_ruby_version: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
143
|
requirements:
|
147
144
|
- - ! '>='
|
148
145
|
- !ruby/object:Gem::Version
|
149
146
|
version: '0'
|
150
|
-
segments:
|
151
|
-
- 0
|
152
|
-
hash: -1989061620893792868
|
153
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
|
-
none: false
|
155
148
|
requirements:
|
156
149
|
- - ! '>='
|
157
150
|
- !ruby/object:Gem::Version
|
158
151
|
version: 1.3.6
|
159
152
|
requirements: []
|
160
153
|
rubyforge_project:
|
161
|
-
rubygems_version:
|
154
|
+
rubygems_version: 2.2.2
|
162
155
|
signing_key:
|
163
|
-
specification_version:
|
156
|
+
specification_version: 4
|
164
157
|
summary: Libcurl wrapper.
|
165
158
|
test_files:
|
166
159
|
- spec/ethon/curl_spec.rb
|