ethon 0.5.2 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,26 @@
2
2
 
3
3
  ## Master
4
4
 
5
- [Full Changelog](http://github.com/typhoeus/ethon/compare/v0.5.1...master)
5
+ [Full Changelog](http://github.com/typhoeus/ethon/compare/v0.5.3...master)
6
+
7
+ ## 0.5.3
8
+
9
+ [Full Changelog](http://github.com/typhoeus/ethon/compare/v0.5.2...v0.5.3)
10
+
11
+ Enhancements:
12
+
13
+ * Deprecate Easy#prepare. It is no longer necessary.
14
+ * Unroll metaprogramming for easy and multi options.
15
+ * More specs.
16
+
17
+ Bugfixes:
18
+
19
+ * Correct size for FDSets
20
+ * Add proxytypes to enums.
21
+
22
+ ## 0.5.2
23
+
24
+ [Full Changelog](http://github.com/typhoeus/ethon/compare/v0.5.1...v0.5.2)
6
25
 
7
26
  Enhancements:
8
27
 
data/Gemfile CHANGED
@@ -9,14 +9,13 @@ group :development, :test do
9
9
  gem "sinatra", "~> 1.3"
10
10
  gem "json"
11
11
 
12
- if RUBY_PLATFORM == "java"
13
- gem "spoon"
14
- else
15
- gem "patron", "~> 0.4"
16
- gem "curb", "~> 0.8.0"
17
- end
18
-
19
12
  unless ENV["CI"]
20
13
  gem "guard-rspec", "~> 0.7"
14
+ gem 'rb-fsevent', '~> 0.9.1'
21
15
  end
22
16
  end
17
+
18
+ group :perf do
19
+ gem "patron", "~> 0.4"
20
+ gem "curb", "~> 0.8.0"
21
+ end
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  In the greek mythology Ethon is a gigantic eagle the son of Typhoeus and Echidna. So much for the history.
4
4
  In the modern world Ethon is a very basic libcurl wrapper using ffi.
5
5
 
6
- * [Documentation](http://rubydoc.info/github/typhoeus/ethon)
6
+ * [Documentation](http://rubydoc.info/github/typhoeus/ethon/frames/Ethon)
7
7
  * [Website](http://typhoeus.github.com/)
8
8
  * [Mailinglist](http://groups.google.com/group/typhoeus)
9
9
 
@@ -23,7 +23,6 @@ Making the first request is realy simple:
23
23
 
24
24
  ```ruby
25
25
  easy = Ethon::Easy.new(url: "www.example.com")
26
- easy.prepare
27
26
  easy.perform
28
27
  #=> :ok
29
28
  ```
@@ -32,7 +31,6 @@ You have access to various options like following redirects:
32
31
 
33
32
  ```ruby
34
33
  easy = Ethon::Easy.new(url: "www.example.com", followlocation: true)
35
- easy.prepare
36
34
  easy.perform
37
35
  #=> :ok
38
36
  ```
@@ -41,7 +39,6 @@ Once you're done you can look at the response code and body:
41
39
 
42
40
  ```ruby
43
41
  easy = Ethon::Easy.new(url: "www.example.com", followlocation: true)
44
- easy.prepare
45
42
  easy.perform
46
43
  easy.response_code
47
44
  #=> 200
@@ -56,7 +53,6 @@ In order to make life easier there are some helpers for doing http requests:
56
53
  ```ruby
57
54
  easy = Ethon::Easy.new
58
55
  easy.http_request("www.example.com", :get, { params: {a: 1} })
59
- easy.prepare
60
56
  easy.perform
61
57
  #=> :ok
62
58
  ```
@@ -64,7 +60,6 @@ easy.perform
64
60
  ```ruby
65
61
  easy = Ethon::Easy.new
66
62
  easy.http_request("www.example.com", :post, { params: { a: 1 }, body: { b: 2 } })
67
- easy.prepare
68
63
  easy.perform
69
64
  #=> :ok
70
65
  ```
@@ -1,15 +1,15 @@
1
1
  require 'logger'
2
2
  require 'ffi'
3
- require 'rbconfig'
4
3
  require 'thread'
5
4
  require 'mime/types'
6
5
  require 'tempfile'
7
6
 
7
+ require 'ethon/libc'
8
8
  require 'ethon/curl'
9
- require 'ethon/errors'
10
9
  require 'ethon/easy'
11
- require 'ethon/multi'
10
+ require 'ethon/errors'
12
11
  require 'ethon/loggable'
12
+ require 'ethon/multi'
13
13
  require 'ethon/version'
14
14
 
15
15
  # Ethon is a very simple libcurl.
@@ -20,5 +20,9 @@ require 'ethon/version'
20
20
  # see how others use Ethon look at the Typhoeus code.
21
21
  #
22
22
  # @see https://www.github.com/typhoeus/typhoeus Typhoeus
23
+ #
24
+ # @note Please update to the latest libcurl version in order
25
+ # to benefit from all features and bugfixes.
26
+ # http://curl.haxx.se/download.html
23
27
  module Ethon
24
28
  end
@@ -18,7 +18,7 @@ module Ethon
18
18
  # :nodoc:
19
19
  class FDSet < ::FFI::Struct
20
20
  # XXX how does this work on non-windows? how can curl know the new size...
21
- FD_SETSIZE = 524288 # set a higher maximum number of fds. this has never applied to windows, so just use the default there
21
+ FD_SETSIZE = ::Ethon::Libc.getdtablesize
22
22
 
23
23
  if Curl.windows?
24
24
  layout :fd_count, :u_int,
@@ -8,6 +8,7 @@ module Ethon
8
8
  # :nodoc:
9
9
  def self.extended(base)
10
10
  base.attach_function :global_init, :curl_global_init, [:long], :int
11
+ base.attach_function :free, :curl_free, [:pointer], :void
11
12
 
12
13
  base.attach_function :easy_init, :curl_easy_init, [], :pointer
13
14
  base.attach_function :easy_cleanup, :curl_easy_cleanup, [:pointer], :void
@@ -17,7 +17,6 @@ module Ethon
17
17
  # @example You can access the libcurl easy interface through this class, every request is based on it. The simplest setup looks like that:
18
18
  #
19
19
  # e = Ethon::Easy.new(url: "www.example.com")
20
- # e.prepare
21
20
  # e.perform
22
21
  # #=> :ok
23
22
  #
@@ -26,7 +25,6 @@ module Ethon
26
25
  # e.reset # reset easy handle
27
26
  # e.url = "www.google.com"
28
27
  # e.followlocation = true
29
- # e.prepare
30
28
  # e.perform
31
29
  # #=> :ok
32
30
  #
@@ -810,6 +808,7 @@ module Ethon
810
808
  Curl.init
811
809
  ObjectSpace.define_finalizer(self, self.class.finalizer(self))
812
810
  set_attributes(options)
811
+ set_callbacks
813
812
  end
814
813
 
815
814
  # Set given options.
@@ -839,10 +838,10 @@ module Ethon
839
838
  # @example Reset.
840
839
  # easy.reset
841
840
  def reset
842
- (instance_variables - [:@handle, :@header_list]).each do |ivar|
843
- instance_variable_set(ivar, nil)
844
- end
841
+ @url = nil
842
+ @hash = nil
845
843
  Curl.easy_reset(handle)
844
+ set_callbacks
846
845
  end
847
846
 
848
847
  # Url escapes the value.
@@ -23,7 +23,10 @@ module Ethon
23
23
  #
24
24
  # @param [ Hash ] headers The headers.
25
25
  def headers=(headers)
26
- @headers = headers
26
+ headers ||= {}
27
+ @header_list = nil
28
+ headers.each {|k, v| @header_list = Curl.slist_append(@header_list, compose_header(k,v)) }
29
+ Curl.set_option(:httpheader, @header_list, handle)
27
30
  end
28
31
 
29
32
  # Return header_list.
@@ -36,18 +39,6 @@ module Ethon
36
39
  @header_list ||= nil
37
40
  end
38
41
 
39
- # Set previously defined headers in libcurl.
40
- #
41
- # @example Set headers in libcurl.
42
- # easy.set_headers
43
- #
44
- # @return [ Symbol ] The return value from Curl.set_option.
45
- def set_headers
46
- @header_list = nil
47
- headers.each {|k, v| @header_list = Curl.slist_append(@header_list, compose_header(k,v)) }
48
- Curl.set_option(:httpheader, @header_list, handle)
49
- end
50
-
51
42
  # Compose libcurl header string from key and value.
52
43
  # Also replaces null bytes, because libcurl will complain about
53
44
  # otherwise.
@@ -70,23 +70,15 @@ module Ethon
70
70
  # @param [ easy ] easy the easy to setup.
71
71
  def setup(easy)
72
72
  @easy = easy
73
- easy.url = url
74
- set_nothing(easy) if params.empty? && form.empty?
75
- set_params(easy) unless params.empty?
73
+ if params.empty?
74
+ easy.url = url
75
+ else
76
+ set_params(easy)
77
+ end
76
78
  set_form(easy) unless form.empty?
77
79
  easy.set_attributes(options)
78
80
  end
79
81
 
80
- # Setup request as if there were no params and form.
81
- #
82
- # @example Setup nothing.
83
- # action.set_nothing(easy)
84
- #
85
- # @param [ Easy ] easy The easy to setup.
86
- def set_nothing(easy)
87
- easy.url = url
88
- end
89
-
90
82
  # Setup request with params.
91
83
  #
92
84
  # @example Setup nothing.
@@ -4,6 +4,7 @@ module Ethon
4
4
 
5
5
  # This module contains logic for setting up a [multipart] POST body.
6
6
  module Postable
7
+
7
8
  # Set things up when form is provided.
8
9
  # Deals with multipart forms.
9
10
  #
@@ -19,8 +20,8 @@ module Ethon
19
20
  easy.httppost = form.first.read_pointer
20
21
  else
21
22
  form.escape = true
23
+ easy.postfieldsize = form.to_s.bytesize
22
24
  easy.copypostfields = form.to_s
23
- easy.postfieldsize = easy.copypostfields.bytesize
24
25
  end
25
26
  end
26
27
  end
@@ -12,7 +12,6 @@ module Ethon
12
12
  #
13
13
  # @param [ Easy ] easy The easy to setup.
14
14
  def set_form(easy)
15
- easy.url ||= url
16
15
  easy.upload = true
17
16
  form.escape = true
18
17
  easy.infilesize = form.to_s.bytesize
@@ -36,10 +36,14 @@ module Ethon
36
36
  # easy.prepare
37
37
  #
38
38
  # @api public
39
+ #
40
+ # @deprecated It is no longer necessary to call prepare.
39
41
  def prepare
40
- set_options
41
- set_headers
42
- set_callbacks
42
+ Ethon.logger.warn(
43
+ "ETHON: It is no longer necessay to call "+
44
+ "Easy#prepare. Its going to be removed "+
45
+ "in future versions."
46
+ )
43
47
  end
44
48
  end
45
49
  end
@@ -7,81 +7,491 @@ module Ethon
7
7
  # @api private
8
8
  module Options
9
9
 
10
- # :nodoc:
11
- def self.included(base)
12
- base.extend ClassMethods
13
- base.const_set(:AVAILABLE_OPTIONS, [
14
- :dns_cache_timeout, :httppost, :httpget, :nobody, :upload,
15
- :customrequest, :cainfo, :capath, :connecttimeout, :connecttimeout_ms,
16
- :forbid_reuse, :followlocation, :httpauth, :infilesize, :interface,
17
- :keypasswd, :maxredirs, :nosignal, :postfieldsize, :copypostfields, :proxy,
18
- :proxyauth, :proxyport, :proxytype, :proxyuserpwd, :timeout, :timeout_ms,
19
- :readdata, :sslcert, :ssl_verifypeer, :ssl_verifyhost, :sslcerttype,
20
- :sslkey, :sslkeytype, :sslversion, :url, :useragent, :userpwd,
21
- :verbose, :readfunction
22
- ])
23
- base.send(:attr_accessor, *Ethon::Easy::AVAILABLE_OPTIONS)
24
- end
25
-
26
- module ClassMethods # :nodoc:
27
-
28
- # Return the available options.
29
- #
30
- # @example Return the available options.
31
- # easy.available_options
32
- #
33
- # @return [ Array ] The available options.
34
- def available_options
35
- Ethon::Easy::AVAILABLE_OPTIONS
36
- end
10
+ attr_reader :url
37
11
 
38
- # Return the options which need to set as 0 or 1 for easy.
39
- #
40
- # @example Return the bool options.
41
- # easy.bool_options
42
- #
43
- # @return [ Array ] The bool options.
44
- def bool_options
45
- [
46
- :followlocation, :forbid_reuse, :nosignal, :ssl_verifypeer,
47
- :verbose, :httpget, :nobody, :upload
48
- ]
49
- end
12
+ # Sets cainfo option.
13
+ #
14
+ # @example Set cainfo option.
15
+ # easy.cainfo = $value
16
+ #
17
+ # @param [ String ] value The value to set.
18
+ #
19
+ # @return [ void ]
20
+ def cainfo=(value)
21
+ Curl.set_option(:cainfo, value_for(value, :string), handle)
22
+ end
50
23
 
51
- # Return the options which are an enum for easy.
52
- #
53
- # @example Return the enum options.
54
- # easy.enum_options
55
- #
56
- # @return [ Hash ] The enum options.
57
- def enum_options
58
- { :httpauth => Curl::Auth, :sslversion => Curl::SSLVersion }
59
- end
24
+ # Sets capath option.
25
+ #
26
+ # @example Set capath option.
27
+ # easy.capath = $value
28
+ #
29
+ # @param [ String ] value The value to set.
30
+ #
31
+ # @return [ void ]
32
+ def capath=(value)
33
+ Curl.set_option(:capath, value_for(value, :string), handle)
34
+ end
60
35
 
61
- # Return the options which need to set as an integer for easy.
62
- #
63
- # @example Return the int options.
64
- # easy.int_options
65
- #
66
- # @return [ Array ] The int options.
67
- def int_options
68
- [
69
- :connecttimeout, :connecttimeout_ms, :dns_cache_timeout, :infilesize, :maxredirs,
70
- :postfieldsize, :proxyport, :ssl_verifyhost, :timeout, :timeout_ms
71
- ]
72
- end
36
+ # Sets connecttimeout option.
37
+ #
38
+ # @example Set connecttimeout option.
39
+ # easy.connecttimeout = 1
40
+ #
41
+ # @param [ Integer ] value The value to set.
42
+ #
43
+ # @return [ void ]
44
+ def connecttimeout=(value)
45
+ Curl.set_option(:connecttimeout, value_for(value, :int), handle)
73
46
  end
74
47
 
75
- # Set specified options on easy handle.
48
+ # Sets connecttimeout_ms option.
76
49
  #
77
- # @example Set options.
78
- # easy.set_options
79
- def set_options
80
- self.class.available_options.each do |option|
81
- Curl.set_option(option, value_for(option), handle)
82
- end
50
+ # @example Set connecttimeout_ms option.
51
+ # easy.connecttimeout_ms = 1
52
+ #
53
+ # @param [ Integer ] value The value to set.
54
+ #
55
+ # @return [ void ]
56
+ def connecttimeout_ms=(value)
57
+ Curl.set_option(:connecttimeout_ms, value_for(value, :int), handle)
58
+ end
59
+
60
+ # Sets copypostfields option.
61
+ #
62
+ # @example Set copypostfields option.
63
+ # easy.copypostfields = $value
64
+ #
65
+ # @param [ String ] value The value to set.
66
+ #
67
+ # @return [ void ]
68
+ def copypostfields=(value)
69
+ Curl.set_option(:copypostfields, value_for(value, :string), handle)
70
+ end
71
+
72
+ # Sets customrequest option.
73
+ #
74
+ # @example Set customrequest option.
75
+ # easy.customrequest = $value
76
+ #
77
+ # @param [ String ] value The value to set.
78
+ #
79
+ # @return [ void ]
80
+ def customrequest=(value)
81
+ Curl.set_option(:customrequest, value_for(value, :string), handle)
82
+ end
83
+
84
+ # Sets dns_cache_timeout option.
85
+ #
86
+ # @example Set dns_cache_timeout option.
87
+ # easy.dns_cache_timeout = 1
88
+ #
89
+ # @param [ Integer ] value The value to set.
90
+ #
91
+ # @return [ void ]
92
+ def dns_cache_timeout=(value)
93
+ Curl.set_option(:dns_cache_timeout, value_for(value, :int), handle)
94
+ end
95
+
96
+ # Sets followlocation option.
97
+ #
98
+ # @example Set followlocation option.
99
+ # easy.followlocation = true
100
+ #
101
+ # @param [ Boolean ] value The value to set.
102
+ #
103
+ # @return [ void ]
104
+ def followlocation=(value)
105
+ Curl.set_option(:followlocation, value_for(value, :bool), handle)
106
+ end
107
+
108
+ # Sets forbid_reuse option.
109
+ #
110
+ # @example Set forbid_reuse option.
111
+ # easy.forbid_reuse = true
112
+ #
113
+ # @param [ Boolean ] value The value to set.
114
+ #
115
+ # @return [ void ]
116
+ def forbid_reuse=(value)
117
+ Curl.set_option(:forbid_reuse, value_for(value, :bool), handle)
118
+ end
119
+
120
+ # Sets httpauth option.
121
+ #
122
+ # @example Set httpauth option.
123
+ # easy.httpauth = $value
124
+ #
125
+ # @param [ $type_doc ] value The value to set.
126
+ #
127
+ # @return [ void ]
128
+ def httpauth=(value)
129
+ Curl.set_option(:httpauth, value_for(value, :enum, :httpauth), handle)
130
+ end
131
+
132
+ # Sets httpget option.
133
+ #
134
+ # @example Set httpget option.
135
+ # easy.httpget = true
136
+ #
137
+ # @param [ Boolean ] value The value to set.
138
+ #
139
+ # @return [ void ]
140
+ def httpget=(value)
141
+ Curl.set_option(:httpget, value_for(value, :bool), handle)
142
+ end
143
+
144
+ # Sets httppost option.
145
+ #
146
+ # @example Set httppost option.
147
+ # easy.httppost = $value
148
+ #
149
+ # @param [ String ] value The value to set.
150
+ #
151
+ # @return [ void ]
152
+ def httppost=(value)
153
+ Curl.set_option(:httppost, value_for(value, :string), handle)
154
+ end
155
+
156
+ # Sets infilesize option.
157
+ #
158
+ # @example Set infilesize option.
159
+ # easy.infilesize = 1
160
+ #
161
+ # @param [ Integer ] value The value to set.
162
+ #
163
+ # @return [ void ]
164
+ def infilesize=(value)
165
+ Curl.set_option(:infilesize, value_for(value, :int), handle)
166
+ end
167
+
168
+ # Sets interface option.
169
+ #
170
+ # @example Set interface option.
171
+ # easy.interface = $value
172
+ #
173
+ # @param [ String ] value The value to set.
174
+ #
175
+ # @return [ void ]
176
+ def interface=(value)
177
+ Curl.set_option(:interface, value_for(value, :string), handle)
178
+ end
179
+
180
+ # Sets keypasswd option.
181
+ #
182
+ # @example Set keypasswd option.
183
+ # easy.keypasswd = $value
184
+ #
185
+ # @param [ String ] value The value to set.
186
+ #
187
+ # @return [ void ]
188
+ def keypasswd=(value)
189
+ Curl.set_option(:keypasswd, value_for(value, :string), handle)
190
+ end
191
+
192
+ # Sets maxredirs option.
193
+ #
194
+ # @example Set maxredirs option.
195
+ # easy.maxredirs = 1
196
+ #
197
+ # @param [ Integer ] value The value to set.
198
+ #
199
+ # @return [ void ]
200
+ def maxredirs=(value)
201
+ Curl.set_option(:maxredirs, value_for(value, :int), handle)
202
+ end
203
+
204
+ # Sets nobody option.
205
+ #
206
+ # @example Set nobody option.
207
+ # easy.nobody = true
208
+ #
209
+ # @param [ Boolean ] value The value to set.
210
+ #
211
+ # @return [ void ]
212
+ def nobody=(value)
213
+ Curl.set_option(:nobody, value_for(value, :bool), handle)
214
+ end
215
+
216
+ # Sets nosignal option.
217
+ #
218
+ # @example Set nosignal option.
219
+ # easy.nosignal = true
220
+ #
221
+ # @param [ Boolean ] value The value to set.
222
+ #
223
+ # @return [ void ]
224
+ def nosignal=(value)
225
+ Curl.set_option(:nosignal, value_for(value, :bool), handle)
226
+ end
227
+
228
+ # Sets postfieldsize option.
229
+ #
230
+ # @example Set postfieldsize option.
231
+ # easy.postfieldsize = 1
232
+ #
233
+ # @param [ Integer ] value The value to set.
234
+ #
235
+ # @return [ void ]
236
+ def postfieldsize=(value)
237
+ Curl.set_option(:postfieldsize, value_for(value, :int), handle)
238
+ end
239
+
240
+ # Sets proxy option.
241
+ #
242
+ # @example Set proxy option.
243
+ # easy.proxy = $value
244
+ #
245
+ # @param [ String ] value The value to set.
246
+ #
247
+ # @return [ void ]
248
+ def proxy=(value)
249
+ Curl.set_option(:proxy, value_for(value, :string), handle)
250
+ end
251
+
252
+ # Sets proxyauth option.
253
+ #
254
+ # @example Set proxyauth option.
255
+ # easy.proxyauth = $value
256
+ #
257
+ # @param [ String ] value The value to set.
258
+ #
259
+ # @return [ void ]
260
+ def proxyauth=(value)
261
+ Curl.set_option(:proxyauth, value_for(value, :string), handle)
83
262
  end
84
263
 
264
+ # Sets proxyport option.
265
+ #
266
+ # @example Set proxyport option.
267
+ # easy.proxyport = 1
268
+ #
269
+ # @param [ Integer ] value The value to set.
270
+ #
271
+ # @return [ void ]
272
+ def proxyport=(value)
273
+ Curl.set_option(:proxyport, value_for(value, :int), handle)
274
+ end
275
+
276
+ # Sets proxytype option.
277
+ #
278
+ # @example Set proxytype option.
279
+ # easy.proxytype = $value
280
+ #
281
+ # @param [ String ] value The value to set.
282
+ #
283
+ # @return [ void ]
284
+ def proxytype=(value)
285
+ Curl.set_option(:proxytype, value_for(value, :string), handle)
286
+ end
287
+
288
+ # Sets proxyuserpwd option.
289
+ #
290
+ # @example Set proxyuserpwd option.
291
+ # easy.proxyuserpwd = $value
292
+ #
293
+ # @param [ String ] value The value to set.
294
+ #
295
+ # @return [ void ]
296
+ def proxyuserpwd=(value)
297
+ Curl.set_option(:proxyuserpwd, value_for(value, :string), handle)
298
+ end
299
+
300
+ # Sets readdata option.
301
+ #
302
+ # @example Set readdata option.
303
+ # easy.readdata = $value
304
+ #
305
+ # @param [ String ] value The value to set.
306
+ #
307
+ # @return [ void ]
308
+ def readdata=(value)
309
+ Curl.set_option(:readdata, value_for(value, :string), handle)
310
+ end
311
+
312
+ # Sets readfunction option.
313
+ #
314
+ # @example Set readfunction option.
315
+ # easy.readfunction = $value
316
+ #
317
+ # @param [ String ] value The value to set.
318
+ #
319
+ # @return [ void ]
320
+ def readfunction=(value)
321
+ Curl.set_option(:readfunction, value_for(value, :string), handle)
322
+ end
323
+
324
+ # Sets ssl_verifyhost option.
325
+ #
326
+ # @example Set ssl_verifyhost option.
327
+ # easy.ssl_verifyhost = 1
328
+ #
329
+ # @param [ Integer ] value The value to set.
330
+ #
331
+ # @return [ void ]
332
+ def ssl_verifyhost=(value)
333
+ Curl.set_option(:ssl_verifyhost, value_for(value, :int), handle)
334
+ end
335
+
336
+ # Sets ssl_verifypeer option.
337
+ #
338
+ # @example Set ssl_verifypeer option.
339
+ # easy.ssl_verifypeer = true
340
+ #
341
+ # @param [ Boolean ] value The value to set.
342
+ #
343
+ # @return [ void ]
344
+ def ssl_verifypeer=(value)
345
+ Curl.set_option(:ssl_verifypeer, value_for(value, :bool), handle)
346
+ end
347
+
348
+ # Sets sslcert option.
349
+ #
350
+ # @example Set sslcert option.
351
+ # easy.sslcert = $value
352
+ #
353
+ # @param [ String ] value The value to set.
354
+ #
355
+ # @return [ void ]
356
+ def sslcert=(value)
357
+ Curl.set_option(:sslcert, value_for(value, :string), handle)
358
+ end
359
+
360
+ # Sets sslcerttype option.
361
+ #
362
+ # @example Set sslcerttype option.
363
+ # easy.sslcerttype = $value
364
+ #
365
+ # @param [ String ] value The value to set.
366
+ #
367
+ # @return [ void ]
368
+ def sslcerttype=(value)
369
+ Curl.set_option(:sslcerttype, value_for(value, :string), handle)
370
+ end
371
+
372
+ # Sets sslkey option.
373
+ #
374
+ # @example Set sslkey option.
375
+ # easy.sslkey = $value
376
+ #
377
+ # @param [ String ] value The value to set.
378
+ #
379
+ # @return [ void ]
380
+ def sslkey=(value)
381
+ Curl.set_option(:sslkey, value_for(value, :string), handle)
382
+ end
383
+
384
+ # Sets sslkeytype option.
385
+ #
386
+ # @example Set sslkeytype option.
387
+ # easy.sslkeytype = $value
388
+ #
389
+ # @param [ String ] value The value to set.
390
+ #
391
+ # @return [ void ]
392
+ def sslkeytype=(value)
393
+ Curl.set_option(:sslkeytype, value_for(value, :string), handle)
394
+ end
395
+
396
+ # Sets sslversion option.
397
+ #
398
+ # @example Set sslversion option.
399
+ # easy.sslversion = $value
400
+ #
401
+ # @param [ $type_doc ] value The value to set.
402
+ #
403
+ # @return [ void ]
404
+ def sslversion=(value)
405
+ Curl.set_option(:sslversion, value_for(value, :enum, :sslversion), handle)
406
+ end
407
+
408
+ # Sets timeout option.
409
+ #
410
+ # @example Set timeout option.
411
+ # easy.timeout = 1
412
+ #
413
+ # @param [ Integer ] value The value to set.
414
+ #
415
+ # @return [ void ]
416
+ def timeout=(value)
417
+ Curl.set_option(:timeout, value_for(value, :int), handle)
418
+ end
419
+
420
+ # Sets timeout_ms option.
421
+ #
422
+ # @example Set timeout_ms option.
423
+ # easy.timeout_ms = 1
424
+ #
425
+ # @param [ Integer ] value The value to set.
426
+ #
427
+ # @return [ void ]
428
+ def timeout_ms=(value)
429
+ Curl.set_option(:timeout_ms, value_for(value, :int), handle)
430
+ end
431
+
432
+ # Sets upload option.
433
+ #
434
+ # @example Set upload option.
435
+ # easy.upload = true
436
+ #
437
+ # @param [ Boolean ] value The value to set.
438
+ #
439
+ # @return [ void ]
440
+ def upload=(value)
441
+ Curl.set_option(:upload, value_for(value, :bool), handle)
442
+ end
443
+
444
+ # Sets url option.
445
+ #
446
+ # @example Set url option.
447
+ # easy.url = $value
448
+ #
449
+ # @param [ String ] value The value to set.
450
+ #
451
+ # @return [ void ]
452
+ def url=(value)
453
+ @url = value
454
+ Curl.set_option(:url, value_for(value, :string), handle)
455
+ end
456
+
457
+ # Sets useragent option.
458
+ #
459
+ # @example Set useragent option.
460
+ # easy.useragent = $value
461
+ #
462
+ # @param [ String ] value The value to set.
463
+ #
464
+ # @return [ void ]
465
+ def useragent=(value)
466
+ Curl.set_option(:useragent, value_for(value, :string), handle)
467
+ end
468
+
469
+ # Sets userpwd option.
470
+ #
471
+ # @example Set userpwd option.
472
+ # easy.userpwd = $value
473
+ #
474
+ # @param [ String ] value The value to set.
475
+ #
476
+ # @return [ void ]
477
+ def userpwd=(value)
478
+ Curl.set_option(:userpwd, value_for(value, :string), handle)
479
+ end
480
+
481
+ # Sets verbose option.
482
+ #
483
+ # @example Set verbose option.
484
+ # easy.verbose = true
485
+ #
486
+ # @param [ Boolean ] value The value to set.
487
+ #
488
+ # @return [ void ]
489
+ def verbose=(value)
490
+ Curl.set_option(:verbose, value_for(value, :bool), handle)
491
+ end
492
+
493
+ private
494
+
85
495
  # Return the value to set to easy handle. It is converted with the help
86
496
  # of bool_options, enum_options and int_options.
87
497
  #
@@ -95,19 +505,26 @@ module Ethon
95
505
  # @raise [ Ethon::Errors::InvalidValue ] If specified option
96
506
  # points to an enum and the value doen't correspond to
97
507
  # the valid values.
98
- def value_for(option)
99
- value = method(option).call
508
+ def value_for(value, type, option = nil)
100
509
  return nil if value.nil?
101
510
 
102
- if self.class.bool_options.include?(option)
511
+ if type == :bool
103
512
  value ? 1 : 0
104
- elsif self.class.enum_options.key?(option)
105
- self.class.enum_options[option].to_h.fetch(value) do
513
+ elsif type == :int
514
+ value.to_i
515
+ elsif type == :enum && option == :httpauth
516
+ Curl::Auth.to_h.fetch(value) do
106
517
  raise Errors::InvalidValue.new(option, value)
107
518
  end
108
- elsif self.class.int_options.include?(option)
109
- value.to_i
110
- elsif value.is_a?(::String)
519
+ elsif type == :enum && option == :sslversion
520
+ Curl::SSLVersion.to_h.fetch(value) do
521
+ raise Errors::InvalidValue.new(option, value)
522
+ end
523
+ elsif type == :enum && option == :proxytype
524
+ Curl::Proxy.to_h.fetch(value) do
525
+ raise Errors::InvalidValue.new(option, value)
526
+ end
527
+ elsif value.is_a?(String)
111
528
  Util.escape_zero_byte(value)
112
529
  else
113
530
  value
@@ -0,0 +1,8 @@
1
+ module Ethon
2
+ module Libc
3
+ extend FFI::Library
4
+ ffi_lib 'c'
5
+ attach_function :getdtablesize, [], :int
6
+ attach_function :free, [:pointer], :void
7
+ end
8
+ end
@@ -1,3 +1,4 @@
1
+ require 'ethon/easy/util'
1
2
  require 'ethon/multi/stack'
2
3
  require 'ethon/multi/operations'
3
4
  require 'ethon/multi/options'
@@ -30,16 +30,6 @@ module Ethon
30
30
  @max_fd = ::FFI::MemoryPointer.new(:int)
31
31
  end
32
32
 
33
- # Return wether the multi still requests or not.
34
- #
35
- # @example Return if ongoing.
36
- # multi.ongoing?
37
- #
38
- # @return [ Boolean ] True if ongoing, else false.
39
- def ongoing?
40
- easy_handles.size > 0 || (!defined?(@running_count) || running_count > 0)
41
- end
42
-
43
33
  # Perform multi.
44
34
  #
45
35
  # @return [ nil ]
@@ -69,8 +59,26 @@ module Ethon
69
59
  # multi.prepare
70
60
  #
71
61
  # @api public
62
+ #
63
+ # @deprecated It is no longer necessary to call prepare.
72
64
  def prepare
73
- set_options
65
+ Ethon.logger.warn(
66
+ "ETHON: It is no longer necessay to call "+
67
+ "Multi#prepare. Its going to be removed "+
68
+ "in future versions."
69
+ )
70
+ end
71
+
72
+ private
73
+
74
+ # Return wether the multi still requests or not.
75
+ #
76
+ # @example Return if ongoing.
77
+ # multi.ongoing?
78
+ #
79
+ # @return [ Boolean ] True if ongoing, else false.
80
+ def ongoing?
81
+ easy_handles.size > 0 || (!defined?(@running_count) || running_count > 0)
74
82
  end
75
83
 
76
84
  # Get timeout.
@@ -5,63 +5,80 @@ module Ethon
5
5
  # available options on multi.
6
6
  module Options
7
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)
8
+ # Sets maxconnects option.
9
+ #
10
+ # @example Set maxconnects option.
11
+ # easy.maxconnects = $value
12
+ #
13
+ # @param [ String ] value The value to set.
14
+ #
15
+ # @return [ void ]
16
+ def maxconnects=(value)
17
+ Curl.set_option(:maxconnects, value_for(value, :int), handle)
16
18
  end
17
19
 
18
- module ClassMethods # :nodoc:
20
+ # Sets pipelining option.
21
+ #
22
+ # @example Set pipelining option.
23
+ # easy.pipelining = $value
24
+ #
25
+ # @param [ String ] value The value to set.
26
+ #
27
+ # @return [ void ]
28
+ def pipelining=(value)
29
+ Curl.set_option(:pipelining, value_for(value, :bool), handle)
30
+ end
19
31
 
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
32
+ # Sets socketdata option.
33
+ #
34
+ # @example Set socketdata option.
35
+ # easy.socketdata = $value
36
+ #
37
+ # @param [ String ] value The value to set.
38
+ #
39
+ # @return [ void ]
40
+ def socketdata=(value)
41
+ Curl.set_option(:socketdata, value_for(value, :string), handle)
42
+ end
29
43
 
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
44
+ # Sets socketfunction option.
45
+ #
46
+ # @example Set socketfunction option.
47
+ # easy.socketfunction = $value
48
+ #
49
+ # @param [ String ] value The value to set.
50
+ #
51
+ # @return [ void ]
52
+ def socketfunction=(value)
53
+ Curl.set_option(:socketfunction, value_for(value, :string), handle)
54
+ end
41
55
 
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
56
+ # Sets timerdata option.
57
+ #
58
+ # @example Set timerdata option.
59
+ # easy.timerdata = $value
60
+ #
61
+ # @param [ String ] value The value to set.
62
+ #
63
+ # @return [ void ]
64
+ def timerdata=(value)
65
+ Curl.set_option(:timerdata, value_for(value, :string), handle)
53
66
  end
54
67
 
55
- # Set specified options on multi handle.
68
+ # Sets timerfunction option.
56
69
  #
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
70
+ # @example Set timerfunction option.
71
+ # easy.timerfunction = $value
72
+ #
73
+ # @param [ String ] value The value to set.
74
+ #
75
+ # @return [ void ]
76
+ def timerfunction=(value)
77
+ Curl.set_option(:timerfunction, value_for(value, :string), handle)
63
78
  end
64
79
 
80
+ private
81
+
65
82
  # Return the value to set to multi handle. It is converted with the help
66
83
  # of bool_options, enum_options and int_options.
67
84
  #
@@ -69,14 +86,15 @@ module Ethon
69
86
  # multi.value_for(:verbose)
70
87
  #
71
88
  # @return [ Object ] The casted value.
72
- def value_for(option)
73
- value = method(option).call
89
+ def value_for(value, type, option = nil)
74
90
  return nil if value.nil?
75
91
 
76
- if self.class.bool_options.include?(option)
92
+ if type == :bool
77
93
  value ? 1 : 0
78
- elsif self.class.int_options.include?(option)
94
+ elsif type == :int
79
95
  value.to_i
96
+ elsif value.is_a?(String)
97
+ Ethon::Easy::Util.escape_zero_byte(value)
80
98
  else
81
99
  value
82
100
  end
@@ -3,5 +3,5 @@ module Ethon
3
3
  # Ethon version.
4
4
  #
5
5
  # @api public
6
- VERSION = '0.5.2'
6
+ VERSION = '0.5.3'
7
7
  end
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.2
4
+ version: 0.5.3
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: 2012-10-30 00:00:00.000000000 Z
12
+ date: 2012-11-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -95,6 +95,7 @@ files:
95
95
  - lib/ethon/errors/multi_timeout.rb
96
96
  - lib/ethon/errors/select.rb
97
97
  - lib/ethon/errors.rb
98
+ - lib/ethon/libc.rb
98
99
  - lib/ethon/loggable.rb
99
100
  - lib/ethon/multi/operations.rb
100
101
  - lib/ethon/multi/options.rb
@@ -121,7 +122,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
121
122
  version: '0'
122
123
  segments:
123
124
  - 0
124
- hash: -2796817779069789218
125
+ hash: -3112365376601188521
125
126
  required_rubygems_version: !ruby/object:Gem::Requirement
126
127
  none: false
127
128
  requirements: