ethon 0.5.11 → 0.5.12
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.
- data/CHANGELOG.md +22 -4
- data/Gemfile +1 -1
- data/lib/ethon/curl.rb +0 -6
- data/lib/ethon/curls/functions.rb +6 -0
- data/lib/ethon/easy.rb +5 -4
- data/lib/ethon/easy/http/actionable.rb +3 -1
- data/lib/ethon/easy/informations.rb +1 -3
- data/lib/ethon/easy/operations.rb +1 -1
- data/lib/ethon/easy/options.rb +22 -4
- data/lib/ethon/easy/queryable.rb +25 -22
- data/lib/ethon/easy/response_callbacks.rb +1 -1
- data/lib/ethon/multi/operations.rb +11 -8
- data/lib/ethon/version.rb +1 -1
- metadata +3 -3
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,25 @@
|
|
2
2
|
|
3
3
|
## Master
|
4
4
|
|
5
|
-
[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.
|
5
|
+
[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.12...master)
|
6
|
+
|
7
|
+
## 0.5.12
|
8
|
+
|
9
|
+
[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.11...v0.5.12)
|
10
|
+
|
11
|
+
Enhancements:
|
12
|
+
|
13
|
+
* Performance optimizations.
|
14
|
+
([Kyle Oppenheim](https://github.com/koppenheim) and [Richie Vos](https://github.com/richievos), [\#48](https://github.com/typhoeus/ethon/pull/48))
|
15
|
+
* Reuse memory pointer.
|
16
|
+
([Richie Vos](https://github.com/richievos), [\#49](https://github.com/typhoeus/ethon/pull/49))
|
17
|
+
|
18
|
+
Bugfixes:
|
19
|
+
|
20
|
+
* Fix windows install.
|
21
|
+
([Derik Olsson](https://github.com/derikolsson), [\#47](https://github.com/typhoeus/ethon/pull/47))
|
22
|
+
* Handle urls that already contain query params.
|
23
|
+
([Turner King](https://github.com/turnerking ), [\#45](https://github.com/typhoeus/ethon/pull/45))
|
6
24
|
|
7
25
|
## 0.5.11
|
8
26
|
|
@@ -16,12 +34,12 @@ Enhancements:
|
|
16
34
|
* Relax ffi requirements.
|
17
35
|
([voxik](https://github.com/voxik), [\#40](https://github.com/typhoeus/ethon/pull/40))
|
18
36
|
* Various documentation improvements.
|
19
|
-
([
|
37
|
+
([Craig Little](https://github.com/craiglittle))
|
20
38
|
|
21
39
|
Bugfixes:
|
22
40
|
|
23
41
|
* Fix the memory leaks.
|
24
|
-
([
|
42
|
+
([Richie Vos](https://github.com/richievos), [\#45](https://github.com/typhoeus/ethon/pull/45))
|
25
43
|
|
26
44
|
## 0.5.10
|
27
45
|
|
@@ -30,7 +48,7 @@ Bugfixes:
|
|
30
48
|
Enhancements:
|
31
49
|
|
32
50
|
* Allow custom requests.
|
33
|
-
([
|
51
|
+
([Nathan Sutton](https://github.com/nate), [\#36](https://github.com/typhoeus/ethon/pull/36))
|
34
52
|
* Use updated version of FFI.
|
35
53
|
|
36
54
|
Bugfixes:
|
data/Gemfile
CHANGED
data/lib/ethon/curl.rb
CHANGED
@@ -35,12 +35,6 @@ module Ethon
|
|
35
35
|
!(RbConfig::CONFIG['host_os'] !~ /mingw|mswin|bccwin/)
|
36
36
|
end
|
37
37
|
|
38
|
-
if Curl.windows?
|
39
|
-
ffi_lib 'ws2_32'
|
40
|
-
else
|
41
|
-
ffi_lib ::FFI::Library::LIBC
|
42
|
-
end
|
43
|
-
|
44
38
|
require 'ethon/curls/constants'
|
45
39
|
require 'ethon/curls/settings'
|
46
40
|
require 'ethon/curls/classes'
|
@@ -51,6 +51,12 @@ module Ethon
|
|
51
51
|
base.attach_function :slist_free_all, :curl_slist_free_all, [:pointer], :void
|
52
52
|
base.instance_variable_set(:@blocking, true)
|
53
53
|
|
54
|
+
if Curl.windows?
|
55
|
+
base.ffi_lib 'ws2_32'
|
56
|
+
else
|
57
|
+
base.ffi_lib ::FFI::Library::LIBC
|
58
|
+
end
|
59
|
+
|
54
60
|
base.attach_function :select, [:int, Curl::FDSet.ptr, Curl::FDSet.ptr, Curl::FDSet.ptr, Curl::Timeval.ptr], :int
|
55
61
|
end
|
56
62
|
end
|
data/lib/ethon/easy.rb
CHANGED
@@ -229,10 +229,11 @@ module Ethon
|
|
229
229
|
# @see initialize
|
230
230
|
def set_attributes(options)
|
231
231
|
options.each_pair do |key, value|
|
232
|
-
|
232
|
+
method = "#{key}="
|
233
|
+
unless respond_to?(method)
|
233
234
|
raise Errors::InvalidOption.new(key)
|
234
235
|
end
|
235
|
-
method
|
236
|
+
send(method, value)
|
236
237
|
end
|
237
238
|
end
|
238
239
|
|
@@ -244,7 +245,7 @@ module Ethon
|
|
244
245
|
def reset
|
245
246
|
@url = nil
|
246
247
|
@hash = nil
|
247
|
-
@on_complete =
|
248
|
+
@on_complete = nil
|
248
249
|
Curl.easy_reset(handle)
|
249
250
|
set_callbacks
|
250
251
|
end
|
@@ -278,7 +279,7 @@ module Ethon
|
|
278
279
|
:response_body => response_body
|
279
280
|
}
|
280
281
|
Easy::Informations::AVAILABLE_INFORMATIONS.keys.each do |info|
|
281
|
-
@hash[info] =
|
282
|
+
@hash[info] = send(info)
|
282
283
|
end
|
283
284
|
@hash
|
284
285
|
end
|
@@ -87,7 +87,9 @@ module Ethon
|
|
87
87
|
# @param [ Easy ] easy The easy to setup.
|
88
88
|
def set_params(easy)
|
89
89
|
params.escape = true
|
90
|
-
|
90
|
+
base_url, base_params = url.split("?")
|
91
|
+
base_params += "&" if base_params
|
92
|
+
easy.url = "#{base_url}?#{base_params}#{params.to_s}"
|
91
93
|
end
|
92
94
|
|
93
95
|
# Setup request with form.
|
@@ -66,9 +66,7 @@ module Ethon
|
|
66
66
|
}
|
67
67
|
|
68
68
|
AVAILABLE_INFORMATIONS.each do |name, type|
|
69
|
-
|
70
|
-
Curl.method("get_info_#{type}").call(name, handle)
|
71
|
-
end
|
69
|
+
eval %Q|def #{name}; Curl.send(:get_info_#{type}, :#{name}, handle); end|
|
72
70
|
end
|
73
71
|
|
74
72
|
# Returns this curl version supports zlib.
|
data/lib/ethon/easy/options.rb
CHANGED
@@ -522,11 +522,29 @@ module Ethon
|
|
522
522
|
Curl.set_option(:postfieldsize, value_for(value, :int), handle)
|
523
523
|
end
|
524
524
|
|
525
|
+
# Pass a bitmask to control how libcurl acts on redirects after
|
526
|
+
# POSTs that get a 301, 302 or 303 response back. A parameter
|
527
|
+
# with bit 0 set (value CURL_REDIR_POST_301) tells the library
|
528
|
+
# to respect RFC 2616/10.3.2 and not convert POST requests into
|
529
|
+
# GET requests when following a 301 redirection. Setting bit 1
|
530
|
+
# (value CURL_REDIR_POST_302) makes libcurl maintain the request
|
531
|
+
# method after a 302 redirect whilst setting bit 2 (value
|
532
|
+
# CURL_REDIR_POST_303) makes libcurl maintain the request method
|
533
|
+
# after a 303 redirect. The value CURL_REDIR_POST_ALL is a
|
534
|
+
# convenience define that sets all three bits.
|
535
|
+
#
|
536
|
+
# The non-RFC behaviour is ubiquitous in web browsers, so the
|
537
|
+
# library does the conversion by default to maintain
|
538
|
+
# consistency. However, a server may require a POST to remain a
|
539
|
+
# POST after such a redirection. This option is meaningful only
|
540
|
+
# when setting CURLOPT_FOLLOWLOCATION. (Added in 7.17.1) (This
|
541
|
+
# option was known as CURLOPT_POST301 up to 7.19.0 as it only
|
542
|
+
# supported the 301 then)
|
543
|
+
#
|
544
|
+
# @example Set postredir option.
|
545
|
+
# easy.postredir = :post_all
|
525
546
|
#
|
526
|
-
# @
|
527
|
-
# easy.protocols = :http
|
528
|
-
#
|
529
|
-
# @param [ Symbol ] value The value or array of values to set.
|
547
|
+
# @param [ Symbol ] value The value to set.
|
530
548
|
#
|
531
549
|
# @return [ void ]
|
532
550
|
def postredir=(value)
|
data/lib/ethon/easy/queryable.rb
CHANGED
@@ -27,12 +27,14 @@ module Ethon
|
|
27
27
|
#
|
28
28
|
# @return [ String ] The string representation.
|
29
29
|
def to_s
|
30
|
-
query_pairs.map{ |pair|
|
30
|
+
@to_s ||= query_pairs.map{ |pair|
|
31
31
|
return pair if pair.is_a?(String)
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
if escape && @easy
|
34
|
+
pair.map{ |e| @easy.escape(e.to_s) }.join("=")
|
35
|
+
else
|
36
|
+
pair.join("=")
|
37
|
+
end
|
36
38
|
}.join('&')
|
37
39
|
end
|
38
40
|
|
@@ -59,21 +61,7 @@ module Ethon
|
|
59
61
|
return [hash] if hash.is_a?(String)
|
60
62
|
|
61
63
|
pairs = []
|
62
|
-
|
63
|
-
case h
|
64
|
-
when Hash
|
65
|
-
h.each_pair do |k,v|
|
66
|
-
key = prefix == '' ? k : "#{prefix}[#{k}]"
|
67
|
-
pairs_for(v, key, pairs, recursive)
|
68
|
-
end
|
69
|
-
when Array
|
70
|
-
h.each_with_index do |v, i|
|
71
|
-
key = "#{prefix}[#{i}]"
|
72
|
-
pairs_for(v, key, pairs, recursive)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
recursive.call(hash, '')
|
64
|
+
recursively_generate_pairs(hash, nil, pairs)
|
77
65
|
pairs
|
78
66
|
end
|
79
67
|
|
@@ -97,12 +85,27 @@ module Ethon
|
|
97
85
|
|
98
86
|
private
|
99
87
|
|
100
|
-
def
|
88
|
+
def recursively_generate_pairs(h, prefix, pairs)
|
89
|
+
case h
|
90
|
+
when Hash
|
91
|
+
h.each_pair do |k,v|
|
92
|
+
key = prefix.nil? ? k : "#{prefix}[#{k}]"
|
93
|
+
pairs_for(v, key, pairs)
|
94
|
+
end
|
95
|
+
when Array
|
96
|
+
h.each_with_index do |v, i|
|
97
|
+
key = "#{prefix}[#{i}]"
|
98
|
+
pairs_for(v, key, pairs)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def pairs_for(v, key, pairs)
|
101
104
|
case v
|
102
105
|
when Hash
|
103
|
-
|
106
|
+
recursively_generate_pairs(v, key, pairs)
|
104
107
|
when Array
|
105
|
-
|
108
|
+
recursively_generate_pairs(v, key, pairs)
|
106
109
|
when File, Tempfile
|
107
110
|
pairs << [Util.escape_zero_byte(key), file_info(v)]
|
108
111
|
else
|
@@ -2,6 +2,9 @@ module Ethon
|
|
2
2
|
class Multi # :nodoc
|
3
3
|
# This module contains logic to run a multi.
|
4
4
|
module Operations
|
5
|
+
STARTED_MULTI = "ETHON: started MULTI"
|
6
|
+
PERFORMED_MULTI = "ETHON: performed MULTI"
|
7
|
+
|
5
8
|
# Return the multi handle. Inititialize multi handle,
|
6
9
|
# in case it didn't happened already.
|
7
10
|
#
|
@@ -35,7 +38,7 @@ module Ethon
|
|
35
38
|
# @example Perform multi.
|
36
39
|
# multi.perform
|
37
40
|
def perform
|
38
|
-
Ethon.logger.debug(
|
41
|
+
Ethon.logger.debug(STARTED_MULTI)
|
39
42
|
while ongoing?
|
40
43
|
run
|
41
44
|
timeout = get_timeout
|
@@ -43,7 +46,7 @@ module Ethon
|
|
43
46
|
reset_fds
|
44
47
|
set_fds(timeout)
|
45
48
|
end
|
46
|
-
Ethon.logger.debug(
|
49
|
+
Ethon.logger.debug(PERFORMED_MULTI)
|
47
50
|
nil
|
48
51
|
end
|
49
52
|
|
@@ -140,7 +143,7 @@ module Ethon
|
|
140
143
|
next if msg[:code] != :done
|
141
144
|
easy = easy_handles.find{ |e| e.handle == msg[:easy_handle] }
|
142
145
|
easy.return_code = msg[:data][:code]
|
143
|
-
Ethon.logger.debug
|
146
|
+
Ethon.logger.debug { "ETHON: performed #{easy.log_inspect}" }
|
144
147
|
delete(easy)
|
145
148
|
easy.complete
|
146
149
|
end
|
@@ -153,7 +156,8 @@ module Ethon
|
|
153
156
|
#
|
154
157
|
# @return [ void ]
|
155
158
|
def run
|
156
|
-
|
159
|
+
running_count_pointer = FFI::MemoryPointer.new(:int)
|
160
|
+
begin code = trigger(running_count_pointer) end while code == :call_multi_perform
|
157
161
|
check
|
158
162
|
end
|
159
163
|
|
@@ -163,10 +167,9 @@ module Ethon
|
|
163
167
|
# multi.trigger
|
164
168
|
#
|
165
169
|
# @return [ Symbol ] The Curl.multi_perform return code.
|
166
|
-
def trigger
|
167
|
-
|
168
|
-
|
169
|
-
@running_count = running_count.read_int
|
170
|
+
def trigger(running_count_pointer)
|
171
|
+
code = Curl.multi_perform(handle, running_count_pointer)
|
172
|
+
@running_count = running_count_pointer.read_int
|
170
173
|
code
|
171
174
|
end
|
172
175
|
|
data/lib/ethon/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ethon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.12
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
@@ -126,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
126
|
version: '0'
|
127
127
|
segments:
|
128
128
|
- 0
|
129
|
-
hash:
|
129
|
+
hash: 2640646266244561120
|
130
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
131
|
none: false
|
132
132
|
requirements:
|