ethon 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +19 -2
- data/Gemfile +20 -1
- data/README.md +29 -34
- data/lib/ethon/curls/constants.rb +3 -1
- data/lib/ethon/curls/functions.rb +36 -29
- data/lib/ethon/curls/options.rb +211 -145
- data/lib/ethon/easy.rb +747 -102
- data/lib/ethon/{easies → easy}/callbacks.rb +1 -1
- data/lib/ethon/{easies → easy}/form.rb +6 -6
- data/lib/ethon/{easies → easy}/header.rb +1 -1
- data/lib/ethon/{easies → easy}/http.rb +16 -10
- data/lib/ethon/{easies → easy}/http/actionable.rb +3 -3
- data/lib/ethon/{easies → easy}/http/delete.rb +3 -3
- data/lib/ethon/{easies → easy}/http/get.rb +3 -3
- data/lib/ethon/{easies → easy}/http/head.rb +3 -3
- data/lib/ethon/{easies → easy}/http/options.rb +3 -3
- data/lib/ethon/{easies → easy}/http/patch.rb +3 -3
- data/lib/ethon/{easies → easy}/http/post.rb +3 -3
- data/lib/ethon/{easies → easy}/http/postable.rb +1 -1
- data/lib/ethon/{easies → easy}/http/put.rb +3 -3
- data/lib/ethon/{easies → easy}/http/putable.rb +1 -1
- data/lib/ethon/{easies → easy}/informations.rb +1 -1
- data/lib/ethon/{easies → easy}/operations.rb +11 -1
- data/lib/ethon/{easies → easy}/options.rb +6 -6
- data/lib/ethon/{easies → easy}/params.rb +5 -5
- data/lib/ethon/{easies → easy}/queryable.rb +1 -1
- data/lib/ethon/{easies → easy}/response_callbacks.rb +1 -1
- data/lib/ethon/{easies → easy}/util.rb +1 -1
- data/lib/ethon/multi.rb +23 -12
- data/lib/ethon/{multies → multi}/operations.rb +13 -1
- data/lib/ethon/multi/options.rb +86 -0
- data/lib/ethon/{multies → multi}/stack.rb +1 -1
- data/lib/ethon/version.rb +1 -1
- metadata +28 -171
@@ -1,15 +1,15 @@
|
|
1
|
-
require 'ethon/
|
2
|
-
require 'ethon/
|
1
|
+
require 'ethon/easy/util'
|
2
|
+
require 'ethon/easy/queryable'
|
3
3
|
|
4
4
|
module Ethon
|
5
|
-
|
5
|
+
class Easy
|
6
6
|
|
7
7
|
# This class represents a form and is used to send a payload in the
|
8
8
|
# request body via POST/PUT.
|
9
9
|
# It handles multipart forms, too.
|
10
10
|
class Form
|
11
|
-
include Ethon::
|
12
|
-
include Ethon::
|
11
|
+
include Ethon::Easy::Util
|
12
|
+
include Ethon::Easy::Queryable
|
13
13
|
|
14
14
|
# Return a new Form.
|
15
15
|
#
|
@@ -92,7 +92,7 @@ module Ethon
|
|
92
92
|
:form_option, :copyname, :pointer, name,
|
93
93
|
:form_option, :namelength, :long, name.bytesize,
|
94
94
|
:form_option, :copycontents, :pointer, content,
|
95
|
-
:form_option, :contentslength, :long, content.bytesize,
|
95
|
+
:form_option, :contentslength, :long, content ? content.bytesize : 0,
|
96
96
|
:form_option, :end
|
97
97
|
)
|
98
98
|
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
require 'ethon/
|
2
|
-
require 'ethon/
|
3
|
-
require 'ethon/
|
4
|
-
require 'ethon/
|
5
|
-
require 'ethon/
|
6
|
-
require 'ethon/
|
7
|
-
require 'ethon/
|
8
|
-
require 'ethon/
|
1
|
+
require 'ethon/easy/http/actionable'
|
2
|
+
require 'ethon/easy/http/post'
|
3
|
+
require 'ethon/easy/http/get'
|
4
|
+
require 'ethon/easy/http/head'
|
5
|
+
require 'ethon/easy/http/put'
|
6
|
+
require 'ethon/easy/http/delete'
|
7
|
+
require 'ethon/easy/http/patch'
|
8
|
+
require 'ethon/easy/http/options'
|
9
9
|
|
10
10
|
module Ethon
|
11
|
-
|
11
|
+
class Easy
|
12
12
|
|
13
13
|
# This module contains logic about making valid http requests.
|
14
14
|
module Http
|
@@ -21,6 +21,12 @@ module Ethon
|
|
21
21
|
# @param [ String ] url The url.
|
22
22
|
# @param [ String ] action_name The http action name.
|
23
23
|
# @param [ Hash ] options The options hash.
|
24
|
+
#
|
25
|
+
# @option options :params [ Hash ] Params hash which
|
26
|
+
# is attached to the url.
|
27
|
+
# @option options :body [ Hash ] Body hash which
|
28
|
+
# becomes the request body. It is a PUT body for
|
29
|
+
# PUT requests and a POST from for everything else.
|
24
30
|
def http_request(url, action_name, options = {})
|
25
31
|
fabricate(action_name).new(url, options).setup(self)
|
26
32
|
end
|
@@ -36,7 +42,7 @@ module Ethon
|
|
36
42
|
#
|
37
43
|
# @return [ Class ] The action class.
|
38
44
|
def fabricate(action_name)
|
39
|
-
Ethon::
|
45
|
+
Ethon::Easy::Http.const_get(action_name.to_s.capitalize)
|
40
46
|
end
|
41
47
|
end
|
42
48
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'ethon/
|
2
|
-
require 'ethon/
|
1
|
+
require 'ethon/easy/http/putable'
|
2
|
+
require 'ethon/easy/http/postable'
|
3
3
|
|
4
4
|
module Ethon
|
5
|
-
|
5
|
+
class Easy
|
6
6
|
module Http
|
7
7
|
# This module represents a Http Action and is a factory
|
8
8
|
# for more real actions like GET, HEAD, POST and PUT.
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Ethon
|
2
|
-
|
2
|
+
class Easy
|
3
3
|
module Http
|
4
4
|
|
5
5
|
# This class knows everything about making DELETE requests.
|
6
6
|
class Delete
|
7
|
-
include Ethon::
|
8
|
-
include Ethon::
|
7
|
+
include Ethon::Easy::Http::Actionable
|
8
|
+
include Ethon::Easy::Http::Postable
|
9
9
|
|
10
10
|
# Setup easy to make a DELETE request.
|
11
11
|
#
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Ethon
|
2
|
-
|
2
|
+
class Easy
|
3
3
|
module Http
|
4
4
|
|
5
5
|
# This class knows everything about making GET requests.
|
6
6
|
class Get
|
7
|
-
include Ethon::
|
8
|
-
include Ethon::
|
7
|
+
include Ethon::Easy::Http::Actionable
|
8
|
+
include Ethon::Easy::Http::Postable
|
9
9
|
|
10
10
|
# Setup easy to make a GET request.
|
11
11
|
#
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Ethon
|
2
|
-
|
2
|
+
class Easy
|
3
3
|
module Http
|
4
4
|
|
5
5
|
# This class knows everything about making HEAD requests.
|
6
6
|
class Head
|
7
|
-
include Ethon::
|
8
|
-
include Ethon::
|
7
|
+
include Ethon::Easy::Http::Actionable
|
8
|
+
include Ethon::Easy::Http::Postable
|
9
9
|
|
10
10
|
# Setup easy to make a HEAD request.
|
11
11
|
#
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Ethon
|
2
|
-
|
2
|
+
class Easy
|
3
3
|
module Http
|
4
4
|
|
5
5
|
# This class knows everything about making OPTIONS requests.
|
6
6
|
class Options
|
7
|
-
include Ethon::
|
8
|
-
include Ethon::
|
7
|
+
include Ethon::Easy::Http::Actionable
|
8
|
+
include Ethon::Easy::Http::Postable
|
9
9
|
|
10
10
|
# Setup easy to make a OPTIONS request.
|
11
11
|
#
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Ethon
|
2
|
-
|
2
|
+
class Easy
|
3
3
|
module Http
|
4
4
|
|
5
5
|
# This class knows everything about making PATCH requests.
|
6
6
|
class Patch
|
7
|
-
include Ethon::
|
8
|
-
include Ethon::
|
7
|
+
include Ethon::Easy::Http::Actionable
|
8
|
+
include Ethon::Easy::Http::Postable
|
9
9
|
|
10
10
|
# Setup easy to make a PATCH request.
|
11
11
|
#
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Ethon
|
2
|
-
|
2
|
+
class Easy
|
3
3
|
module Http
|
4
4
|
# This class knows everything about making POST requests.
|
5
5
|
class Post
|
6
|
-
include Ethon::
|
7
|
-
include Ethon::
|
6
|
+
include Ethon::Easy::Http::Actionable
|
7
|
+
include Ethon::Easy::Http::Postable
|
8
8
|
|
9
9
|
# Setup easy to make a POST request.
|
10
10
|
#
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Ethon
|
2
|
-
|
2
|
+
class Easy
|
3
3
|
module Http
|
4
4
|
|
5
5
|
# This class knows everything about making PUT requests.
|
6
6
|
class Put
|
7
|
-
include Ethon::
|
8
|
-
include Ethon::
|
7
|
+
include Ethon::Easy::Http::Actionable
|
8
|
+
include Ethon::Easy::Http::Putable
|
9
9
|
|
10
10
|
# Setup easy to make a PUT request.
|
11
11
|
#
|
@@ -1,9 +1,19 @@
|
|
1
1
|
module Ethon
|
2
|
-
|
2
|
+
class Easy
|
3
3
|
# This module contains the logic to prepare and perform
|
4
4
|
# an easy.
|
5
5
|
module Operations
|
6
6
|
|
7
|
+
# Returns a pointer to the curl easy handle.
|
8
|
+
#
|
9
|
+
# @example Return the handle.
|
10
|
+
# easy.handle
|
11
|
+
#
|
12
|
+
# @return [ FFI::Pointer ] A pointer to the curl easy handle.
|
13
|
+
def handle
|
14
|
+
@handle ||= Curl.easy_init
|
15
|
+
end
|
16
|
+
|
7
17
|
# Perform the easy request.
|
8
18
|
#
|
9
19
|
# @example Perform the request.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Ethon
|
2
|
-
|
2
|
+
class Easy
|
3
3
|
|
4
4
|
# This module contains the logic and knowledge about the
|
5
5
|
# available options on easy.
|
@@ -9,11 +9,11 @@ module Ethon
|
|
9
9
|
def self.included(base)
|
10
10
|
base.extend ClassMethods
|
11
11
|
base.const_set(:AVAILABLE_OPTIONS, [
|
12
|
-
:dns_cache_timeout, :httppost, :
|
13
|
-
:customrequest, :cainfo, :capath, :connecttimeout,
|
12
|
+
:dns_cache_timeout, :httppost, :httpget, :nobody, :upload,
|
13
|
+
:customrequest, :cainfo, :capath, :connecttimeout, :connecttimeout_ms,
|
14
14
|
:forbid_reuse, :followlocation, :httpauth, :infilesize, :interface,
|
15
15
|
:maxredirs, :nosignal, :postfieldsize, :copypostfields, :proxy,
|
16
|
-
:proxyauth, :proxyport, :proxytype, :timeout, :readdata, :sslcert,
|
16
|
+
:proxyauth, :proxyport, :proxytype, :timeout, :timeout_ms, :readdata, :sslcert,
|
17
17
|
:ssl_verifypeer, :ssl_verifyhost, :sslcerttype, :sslkey, :sslkeytype,
|
18
18
|
:sslversion, :url, :useragent, :userpwd, :verbose, :readfunction
|
19
19
|
])
|
@@ -63,8 +63,8 @@ module Ethon
|
|
63
63
|
# @return [ Array ] The int options.
|
64
64
|
def int_options
|
65
65
|
[
|
66
|
-
:connecttimeout, :dns_cache_timeout, :infilesize, :maxredirs,
|
67
|
-
:postfieldsize, :proxyport, :ssl_verifyhost, :timeout
|
66
|
+
:connecttimeout, :connecttimeout_ms, :dns_cache_timeout, :infilesize, :maxredirs,
|
67
|
+
:postfieldsize, :proxyport, :ssl_verifyhost, :timeout, :timeout_ms
|
68
68
|
]
|
69
69
|
end
|
70
70
|
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require 'ethon/
|
2
|
-
require 'ethon/
|
1
|
+
require 'ethon/easy/util'
|
2
|
+
require 'ethon/easy/queryable'
|
3
3
|
|
4
4
|
module Ethon
|
5
|
-
|
5
|
+
class Easy
|
6
6
|
|
7
7
|
# This class represents http request parameters.
|
8
8
|
class Params
|
9
|
-
include Ethon::
|
10
|
-
include Ethon::
|
9
|
+
include Ethon::Easy::Util
|
10
|
+
include Ethon::Easy::Queryable
|
11
11
|
|
12
12
|
# Create a new Params.
|
13
13
|
#
|
data/lib/ethon/multi.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
require 'ethon/
|
2
|
-
require 'ethon/
|
1
|
+
require 'ethon/multi/stack'
|
2
|
+
require 'ethon/multi/operations'
|
3
|
+
require 'ethon/multi/options'
|
3
4
|
|
4
5
|
module Ethon
|
5
6
|
|
6
7
|
# This class represents libcurl multi.
|
7
8
|
class Multi
|
8
|
-
include Ethon::
|
9
|
-
include Ethon::
|
9
|
+
include Ethon::Multi::Stack
|
10
|
+
include Ethon::Multi::Operations
|
11
|
+
include Ethon::Multi::Options
|
10
12
|
|
11
13
|
class << self
|
12
14
|
|
@@ -27,21 +29,30 @@ module Ethon
|
|
27
29
|
# it didn't happen before.
|
28
30
|
#
|
29
31
|
# @return [ Multi ] The new multi.
|
30
|
-
def initialize
|
32
|
+
def initialize(options = {})
|
31
33
|
Curl.init
|
32
34
|
ObjectSpace.define_finalizer(self, self.class.finalizer(self))
|
35
|
+
set_attributes(options)
|
33
36
|
init_vars
|
34
37
|
end
|
35
38
|
|
36
|
-
#
|
37
|
-
# in case it didn't happened already.
|
39
|
+
# Set given options.
|
38
40
|
#
|
39
|
-
# @example
|
40
|
-
# multi.
|
41
|
+
# @example Set options.
|
42
|
+
# multi.set_attributes(options)
|
41
43
|
#
|
42
|
-
# @
|
43
|
-
|
44
|
-
|
44
|
+
# @param [ Hash ] options The options.
|
45
|
+
#
|
46
|
+
# @raise InvalidOption
|
47
|
+
#
|
48
|
+
# @see initialize
|
49
|
+
def set_attributes(options)
|
50
|
+
options.each_pair do |key, value|
|
51
|
+
unless respond_to?("#{key}=")
|
52
|
+
raise Errors::InvalidOption.new(key)
|
53
|
+
end
|
54
|
+
method("#{key}=").call(value)
|
55
|
+
end
|
45
56
|
end
|
46
57
|
end
|
47
58
|
end
|
@@ -1,9 +1,20 @@
|
|
1
1
|
module Ethon
|
2
|
-
|
2
|
+
class Multi # :nodoc
|
3
3
|
|
4
4
|
# This module contains logic to run a multi.
|
5
5
|
module Operations
|
6
6
|
|
7
|
+
# Return the multi handle. Inititialize multi handle,
|
8
|
+
# in case it didn't happened already.
|
9
|
+
#
|
10
|
+
# @example Return multi handle.
|
11
|
+
# multi.handle
|
12
|
+
#
|
13
|
+
# @return [ ::FFI::Pointer ] The multi handle.
|
14
|
+
def handle
|
15
|
+
@handle ||= Curl.multi_init
|
16
|
+
end
|
17
|
+
|
7
18
|
# Initialize variables.
|
8
19
|
#
|
9
20
|
# @example Initialize variables.
|
@@ -32,6 +43,7 @@ module Ethon
|
|
32
43
|
# @example Perform multi.
|
33
44
|
# multi.perform
|
34
45
|
def perform
|
46
|
+
set_options
|
35
47
|
Ethon.logger.debug("ETHON: started MULTI") if Ethon.logger
|
36
48
|
while ongoing?
|
37
49
|
run
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Ethon
|
2
|
+
class Multi
|
3
|
+
|
4
|
+
# This module contains the logic and knowledge about the
|
5
|
+
# available options on multi.
|
6
|
+
module Options
|
7
|
+
|
8
|
+
# :nodoc:
|
9
|
+
def self.included(base)
|
10
|
+
base.extend ClassMethods
|
11
|
+
base.const_set(:AVAILABLE_OPTIONS, [
|
12
|
+
:socketfunction, :socketdata, :pipelining,
|
13
|
+
:timerfunction, :timerdata, :maxconnects
|
14
|
+
])
|
15
|
+
base.send(:attr_accessor, *Ethon::Multi::AVAILABLE_OPTIONS)
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods # :nodoc:
|
19
|
+
|
20
|
+
# Return the available options.
|
21
|
+
#
|
22
|
+
# @example Return the available options.
|
23
|
+
# multi.available_options
|
24
|
+
#
|
25
|
+
# @return [ Array ] The available options.
|
26
|
+
def available_options
|
27
|
+
Ethon::Multi::AVAILABLE_OPTIONS
|
28
|
+
end
|
29
|
+
|
30
|
+
# Return the options which need to set as 0 or 1 for multi.
|
31
|
+
#
|
32
|
+
# @example Return the bool options.
|
33
|
+
# multi.bool_options
|
34
|
+
#
|
35
|
+
# @return [ Array ] The bool options.
|
36
|
+
def bool_options
|
37
|
+
[
|
38
|
+
:pipelining
|
39
|
+
]
|
40
|
+
end
|
41
|
+
|
42
|
+
# Return the options which need to set as an integer for multi.
|
43
|
+
#
|
44
|
+
# @example Return the int options.
|
45
|
+
# multi.int_options
|
46
|
+
#
|
47
|
+
# @return [ Array ] The int options.
|
48
|
+
def int_options
|
49
|
+
[
|
50
|
+
:maxconnects
|
51
|
+
]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Set specified options on multi handle.
|
56
|
+
#
|
57
|
+
# @example Set options.
|
58
|
+
# multi.set_options
|
59
|
+
def set_options
|
60
|
+
self.class.available_options.each do |option|
|
61
|
+
Curl.set_option(option, value_for(option), handle, :multi)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Return the value to set to multi handle. It is converted with the help
|
66
|
+
# of bool_options, enum_options and int_options.
|
67
|
+
#
|
68
|
+
# @example Return casted the value.
|
69
|
+
# multi.value_for(:verbose)
|
70
|
+
#
|
71
|
+
# @return [ Object ] The casted value.
|
72
|
+
def value_for(option)
|
73
|
+
value = method(option).call
|
74
|
+
return nil if value.nil?
|
75
|
+
|
76
|
+
if self.class.bool_options.include?(option)
|
77
|
+
value ? 1 : 0
|
78
|
+
elsif self.class.int_options.include?(option)
|
79
|
+
value.to_i
|
80
|
+
else
|
81
|
+
value
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|