curb 1.0.1 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.markdown +2 -1
- data/Rakefile +0 -7
- data/ext/curb.c +4 -0
- data/ext/curb.h +3 -3
- data/ext/curb_easy.c +6 -0
- data/ext/curb_macros.h +6 -0
- data/ext/curb_multi.c +36 -14
- data/ext/curb_postfield.c +2 -0
- data/ext/curb_upload.c +1 -0
- data/ext/extconf.rb +2 -0
- data/lib/curl/multi.rb +8 -1
- data/tests/bug_crash_on_debug.rb +14 -4
- data/tests/bug_crash_on_progress.rb +4 -2
- data/tests/bug_follow_redirect_288.rb +91 -0
- data/tests/bug_raise_on_callback.rb +40 -0
- data/tests/tc_curl_easy.rb +4 -4
- data/tests/tc_curl_multi.rb +18 -7
- metadata +27 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51f01ce3c875c6eb02061c959c0724844fd0076d3644e28aa130b87c3f7da631
|
4
|
+
data.tar.gz: 0ca3a17b17bcdfc721608f119757e908d2c57c40aaf8e9a66d119a1deec3184d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 207ac7282c2d95de745edfadef35e809d7dee0edf03eec266c536e0c080dd072df87809dbdd0a3137382a4c7a1b5c420bb32de3bd2820126c6ad6e29085d986f
|
7
|
+
data.tar.gz: e1ad940900fb2a107c52b8f28991e0cc50d409dc91a1d075d03145020a527a806578da341ed8cbf2162cb8383c64f3137ec68329911b04ce4713acb9bb7baf1b
|
data/README.markdown
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
# Curb - Libcurl bindings for Ruby
|
1
|
+
# Curb - Libcurl bindings for Ruby
|
2
2
|
|
3
|
+
* [CI Build Status](https://github.com/taf2/curb/actions/workflows/CI.yml)
|
3
4
|
* [rubydoc rdoc](http://www.rubydoc.info/github/taf2/curb/)
|
4
5
|
* [github project](http://github.com/taf2/curb/tree/master)
|
5
6
|
|
data/Rakefile
CHANGED
@@ -10,13 +10,6 @@ CLOBBER.include '**/*.log'
|
|
10
10
|
CLOBBER.include '**/Makefile'
|
11
11
|
CLOBBER.include '**/extconf.h'
|
12
12
|
|
13
|
-
# Not available for really old rubies, but that's ok.
|
14
|
-
begin
|
15
|
-
require 'pry'
|
16
|
-
rescue LoadError
|
17
|
-
puts "Failed to load pry."
|
18
|
-
end
|
19
|
-
|
20
13
|
# Load support ruby and rake files (in this order)
|
21
14
|
Dir.glob('tasks/*.rb').each { |r| load r}
|
22
15
|
Dir.glob('tasks/*.rake').each { |r| load r}
|
data/ext/curb.c
CHANGED
@@ -1076,6 +1076,10 @@ void Init_curb_core() {
|
|
1076
1076
|
CURB_DEFINE(CURLOPT_HAPROXYPROTOCOL);
|
1077
1077
|
#endif
|
1078
1078
|
|
1079
|
+
#if HAVE_CURLOPT_PROXY_SSL_VERIFYHOST
|
1080
|
+
CURB_DEFINE(CURLOPT_PROXY_SSL_VERIFYHOST);
|
1081
|
+
#endif
|
1082
|
+
|
1079
1083
|
#if HAVE_CURLPROTO_RTMPTE
|
1080
1084
|
CURB_DEFINE(CURLPROTO_RTMPTE);
|
1081
1085
|
#endif
|
data/ext/curb.h
CHANGED
@@ -28,11 +28,11 @@
|
|
28
28
|
#include "curb_macros.h"
|
29
29
|
|
30
30
|
// These should be managed from the Rake 'release' task.
|
31
|
-
#define CURB_VERSION "1.0.
|
32
|
-
#define CURB_VER_NUM
|
31
|
+
#define CURB_VERSION "1.0.3"
|
32
|
+
#define CURB_VER_NUM 1003
|
33
33
|
#define CURB_VER_MAJ 1
|
34
34
|
#define CURB_VER_MIN 0
|
35
|
-
#define CURB_VER_MIC
|
35
|
+
#define CURB_VER_MIC 3
|
36
36
|
#define CURB_VER_PATCH 0
|
37
37
|
|
38
38
|
|
data/ext/curb_easy.c
CHANGED
@@ -3653,6 +3653,11 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
|
3653
3653
|
case CURLOPT_SSL_SESSIONID_CACHE:
|
3654
3654
|
curl_easy_setopt(rbce->curl, CURLOPT_SSL_SESSIONID_CACHE, NUM2LONG(val));
|
3655
3655
|
break;
|
3656
|
+
#endif
|
3657
|
+
#if HAVE_CURLOPT_PROXY_SSL_VERIFYHOST
|
3658
|
+
case CURLOPT_PROXY_SSL_VERIFYHOST:
|
3659
|
+
curl_easy_setopt(rbce->curl, CURLOPT_PROXY_SSL_VERIFYHOST, NUM2LONG(val));
|
3660
|
+
break;
|
3656
3661
|
#endif
|
3657
3662
|
default:
|
3658
3663
|
rb_raise(rb_eTypeError, "Curb unsupported option");
|
@@ -3770,6 +3775,7 @@ static VALUE ruby_curl_easy_error_message(VALUE klass, VALUE code) {
|
|
3770
3775
|
}
|
3771
3776
|
|
3772
3777
|
/* =================== INIT LIB =====================*/
|
3778
|
+
// TODO: https://bugs.ruby-lang.org/issues/18007
|
3773
3779
|
void init_curb_easy() {
|
3774
3780
|
idCall = rb_intern("call");
|
3775
3781
|
idJoin = rb_intern("join");
|
data/ext/curb_macros.h
CHANGED
@@ -156,4 +156,10 @@
|
|
156
156
|
#define CURB_DEFINE(name) \
|
157
157
|
rb_define_const(mCurl, #name, LONG2NUM(name))
|
158
158
|
|
159
|
+
#define CURB_RB_CALLBACK_RAISE(context) \
|
160
|
+
VALUE exception = rb_errinfo(); \
|
161
|
+
const char *msg = rb_respond_to(exception,rb_intern("message")) ? RSTRING_PTR(rb_funcall(exception, rb_intern("message"), 0)) : ""; \
|
162
|
+
rb_set_errinfo(Qnil); \
|
163
|
+
rb_raise(eCurlErrAbortedByCallback, "Operation was aborted by an application callback[%s]:\"%s\"", context, msg);
|
164
|
+
|
159
165
|
#endif
|
data/ext/curb_multi.c
CHANGED
@@ -43,8 +43,9 @@ static void rb_curl_multi_remove(ruby_curl_multi *rbcm, VALUE easy);
|
|
43
43
|
static void rb_curl_multi_read_info(VALUE self, CURLM *mptr);
|
44
44
|
static void rb_curl_multi_run(VALUE self, CURLM *multi_handle, int *still_running);
|
45
45
|
|
46
|
-
static VALUE callback_exception(VALUE
|
47
|
-
|
46
|
+
static VALUE callback_exception(VALUE did_raise, VALUE exception) {
|
47
|
+
rb_hash_aset(did_raise, rb_easy_hkey("error"), exception);
|
48
|
+
return exception;
|
48
49
|
}
|
49
50
|
|
50
51
|
void curl_multi_free(ruby_curl_multi *rbcm) {
|
@@ -274,7 +275,7 @@ static void rb_curl_mutli_handle_complete(VALUE self, CURL *easy_handle, int res
|
|
274
275
|
long response_code = -1;
|
275
276
|
VALUE easy;
|
276
277
|
ruby_curl_easy *rbce = NULL;
|
277
|
-
VALUE callargs
|
278
|
+
VALUE callargs;
|
278
279
|
|
279
280
|
CURLcode ecode = curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, (char**)&easy);
|
280
281
|
|
@@ -295,11 +296,17 @@ static void rb_curl_mutli_handle_complete(VALUE self, CURL *easy_handle, int res
|
|
295
296
|
raise_curl_easy_error_exception(ecode);
|
296
297
|
}
|
297
298
|
|
299
|
+
int status;
|
300
|
+
VALUE did_raise = rb_hash_new();
|
301
|
+
|
298
302
|
if (!rb_easy_nil("complete_proc")) {
|
299
303
|
callargs = rb_ary_new3(2, rb_easy_get("complete_proc"), easy);
|
300
304
|
rbce->callback_active = 1;
|
301
|
-
|
305
|
+
rb_rescue(call_status_handler1, callargs, callback_exception, did_raise);
|
302
306
|
rbce->callback_active = 0;
|
307
|
+
if (rb_hash_aref(did_raise, "error") != Qnil) {
|
308
|
+
CURB_RB_CALLBACK_RAISE("complete")
|
309
|
+
}
|
303
310
|
}
|
304
311
|
|
305
312
|
#ifdef HAVE_CURLINFO_RESPONSE_CODE
|
@@ -308,42 +315,55 @@ static void rb_curl_mutli_handle_complete(VALUE self, CURL *easy_handle, int res
|
|
308
315
|
// old libcurl
|
309
316
|
curl_easy_getinfo(rbce->curl, CURLINFO_HTTP_CODE, &response_code);
|
310
317
|
#endif
|
318
|
+
long redirect_count;
|
319
|
+
curl_easy_getinfo(rbce->curl, CURLINFO_REDIRECT_COUNT, &redirect_count);
|
311
320
|
|
312
321
|
if (result != 0) {
|
313
322
|
if (!rb_easy_nil("failure_proc")) {
|
314
323
|
callargs = rb_ary_new3(3, rb_easy_get("failure_proc"), easy, rb_curl_easy_error(result));
|
315
324
|
rbce->callback_active = 1;
|
316
|
-
|
325
|
+
rb_rescue(call_status_handler2, callargs, callback_exception, did_raise);
|
317
326
|
rbce->callback_active = 0;
|
318
|
-
|
327
|
+
if (rb_hash_aref(did_raise, "error") != Qnil) {
|
328
|
+
CURB_RB_CALLBACK_RAISE("failure")
|
329
|
+
}
|
319
330
|
}
|
320
331
|
} else if (!rb_easy_nil("success_proc") &&
|
321
332
|
((response_code >= 200 && response_code < 300) || response_code == 0)) {
|
322
333
|
/* NOTE: we allow response_code == 0, in the case of non http requests e.g. reading from disk */
|
323
334
|
callargs = rb_ary_new3(2, rb_easy_get("success_proc"), easy);
|
324
335
|
rbce->callback_active = 1;
|
325
|
-
|
336
|
+
rb_rescue(call_status_handler1, callargs, callback_exception, did_raise);
|
326
337
|
rbce->callback_active = 0;
|
327
|
-
|
328
|
-
|
329
|
-
|
338
|
+
if (rb_hash_aref(did_raise, "error") != Qnil) {
|
339
|
+
CURB_RB_CALLBACK_RAISE("success")
|
340
|
+
}
|
341
|
+
} else if (!rb_easy_nil("redirect_proc") && ((response_code >= 300 && response_code < 400) || redirect_count > 0) ) {
|
330
342
|
rbce->callback_active = 1;
|
331
343
|
callargs = rb_ary_new3(3, rb_easy_get("redirect_proc"), easy, rb_curl_easy_error(result));
|
332
344
|
rbce->callback_active = 0;
|
333
|
-
|
345
|
+
rb_rescue(call_status_handler2, callargs, callback_exception, did_raise);
|
346
|
+
if (rb_hash_aref(did_raise, "error") != Qnil) {
|
347
|
+
CURB_RB_CALLBACK_RAISE("redirect")
|
348
|
+
}
|
334
349
|
} else if (!rb_easy_nil("missing_proc") &&
|
335
350
|
(response_code >= 400 && response_code < 500)) {
|
336
351
|
rbce->callback_active = 1;
|
337
352
|
callargs = rb_ary_new3(3, rb_easy_get("missing_proc"), easy, rb_curl_easy_error(result));
|
338
353
|
rbce->callback_active = 0;
|
339
|
-
|
354
|
+
rb_rescue(call_status_handler2, callargs, callback_exception, did_raise);
|
355
|
+
if (rb_hash_aref(did_raise, "error") != Qnil) {
|
356
|
+
CURB_RB_CALLBACK_RAISE("missing")
|
357
|
+
}
|
340
358
|
} else if (!rb_easy_nil("failure_proc") &&
|
341
359
|
(response_code >= 500 && response_code <= 999)) {
|
342
360
|
callargs = rb_ary_new3(3, rb_easy_get("failure_proc"), easy, rb_curl_easy_error(result));
|
343
361
|
rbce->callback_active = 1;
|
344
|
-
|
362
|
+
rb_rescue(call_status_handler2, callargs, callback_exception, did_raise);
|
345
363
|
rbce->callback_active = 0;
|
346
|
-
|
364
|
+
if (rb_hash_aref(did_raise, "error") != Qnil) {
|
365
|
+
CURB_RB_CALLBACK_RAISE("failure")
|
366
|
+
}
|
347
367
|
}
|
348
368
|
|
349
369
|
}
|
@@ -627,6 +647,8 @@ void init_curb_multi() {
|
|
627
647
|
idCall = rb_intern("call");
|
628
648
|
cCurlMulti = rb_define_class_under(mCurl, "Multi", rb_cObject);
|
629
649
|
|
650
|
+
rb_undef_alloc_func(cCurlMulti);
|
651
|
+
|
630
652
|
/* Class methods */
|
631
653
|
rb_define_singleton_method(cCurlMulti, "new", ruby_curl_multi_new, 0);
|
632
654
|
rb_define_singleton_method(cCurlMulti, "default_timeout=", ruby_curl_multi_set_default_timeout, 1);
|
data/ext/curb_postfield.c
CHANGED
@@ -498,6 +498,8 @@ void init_curb_postfield() {
|
|
498
498
|
|
499
499
|
cCurlPostField = rb_define_class_under(mCurl, "PostField", rb_cObject);
|
500
500
|
|
501
|
+
rb_undef_alloc_func(cCurlPostField);
|
502
|
+
|
501
503
|
/* Class methods */
|
502
504
|
rb_define_singleton_method(cCurlPostField, "content", ruby_curl_postfield_new_content, -1);
|
503
505
|
rb_define_singleton_method(cCurlPostField, "file", ruby_curl_postfield_new_file, -1);
|
data/ext/curb_upload.c
CHANGED
@@ -72,6 +72,7 @@ VALUE ruby_curl_upload_offset_get(VALUE self) {
|
|
72
72
|
/* =================== INIT LIB =====================*/
|
73
73
|
void init_curb_upload() {
|
74
74
|
cCurlUpload = rb_define_class_under(mCurl, "Upload", rb_cObject);
|
75
|
+
rb_undef_alloc_func(cCurlUpload);
|
75
76
|
rb_define_singleton_method(cCurlUpload, "new", ruby_curl_upload_new, 0);
|
76
77
|
rb_define_method(cCurlUpload, "stream=", ruby_curl_upload_stream_set, 1);
|
77
78
|
rb_define_method(cCurlUpload, "stream", ruby_curl_upload_stream_get, 0);
|
data/ext/extconf.rb
CHANGED
data/lib/curl/multi.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module Curl
|
3
3
|
class Multi
|
4
|
+
class DownloadError < RuntimeError
|
5
|
+
attr_accessor :errors
|
6
|
+
end
|
4
7
|
class << self
|
5
8
|
# call-seq:
|
6
9
|
# Curl::Multi.get(['url1','url2','url3','url4','url5'], :follow_location => true) do|easy|
|
@@ -241,7 +244,11 @@ module Curl
|
|
241
244
|
errors << e
|
242
245
|
end
|
243
246
|
}
|
244
|
-
|
247
|
+
if errors.any?
|
248
|
+
de = Curl::Multi::DownloadError.new
|
249
|
+
de.errors = errors
|
250
|
+
raise de
|
251
|
+
end
|
245
252
|
end
|
246
253
|
end
|
247
254
|
|
data/tests/bug_crash_on_debug.rb
CHANGED
@@ -20,11 +20,21 @@ class BugCrashOnDebug < Test::Unit::TestCase
|
|
20
20
|
end
|
21
21
|
puts 'b'
|
22
22
|
c = Curl::Easy.new('http://127.0.0.1:9999/test')
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
did_raise = false
|
24
|
+
did_call = false
|
25
|
+
begin
|
26
|
+
c.on_success do|x|
|
27
|
+
puts x.inspect
|
28
|
+
did_call = true
|
29
|
+
raise "error" # this will get swallowed
|
30
|
+
end
|
31
|
+
c.perform
|
32
|
+
rescue => e
|
33
|
+
did_raise = true
|
26
34
|
end
|
27
|
-
c.
|
35
|
+
puts c.response_code
|
36
|
+
assert did_raise
|
37
|
+
assert did_call
|
28
38
|
puts 'c'
|
29
39
|
ensure
|
30
40
|
puts 'd'
|
@@ -28,7 +28,8 @@ class BugCrashOnDebug < Test::Unit::TestCase
|
|
28
28
|
assert_equal 'Curl::Err::AbortedByCallbackError', e.class.to_s
|
29
29
|
c.close
|
30
30
|
ensure
|
31
|
-
server
|
31
|
+
server&.shutdown
|
32
|
+
thread&.exit
|
32
33
|
end
|
33
34
|
|
34
35
|
def test_on_progress_abort
|
@@ -67,7 +68,8 @@ class BugCrashOnDebug < Test::Unit::TestCase
|
|
67
68
|
assert_equal 'Curl::Err::AbortedByCallbackError', e.class.to_s
|
68
69
|
c.close
|
69
70
|
ensure
|
70
|
-
server
|
71
|
+
server&.shutdown
|
72
|
+
thread&.exit
|
71
73
|
end
|
72
74
|
|
73
75
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
2
|
+
require 'webrick'
|
3
|
+
class ::WEBrick::HTTPServer ; def access_log(config, req, res) ; end ; end
|
4
|
+
class ::WEBrick::BasicLog ; def log(level, data) ; end ; end
|
5
|
+
|
6
|
+
class BugFollowRedirect288 < Test::Unit::TestCase
|
7
|
+
def test_follow_redirect_with_no_redirect
|
8
|
+
server = WEBrick::HTTPServer.new( :Port => 9999 )
|
9
|
+
server.mount_proc("/test") do|req,res|
|
10
|
+
res.body = "hi"
|
11
|
+
res['Content-Type'] = "text/html"
|
12
|
+
end
|
13
|
+
server.mount_proc("/redirect_to_test") do|req,res|
|
14
|
+
res.set_redirect(WEBrick::HTTPStatus::TemporaryRedirect, "/test")
|
15
|
+
end
|
16
|
+
|
17
|
+
thread = Thread.new(server) do|srv|
|
18
|
+
srv.start
|
19
|
+
end
|
20
|
+
|
21
|
+
c = Curl::Easy.new('http://127.0.0.1:9999/test')
|
22
|
+
did_call_redirect = false
|
23
|
+
c.on_redirect do|x|
|
24
|
+
did_call_redirect = true
|
25
|
+
end
|
26
|
+
c.perform
|
27
|
+
|
28
|
+
assert !did_call_redirect, "should reach this point redirect should not have been called"
|
29
|
+
|
30
|
+
c = Curl::Easy.new('http://127.0.0.1:9999/test')
|
31
|
+
did_call_redirect = false
|
32
|
+
c.on_redirect do|x|
|
33
|
+
did_call_redirect = true
|
34
|
+
end
|
35
|
+
c.follow_location = true
|
36
|
+
c.perform
|
37
|
+
|
38
|
+
assert_equal 0, c.redirect_count
|
39
|
+
assert !did_call_redirect, "should reach this point redirect should not have been called"
|
40
|
+
|
41
|
+
c = Curl::Easy.new('http://127.0.0.1:9999/redirect_to_test')
|
42
|
+
did_call_redirect = false
|
43
|
+
c.on_redirect do|x|
|
44
|
+
did_call_redirect = true
|
45
|
+
end
|
46
|
+
c.perform
|
47
|
+
assert_equal 307, c.response_code
|
48
|
+
|
49
|
+
assert did_call_redirect, "we should have called on_redirect"
|
50
|
+
|
51
|
+
c = Curl::Easy.new('http://127.0.0.1:9999/redirect_to_test')
|
52
|
+
did_call_redirect = false
|
53
|
+
c.follow_location = true
|
54
|
+
# NOTE: while this API is not supported by libcurl e.g. there is no redirect function callback in libcurl we could
|
55
|
+
# add support in ruby for this by executing this callback if redirect_count is greater than 0 at the end of a request in curb_multi.c
|
56
|
+
c.on_redirect do|x|
|
57
|
+
did_call_redirect = true
|
58
|
+
end
|
59
|
+
c.perform
|
60
|
+
assert_equal 1, c.redirect_count
|
61
|
+
assert_equal 200, c.response_code
|
62
|
+
|
63
|
+
assert did_call_redirect, "we should have called on_redirect"
|
64
|
+
|
65
|
+
c.url = 'http://127.0.0.1:9999/test'
|
66
|
+
c.perform
|
67
|
+
assert_equal 0, c.redirect_count
|
68
|
+
assert_equal 200, c.response_code
|
69
|
+
|
70
|
+
did_raise = false
|
71
|
+
begin
|
72
|
+
c = Curl::Easy.new('http://127.0.0.1:9999/redirect_to_test')
|
73
|
+
did_call_redirect = false
|
74
|
+
c.on_redirect do|x|
|
75
|
+
raise "raise"
|
76
|
+
did_call_redirect = true
|
77
|
+
end
|
78
|
+
c.perform
|
79
|
+
rescue => e
|
80
|
+
did_raise = true
|
81
|
+
end
|
82
|
+
assert did_raise
|
83
|
+
assert_equal 307, c.response_code
|
84
|
+
|
85
|
+
ensure
|
86
|
+
server.stop
|
87
|
+
thread.join
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
2
|
+
|
3
|
+
require 'webrick'
|
4
|
+
class ::WEBrick::HTTPServer ; def access_log(config, req, res) ; end ; end
|
5
|
+
class ::WEBrick::BasicLog ; def log(level, data) ; end ; end
|
6
|
+
|
7
|
+
require 'curl'
|
8
|
+
|
9
|
+
class BugRaiseOnCallback < Test::Unit::TestCase
|
10
|
+
|
11
|
+
def test_on_complte
|
12
|
+
server = WEBrick::HTTPServer.new( :Port => 9999 )
|
13
|
+
server.mount_proc("/test") do|req,res|
|
14
|
+
res.body = "hi"
|
15
|
+
res['Content-Type'] = "text/html"
|
16
|
+
end
|
17
|
+
thread = Thread.new(server) do|srv|
|
18
|
+
srv.start
|
19
|
+
end
|
20
|
+
c = Curl::Easy.new('http://127.0.0.1:9999/test')
|
21
|
+
did_raise = false
|
22
|
+
begin
|
23
|
+
c.on_complete do|x|
|
24
|
+
assert_equal 'http://127.0.0.1:9999/test', x.url
|
25
|
+
raise "error complete" # this will get swallowed
|
26
|
+
end
|
27
|
+
c.perform
|
28
|
+
rescue => e
|
29
|
+
did_raise = true
|
30
|
+
end
|
31
|
+
assert did_raise, "we want to raise an exception if the ruby callbacks raise"
|
32
|
+
|
33
|
+
ensure
|
34
|
+
server.shutdown
|
35
|
+
thread.exit
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
#test_on_debug
|
data/tests/tc_curl_easy.rb
CHANGED
@@ -721,9 +721,9 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
721
721
|
on_success_called = false
|
722
722
|
curl.on_success {|c|
|
723
723
|
on_success_called = true
|
724
|
-
assert_not_nil c.
|
725
|
-
|
726
|
-
assert_match(/^# DO NOT REMOVE THIS COMMENT/, c.
|
724
|
+
assert_not_nil c.body
|
725
|
+
assert_match /Content-Length: 7714/, c.head
|
726
|
+
assert_match(/^# DO NOT REMOVE THIS COMMENT/, c.body)
|
727
727
|
}
|
728
728
|
curl.perform
|
729
729
|
assert on_success_called, "Success handler not called"
|
@@ -1147,7 +1147,7 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
1147
1147
|
c = Curl::Easy.new($TEST_URL)
|
1148
1148
|
c.on_success {|x| raise "error" }
|
1149
1149
|
c.perform
|
1150
|
-
rescue => e
|
1150
|
+
rescue Curl::Err::AbortedByCallbackError => e
|
1151
1151
|
assert_equal 'Curl::Err::AbortedByCallbackError', e.class.to_s
|
1152
1152
|
c.close
|
1153
1153
|
end
|
data/tests/tc_curl_multi.rb
CHANGED
@@ -74,7 +74,9 @@ class TestCurbCurlMulti < Test::Unit::TestCase
|
|
74
74
|
assert did_complete
|
75
75
|
after_open = open_fds.call
|
76
76
|
#puts "after_open: #{after_open} before_open: #{before_open.inspect}"
|
77
|
-
|
77
|
+
# ruby process may keep a connection alive
|
78
|
+
assert (after_open - before_open) < 3, "with max connections set to 1 at this point the connection to google should still be open"
|
79
|
+
assert (after_open - before_open) > 0, "with max connections set to 1 at this point the connection to google should still be open"
|
78
80
|
multi.close
|
79
81
|
|
80
82
|
after_open = open_fds.call
|
@@ -159,6 +161,15 @@ class TestCurbCurlMulti < Test::Unit::TestCase
|
|
159
161
|
|
160
162
|
end
|
161
163
|
|
164
|
+
def test_multi_easy_get
|
165
|
+
n = 1
|
166
|
+
urls = []
|
167
|
+
n.times { urls << $TEST_URL }
|
168
|
+
Curl::Multi.get(urls, {timeout: 5}) {|easy|
|
169
|
+
puts easy.last_effective_url
|
170
|
+
}
|
171
|
+
end
|
172
|
+
|
162
173
|
# NOTE: if this test runs slowly on Mac OSX, it is probably due to the use of a port install curl+ssl+ares install
|
163
174
|
# on my MacBook, this causes curl_easy_init to take nearly 0.01 seconds / * 100 below is 1 second too many!
|
164
175
|
def test_n_requests
|
@@ -480,7 +491,7 @@ class TestCurbCurlMulti < Test::Unit::TestCase
|
|
480
491
|
{ :url => TestServlet.url, :method => :get }
|
481
492
|
]
|
482
493
|
Curl::Multi.http(urls, {:pipeline => true}) do|easy, code, method|
|
483
|
-
assert_equal
|
494
|
+
assert_equal 200, code
|
484
495
|
case method
|
485
496
|
when :post
|
486
497
|
assert_match(/POST/, easy.body_str)
|
@@ -494,20 +505,20 @@ class TestCurbCurlMulti < Test::Unit::TestCase
|
|
494
505
|
end
|
495
506
|
|
496
507
|
def test_multi_easy_http_with_max_connects
|
497
|
-
|
508
|
+
urls = [
|
498
509
|
{ :url => TestServlet.url + '?q=1', :method => :get },
|
499
510
|
{ :url => TestServlet.url + '?q=2', :method => :get },
|
500
511
|
{ :url => TestServlet.url + '?q=3', :method => :get }
|
501
512
|
]
|
502
513
|
Curl::Multi.http(urls, {:pipeline => true, :max_connects => 1}) do|easy, code, method|
|
503
|
-
assert_equal
|
514
|
+
assert_equal 200, code
|
504
515
|
case method
|
505
516
|
when :post
|
506
|
-
assert_match(/POST/, easy.
|
517
|
+
assert_match(/POST/, easy.body)
|
507
518
|
when :get
|
508
|
-
assert_match(/GET/, easy.
|
519
|
+
assert_match(/GET/, easy.body)
|
509
520
|
when :put
|
510
|
-
assert_match(/PUT/, easy.
|
521
|
+
assert_match(/PUT/, easy.body)
|
511
522
|
end
|
512
523
|
end
|
513
524
|
end
|
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: 1.0.
|
4
|
+
version: 1.0.3
|
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: 2022-
|
12
|
+
date: 2022-12-28 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
|
@@ -50,12 +50,14 @@ files:
|
|
50
50
|
- tests/bug_crash_on_progress.rb
|
51
51
|
- tests/bug_curb_easy_blocks_ruby_threads.rb
|
52
52
|
- tests/bug_curb_easy_post_with_string_no_content_length_header.rb
|
53
|
+
- tests/bug_follow_redirect_288.rb
|
53
54
|
- tests/bug_instance_post_differs_from_class_post.rb
|
54
55
|
- tests/bug_issue102.rb
|
55
56
|
- tests/bug_issue277.rb
|
56
57
|
- tests/bug_multi_segfault.rb
|
57
58
|
- tests/bug_postfields_crash.rb
|
58
59
|
- tests/bug_postfields_crash2.rb
|
60
|
+
- tests/bug_raise_on_callback.rb
|
59
61
|
- tests/bug_require_last_or_segfault.rb
|
60
62
|
- tests/bugtests.rb
|
61
63
|
- tests/helper.rb
|
@@ -96,37 +98,39 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
98
|
- !ruby/object:Gem::Version
|
97
99
|
version: '0'
|
98
100
|
requirements: []
|
99
|
-
rubygems_version: 3.
|
101
|
+
rubygems_version: 3.2.33
|
100
102
|
signing_key:
|
101
103
|
specification_version: 4
|
102
104
|
summary: Ruby libcurl bindings
|
103
105
|
test_files:
|
104
|
-
- tests/tc_curl_multi.rb
|
105
106
|
- tests/alltests.rb
|
106
|
-
- tests/
|
107
|
-
- tests/tc_curl.rb
|
108
|
-
- tests/bug_postfields_crash.rb
|
107
|
+
- tests/bug_crash_on_debug.rb
|
109
108
|
- tests/bug_crash_on_progress.rb
|
110
|
-
- tests/
|
109
|
+
- tests/bug_curb_easy_blocks_ruby_threads.rb
|
110
|
+
- tests/bug_curb_easy_post_with_string_no_content_length_header.rb
|
111
|
+
- tests/bug_follow_redirect_288.rb
|
112
|
+
- tests/bug_instance_post_differs_from_class_post.rb
|
113
|
+
- tests/bug_issue102.rb
|
111
114
|
- tests/bug_issue277.rb
|
115
|
+
- tests/bug_multi_segfault.rb
|
116
|
+
- tests/bug_postfields_crash.rb
|
112
117
|
- tests/bug_postfields_crash2.rb
|
118
|
+
- tests/bug_raise_on_callback.rb
|
113
119
|
- tests/bug_require_last_or_segfault.rb
|
114
|
-
- tests/
|
115
|
-
- tests/
|
116
|
-
- tests/
|
117
|
-
- tests/tc_curl_protocols.rb
|
118
|
-
- tests/bug_issue102.rb
|
119
|
-
- tests/bug_curb_easy_blocks_ruby_threads.rb
|
120
|
-
- tests/bug_multi_segfault.rb
|
121
|
-
- tests/bug_instance_post_differs_from_class_post.rb
|
120
|
+
- tests/bugtests.rb
|
121
|
+
- tests/helper.rb
|
122
|
+
- tests/mem_check.rb
|
122
123
|
- tests/require_last_or_segfault_script.rb
|
123
|
-
- tests/
|
124
|
+
- tests/signals.rb
|
125
|
+
- tests/tc_curl.rb
|
124
126
|
- tests/tc_curl_download.rb
|
125
127
|
- tests/tc_curl_easy.rb
|
126
|
-
- tests/mem_check.rb
|
127
|
-
- tests/tc_curl_postfield.rb
|
128
|
-
- tests/tc_curl_maxfilesize.rb
|
129
|
-
- tests/bugtests.rb
|
130
128
|
- tests/tc_curl_easy_resolve.rb
|
131
|
-
- tests/
|
132
|
-
- tests/
|
129
|
+
- tests/tc_curl_easy_setopt.rb
|
130
|
+
- tests/tc_curl_maxfilesize.rb
|
131
|
+
- tests/tc_curl_multi.rb
|
132
|
+
- tests/tc_curl_postfield.rb
|
133
|
+
- tests/tc_curl_protocols.rb
|
134
|
+
- tests/timeout.rb
|
135
|
+
- tests/timeout_server.rb
|
136
|
+
- tests/unittests.rb
|