curb 1.0.1 → 1.0.3
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 +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
|