curb 0.9.3 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.markdown +90 -22
- data/Rakefile +35 -20
- data/ext/banned.h +32 -0
- data/ext/curb.c +190 -14
- data/ext/curb.h +18 -5
- data/ext/curb_easy.c +514 -98
- data/ext/curb_easy.h +7 -0
- data/ext/curb_errors.c +86 -0
- data/ext/curb_macros.h +12 -0
- data/ext/curb_multi.c +178 -229
- data/ext/curb_multi.h +0 -1
- data/ext/curb_postfield.c +9 -7
- data/ext/curb_upload.c +1 -0
- data/ext/extconf.rb +76 -6
- data/lib/curb.rb +1 -0
- data/lib/curl/easy.rb +16 -9
- data/lib/curl/multi.rb +60 -14
- data/lib/curl.rb +20 -12
- data/tests/bug_crash_on_debug.rb +14 -28
- data/tests/bug_crash_on_progress.rb +7 -31
- data/tests/bug_curb_easy_blocks_ruby_threads.rb +8 -13
- data/tests/bug_curb_easy_post_with_string_no_content_length_header.rb +6 -30
- data/tests/bug_follow_redirect_288.rb +83 -0
- data/tests/bug_instance_post_differs_from_class_post.rb +3 -5
- data/tests/bug_issue277.rb +32 -0
- data/tests/bug_multi_segfault.rb +1 -0
- data/tests/bug_raise_on_callback.rb +29 -0
- data/tests/helper.rb +122 -13
- data/tests/tc_curl.rb +31 -1
- data/tests/tc_curl_download.rb +3 -3
- data/tests/tc_curl_easy.rb +167 -46
- data/tests/tc_curl_easy_resolve.rb +16 -0
- data/tests/tc_curl_maxfilesize.rb +12 -0
- data/tests/tc_curl_multi.rb +161 -18
- data/tests/tc_curl_postfield.rb +29 -29
- data/tests/tc_curl_protocols.rb +37 -0
- data/tests/timeout.rb +21 -5
- metadata +20 -8
data/ext/curb_easy.h
CHANGED
@@ -36,6 +36,9 @@ typedef struct {
|
|
36
36
|
/* The handler */
|
37
37
|
CURL *curl;
|
38
38
|
|
39
|
+
/* Buffer for error details from CURLOPT_ERRORBUFFER */
|
40
|
+
char err_buf[CURL_ERROR_SIZE];
|
41
|
+
|
39
42
|
VALUE opts; /* rather then allocate everything we might need to store, allocate a Hash and only store objects we actually use... */
|
40
43
|
VALUE multi; /* keep a multi handle alive for each easy handle not being used by a multi handle. This improves easy performance when not within a multi context */
|
41
44
|
|
@@ -55,6 +58,8 @@ typedef struct {
|
|
55
58
|
unsigned long ftp_response_timeout;
|
56
59
|
long low_speed_limit;
|
57
60
|
long low_speed_time;
|
61
|
+
long max_send_speed_large;
|
62
|
+
long max_recv_speed_large;
|
58
63
|
long ssl_version;
|
59
64
|
long use_ssl;
|
60
65
|
long ftp_filemethod;
|
@@ -76,7 +81,9 @@ typedef struct {
|
|
76
81
|
char callback_active;
|
77
82
|
|
78
83
|
struct curl_slist *curl_headers;
|
84
|
+
struct curl_slist *curl_proxy_headers;
|
79
85
|
struct curl_slist *curl_ftp_commands;
|
86
|
+
struct curl_slist *curl_resolve;
|
80
87
|
|
81
88
|
int last_result; /* last result code from multi loop */
|
82
89
|
|
data/ext/curb_errors.c
CHANGED
@@ -21,6 +21,7 @@ VALUE eCurlErrFileError;
|
|
21
21
|
VALUE eCurlErrLDAPError;
|
22
22
|
VALUE eCurlErrTelnetError;
|
23
23
|
VALUE eCurlErrTFTPError;
|
24
|
+
VALUE eCurlErrRTSPError;
|
24
25
|
|
25
26
|
/* Specific libcurl errors */
|
26
27
|
VALUE eCurlErrOK; /* not really an error but a return code */
|
@@ -127,6 +128,18 @@ VALUE mCurlErrUnknownOption;
|
|
127
128
|
VALUE eCurlErrInvalidPostField;
|
128
129
|
|
129
130
|
|
131
|
+
/* new errors */
|
132
|
+
VALUE eCurlErrFTPPRETFailed;
|
133
|
+
VALUE eCurlErrRTSPCseqError;
|
134
|
+
VALUE eCurlErrRTSPSessionError;
|
135
|
+
VALUE eCurlErrFTPBadFileList;
|
136
|
+
VALUE eCurlErrChunkFailed;
|
137
|
+
VALUE eCurlErrNoConnectionAvailable;
|
138
|
+
VALUE eCurlErrSSLPinnedPubKeyNotMatch;
|
139
|
+
VALUE eCurlErrSSLInvalidCertStatus;
|
140
|
+
VALUE eCurlErrHTTP2Stream;
|
141
|
+
|
142
|
+
|
130
143
|
VALUE rb_curl_easy_error(CURLcode code) {
|
131
144
|
VALUE exclz;
|
132
145
|
const char *exmsg = NULL;
|
@@ -294,9 +307,11 @@ VALUE rb_curl_easy_error(CURLcode code) {
|
|
294
307
|
exclz = eCurlErrObsolete;
|
295
308
|
break;
|
296
309
|
#endif
|
310
|
+
#if LIBCURL_VERSION_NUM < 0x073e00
|
297
311
|
case CURLE_SSL_PEER_CERTIFICATE: /* 51 - peer's certificate wasn't ok */
|
298
312
|
exclz = eCurlErrSSLPeerCertificate;
|
299
313
|
break;
|
314
|
+
#endif
|
300
315
|
case CURLE_GOT_NOTHING: /* 52 - when this is a specific error */
|
301
316
|
exclz = eCurlErrGotNothing;
|
302
317
|
break;
|
@@ -321,8 +336,13 @@ VALUE rb_curl_easy_error(CURLcode code) {
|
|
321
336
|
case CURLE_SSL_CIPHER: /* 59 - couldn't use specified cipher */
|
322
337
|
exclz = eCurlErrSSLCipher;
|
323
338
|
break;
|
339
|
+
#if LIBCURL_VERSION_NUM >= 0x073e00
|
340
|
+
case CURLE_PEER_FAILED_VERIFICATION: /* 60 - problem with the CA cert (path?) */
|
341
|
+
exclz = eCurlErrSSLPeerCertificate;
|
342
|
+
#else
|
324
343
|
case CURLE_SSL_CACERT: /* 60 - problem with the CA cert (path?) */
|
325
344
|
exclz = eCurlErrSSLCACertificate;
|
345
|
+
#endif
|
326
346
|
break;
|
327
347
|
case CURLE_BAD_CONTENT_ENCODING: /* 61 - Unrecognized transfer encoding */
|
328
348
|
exclz = eCurlErrBadContentEncoding;
|
@@ -445,6 +465,61 @@ VALUE rb_curl_easy_error(CURLcode code) {
|
|
445
465
|
exclz = eCurlErrSSLIssuerError;
|
446
466
|
break;
|
447
467
|
#endif
|
468
|
+
|
469
|
+
#ifdef HAVE_CURLE_FTP_PRET_FAILED
|
470
|
+
case CURLE_FTP_PRET_FAILED: /* 84 */
|
471
|
+
exclz = eCurlErrFTPPRETFailed;
|
472
|
+
break;
|
473
|
+
#endif
|
474
|
+
|
475
|
+
#ifdef HAVE_CURLE_RTSP_CSEQ_ERROR
|
476
|
+
case CURLE_RTSP_CSEQ_ERROR: /* 85 */
|
477
|
+
exclz = eCurlErrRTSPCseqError;
|
478
|
+
break;
|
479
|
+
#endif
|
480
|
+
|
481
|
+
#ifdef HAVE_CURLE_RTSP_SESSION_ERROR
|
482
|
+
case CURLE_RTSP_SESSION_ERROR: /* 86 */
|
483
|
+
exclz = eCurlErrRTSPSessionError;
|
484
|
+
break;
|
485
|
+
#endif
|
486
|
+
|
487
|
+
#ifdef HAVE_CURLE_FTP_BAD_FILE_LIST
|
488
|
+
case CURLE_FTP_BAD_FILE_LIST: /* 87 */
|
489
|
+
exclz = eCurlErrFTPBadFileList;
|
490
|
+
break;
|
491
|
+
#endif
|
492
|
+
|
493
|
+
#ifdef HAVE_CURLE_CHUNK_FAILED
|
494
|
+
case CURLE_CHUNK_FAILED: /* 88 */
|
495
|
+
exclz = eCurlErrChunkFailed;
|
496
|
+
break;
|
497
|
+
#endif
|
498
|
+
|
499
|
+
#ifdef HAVE_CURLE_NO_CONNECTION_AVAILABLE
|
500
|
+
case CURLE_NO_CONNECTION_AVAILABLE: /* 89 */
|
501
|
+
exclz = eCurlErrNoConnectionAvailable;
|
502
|
+
break;
|
503
|
+
#endif
|
504
|
+
|
505
|
+
#ifdef HAVE_CURLE_SSL_PINNEDPUBKEYNOTMATCH
|
506
|
+
case CURLE_SSL_PINNEDPUBKEYNOTMATCH: /* 90 */
|
507
|
+
exclz = eCurlErrSSLPinnedPubKeyNotMatch;
|
508
|
+
break;
|
509
|
+
#endif
|
510
|
+
|
511
|
+
#ifdef HAVE_CURLE_SSL_INVALIDCERTSTATUS
|
512
|
+
case CURLE_SSL_INVALIDCERTSTATUS: /* 91 */
|
513
|
+
exclz = eCurlErrSSLInvalidCertStatus;
|
514
|
+
break;
|
515
|
+
#endif
|
516
|
+
|
517
|
+
#ifdef HAVE_CURLE_HTTP2_STREAM
|
518
|
+
case CURLE_HTTP2_STREAM: /* 92 */
|
519
|
+
exclz = eCurlErrHTTP2Stream;
|
520
|
+
break;
|
521
|
+
#endif
|
522
|
+
|
448
523
|
default:
|
449
524
|
exclz = eCurlErrError;
|
450
525
|
exmsg = "Unknown error result from libcurl";
|
@@ -532,6 +607,7 @@ void init_curb_errors() {
|
|
532
607
|
eCurlErrLDAPError = rb_define_class_under(mCurlErr, "LDAPError", eCurlErrError);
|
533
608
|
eCurlErrTelnetError = rb_define_class_under(mCurlErr, "TelnetError", eCurlErrError);
|
534
609
|
eCurlErrTFTPError = rb_define_class_under(mCurlErr, "TFTPError", eCurlErrError);
|
610
|
+
eCurlErrRTSPError = rb_define_class_under(mCurlErr, "RTSPError", eCurlErrError);
|
535
611
|
|
536
612
|
eCurlErrOK = rb_define_class_under(mCurlErr, "CurlOK", eCurlErrError);
|
537
613
|
eCurlErrUnsupportedProtocol = rb_define_class_under(mCurlErr, "UnsupportedProtocolError", eCurlErrError);
|
@@ -657,4 +733,14 @@ void init_curb_errors() {
|
|
657
733
|
eCurlErrTFTPNoSuchUser = rb_define_class_under(mCurlErr, "NoSuchUserError", eCurlErrTFTPError);
|
658
734
|
|
659
735
|
eCurlErrInvalidPostField = rb_define_class_under(mCurlErr, "InvalidPostFieldError", eCurlErrError);
|
736
|
+
|
737
|
+
eCurlErrFTPPRETFailed = rb_define_class_under(mCurlErr, "PPRETFailedError", eCurlErrFTPError);
|
738
|
+
eCurlErrRTSPCseqError = rb_define_class_under(mCurlErr, "CseqError", eCurlErrRTSPError);
|
739
|
+
eCurlErrRTSPSessionError = rb_define_class_under(mCurlErr, "SessionError", eCurlErrRTSPError);
|
740
|
+
eCurlErrFTPBadFileList = rb_define_class_under(mCurlErr, "BadFileListError", eCurlErrFTPError);
|
741
|
+
eCurlErrChunkFailed = rb_define_class_under(mCurlErr, "ChunkFailedError", eCurlErrError);
|
742
|
+
eCurlErrNoConnectionAvailable = rb_define_class_under(mCurlErr, "NoConnectionAvailableError", eCurlErrError);
|
743
|
+
eCurlErrSSLPinnedPubKeyNotMatch = rb_define_class_under(mCurlErr, "SSLPinnedPubKeyNotMatchError", eCurlErrError);
|
744
|
+
eCurlErrSSLInvalidCertStatus = rb_define_class_under(mCurlErr, "SSLInvalidCertStatusError", eCurlErrError);
|
745
|
+
eCurlErrHTTP2Stream = rb_define_class_under(mCurlErr, "HTTP2StreamError", eCurlErrHTTPError);
|
660
746
|
}
|
data/ext/curb_macros.h
CHANGED
@@ -156,4 +156,16 @@
|
|
156
156
|
#define CURB_DEFINE(name) \
|
157
157
|
rb_define_const(mCurl, #name, LONG2NUM(name))
|
158
158
|
|
159
|
+
/* copy and raise exception */
|
160
|
+
#define CURB_CHECK_RB_CALLBACK_RAISE(did_raise) \
|
161
|
+
VALUE exception = rb_hash_aref(did_raise, rb_easy_hkey("error")); \
|
162
|
+
if (FIX2INT(rb_hash_size(did_raise)) > 0 && exception != Qnil) { \
|
163
|
+
rb_hash_clear(did_raise); \
|
164
|
+
VALUE message = rb_funcall(exception, rb_intern("message"), 0); \
|
165
|
+
VALUE aborted_exception = rb_exc_new_str(eCurlErrAbortedByCallback, message); \
|
166
|
+
VALUE backtrace = rb_funcall(exception, rb_intern("backtrace"), 0); \
|
167
|
+
rb_funcall(aborted_exception, rb_intern("set_backtrace"), 1, backtrace); \
|
168
|
+
rb_exc_raise(aborted_exception); \
|
169
|
+
}
|
170
|
+
|
159
171
|
#endif
|