curb 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.markdown +16 -4
- data/Rakefile +1 -1
- data/ext/curb.c +75 -45
- data/ext/curb.h +3 -3
- data/ext/curb_easy.c +49 -35
- data/ext/curb_macros.h +7 -7
- data/ext/curb_multi.c +98 -34
- data/ext/curb_upload.c +2 -2
- data/ext/extconf.rb +3 -0
- data/lib/curl/easy.rb +2 -2
- data/lib/curl/multi.rb +3 -3
- data/tests/tc_curl_multi.rb +4 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c2d299f9e0dce739a74ea53589cc402c4dc2ae2b
|
4
|
+
data.tar.gz: efd8d73f02b9da758c3861a93489e78bb770e4af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 364eed3e88338d6c1c7fc8028181b82e945d8d605d171d470d319a434ad7198a2900fe600e4870ac2acc680a35df4e4506471d923cee020d707888168920276d
|
7
|
+
data.tar.gz: ad15467a00c66ee255ed5a605ed48426400a12901e673181c873cf56c7e793534b4b17304cd75b02fd7c15d8e51e2b7a6f1bd24e5dc36c3ffc35096ef6c1b030
|
data/README.markdown
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Curb - Libcurl bindings for Ruby
|
1
|
+
# Curb - Libcurl bindings for Ruby [](https://travis-ci.org/taf2/curb)
|
2
2
|
|
3
3
|
* [rubydoc rdoc](http://www.rubydoc.info/github/taf2/curb/)
|
4
4
|
* [github project](http://github.com/taf2/curb/tree/master)
|
@@ -172,14 +172,25 @@ c.multipart_form_post = true
|
|
172
172
|
c.http_post(Curl::PostField.file('thing[file]', 'myfile.rb'))
|
173
173
|
```
|
174
174
|
|
175
|
+
### Using HTTP/2
|
176
|
+
|
177
|
+
```ruby
|
178
|
+
c = Curl::Easy.new("https://http2.akamai.com")
|
179
|
+
c.set(:HTTP_VERSION, Curl::HTTP_2_0)
|
180
|
+
|
181
|
+
c.perform
|
182
|
+
puts (c.body_str.include? "You are using HTTP/2 right now!") ? "HTTP/2" : "HTTP/1.x"
|
183
|
+
```
|
184
|
+
|
175
185
|
### Multi Interface (Basic HTTP GET):
|
176
186
|
|
177
187
|
```ruby
|
178
188
|
# make multiple GET requests
|
179
189
|
easy_options = {:follow_location => true}
|
180
|
-
|
190
|
+
# Use Curl::CURLPIPE_MULTIPLEX for HTTP/2 multiplexing
|
191
|
+
multi_options = {:pipeline => Curl::CURLPIPE_HTTP1}
|
181
192
|
|
182
|
-
Curl::Multi.get('url1','url2','url3','url4','url5', easy_options, multi_options) do|easy|
|
193
|
+
Curl::Multi.get(['url1','url2','url3','url4','url5'], easy_options, multi_options) do|easy|
|
183
194
|
# do something interesting with the easy response
|
184
195
|
puts easy.last_effective_url
|
185
196
|
end
|
@@ -190,7 +201,8 @@ end
|
|
190
201
|
```ruby
|
191
202
|
# make multiple POST requests
|
192
203
|
easy_options = {:follow_location => true, :multipart_form_post => true}
|
193
|
-
multi_options = {:pipeline =>
|
204
|
+
multi_options = {:pipeline => Curl::CURLPIPE_HTTP1}
|
205
|
+
|
194
206
|
|
195
207
|
url_fields = [
|
196
208
|
{ :url => 'url1', :post_fields => {'f1' => 'v1'} },
|
data/Rakefile
CHANGED
data/ext/curb.c
CHANGED
@@ -258,122 +258,128 @@ void Init_curb_core() {
|
|
258
258
|
rb_define_const(mCurl, "CURL_LONG_VERSION", curllongver);
|
259
259
|
|
260
260
|
/* Passed to on_debug handler to indicate that the data is informational text. */
|
261
|
-
rb_define_const(mCurl, "CURLINFO_TEXT",
|
261
|
+
rb_define_const(mCurl, "CURLINFO_TEXT", LONG2NUM(CURLINFO_TEXT));
|
262
262
|
|
263
263
|
/* Passed to on_debug handler to indicate that the data is header (or header-like) data received from the peer. */
|
264
|
-
rb_define_const(mCurl, "CURLINFO_HEADER_IN",
|
264
|
+
rb_define_const(mCurl, "CURLINFO_HEADER_IN", LONG2NUM(CURLINFO_HEADER_IN));
|
265
265
|
|
266
266
|
/* Passed to on_debug handler to indicate that the data is header (or header-like) data sent to the peer. */
|
267
|
-
rb_define_const(mCurl, "CURLINFO_HEADER_OUT",
|
267
|
+
rb_define_const(mCurl, "CURLINFO_HEADER_OUT", LONG2NUM(CURLINFO_HEADER_OUT));
|
268
268
|
|
269
269
|
/* Passed to on_debug handler to indicate that the data is protocol data received from the peer. */
|
270
|
-
rb_define_const(mCurl, "CURLINFO_DATA_IN",
|
270
|
+
rb_define_const(mCurl, "CURLINFO_DATA_IN", LONG2NUM(CURLINFO_DATA_IN));
|
271
271
|
|
272
272
|
/* Passed to on_debug handler to indicate that the data is protocol data sent to the peer. */
|
273
|
-
rb_define_const(mCurl, "CURLINFO_DATA_OUT",
|
273
|
+
rb_define_const(mCurl, "CURLINFO_DATA_OUT", LONG2NUM(CURLINFO_DATA_OUT));
|
274
274
|
|
275
275
|
#ifdef HAVE_CURLFTPMETHOD_MULTICWD
|
276
|
-
rb_define_const(mCurl, "CURL_MULTICWD",
|
276
|
+
rb_define_const(mCurl, "CURL_MULTICWD", LONG2NUM(CURLFTPMETHOD_MULTICWD));
|
277
277
|
#endif
|
278
278
|
|
279
279
|
#ifdef HAVE_CURLFTPMETHOD_NOCWD
|
280
|
-
rb_define_const(mCurl, "CURL_NOCWD",
|
280
|
+
rb_define_const(mCurl, "CURL_NOCWD", LONG2NUM(CURLFTPMETHOD_NOCWD));
|
281
281
|
#endif
|
282
282
|
|
283
283
|
#ifdef HAVE_CURLFTPMETHOD_SINGLECWD
|
284
|
-
rb_define_const(mCurl, "CURL_SINGLECWD",
|
284
|
+
rb_define_const(mCurl, "CURL_SINGLECWD", LONG2NUM(CURLFTPMETHOD_SINGLECWD));
|
285
285
|
#endif
|
286
286
|
|
287
287
|
/* When passed to Curl::Easy#proxy_type , indicates that the proxy is an HTTP proxy. (libcurl >= 7.10) */
|
288
288
|
#ifdef HAVE_CURLPROXY_HTTP
|
289
|
-
rb_define_const(mCurl, "CURLPROXY_HTTP",
|
289
|
+
rb_define_const(mCurl, "CURLPROXY_HTTP", LONG2NUM(CURLPROXY_HTTP));
|
290
290
|
#else
|
291
|
-
rb_define_const(mCurl, "CURLPROXY_HTTP",
|
291
|
+
rb_define_const(mCurl, "CURLPROXY_HTTP", LONG2NUM(-1));
|
292
292
|
#endif
|
293
293
|
|
294
294
|
#ifdef CURL_VERSION_SSL
|
295
|
-
rb_define_const(mCurl, "CURL_SSLVERSION_DEFAULT",
|
296
|
-
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1",
|
297
|
-
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv2",
|
298
|
-
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv3",
|
299
|
-
|
300
|
-
rb_define_const(mCurl, "
|
301
|
-
rb_define_const(mCurl, "
|
302
|
-
|
303
|
-
rb_define_const(mCurl, "
|
295
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_DEFAULT", LONG2NUM(CURL_SSLVERSION_DEFAULT));
|
296
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1", LONG2NUM(CURL_SSLVERSION_TLSv1));
|
297
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv2", LONG2NUM(CURL_SSLVERSION_SSLv2));
|
298
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv3", LONG2NUM(CURL_SSLVERSION_SSLv3));
|
299
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_0", LONG2NUM(CURL_SSLVERSION_TLSv1_0));
|
300
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_1", LONG2NUM(CURL_SSLVERSION_TLSv1_1));
|
301
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_2", LONG2NUM(CURL_SSLVERSION_TLSv1_2));
|
302
|
+
|
303
|
+
rb_define_const(mCurl, "CURL_USESSL_CONTROL", LONG2NUM(CURB_FTPSSL_CONTROL));
|
304
|
+
rb_define_const(mCurl, "CURL_USESSL_NONE", LONG2NUM(CURB_FTPSSL_NONE));
|
305
|
+
rb_define_const(mCurl, "CURL_USESSL_TRY", LONG2NUM(CURB_FTPSSL_TRY));
|
306
|
+
rb_define_const(mCurl, "CURL_USESSL_ALL", LONG2NUM(CURB_FTPSSL_ALL));
|
304
307
|
#else
|
305
|
-
rb_define_const(mCurl, "CURL_SSLVERSION_DEFAULT",
|
306
|
-
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1",
|
307
|
-
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv2",
|
308
|
-
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv3",
|
308
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_DEFAULT", LONG2NUM(-1));
|
309
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1", LONG2NUM(-1));
|
310
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv2", LONG2NUM(-1));
|
311
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv3", LONG2NUM(-1));
|
312
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_0", LONG2NUM(-1));
|
313
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_1", LONG2NUM(-1));
|
314
|
+
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_2", LONG2NUM(-1));
|
309
315
|
|
310
|
-
rb_define_const(mCurl, "CURL_USESSL_CONTROL",
|
311
|
-
rb_define_const(mCurl, "CURL_USESSL_NONE",
|
312
|
-
rb_define_const(mCurl, "CURL_USESSL_TRY",
|
313
|
-
rb_define_const(mCurl, "CURL_USESSL_ALL",
|
316
|
+
rb_define_const(mCurl, "CURL_USESSL_CONTROL", LONG2NUM(-1));
|
317
|
+
rb_define_const(mCurl, "CURL_USESSL_NONE", LONG2NUM(-1));
|
318
|
+
rb_define_const(mCurl, "CURL_USESSL_TRY", LONG2NUM(-1));
|
319
|
+
rb_define_const(mCurl, "CURL_USESSL_ALL", LONG2NUM(-1));
|
314
320
|
#endif
|
315
321
|
|
316
322
|
/* When passed to Curl::Easy#proxy_type , indicates that the proxy is a SOCKS4 proxy. (libcurl >= 7.15.2) */
|
317
323
|
#ifdef HAVE_CURLPROXY_SOCKS4
|
318
|
-
rb_define_const(mCurl, "CURLPROXY_SOCKS4",
|
324
|
+
rb_define_const(mCurl, "CURLPROXY_SOCKS4", LONG2NUM(CURLPROXY_SOCKS4));
|
319
325
|
#else
|
320
|
-
rb_define_const(mCurl, "CURLPROXY_SOCKS4",
|
326
|
+
rb_define_const(mCurl, "CURLPROXY_SOCKS4", LONG2NUM(-2));
|
321
327
|
#endif
|
322
328
|
|
323
329
|
/* When passed to Curl::Easy#proxy_type , indicates that the proxy is a SOCKS4A proxy. (libcurl >= 7.18.0) */
|
324
330
|
#ifdef HAVE_CURLPROXY_SOCKS4A
|
325
|
-
rb_define_const(mCurl, "CURLPROXY_SOCKS4A",
|
331
|
+
rb_define_const(mCurl, "CURLPROXY_SOCKS4A", LONG2NUM(CURLPROXY_SOCKS4A));
|
326
332
|
#else
|
327
|
-
rb_define_const(mCurl, "CURLPROXY_SOCKS4A",
|
333
|
+
rb_define_const(mCurl, "CURLPROXY_SOCKS4A", LONG2NUM(-2));
|
328
334
|
#endif
|
329
335
|
|
330
336
|
/* When passed to Curl::Easy#proxy_type , indicates that the proxy is a SOCKS5 proxy. (libcurl >= 7.10) */
|
331
337
|
#ifdef HAVE_CURLPROXY_SOCKS5
|
332
|
-
rb_define_const(mCurl, "CURLPROXY_SOCKS5",
|
338
|
+
rb_define_const(mCurl, "CURLPROXY_SOCKS5", LONG2NUM(CURLPROXY_SOCKS5));
|
333
339
|
#else
|
334
|
-
rb_define_const(mCurl, "CURLPROXY_SOCKS5",
|
340
|
+
rb_define_const(mCurl, "CURLPROXY_SOCKS5", LONG2NUM(-2));
|
335
341
|
#endif
|
336
342
|
|
337
343
|
/* When passed to Curl::Easy#http_auth_types or Curl::Easy#proxy_auth_types, directs libcurl to use Basic authentication. */
|
338
344
|
#ifdef HAVE_CURLAUTH_BASIC
|
339
|
-
rb_define_const(mCurl, "CURLAUTH_BASIC",
|
345
|
+
rb_define_const(mCurl, "CURLAUTH_BASIC", LONG2NUM(CURLAUTH_BASIC));
|
340
346
|
#else
|
341
|
-
rb_define_const(mCurl, "CURLAUTH_BASIC",
|
347
|
+
rb_define_const(mCurl, "CURLAUTH_BASIC", LONG2NUM(0));
|
342
348
|
#endif
|
343
349
|
|
344
350
|
/* When passed to Curl::Easy#http_auth_types or Curl::Easy#proxy_auth_types, directs libcurl to use Digest authentication. */
|
345
351
|
#ifdef HAVE_CURLAUTH_DIGEST
|
346
|
-
rb_define_const(mCurl, "CURLAUTH_DIGEST",
|
352
|
+
rb_define_const(mCurl, "CURLAUTH_DIGEST", LONG2NUM(CURLAUTH_DIGEST));
|
347
353
|
#else
|
348
|
-
rb_define_const(mCurl, "CURLAUTH_DIGEST",
|
354
|
+
rb_define_const(mCurl, "CURLAUTH_DIGEST", LONG2NUM(0));
|
349
355
|
#endif
|
350
356
|
|
351
357
|
/* When passed to Curl::Easy#http_auth_types or Curl::Easy#proxy_auth_types, directs libcurl to use GSS Negotiate authentication. Requires a suitable GSS-API library. */
|
352
358
|
#ifdef HAVE_CURLAUTH_GSSNEGOTIATE
|
353
|
-
rb_define_const(mCurl, "CURLAUTH_GSSNEGOTIATE",
|
359
|
+
rb_define_const(mCurl, "CURLAUTH_GSSNEGOTIATE", LONG2NUM(CURLAUTH_GSSNEGOTIATE));
|
354
360
|
#else
|
355
|
-
rb_define_const(mCurl, "CURLAUTH_GSSNEGOTIATE",
|
361
|
+
rb_define_const(mCurl, "CURLAUTH_GSSNEGOTIATE", LONG2NUM(0));
|
356
362
|
#endif
|
357
363
|
|
358
364
|
/* When passed to Curl::Easy#http_auth_types or Curl::Easy#proxy_auth_types, directs libcurl to use HTTP NTLM authentication. Requires MS Windows or OpenSSL support. */
|
359
365
|
#ifdef HAVE_CURLAUTH_NTLM
|
360
|
-
rb_define_const(mCurl, "CURLAUTH_NTLM",
|
366
|
+
rb_define_const(mCurl, "CURLAUTH_NTLM", LONG2NUM(CURLAUTH_NTLM));
|
361
367
|
#else
|
362
|
-
rb_define_const(mCurl, "CURLAUTH_NTLM",
|
368
|
+
rb_define_const(mCurl, "CURLAUTH_NTLM", LONG2NUM(0));
|
363
369
|
#endif
|
364
370
|
|
365
371
|
/* When passed to Curl::Easy#http_auth_types or Curl::Easy#proxy_auth_types, allows libcurl to select any suitable authentication method except basic. */
|
366
372
|
#ifdef HAVE_CURLAUTH_ANYSAFE
|
367
|
-
rb_define_const(mCurl, "CURLAUTH_ANYSAFE",
|
373
|
+
rb_define_const(mCurl, "CURLAUTH_ANYSAFE", LONG2NUM(CURLAUTH_ANYSAFE));
|
368
374
|
#else
|
369
|
-
rb_define_const(mCurl, "CURLAUTH_ANYSAFE",
|
375
|
+
rb_define_const(mCurl, "CURLAUTH_ANYSAFE", LONG2NUM(0));
|
370
376
|
#endif
|
371
377
|
|
372
378
|
/* When passed to Curl::Easy#http_auth_types or Curl::Easy#proxy_auth_types, allows libcurl to select any suitable authentication method. */
|
373
379
|
#ifdef HAVE_CURLAUTH_ANY
|
374
|
-
rb_define_const(mCurl, "CURLAUTH_ANY",
|
380
|
+
rb_define_const(mCurl, "CURLAUTH_ANY", LONG2NUM(CURLAUTH_ANY));
|
375
381
|
#else
|
376
|
-
rb_define_const(mCurl, "CURLAUTH_ANY",
|
382
|
+
rb_define_const(mCurl, "CURLAUTH_ANY", LONG2NUM(0));
|
377
383
|
#endif
|
378
384
|
|
379
385
|
CURB_DEFINE(CURLOPT_VERBOSE);
|
@@ -585,6 +591,9 @@ void Init_curb_core() {
|
|
585
591
|
CURB_DEFINE(CURL_HTTP_VERSION_NONE);
|
586
592
|
CURB_DEFINE(CURL_HTTP_VERSION_1_0);
|
587
593
|
CURB_DEFINE(CURL_HTTP_VERSION_1_1);
|
594
|
+
#if LIBCURL_VERSION_NUM >= 0x072100 /* 7.33.0 */
|
595
|
+
CURB_DEFINE(CURL_HTTP_VERSION_2_0);
|
596
|
+
#endif
|
588
597
|
#if HAVE_CURLOPT_IGNORE_CONTENT_LENGTH
|
589
598
|
CURB_DEFINE(CURLOPT_IGNORE_CONTENT_LENGTH);
|
590
599
|
#endif
|
@@ -886,6 +895,15 @@ void Init_curb_core() {
|
|
886
895
|
#if HAVE_CURL_SSLVERSION_SSLv3
|
887
896
|
CURB_DEFINE(CURL_SSLVERSION_SSLv3);
|
888
897
|
#endif
|
898
|
+
#if HAVE_CURL_SSLVERSION_TLSv1_0
|
899
|
+
CURB_DEFINE(CURL_SSLVERSION_TLSv1_0);
|
900
|
+
#endif
|
901
|
+
#if HAVE_CURL_SSLVERSION_TLSv1_1
|
902
|
+
CURB_DEFINE(CURL_SSLVERSION_TLSv1_1);
|
903
|
+
#endif
|
904
|
+
#if HAVE_CURL_SSLVERSION_TLSv1_2
|
905
|
+
CURB_DEFINE(CURL_SSLVERSION_TLSv1_2);
|
906
|
+
#endif
|
889
907
|
#if HAVE_CURLOPT_SSL_VERIFYPEER
|
890
908
|
CURB_DEFINE(CURLOPT_SSL_VERIFYPEER);
|
891
909
|
#endif
|
@@ -990,6 +1008,16 @@ void Init_curb_core() {
|
|
990
1008
|
CURB_DEFINE(CURLOPT_UNIX_SOCKET_PATH);
|
991
1009
|
#endif
|
992
1010
|
|
1011
|
+
#if LIBCURL_VERSION_NUM >= 0x072B00 /* 7.43.0 */
|
1012
|
+
CURB_DEFINE(CURLPIPE_NOTHING);
|
1013
|
+
CURB_DEFINE(CURLPIPE_HTTP1);
|
1014
|
+
CURB_DEFINE(CURLPIPE_MULTIPLEX);
|
1015
|
+
|
1016
|
+
rb_define_const(mCurl, "PIPE_NOTHING", LONG2NUM(CURLPIPE_NOTHING));
|
1017
|
+
rb_define_const(mCurl, "PIPE_HTTP1", LONG2NUM(CURLPIPE_HTTP1));
|
1018
|
+
rb_define_const(mCurl, "PIPE_MULTIPLEX", LONG2NUM(CURLPIPE_MULTIPLEX));
|
1019
|
+
#endif
|
1020
|
+
|
993
1021
|
#if LIBCURL_VERSION_NUM >= 0x072100 /* 7.33.0 */
|
994
1022
|
rb_define_const(mCurl, "HTTP_2_0", LONG2NUM(CURL_HTTP_VERSION_2_0));
|
995
1023
|
#endif
|
@@ -997,6 +1025,8 @@ void Init_curb_core() {
|
|
997
1025
|
rb_define_const(mCurl, "HTTP_1_0", LONG2NUM(CURL_HTTP_VERSION_1_0));
|
998
1026
|
rb_define_const(mCurl, "HTTP_NONE", LONG2NUM(CURL_HTTP_VERSION_NONE));
|
999
1027
|
|
1028
|
+
|
1029
|
+
|
1000
1030
|
rb_define_singleton_method(mCurl, "ipv6?", ruby_curl_ipv6_q, 0);
|
1001
1031
|
rb_define_singleton_method(mCurl, "kerberos4?", ruby_curl_kerberos4_q, 0);
|
1002
1032
|
rb_define_singleton_method(mCurl, "ssl?", ruby_curl_ssl_q, 0);
|
data/ext/curb.h
CHANGED
@@ -20,10 +20,10 @@
|
|
20
20
|
#include "curb_macros.h"
|
21
21
|
|
22
22
|
// These should be managed from the Rake 'release' task.
|
23
|
-
#define CURB_VERSION "0.9.
|
24
|
-
#define CURB_VER_NUM
|
23
|
+
#define CURB_VERSION "0.9.2"
|
24
|
+
#define CURB_VER_NUM 902
|
25
25
|
#define CURB_VER_MAJ 0
|
26
|
-
#define CURB_VER_MIN
|
26
|
+
#define CURB_VER_MIN 2
|
27
27
|
#define CURB_VER_MIC 0
|
28
28
|
#define CURB_VER_PATCH 0
|
29
29
|
|
data/ext/curb_easy.c
CHANGED
@@ -192,7 +192,7 @@ static int proc_progress_handler(VALUE proc,
|
|
192
192
|
|
193
193
|
static VALUE call_debug_handler(VALUE ary) {
|
194
194
|
return rb_funcall(rb_ary_entry(ary, 0), idCall, 2,
|
195
|
-
rb_ary_entry(ary, 1), //
|
195
|
+
rb_ary_entry(ary, 1), // INT2NUM(type),
|
196
196
|
rb_ary_entry(ary, 2)); // rb_str_new(data, data_len)
|
197
197
|
}
|
198
198
|
static int proc_debug_handler(CURL *curl,
|
@@ -202,13 +202,13 @@ static int proc_debug_handler(CURL *curl,
|
|
202
202
|
VALUE proc) {
|
203
203
|
VALUE callargs = rb_ary_new2(3);
|
204
204
|
rb_ary_store(callargs, 0, proc);
|
205
|
-
rb_ary_store(callargs, 1,
|
205
|
+
rb_ary_store(callargs, 1, INT2NUM(type));
|
206
206
|
rb_ary_store(callargs, 2, rb_str_new(data, data_len));
|
207
207
|
rb_rescue(call_debug_handler, callargs, callback_exception, Qnil);
|
208
208
|
/* no way to indicate to libcurl that we should break out given an exception in the on_debug handler...
|
209
209
|
* this means exceptions will be swallowed
|
210
210
|
*/
|
211
|
-
//rb_funcall(proc, idCall, 2,
|
211
|
+
//rb_funcall(proc, idCall, 2, INT2NUM(type), rb_str_new(data, data_len));
|
212
212
|
return 0;
|
213
213
|
}
|
214
214
|
|
@@ -827,14 +827,14 @@ static VALUE ruby_curl_easy_put_data_set(VALUE self, VALUE data) {
|
|
827
827
|
rb_hash_aset(headers, rb_str_new2("Expect"), rb_str_new2(""));
|
828
828
|
}
|
829
829
|
size = rb_funcall(stat, rb_intern("size"), 0);
|
830
|
-
curl_easy_setopt(curl, CURLOPT_INFILESIZE,
|
830
|
+
curl_easy_setopt(curl, CURLOPT_INFILESIZE, NUM2LONG(size));
|
831
831
|
}
|
832
832
|
else if( rb_hash_aref(headers, rb_str_new2("Content-Length")) == Qnil && rb_hash_aref(headers, rb_str_new2("Transfer-Encoding")) == Qnil ) {
|
833
833
|
rb_hash_aset(headers, rb_str_new2("Transfer-Encoding"), rb_str_new2("chunked"));
|
834
834
|
}
|
835
835
|
else if( rb_hash_aref(headers, rb_str_new2("Content-Length")) ) {
|
836
836
|
VALUE size = rb_funcall(rb_hash_aref(headers, rb_str_new2("Content-Length")), rb_intern("to_i"), 0);
|
837
|
-
curl_easy_setopt(curl, CURLOPT_INFILESIZE,
|
837
|
+
curl_easy_setopt(curl, CURLOPT_INFILESIZE, NUM2LONG(size));
|
838
838
|
}
|
839
839
|
}
|
840
840
|
else if (rb_respond_to(data, rb_intern("to_s"))) {
|
@@ -978,16 +978,16 @@ static VALUE ruby_curl_easy_proxy_type_get(VALUE self) {
|
|
978
978
|
(!strncmp("digest",node,6)) ? CURLAUTH_DIGEST : \
|
979
979
|
(!strncmp("gssnegotiate",node,12)) ? CURLAUTH_GSSNEGOTIATE : \
|
980
980
|
(!strncmp("ntlm",node,4)) ? CURLAUTH_NTLM : \
|
981
|
-
(!strncmp("
|
982
|
-
(!strncmp("
|
981
|
+
(!strncmp("anysafe",node,7)) ? CURLAUTH_ANYSAFE : \
|
982
|
+
(!strncmp("any",node,3)) ? CURLAUTH_ANY : 0
|
983
983
|
#else
|
984
984
|
#define CURL_HTTPAUTH_STR_TO_NUM(node) \
|
985
985
|
(!strncmp("basic",node,5)) ? CURLAUTH_BASIC : \
|
986
986
|
(!strncmp("digest",node,6)) ? CURLAUTH_DIGEST : \
|
987
987
|
(!strncmp("gssnegotiate",node,12)) ? CURLAUTH_GSSNEGOTIATE : \
|
988
988
|
(!strncmp("ntlm",node,4)) ? CURLAUTH_NTLM : \
|
989
|
-
(!strncmp("
|
990
|
-
(!strncmp("
|
989
|
+
(!strncmp("anysafe",node,7)) ? CURLAUTH_ANYSAFE : \
|
990
|
+
(!strncmp("any",node,3)) ? CURLAUTH_ANY : 0
|
991
991
|
#endif
|
992
992
|
/*
|
993
993
|
* call-seq:
|
@@ -1001,21 +1001,22 @@ static VALUE ruby_curl_easy_proxy_type_get(VALUE self) {
|
|
1001
1001
|
static VALUE ruby_curl_easy_http_auth_types_set(int argc, VALUE *argv, VALUE self) {//VALUE self, VALUE http_auth_types) {
|
1002
1002
|
ruby_curl_easy *rbce;
|
1003
1003
|
VALUE args_ary;
|
1004
|
-
|
1004
|
+
long i, len;
|
1005
1005
|
char* node = NULL;
|
1006
|
-
long mask =
|
1006
|
+
long mask = 0;
|
1007
1007
|
|
1008
1008
|
rb_scan_args(argc, argv, "*", &args_ary);
|
1009
1009
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
1010
1010
|
|
1011
|
-
len =
|
1011
|
+
len = RARRAY_LEN(args_ary);
|
1012
1012
|
|
1013
|
-
if (len == 1 && (
|
1013
|
+
if (len == 1 && (rb_ary_entry(args_ary,0) == Qnil || TYPE(rb_ary_entry(args_ary,0)) == T_FIXNUM ||
|
1014
|
+
TYPE(rb_ary_entry(args_ary,0)) == T_BIGNUM)) {
|
1014
1015
|
if (rb_ary_entry(args_ary,0) == Qnil) {
|
1015
1016
|
rbce->http_auth_types = 0;
|
1016
1017
|
}
|
1017
1018
|
else {
|
1018
|
-
rbce->http_auth_types =
|
1019
|
+
rbce->http_auth_types = NUM2LONG(rb_ary_entry(args_ary,0));
|
1019
1020
|
}
|
1020
1021
|
}
|
1021
1022
|
else {
|
@@ -1028,7 +1029,7 @@ static VALUE ruby_curl_easy_http_auth_types_set(int argc, VALUE *argv, VALUE sel
|
|
1028
1029
|
}
|
1029
1030
|
rbce->http_auth_types = mask;
|
1030
1031
|
}
|
1031
|
-
return
|
1032
|
+
return LONG2NUM(rbce->http_auth_types);
|
1032
1033
|
}
|
1033
1034
|
|
1034
1035
|
/*
|
@@ -1353,8 +1354,15 @@ static VALUE ruby_curl_easy_password_get(VALUE self, VALUE password) {
|
|
1353
1354
|
* easy.ssl_version = value => fixnum or nil
|
1354
1355
|
*
|
1355
1356
|
* Sets the version of SSL/TLS that libcurl will attempt to use. Valid
|
1356
|
-
* options are
|
1357
|
-
*
|
1357
|
+
* options are:
|
1358
|
+
*
|
1359
|
+
* Curl::CURL_SSLVERSION_DEFAULT
|
1360
|
+
* Curl::CURL_SSLVERSION_TLSv1 (TLS 1.x)
|
1361
|
+
* Curl::CURL_SSLVERSION_SSLv2
|
1362
|
+
* Curl::CURL_SSLVERSION_SSLv3
|
1363
|
+
* Curl::CURL_SSLVERSION_TLSv1_0
|
1364
|
+
* Curl::CURL_SSLVERSION_TLSv1_1
|
1365
|
+
* Curl::CURL_SSLVERSION_TLSv1_2
|
1358
1366
|
*/
|
1359
1367
|
static VALUE ruby_curl_easy_ssl_version_set(VALUE self, VALUE ssl_version) {
|
1360
1368
|
CURB_IMMED_SETTER(ruby_curl_easy, ssl_version, -1);
|
@@ -2168,7 +2176,7 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2168
2176
|
/*
|
2169
2177
|
* NOTE: we used to set CURLAUTH_ANY but see: http://curl.haxx.se/mail/lib-2015-06/0033.html
|
2170
2178
|
*/
|
2171
|
-
if (rbce->http_auth_types
|
2179
|
+
if (rbce->http_auth_types != 0) {
|
2172
2180
|
#if LIBCURL_VERSION_NUM >= 0x070a06
|
2173
2181
|
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, rbce->http_auth_types);
|
2174
2182
|
#else
|
@@ -2176,7 +2184,7 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2176
2184
|
#endif
|
2177
2185
|
}
|
2178
2186
|
|
2179
|
-
if (rbce->proxy_auth_types
|
2187
|
+
if (rbce->proxy_auth_types != 0) {
|
2180
2188
|
#if LIBCURL_VERSION_NUM >= 0x070a07
|
2181
2189
|
curl_easy_setopt(curl, CURLOPT_PROXYAUTH, rbce->proxy_auth_types);
|
2182
2190
|
#else
|
@@ -2403,7 +2411,7 @@ static VALUE ruby_curl_easy_perform_post(int argc, VALUE *argv, VALUE self) {
|
|
2403
2411
|
append_to_form(argv[i], &first, &last);
|
2404
2412
|
} else if (rb_type(argv[i]) == T_ARRAY) {
|
2405
2413
|
// see: https://github.com/rvanlieshout/curb/commit/8bcdefddc0162484681ebd1a92d52a642666a445
|
2406
|
-
|
2414
|
+
long c = 0, argv_len = RARRAY_LEN(argv[i]);
|
2407
2415
|
for (; c < argv_len; ++c) {
|
2408
2416
|
if (rb_obj_is_instance_of(rb_ary_entry(argv[i],c), cCurlPostField)) {
|
2409
2417
|
append_to_form(rb_ary_entry(argv[i],c), &first, &last);
|
@@ -2612,7 +2620,7 @@ static VALUE ruby_curl_easy_file_time_get(VALUE self) {
|
|
2612
2620
|
return LONG2NUM(time);
|
2613
2621
|
#else
|
2614
2622
|
rb_warn("Installed libcurl is too old to support file_time");
|
2615
|
-
return
|
2623
|
+
return LONG2NUM(0);
|
2616
2624
|
#endif
|
2617
2625
|
}
|
2618
2626
|
|
@@ -2772,7 +2780,7 @@ static VALUE ruby_curl_easy_redirect_count_get(VALUE self) {
|
|
2772
2780
|
return LONG2NUM(count);
|
2773
2781
|
#else
|
2774
2782
|
rb_warn("Installed libcurl is too old to support redirect_count");
|
2775
|
-
return
|
2783
|
+
return LONG2NUM(-1);
|
2776
2784
|
#endif
|
2777
2785
|
|
2778
2786
|
}
|
@@ -2801,7 +2809,7 @@ static VALUE ruby_curl_easy_redirect_url_get(VALUE self) {
|
|
2801
2809
|
}
|
2802
2810
|
#else
|
2803
2811
|
rb_warn("Installed libcurl is too old to support redirect_url");
|
2804
|
-
return
|
2812
|
+
return LONG2NUM(-1);
|
2805
2813
|
#endif
|
2806
2814
|
}
|
2807
2815
|
|
@@ -3030,7 +3038,7 @@ static VALUE ruby_curl_easy_os_errno_get(VALUE self) {
|
|
3030
3038
|
return LONG2NUM(result);
|
3031
3039
|
#else
|
3032
3040
|
rb_warn("Installed libcurl is too old to support os_errno");
|
3033
|
-
return
|
3041
|
+
return LONG2NUM(0);
|
3034
3042
|
#endif
|
3035
3043
|
}
|
3036
3044
|
|
@@ -3059,7 +3067,7 @@ static VALUE ruby_curl_easy_num_connects_get(VALUE self) {
|
|
3059
3067
|
return LONG2NUM(result);
|
3060
3068
|
#else
|
3061
3069
|
rb_warn("Installed libcurl is too old to support num_connects");
|
3062
|
-
return
|
3070
|
+
return LONG2NUM(-1);
|
3063
3071
|
#endif
|
3064
3072
|
}
|
3065
3073
|
|
@@ -3136,7 +3144,7 @@ static VALUE ruby_curl_easy_multi_set(VALUE self, VALUE multi) {
|
|
3136
3144
|
static VALUE ruby_curl_easy_last_result(VALUE self) {
|
3137
3145
|
ruby_curl_easy *rbce;
|
3138
3146
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
3139
|
-
return
|
3147
|
+
return LONG2NUM(rbce->last_result);
|
3140
3148
|
}
|
3141
3149
|
|
3142
3150
|
/*
|
@@ -3147,7 +3155,7 @@ static VALUE ruby_curl_easy_last_result(VALUE self) {
|
|
3147
3155
|
*/
|
3148
3156
|
static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
3149
3157
|
ruby_curl_easy *rbce;
|
3150
|
-
long option =
|
3158
|
+
long option = NUM2LONG(opt);
|
3151
3159
|
|
3152
3160
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
3153
3161
|
|
@@ -3172,7 +3180,7 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
|
3172
3180
|
curl_easy_setopt(rbce->curl, CURLOPT_CUSTOMREQUEST, NIL_P(val) ? NULL : StringValueCStr(val));
|
3173
3181
|
break;
|
3174
3182
|
case CURLOPT_HTTP_VERSION:
|
3175
|
-
curl_easy_setopt(rbce->curl, CURLOPT_HTTP_VERSION,
|
3183
|
+
curl_easy_setopt(rbce->curl, CURLOPT_HTTP_VERSION, NUM2LONG(val));
|
3176
3184
|
break;
|
3177
3185
|
case CURLOPT_PROXY: {
|
3178
3186
|
VALUE proxy_url = val;
|
@@ -3196,11 +3204,14 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
|
3196
3204
|
} else {
|
3197
3205
|
value = rb_funcall(val, rb_intern("to_i"), 0);
|
3198
3206
|
}
|
3199
|
-
curl_easy_setopt(rbce->curl, option,
|
3207
|
+
curl_easy_setopt(rbce->curl, option, NUM2LONG(value));
|
3200
3208
|
} break;
|
3201
3209
|
case CURLOPT_POST: {
|
3202
3210
|
curl_easy_setopt(rbce->curl, CURLOPT_POST, rb_type(val) == T_TRUE);
|
3203
3211
|
} break;
|
3212
|
+
case CURLOPT_MAXCONNECTS: {
|
3213
|
+
curl_easy_setopt(rbce->curl, CURLOPT_MAXCONNECTS, NUM2LONG(val));
|
3214
|
+
} break;
|
3204
3215
|
case CURLOPT_POSTFIELDS: {
|
3205
3216
|
curl_easy_setopt(rbce->curl, CURLOPT_POSTFIELDS, NIL_P(val) ? NULL : StringValueCStr(val));
|
3206
3217
|
} break;
|
@@ -3225,20 +3236,23 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
|
3225
3236
|
CURB_OBJECT_HSETTER(ruby_curl_easy, cookiejar);
|
3226
3237
|
} break;
|
3227
3238
|
case CURLOPT_TCP_NODELAY: {
|
3228
|
-
curl_easy_setopt(rbce->curl, CURLOPT_TCP_NODELAY,
|
3239
|
+
curl_easy_setopt(rbce->curl, CURLOPT_TCP_NODELAY, NUM2LONG(val));
|
3229
3240
|
} break;
|
3230
3241
|
case CURLOPT_RESUME_FROM: {
|
3231
|
-
curl_easy_setopt(rbce->curl, CURLOPT_RESUME_FROM,
|
3242
|
+
curl_easy_setopt(rbce->curl, CURLOPT_RESUME_FROM, NUM2LONG(val));
|
3232
3243
|
} break;
|
3233
3244
|
case CURLOPT_FAILONERROR: {
|
3234
|
-
curl_easy_setopt(rbce->curl, CURLOPT_FAILONERROR,
|
3245
|
+
curl_easy_setopt(rbce->curl, CURLOPT_FAILONERROR, NUM2LONG(val));
|
3235
3246
|
} break;
|
3236
3247
|
case CURLOPT_SSL_CIPHER_LIST: {
|
3237
3248
|
curl_easy_setopt(rbce->curl, CURLOPT_SSL_CIPHER_LIST, StringValueCStr(val));
|
3238
3249
|
} break;
|
3250
|
+
case CURLOPT_FORBID_REUSE: {
|
3251
|
+
curl_easy_setopt(rbce->curl, CURLOPT_FORBID_REUSE, NUM2LONG(val));
|
3252
|
+
} break;
|
3239
3253
|
#if HAVE_CURLOPT_GSSAPI_DELEGATION
|
3240
3254
|
case CURLOPT_GSSAPI_DELEGATION: {
|
3241
|
-
curl_easy_setopt(rbce->curl, CURLOPT_GSSAPI_DELEGATION,
|
3255
|
+
curl_easy_setopt(rbce->curl, CURLOPT_GSSAPI_DELEGATION, NUM2LONG(val));
|
3242
3256
|
} break;
|
3243
3257
|
#endif
|
3244
3258
|
#if HAVE_CURLOPT_UNIX_SOCKET_PATH
|
@@ -3338,7 +3352,7 @@ static VALUE ruby_curl_easy_unescape(VALUE self, VALUE str) {
|
|
3338
3352
|
#if (LIBCURL_VERSION_NUM >= 0x070f04)
|
3339
3353
|
result = (char*)curl_easy_unescape(rbce->curl, StringValuePtr(str), (int)RSTRING_LEN(str), &rlen);
|
3340
3354
|
#else
|
3341
|
-
result = (char*)curl_unescape(StringValuePtr(str), RSTRING_LEN(str));
|
3355
|
+
result = (char*)curl_unescape(StringValuePtr(str), (int)RSTRING_LEN(str));
|
3342
3356
|
rlen = strlen(result);
|
3343
3357
|
#endif
|
3344
3358
|
|
@@ -3358,7 +3372,7 @@ static VALUE ruby_curl_easy_unescape(VALUE self, VALUE str) {
|
|
3358
3372
|
* translate an internal libcurl error to ruby error class
|
3359
3373
|
*/
|
3360
3374
|
static VALUE ruby_curl_easy_error_message(VALUE klass, VALUE code) {
|
3361
|
-
return rb_curl_easy_error(
|
3375
|
+
return rb_curl_easy_error(NUM2INT(code));
|
3362
3376
|
}
|
3363
3377
|
|
3364
3378
|
/* =================== INIT LIB =====================*/
|
data/ext/curb_macros.h
CHANGED
@@ -99,7 +99,7 @@
|
|
99
99
|
\
|
100
100
|
return oldproc;
|
101
101
|
|
102
|
-
/* setter for numerics that are kept in c
|
102
|
+
/* setter for numerics that are kept in c longs */
|
103
103
|
#define CURB_IMMED_SETTER(type, attr, nilval) \
|
104
104
|
type *ptr; \
|
105
105
|
\
|
@@ -107,12 +107,12 @@
|
|
107
107
|
if (attr == Qnil) { \
|
108
108
|
ptr->attr = nilval; \
|
109
109
|
} else { \
|
110
|
-
ptr->attr =
|
110
|
+
ptr->attr = NUM2LONG(attr); \
|
111
111
|
} \
|
112
112
|
\
|
113
113
|
return attr; \
|
114
114
|
|
115
|
-
/* setter for numerics that are kept in c
|
115
|
+
/* setter for numerics that are kept in c longs */
|
116
116
|
#define CURB_IMMED_GETTER(type, attr, nilval) \
|
117
117
|
type *ptr; \
|
118
118
|
\
|
@@ -120,7 +120,7 @@
|
|
120
120
|
if (ptr->attr == nilval) { \
|
121
121
|
return Qnil; \
|
122
122
|
} else { \
|
123
|
-
return
|
123
|
+
return LONG2NUM(ptr->attr); \
|
124
124
|
}
|
125
125
|
|
126
126
|
/* special setter for port / port ranges */
|
@@ -131,7 +131,7 @@
|
|
131
131
|
if (attr == Qnil) { \
|
132
132
|
ptr->attr = 0; \
|
133
133
|
} else { \
|
134
|
-
int port =
|
134
|
+
int port = NUM2INT(attr); \
|
135
135
|
\
|
136
136
|
if ((port) && ((port & 0xFFFF) == port)) { \
|
137
137
|
ptr->attr = port; \
|
@@ -150,10 +150,10 @@
|
|
150
150
|
if (ptr->attr == 0) { \
|
151
151
|
return Qnil; \
|
152
152
|
} else { \
|
153
|
-
return
|
153
|
+
return INT2NUM(ptr->attr); \
|
154
154
|
}
|
155
155
|
|
156
156
|
#define CURB_DEFINE(name) \
|
157
|
-
rb_define_const(mCurl, #name,
|
157
|
+
rb_define_const(mCurl, #name, LONG2NUM(name))
|
158
158
|
|
159
159
|
#endif
|
data/ext/curb_multi.c
CHANGED
@@ -47,37 +47,41 @@ static VALUE callback_exception(VALUE unused) {
|
|
47
47
|
}
|
48
48
|
|
49
49
|
static void curl_multi_mark(ruby_curl_multi *rbcm) {
|
50
|
-
rb_gc_mark(rbcm->requests);
|
50
|
+
if (!NIL_P(rbcm->requests)) rb_gc_mark(rbcm->requests);
|
51
51
|
}
|
52
52
|
|
53
|
-
|
53
|
+
/* Hash#foreach callback for curl_multi_free */
|
54
|
+
static int curl_multi_flush_easy(VALUE key, VALUE easy, ruby_curl_multi *rbcm) {
|
54
55
|
CURLMcode result;
|
55
56
|
ruby_curl_easy *rbce;
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
// sometimes the type is T_ZOMBIE, e.g. after Ruby has received the SIGTERM signal
|
59
|
+
if (rb_type(easy) == T_DATA) {
|
60
|
+
Data_Get_Struct(easy, ruby_curl_easy, rbce);
|
61
|
+
|
62
|
+
result = curl_multi_remove_handle(rbcm->handle, rbce->curl);
|
63
|
+
if (result != 0) {
|
64
|
+
raise_curl_multi_error_exception(result);
|
65
|
+
}
|
61
66
|
}
|
62
|
-
}
|
63
67
|
|
64
|
-
static int
|
65
|
-
rb_hash_clear_i(VALUE key, VALUE value, VALUE dummy) {
|
66
68
|
return ST_DELETE;
|
67
69
|
}
|
68
70
|
|
69
|
-
|
71
|
+
void curl_multi_free(ruby_curl_multi *rbcm) {
|
70
72
|
VALUE hash = rbcm->requests;
|
71
73
|
|
72
|
-
if (
|
74
|
+
if (!NIL_P(hash) && rb_type(hash) == T_HASH && RHASH_SIZE(hash) > 0) {
|
73
75
|
|
74
|
-
rb_hash_foreach(hash,
|
75
|
-
rb_hash_foreach(hash, rb_hash_clear_i, 0);
|
76
|
+
rb_hash_foreach(hash, curl_multi_flush_easy, (VALUE)rbcm);
|
76
77
|
/* rb_hash_clear(rbcm->requests); */
|
77
78
|
|
78
79
|
rbcm->requests = Qnil;
|
79
80
|
}
|
80
|
-
|
81
|
+
|
82
|
+
if (rbcm->handle) {
|
83
|
+
curl_multi_cleanup(rbcm->handle);
|
84
|
+
}
|
81
85
|
free(rbcm);
|
82
86
|
}
|
83
87
|
|
@@ -116,7 +120,7 @@ VALUE ruby_curl_multi_new(VALUE klass) {
|
|
116
120
|
*
|
117
121
|
*/
|
118
122
|
VALUE ruby_curl_multi_set_default_timeout(VALUE klass, VALUE timeout) {
|
119
|
-
cCurlMutiDefaulttimeout =
|
123
|
+
cCurlMutiDefaulttimeout = NUM2LONG(timeout);
|
120
124
|
return timeout;
|
121
125
|
}
|
122
126
|
|
@@ -128,7 +132,7 @@ VALUE ruby_curl_multi_set_default_timeout(VALUE klass, VALUE timeout) {
|
|
128
132
|
*
|
129
133
|
*/
|
130
134
|
VALUE ruby_curl_multi_get_default_timeout(VALUE klass) {
|
131
|
-
return
|
135
|
+
return LONG2NUM(cCurlMutiDefaulttimeout);
|
132
136
|
}
|
133
137
|
|
134
138
|
/* Hash#foreach callback for ruby_curl_multi_requests */
|
@@ -170,7 +174,7 @@ static VALUE ruby_curl_multi_idle(VALUE self) {
|
|
170
174
|
|
171
175
|
Data_Get_Struct(self, ruby_curl_multi, rbcm);
|
172
176
|
|
173
|
-
if (
|
177
|
+
if (RHASH_SIZE(rbcm->requests) == 0) {
|
174
178
|
return Qtrue;
|
175
179
|
} else {
|
176
180
|
return Qfalse;
|
@@ -189,7 +193,15 @@ static VALUE ruby_curl_multi_max_connects(VALUE self, VALUE count) {
|
|
189
193
|
ruby_curl_multi *rbcm;
|
190
194
|
|
191
195
|
Data_Get_Struct(self, ruby_curl_multi, rbcm);
|
192
|
-
|
196
|
+
|
197
|
+
if (!rbcm->handle) {
|
198
|
+
rbcm->handle = curl_multi_init();
|
199
|
+
if (!rbcm->handle) {
|
200
|
+
rb_raise(mCurlErrFailedInit, "Failed to initialize multi handle");
|
201
|
+
}
|
202
|
+
}
|
203
|
+
|
204
|
+
curl_multi_setopt(rbcm->handle, CURLMOPT_MAXCONNECTS, NUM2LONG(count));
|
193
205
|
#endif
|
194
206
|
|
195
207
|
return count;
|
@@ -200,20 +212,39 @@ static VALUE ruby_curl_multi_max_connects(VALUE self, VALUE count) {
|
|
200
212
|
* multi = Curl::Multi.new
|
201
213
|
* multi.pipeline = true
|
202
214
|
*
|
203
|
-
* Pass a long set to 1
|
204
|
-
*
|
205
|
-
*
|
206
|
-
*
|
215
|
+
* Pass a long set to 1 for HTTP/1.1 pipelining, 2 for HTTP/2 multiplexing, or 0 to disable.
|
216
|
+
* Enabling pipelining on a multi handle will make it attempt to perform HTTP Pipelining as
|
217
|
+
* far as possible for transfers using this handle. This means that if you add a second request
|
218
|
+
* that can use an already existing connection, the second request will be "piped" on the same
|
219
|
+
* connection rather than being executed in parallel. (Added in 7.16.0, multiplex added in 7.43.0)
|
207
220
|
*
|
208
221
|
*/
|
209
|
-
static VALUE ruby_curl_multi_pipeline(VALUE self, VALUE
|
222
|
+
static VALUE ruby_curl_multi_pipeline(VALUE self, VALUE method) {
|
210
223
|
#ifdef HAVE_CURLMOPT_PIPELINING
|
211
224
|
ruby_curl_multi *rbcm;
|
212
225
|
|
226
|
+
long value;
|
227
|
+
|
228
|
+
if (method == Qtrue) {
|
229
|
+
value = 1;
|
230
|
+
} else if (method == Qfalse) {
|
231
|
+
value = 0;
|
232
|
+
} else {
|
233
|
+
value = NUM2LONG(method);
|
234
|
+
}
|
235
|
+
|
213
236
|
Data_Get_Struct(self, ruby_curl_multi, rbcm);
|
214
|
-
|
237
|
+
|
238
|
+
if (!rbcm->handle) {
|
239
|
+
rbcm->handle = curl_multi_init();
|
240
|
+
if (!rbcm->handle) {
|
241
|
+
rb_raise(mCurlErrFailedInit, "Failed to initialize multi handle");
|
242
|
+
}
|
243
|
+
}
|
244
|
+
|
245
|
+
curl_multi_setopt(rbcm->handle, CURLMOPT_PIPELINING, value);
|
215
246
|
#endif
|
216
|
-
return
|
247
|
+
return method == Qtrue ? 1 : 0;
|
217
248
|
}
|
218
249
|
|
219
250
|
/*
|
@@ -235,7 +266,7 @@ VALUE ruby_curl_multi_add(VALUE self, VALUE easy) {
|
|
235
266
|
Data_Get_Struct(easy, ruby_curl_easy, rbce);
|
236
267
|
|
237
268
|
// check if this curl handle has been added before adding again
|
238
|
-
r = rb_hash_aref(rbcm->requests,
|
269
|
+
r = rb_hash_aref(rbcm->requests, LONG2NUM((long)rbce->curl));
|
239
270
|
if ( r != Qnil ) {
|
240
271
|
return Qnil;
|
241
272
|
}
|
@@ -243,6 +274,13 @@ VALUE ruby_curl_multi_add(VALUE self, VALUE easy) {
|
|
243
274
|
/* setup the easy handle */
|
244
275
|
ruby_curl_easy_setup( rbce );
|
245
276
|
|
277
|
+
if (!rbcm->handle) {
|
278
|
+
rbcm->handle = curl_multi_init();
|
279
|
+
if (!rbcm->handle) {
|
280
|
+
rb_raise(mCurlErrFailedInit, "Failed to initialize multi handle");
|
281
|
+
}
|
282
|
+
}
|
283
|
+
|
246
284
|
mcode = curl_multi_add_handle(rbcm->handle, rbce->curl);
|
247
285
|
if (mcode != CURLM_CALL_MULTI_PERFORM && mcode != CURLM_OK) {
|
248
286
|
raise_curl_multi_error_exception(mcode);
|
@@ -254,7 +292,10 @@ VALUE ruby_curl_multi_add(VALUE self, VALUE easy) {
|
|
254
292
|
* If this number is not correct, the next call to curl_multi_perform will correct it. */
|
255
293
|
rbcm->running++;
|
256
294
|
|
257
|
-
|
295
|
+
/* track a reference to associated multi handle */
|
296
|
+
rbce->multi = self;
|
297
|
+
|
298
|
+
rb_hash_aset( rbcm->requests, LONG2NUM((long)rbce->curl), easy );
|
258
299
|
|
259
300
|
return self;
|
260
301
|
}
|
@@ -278,6 +319,13 @@ VALUE ruby_curl_multi_remove(VALUE self, VALUE easy) {
|
|
278
319
|
|
279
320
|
Data_Get_Struct(self, ruby_curl_multi, rbcm);
|
280
321
|
|
322
|
+
if (!rbcm->handle) {
|
323
|
+
rbcm->handle = curl_multi_init();
|
324
|
+
if (!rbcm->handle) {
|
325
|
+
rb_raise(mCurlErrFailedInit, "Failed to initialize multi handle");
|
326
|
+
}
|
327
|
+
}
|
328
|
+
|
281
329
|
rb_curl_multi_remove(rbcm,easy);
|
282
330
|
|
283
331
|
return self;
|
@@ -290,7 +338,7 @@ static void rb_curl_multi_remove(ruby_curl_multi *rbcm, VALUE easy) {
|
|
290
338
|
Data_Get_Struct(easy, ruby_curl_easy, rbce);
|
291
339
|
|
292
340
|
// check if this curl handle has been added before removing
|
293
|
-
r = rb_hash_aref(rbcm->requests,
|
341
|
+
r = rb_hash_aref(rbcm->requests, LONG2NUM((long)rbce->curl));
|
294
342
|
if ( r == Qnil ) {
|
295
343
|
return;
|
296
344
|
}
|
@@ -304,8 +352,8 @@ static void rb_curl_multi_remove(ruby_curl_multi *rbcm, VALUE easy) {
|
|
304
352
|
|
305
353
|
ruby_curl_easy_cleanup( easy, rbce );
|
306
354
|
|
307
|
-
// active should equal
|
308
|
-
r = rb_hash_delete( rbcm->requests,
|
355
|
+
// active should equal LONG2NUM(RHASH(rbcm->requests)->tbl->num_entries)
|
356
|
+
r = rb_hash_delete( rbcm->requests, LONG2NUM((long)rbce->curl) );
|
309
357
|
if( r != easy || r == Qnil ) {
|
310
358
|
rb_warn("Possibly lost track of Curl::Easy VALUE, it may not be reclaimed by GC");
|
311
359
|
}
|
@@ -328,6 +376,13 @@ static VALUE ruby_curl_multi_cancel(VALUE self) {
|
|
328
376
|
ruby_curl_multi *rbcm;
|
329
377
|
|
330
378
|
Data_Get_Struct(self, ruby_curl_multi, rbcm);
|
379
|
+
|
380
|
+
if (!rbcm->handle) {
|
381
|
+
rbcm->handle = curl_multi_init();
|
382
|
+
if (!rbcm->handle) {
|
383
|
+
rb_raise(mCurlErrFailedInit, "Failed to initialize multi handle");
|
384
|
+
}
|
385
|
+
}
|
331
386
|
|
332
387
|
rb_hash_foreach( rbcm->requests, ruby_curl_multi_cancel_callback, (VALUE)rbcm );
|
333
388
|
|
@@ -450,10 +505,11 @@ static void rb_curl_multi_run(VALUE self, CURLM *multi_handle, int *still_runnin
|
|
450
505
|
mcode = curl_multi_perform(multi_handle, still_running);
|
451
506
|
} while (mcode == CURLM_CALL_MULTI_PERFORM);
|
452
507
|
|
508
|
+
|
453
509
|
if (mcode != CURLM_OK) {
|
454
510
|
raise_curl_multi_error_exception(mcode);
|
455
511
|
}
|
456
|
-
|
512
|
+
|
457
513
|
}
|
458
514
|
|
459
515
|
#ifdef _WIN32
|
@@ -517,7 +573,7 @@ static VALUE curb_select(void *args) {
|
|
517
573
|
VALUE ruby_curl_multi_perform(int argc, VALUE *argv, VALUE self) {
|
518
574
|
CURLMcode mcode;
|
519
575
|
ruby_curl_multi *rbcm;
|
520
|
-
int maxfd, rc;
|
576
|
+
int maxfd, rc = -1;
|
521
577
|
fd_set fdread, fdwrite, fdexcep;
|
522
578
|
#ifdef _WIN32
|
523
579
|
fd_set crt_fdread, crt_fdwrite, crt_fdexcep;
|
@@ -627,7 +683,15 @@ VALUE ruby_curl_multi_perform(int argc, VALUE *argv, VALUE self) {
|
|
627
683
|
|
628
684
|
rb_curl_multi_read_info( self, rbcm->handle );
|
629
685
|
if (block != Qnil) { rb_funcall(block, rb_intern("call"), 1, self); }
|
630
|
-
|
686
|
+
|
687
|
+
/* do early cleanup */
|
688
|
+
VALUE hash = rbcm->requests;
|
689
|
+
if (!NIL_P(hash) && rb_type(hash) == T_HASH && RHASH_SIZE(hash) > 0) {
|
690
|
+
rb_hash_foreach(hash, curl_multi_flush_easy, (VALUE)rbcm);
|
691
|
+
}
|
692
|
+
curl_multi_cleanup(rbcm->handle);
|
693
|
+
rbcm->handle = NULL;
|
694
|
+
|
631
695
|
return Qtrue;
|
632
696
|
}
|
633
697
|
|
@@ -646,7 +710,7 @@ void init_curb_multi() {
|
|
646
710
|
rb_define_method(cCurlMulti, "requests", ruby_curl_multi_requests, 0);
|
647
711
|
rb_define_method(cCurlMulti, "idle?", ruby_curl_multi_idle, 0);
|
648
712
|
|
649
|
-
/*
|
713
|
+
/* Instance methods */
|
650
714
|
rb_define_method(cCurlMulti, "max_connects=", ruby_curl_multi_max_connects, 1);
|
651
715
|
rb_define_method(cCurlMulti, "pipeline=", ruby_curl_multi_pipeline, 1);
|
652
716
|
rb_define_method(cCurlMulti, "add", ruby_curl_multi_add, 1);
|
data/ext/curb_upload.c
CHANGED
@@ -56,7 +56,7 @@ VALUE ruby_curl_upload_stream_get(VALUE self) {
|
|
56
56
|
VALUE ruby_curl_upload_offset_set(VALUE self, VALUE offset) {
|
57
57
|
ruby_curl_upload *rbcu;
|
58
58
|
Data_Get_Struct(self, ruby_curl_upload, rbcu);
|
59
|
-
rbcu->offset =
|
59
|
+
rbcu->offset = NUM2LONG(offset);
|
60
60
|
return offset;
|
61
61
|
}
|
62
62
|
/*
|
@@ -66,7 +66,7 @@ VALUE ruby_curl_upload_offset_set(VALUE self, VALUE offset) {
|
|
66
66
|
VALUE ruby_curl_upload_offset_get(VALUE self) {
|
67
67
|
ruby_curl_upload *rbcu;
|
68
68
|
Data_Get_Struct(self, ruby_curl_upload, rbcu);
|
69
|
-
return
|
69
|
+
return LONG2NUM(rbcu->offset);
|
70
70
|
}
|
71
71
|
|
72
72
|
/* =================== INIT LIB =====================*/
|
data/ext/extconf.rb
CHANGED
@@ -321,6 +321,9 @@ have_constant "curl_sslversion_default"
|
|
321
321
|
have_constant :CURL_SSLVERSION_TLSv1
|
322
322
|
have_constant :CURL_SSLVERSION_SSLv2
|
323
323
|
have_constant :CURL_SSLVERSION_SSLv3
|
324
|
+
have_constant :CURL_SSLVERSION_TLSv1_0
|
325
|
+
have_constant :CURL_SSLVERSION_TLSv1_1
|
326
|
+
have_constant :CURL_SSLVERSION_TLSv1_2
|
324
327
|
have_constant "curlopt_ssl_verifypeer"
|
325
328
|
have_constant "curlopt_cainfo"
|
326
329
|
have_constant "curlopt_issuercert"
|
data/lib/curl/easy.rb
CHANGED
@@ -6,7 +6,7 @@ module Curl
|
|
6
6
|
alias body body_str
|
7
7
|
alias head header_str
|
8
8
|
|
9
|
-
class Error <
|
9
|
+
class Error < StandardError
|
10
10
|
attr_accessor :message, :code
|
11
11
|
def initialize(code, msg)
|
12
12
|
self.message = msg
|
@@ -20,7 +20,7 @@ module Curl
|
|
20
20
|
#
|
21
21
|
def status
|
22
22
|
# Matches the last HTTP Status - following the HTTP protocol specification 'Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF'
|
23
|
-
statuses = self.header_str.scan(/HTTP\/\d\.\d\s(\d+\s
|
23
|
+
statuses = self.header_str.scan(/HTTP\/\d\.\d\s(\d+\s.*)\r\n/).map{ |match| match[0] }
|
24
24
|
statuses.last.strip
|
25
25
|
end
|
26
26
|
|
data/lib/curl/multi.rb
CHANGED
@@ -22,7 +22,7 @@ module Curl
|
|
22
22
|
# {:url => 'url2', :post_fields => {'field1' => 'value1', 'field2' => 'value2'}},
|
23
23
|
# {:url => 'url3', :post_fields => {'field1' => 'value1', 'field2' => 'value2'}}],
|
24
24
|
# { :follow_location => true, :multipart_form_post => true },
|
25
|
-
# {:pipeline =>
|
25
|
+
# {:pipeline => Curl::CURLPIPE_HTTP1}) do|easy|
|
26
26
|
# easy_handle_on_request_complete
|
27
27
|
# end
|
28
28
|
#
|
@@ -46,7 +46,7 @@ module Curl
|
|
46
46
|
# {:url => 'url2', :put_data => IO.read('filepath')},
|
47
47
|
# {:url => 'url3', :put_data => "maybe another string or socket?"],
|
48
48
|
# {:follow_location => true},
|
49
|
-
# {:pipeline =>
|
49
|
+
# {:pipeline => Curl::CURLPIPE_HTTP1}) do|easy|
|
50
50
|
# easy_handle_on_request_complete
|
51
51
|
# end
|
52
52
|
#
|
@@ -74,7 +74,7 @@ module Curl
|
|
74
74
|
# :follow_location => true, :max_redirects => 3 },
|
75
75
|
# { :url => 'url3', :method => :put, :put_data => File.open('file.txt','rb') },
|
76
76
|
# { :url => 'url4', :method => :head }
|
77
|
-
# ], {:pipeline =>
|
77
|
+
# ], {:pipeline => Curl::CURLPIPE_HTTP1})
|
78
78
|
#
|
79
79
|
# Blocking call to issue multiple HTTP requests with varying verb's.
|
80
80
|
#
|
data/tests/tc_curl_multi.rb
CHANGED
@@ -109,8 +109,12 @@ class TestCurbCurlMulti < Test::Unit::TestCase
|
|
109
109
|
|
110
110
|
assert(m.idle?, 'A new Curl::Multi handle should be idle')
|
111
111
|
|
112
|
+
assert_nil e.multi
|
113
|
+
|
112
114
|
m.add(e)
|
113
115
|
|
116
|
+
assert_not_nil e.multi
|
117
|
+
|
114
118
|
assert((not m.idle?), 'A Curl::Multi handle with a request should not be idle')
|
115
119
|
|
116
120
|
m.perform
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: curb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ross Bamford
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-04-10 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Curb (probably CUrl-RuBy or something) provides Ruby-language bindings
|
15
15
|
for the libcurl(3), a fully-featured client-side URL transfer library. cURL and
|
@@ -70,7 +70,8 @@ files:
|
|
70
70
|
- tests/timeout_server.rb
|
71
71
|
- tests/unittests.rb
|
72
72
|
homepage: http://curb.rubyforge.org/
|
73
|
-
licenses:
|
73
|
+
licenses:
|
74
|
+
- MIT
|
74
75
|
metadata: {}
|
75
76
|
post_install_message:
|
76
77
|
rdoc_options:
|