taf2-curb 0.4.6.0 → 0.4.8.0
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.
- data/ext/curb.h +6 -5
- data/ext/curb_easy.c +8 -138
- data/ext/curb_easy.h +2 -0
- data/ext/curb_multi.c +10 -8
- data/ext/curb_multi.h +4 -0
- data/tests/helper.rb +1 -1
- metadata +16 -16
data/ext/curb.h
CHANGED
@@ -20,20 +20,21 @@
|
|
20
20
|
#include "curb_macros.h"
|
21
21
|
|
22
22
|
// These should be managed from the Rake 'release' task.
|
23
|
-
#define CURB_VERSION "0.4.
|
24
|
-
#define CURB_VER_NUM
|
23
|
+
#define CURB_VERSION "0.4.8.0"
|
24
|
+
#define CURB_VER_NUM 480
|
25
25
|
#define CURB_VER_MAJ 0
|
26
26
|
#define CURB_VER_MIN 4
|
27
|
-
#define CURB_VER_MIC
|
27
|
+
#define CURB_VER_MIC 8
|
28
28
|
#define CURB_VER_PATCH 0
|
29
29
|
|
30
30
|
|
31
31
|
// Maybe not yet defined in Ruby
|
32
32
|
#ifndef RSTRING_LEN
|
33
|
-
#define RSTRING_LEN(x) RSTRING(x)->len
|
33
|
+
#define RSTRING_LEN(x) RSTRING(x)->len
|
34
34
|
#endif
|
35
|
+
|
35
36
|
#ifndef RSTRING_PTR
|
36
|
-
#define RSTRING_PTR(x) RSTRING(x)->ptr
|
37
|
+
#define RSTRING_PTR(x) RSTRING(x)->ptr
|
37
38
|
#endif
|
38
39
|
|
39
40
|
#ifdef HAVE_RUBY19_HASH
|
data/ext/curb_easy.c
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
#include "curb_errors.h"
|
9
9
|
#include "curb_postfield.h"
|
10
10
|
#include "curb_upload.h"
|
11
|
+
#include "curb_multi.h"
|
11
12
|
|
12
13
|
#include <errno.h>
|
13
14
|
#include <string.h>
|
@@ -1716,147 +1717,16 @@ VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce, VALUE bodybuf, V
|
|
1716
1717
|
*/
|
1717
1718
|
static VALUE handle_perform(VALUE self, ruby_curl_easy *rbce) {
|
1718
1719
|
|
1719
|
-
|
1720
|
-
|
1721
|
-
VALUE
|
1722
|
-
// char errors[CURL_ERROR_SIZE*2];
|
1720
|
+
VALUE multi = ruby_curl_multi_new(cCurlMulti);
|
1721
|
+
ruby_curl_multi_add(multi, self);
|
1722
|
+
VALUE ret = ruby_curl_multi_perform(multi);
|
1723
1723
|
|
1724
|
-
|
1725
|
-
|
1726
|
-
|
1727
|
-
|
1728
|
-
if( rb_thread_alone() ) {
|
1729
|
-
result = curl_easy_perform(rbce->curl);
|
1724
|
+
/* check for errors in the easy response and raise exceptions if anything went wrong and their is no on_failure handler */
|
1725
|
+
if( rbce->last_result != 0 && rbce->failure_proc == Qnil ) {
|
1726
|
+
raise_curl_easy_error_exception(rbce->last_result);
|
1730
1727
|
}
|
1731
|
-
else {
|
1732
|
-
int msgs;
|
1733
|
-
int still_running = 1;
|
1734
|
-
CURLMcode mcode = -1;
|
1735
|
-
CURLM *multi_handle = curl_multi_init();
|
1736
|
-
long timeout;
|
1737
|
-
struct timeval tv = {0, 0};
|
1738
|
-
int rc; /* select() return code */
|
1739
|
-
int maxfd;
|
1740
|
-
|
1741
|
-
/* NOTE:
|
1742
|
-
* We create an Curl multi handle here and use rb_thread_select allowing other ruby threads to
|
1743
|
-
* perform actions... ideally we'd have just 1 shared multi handle per all curl easy handles globally
|
1744
|
-
*/
|
1745
|
-
mcode = curl_multi_add_handle(multi_handle, rbce->curl);
|
1746
|
-
if (mcode != CURLM_CALL_MULTI_PERFORM && mcode != CURLM_OK) {
|
1747
|
-
raise_curl_multi_error_exception(mcode);
|
1748
|
-
}
|
1749
|
-
|
1750
|
-
while(CURLM_CALL_MULTI_PERFORM == (mcode=curl_multi_perform(multi_handle, &still_running)) ) ;
|
1751
|
-
|
1752
|
-
if (mcode != CURLM_CALL_MULTI_PERFORM && mcode != CURLM_OK) {
|
1753
|
-
raise_curl_multi_error_exception(mcode);
|
1754
|
-
}
|
1755
|
-
|
1756
|
-
|
1757
|
-
while(still_running) {
|
1758
|
-
|
1759
|
-
fd_set fdread;
|
1760
|
-
fd_set fdwrite;
|
1761
|
-
fd_set fdexcep;
|
1762
|
-
|
1763
|
-
FD_ZERO(&fdread);
|
1764
|
-
FD_ZERO(&fdwrite);
|
1765
|
-
FD_ZERO(&fdexcep);
|
1766
|
-
|
1767
|
-
//time_t timer = time(NULL);
|
1768
|
-
/* get file descriptors from the transfers */
|
1769
|
-
mcode = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
1770
|
-
if (mcode != CURLM_CALL_MULTI_PERFORM && mcode != CURLM_OK) {
|
1771
|
-
raise_curl_multi_error_exception(mcode);
|
1772
|
-
}
|
1773
|
-
|
1774
|
-
#ifdef HAVE_CURL_MULTI_TIMEOUT
|
1775
|
-
/* get the curl suggested time out */
|
1776
|
-
mcode = curl_multi_timeout(multi_handle, &timeout);
|
1777
|
-
if (mcode != CURLM_OK) {
|
1778
|
-
raise_curl_multi_error_exception(mcode);
|
1779
|
-
}
|
1780
|
-
#else
|
1781
|
-
/* libcurl doesn't have a timeout method defined... make a wild guess */
|
1782
|
-
timeout = 1; /* wait a second */
|
1783
|
-
#endif
|
1784
|
-
|
1785
|
-
if (timeout == 0) { /* no delay */
|
1786
|
-
while(CURLM_CALL_MULTI_PERFORM == (mcode=curl_multi_perform(multi_handle, &still_running)) );
|
1787
|
-
continue;
|
1788
|
-
}
|
1789
|
-
else if (timeout == -1) {
|
1790
|
-
timeout = 1; /* wait a second */
|
1791
|
-
}
|
1792
|
-
|
1793
|
-
/* set a suitable timeout to play around with - ruby seems to be greedy about this and won't necessarily yield so the timeout is small.. */
|
1794
|
-
tv.tv_sec = timeout / 1000;
|
1795
|
-
tv.tv_usec = (timeout * 1000) % 1000000;
|
1796
|
-
rc = rb_thread_select(maxfd+1, &fdread, &fdwrite, &fdexcep, &tv);
|
1797
|
-
if (rc < 0) {
|
1798
|
-
rb_raise(rb_eRuntimeError, "select(): %s", strerror(errno));
|
1799
|
-
}
|
1800
1728
|
|
1801
|
-
|
1802
|
-
switch(rc) {
|
1803
|
-
case 0:
|
1804
|
-
//printf("timeout(%.6f) :", difftime(time(NULL), timer) );
|
1805
|
-
default:
|
1806
|
-
//printf("readable/writable: %d\n", rc);
|
1807
|
-
/* timeout or readable/writable sockets */
|
1808
|
-
while(CURLM_CALL_MULTI_PERFORM == (mcode=curl_multi_perform(multi_handle, &still_running)) );
|
1809
|
-
break;
|
1810
|
-
}
|
1811
|
-
}
|
1812
|
-
else {
|
1813
|
-
// error
|
1814
|
-
}
|
1815
|
-
|
1816
|
-
if (mcode != CURLM_CALL_MULTI_PERFORM && mcode != CURLM_OK) {
|
1817
|
-
raise_curl_multi_error_exception(mcode);
|
1818
|
-
}
|
1819
|
-
|
1820
|
-
}
|
1821
|
-
|
1822
|
-
/* check for errors */
|
1823
|
-
CURLMsg *msg = curl_multi_info_read(multi_handle, &msgs);
|
1824
|
-
if (msg && msg->msg == CURLMSG_DONE) {
|
1825
|
-
result = msg->data.result;
|
1826
|
-
}
|
1827
|
-
|
1828
|
-
curl_multi_remove_handle(multi_handle, rbce->curl);
|
1829
|
-
curl_multi_cleanup(multi_handle);
|
1830
|
-
}
|
1831
|
-
|
1832
|
-
ruby_curl_easy_cleanup(self, rbce, bodybuf, headerbuf, headers);
|
1833
|
-
|
1834
|
-
if (rbce->complete_proc != Qnil) {
|
1835
|
-
rb_funcall( rbce->complete_proc, idCall, 1, self );
|
1836
|
-
}
|
1837
|
-
|
1838
|
-
/* check the request status and determine if on_success or on_failure should be called */
|
1839
|
-
long response_code = -1;
|
1840
|
-
curl_easy_getinfo(rbce->curl, CURLINFO_RESPONSE_CODE, &response_code);
|
1841
|
-
if (result != 0) {
|
1842
|
-
// printf("error: %s\n", errors);
|
1843
|
-
if (rbce->failure_proc != Qnil) {
|
1844
|
-
rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, rb_curl_easy_error(result) );
|
1845
|
-
} else {
|
1846
|
-
raise_curl_easy_error_exception(result);
|
1847
|
-
}
|
1848
|
-
}
|
1849
|
-
else if (rbce->success_proc != Qnil &&
|
1850
|
-
/* NOTE: we allow response_code == 0, in the case the file is being read from disk */
|
1851
|
-
((response_code >= 200 && response_code < 300) || response_code == 0)) {
|
1852
|
-
rb_funcall( rbce->success_proc, idCall, 1, self );
|
1853
|
-
}
|
1854
|
-
else if (rbce->failure_proc != Qnil &&
|
1855
|
-
(response_code >= 300 && response_code <= 999)) {
|
1856
|
-
rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, rb_curl_easy_error(result) );
|
1857
|
-
}
|
1858
|
-
|
1859
|
-
return Qtrue;
|
1729
|
+
return ret;
|
1860
1730
|
}
|
1861
1731
|
|
1862
1732
|
/*
|
data/ext/curb_easy.h
CHANGED
@@ -89,6 +89,8 @@ typedef struct {
|
|
89
89
|
VALUE self; /* pointer to self, used by multi interface */
|
90
90
|
VALUE upload; /* pointer to an active upload otherwise Qnil */
|
91
91
|
|
92
|
+
int last_result; /* last result code from multi loop */
|
93
|
+
|
92
94
|
} ruby_curl_easy;
|
93
95
|
|
94
96
|
extern VALUE cCurlEasy;
|
data/ext/curb_multi.c
CHANGED
@@ -6,9 +6,11 @@
|
|
6
6
|
|
7
7
|
#include "curb_config.h"
|
8
8
|
#ifdef HAVE_RUBY19_ST_H
|
9
|
-
#include <ruby
|
9
|
+
#include <ruby.h>
|
10
|
+
#include <ruby/st.h>
|
10
11
|
#else
|
11
|
-
#include <
|
12
|
+
#include <ruby.h>
|
13
|
+
#include <st.h>
|
12
14
|
#endif
|
13
15
|
#include "curb_easy.h"
|
14
16
|
#include "curb_errors.h"
|
@@ -26,7 +28,6 @@ static VALUE idCall;
|
|
26
28
|
|
27
29
|
VALUE cCurlMulti;
|
28
30
|
|
29
|
-
static VALUE ruby_curl_multi_remove(VALUE , VALUE );
|
30
31
|
static void rb_curl_multi_remove(ruby_curl_multi *rbcm, VALUE easy);
|
31
32
|
static void rb_curl_multi_read_info(VALUE self, CURLM *mptr);
|
32
33
|
|
@@ -76,7 +77,7 @@ static void curl_multi_free(ruby_curl_multi *rbcm) {
|
|
76
77
|
*
|
77
78
|
* Create a new Curl::Multi instance
|
78
79
|
*/
|
79
|
-
|
80
|
+
VALUE ruby_curl_multi_new(VALUE klass) {
|
80
81
|
VALUE new_curlm;
|
81
82
|
|
82
83
|
ruby_curl_multi *rbcm = ALLOC(ruby_curl_multi);
|
@@ -186,7 +187,7 @@ static VALUE ruby_curl_multi_pipeline(VALUE self, VALUE onoff) {
|
|
186
187
|
*
|
187
188
|
* Add an easy handle to the multi stack
|
188
189
|
*/
|
189
|
-
|
190
|
+
VALUE ruby_curl_multi_add(VALUE self, VALUE easy) {
|
190
191
|
CURLMcode mcode;
|
191
192
|
ruby_curl_easy *rbce;
|
192
193
|
ruby_curl_multi *rbcm;
|
@@ -234,7 +235,7 @@ static VALUE ruby_curl_multi_add(VALUE self, VALUE easy) {
|
|
234
235
|
*
|
235
236
|
* Will raise an exception if the easy handle is not found
|
236
237
|
*/
|
237
|
-
|
238
|
+
VALUE ruby_curl_multi_remove(VALUE self, VALUE easy) {
|
238
239
|
ruby_curl_multi *rbcm;
|
239
240
|
|
240
241
|
Data_Get_Struct(self, ruby_curl_multi, rbcm);
|
@@ -316,6 +317,7 @@ static void rb_curl_multi_read_info(VALUE self, CURLM *multi_handle) {
|
|
316
317
|
if (ecode != 0) {
|
317
318
|
raise_curl_easy_error_exception(ecode);
|
318
319
|
}
|
320
|
+
rbce->last_result = result; // save the last easy result code
|
319
321
|
ruby_curl_multi_remove( self, rbce->self );
|
320
322
|
|
321
323
|
if (rbce->complete_proc != Qnil) {
|
@@ -377,7 +379,7 @@ static void rb_curl_multi_run(VALUE self, CURLM *multi_handle, int *still_runnin
|
|
377
379
|
*
|
378
380
|
* Run multi handles, looping selecting when data can be transfered
|
379
381
|
*/
|
380
|
-
|
382
|
+
VALUE ruby_curl_multi_perform(VALUE self) {
|
381
383
|
CURLMcode mcode;
|
382
384
|
ruby_curl_multi *rbcm;
|
383
385
|
int maxfd, rc;
|
@@ -437,7 +439,7 @@ static VALUE ruby_curl_multi_perform(VALUE self) {
|
|
437
439
|
|
438
440
|
}
|
439
441
|
|
440
|
-
return
|
442
|
+
return Qtrue;
|
441
443
|
}
|
442
444
|
|
443
445
|
/* =================== INIT LIB =====================*/
|
data/ext/curb_multi.h
CHANGED
@@ -20,6 +20,10 @@ typedef struct {
|
|
20
20
|
|
21
21
|
extern VALUE cCurlMulti;
|
22
22
|
void init_curb_multi();
|
23
|
+
VALUE ruby_curl_multi_new(VALUE klass);
|
24
|
+
VALUE ruby_curl_multi_perform(VALUE self);
|
25
|
+
VALUE ruby_curl_multi_add(VALUE self, VALUE easy);
|
26
|
+
VALUE ruby_curl_multi_remove(VALUE self, VALUE easy);
|
23
27
|
|
24
28
|
|
25
29
|
#endif
|
data/tests/helper.rb
CHANGED
@@ -21,7 +21,7 @@ require 'webrick'
|
|
21
21
|
# or to test with multiple threads set it to false
|
22
22
|
# this is important since, some code paths will change depending
|
23
23
|
# on the presence of multiple threads
|
24
|
-
TEST_SINGLE_THREADED=
|
24
|
+
TEST_SINGLE_THREADED=false
|
25
25
|
|
26
26
|
# keep webrick quiet
|
27
27
|
class ::WEBrick::HTTPServer
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: taf2-curb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ross Bamford
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-07-
|
13
|
+
date: 2009-07-21 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|
@@ -32,18 +32,18 @@ files:
|
|
32
32
|
- lib/curb.rb
|
33
33
|
- lib/curl.rb
|
34
34
|
- ext/curb.c
|
35
|
-
- ext/curb_easy.c
|
36
|
-
- ext/curb_errors.c
|
37
|
-
- ext/curb_multi.c
|
38
35
|
- ext/curb_postfield.c
|
36
|
+
- ext/curb_multi.c
|
37
|
+
- ext/curb_errors.c
|
38
|
+
- ext/curb_easy.c
|
39
39
|
- ext/curb_upload.c
|
40
|
-
- ext/curb.h
|
41
40
|
- ext/curb_easy.h
|
42
41
|
- ext/curb_errors.h
|
42
|
+
- ext/curb_upload.h
|
43
43
|
- ext/curb_macros.h
|
44
|
-
- ext/
|
44
|
+
- ext/curb.h
|
45
45
|
- ext/curb_postfield.h
|
46
|
-
- ext/
|
46
|
+
- ext/curb_multi.h
|
47
47
|
has_rdoc: true
|
48
48
|
homepage: http://curb.rubyforge.org/
|
49
49
|
post_install_message:
|
@@ -73,15 +73,15 @@ signing_key:
|
|
73
73
|
specification_version: 2
|
74
74
|
summary: Ruby libcurl bindings
|
75
75
|
test_files:
|
76
|
-
- tests/
|
76
|
+
- tests/tc_curl_multi.rb
|
77
|
+
- tests/tc_curl_postfield.rb
|
77
78
|
- tests/bug_curb_easy_blocks_ruby_threads.rb
|
78
|
-
- tests/
|
79
|
-
- tests/bug_multi_segfault.rb
|
79
|
+
- tests/unittests.rb
|
80
80
|
- tests/bug_require_last_or_segfault.rb
|
81
|
-
- tests/
|
82
|
-
- tests/require_last_or_segfault_script.rb
|
81
|
+
- tests/bug_instance_post_differs_from_class_post.rb
|
83
82
|
- tests/tc_curl_download.rb
|
83
|
+
- tests/alltests.rb
|
84
|
+
- tests/helper.rb
|
84
85
|
- tests/tc_curl_easy.rb
|
85
|
-
- tests/
|
86
|
-
- tests/
|
87
|
-
- tests/unittests.rb
|
86
|
+
- tests/bug_multi_segfault.rb
|
87
|
+
- tests/require_last_or_segfault_script.rb
|