curb 0.7.9 → 0.7.10
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 +3 -3
- data/ext/curb_easy.c +14 -3
- data/ext/curb_multi.c +50 -0
- data/ext/curb_postfield.c +3 -2
- data/tests/tc_curl_easy.rb +2 -2
- metadata +4 -4
data/ext/curb.h
CHANGED
@@ -20,11 +20,11 @@
|
|
20
20
|
#include "curb_macros.h"
|
21
21
|
|
22
22
|
// These should be managed from the Rake 'release' task.
|
23
|
-
#define CURB_VERSION "0.7.
|
24
|
-
#define CURB_VER_NUM
|
23
|
+
#define CURB_VERSION "0.7.10"
|
24
|
+
#define CURB_VER_NUM 710
|
25
25
|
#define CURB_VER_MAJ 0
|
26
26
|
#define CURB_VER_MIN 7
|
27
|
-
#define CURB_VER_MIC
|
27
|
+
#define CURB_VER_MIC 1
|
28
28
|
#define CURB_VER_PATCH 0
|
29
29
|
|
30
30
|
|
data/ext/curb_easy.c
CHANGED
@@ -753,8 +753,18 @@ static VALUE ruby_curl_easy_post_body_set(VALUE self, VALUE post_body) {
|
|
753
753
|
rb_easy_del("postdata_buffer");
|
754
754
|
|
755
755
|
} else {
|
756
|
-
|
757
|
-
|
756
|
+
if (rb_type(post_body) == T_STRING) {
|
757
|
+
data = StringValuePtr(post_body);
|
758
|
+
len = RSTRING_LEN(post_body);
|
759
|
+
}
|
760
|
+
else if (rb_respond_to(post_body, rb_intern("to_s"))) {
|
761
|
+
VALUE str_body = rb_funcall(post_body, rb_intern("to_s"), 0);
|
762
|
+
data = StringValuePtr(str_body);
|
763
|
+
len = RSTRING_LEN(post_body);
|
764
|
+
}
|
765
|
+
else {
|
766
|
+
rb_raise(rb_eRuntimeError, "post data must respond_to .to_s");
|
767
|
+
}
|
758
768
|
|
759
769
|
// Store the string, since it has to hang around for the duration of the
|
760
770
|
// request. See CURLOPT_POSTFIELDS in the libcurl docs.
|
@@ -2141,6 +2151,7 @@ VALUE ruby_curl_easy_setup( ruby_curl_easy *rbce ) {
|
|
2141
2151
|
VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce ) {
|
2142
2152
|
|
2143
2153
|
CURL *curl = rbce->curl;
|
2154
|
+
struct curl_slist *ftp_commands;
|
2144
2155
|
|
2145
2156
|
/* Free everything up */
|
2146
2157
|
if (rbce->curl_headers) {
|
@@ -2148,7 +2159,7 @@ VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce ) {
|
|
2148
2159
|
rbce->curl_headers = NULL;
|
2149
2160
|
}
|
2150
2161
|
|
2151
|
-
|
2162
|
+
ftp_commands = rbce->curl_ftp_commands;
|
2152
2163
|
if (ftp_commands) {
|
2153
2164
|
curl_slist_free_all(ftp_commands);
|
2154
2165
|
rbce->curl_ftp_commands = NULL;
|
data/ext/curb_multi.c
CHANGED
@@ -19,6 +19,11 @@
|
|
19
19
|
|
20
20
|
#include <errno.h>
|
21
21
|
|
22
|
+
#ifdef _WIN32
|
23
|
+
// for O_RDWR and O_BINARY
|
24
|
+
#include <fcntl.h>
|
25
|
+
#endif
|
26
|
+
|
22
27
|
extern VALUE mCurl;
|
23
28
|
static VALUE idCall;
|
24
29
|
|
@@ -396,6 +401,35 @@ static void rb_curl_multi_run(VALUE self, CURLM *multi_handle, int *still_runnin
|
|
396
401
|
|
397
402
|
}
|
398
403
|
|
404
|
+
#ifdef _WIN32
|
405
|
+
void create_crt_fd(fd_set *os_set, fd_set *crt_set)
|
406
|
+
{
|
407
|
+
int i;
|
408
|
+
crt_set->fd_count = os_set->fd_count;
|
409
|
+
for (i = 0; i < os_set->fd_count; i++) {
|
410
|
+
WSAPROTOCOL_INFO wsa_pi;
|
411
|
+
// dupicate the SOCKET
|
412
|
+
int r = WSADuplicateSocket(os_set->fd_array[i], GetCurrentProcessId(), &wsa_pi);
|
413
|
+
SOCKET s = WSASocket(wsa_pi.iAddressFamily, wsa_pi.iSocketType, wsa_pi.iProtocol, &wsa_pi, 0, 0);
|
414
|
+
// create the CRT fd so ruby can get back to the SOCKET
|
415
|
+
int fd = _open_osfhandle(s, O_RDWR|O_BINARY);
|
416
|
+
os_set->fd_array[i] = s;
|
417
|
+
crt_set->fd_array[i] = fd;
|
418
|
+
}
|
419
|
+
}
|
420
|
+
|
421
|
+
void cleanup_crt_fd(fd_set *os_set, fd_set *crt_set)
|
422
|
+
{
|
423
|
+
int i;
|
424
|
+
for (i = 0; i < os_set->fd_count; i++) {
|
425
|
+
// cleanup the CRT fd
|
426
|
+
_close(crt_set->fd_array[i]);
|
427
|
+
// cleanup the duplicated SOCKET
|
428
|
+
closesocket(os_set->fd_array[i]);
|
429
|
+
}
|
430
|
+
}
|
431
|
+
#endif
|
432
|
+
|
399
433
|
/*
|
400
434
|
* call-seq:
|
401
435
|
* multi = Curl::Multi.new
|
@@ -416,6 +450,9 @@ VALUE ruby_curl_multi_perform(int argc, VALUE *argv, VALUE self) {
|
|
416
450
|
ruby_curl_multi *rbcm;
|
417
451
|
int maxfd, rc;
|
418
452
|
fd_set fdread, fdwrite, fdexcep;
|
453
|
+
#ifdef _WIN32
|
454
|
+
fd_set crt_fdread, crt_fdwrite, crt_fdexcep;
|
455
|
+
#endif
|
419
456
|
|
420
457
|
long timeout_milliseconds;
|
421
458
|
struct timeval tv = {0, 0};
|
@@ -474,7 +511,20 @@ VALUE ruby_curl_multi_perform(int argc, VALUE *argv, VALUE self) {
|
|
474
511
|
raise_curl_multi_error_exception(mcode);
|
475
512
|
}
|
476
513
|
|
514
|
+
#ifdef _WIN32
|
515
|
+
create_crt_fd(&fdread, &crt_fdread);
|
516
|
+
create_crt_fd(&fdwrite, &crt_fdwrite);
|
517
|
+
create_crt_fd(&fdexcep, &crt_fdexcep);
|
518
|
+
#endif
|
519
|
+
|
477
520
|
rc = rb_thread_select(maxfd+1, &fdread, &fdwrite, &fdexcep, &tv);
|
521
|
+
|
522
|
+
#ifdef _WIN32
|
523
|
+
cleanup_crt_fd(&fdread, &crt_fdread);
|
524
|
+
cleanup_crt_fd(&fdwrite, &crt_fdwrite);
|
525
|
+
cleanup_crt_fd(&fdexcep, &crt_fdexcep);
|
526
|
+
#endif
|
527
|
+
|
478
528
|
switch(rc) {
|
479
529
|
case -1:
|
480
530
|
rb_raise(rb_eRuntimeError, "select(): %s", strerror(errno));
|
data/ext/curb_postfield.c
CHANGED
@@ -213,7 +213,7 @@ static VALUE ruby_curl_postfield_new_content(int argc, VALUE *argv, VALUE klass)
|
|
213
213
|
// wierdness - we actually require two args, unless a block is provided, but
|
214
214
|
// we have to work that out below.
|
215
215
|
rb_scan_args(argc, argv, "12&", &rbcpf->name, &rbcpf->content, &rbcpf->content_type, &rbcpf->content_proc);
|
216
|
-
|
216
|
+
|
217
217
|
// special handling if theres a block, second arg is actually content_type
|
218
218
|
if (rbcpf->content_proc != Qnil) {
|
219
219
|
if (rbcpf->content != Qnil) {
|
@@ -425,6 +425,7 @@ static VALUE ruby_curl_postfield_to_str(VALUE self) {
|
|
425
425
|
ruby_curl_postfield *rbcpf;
|
426
426
|
VALUE result = Qnil;
|
427
427
|
VALUE name = Qnil;
|
428
|
+
char *tmpchrs;
|
428
429
|
|
429
430
|
Data_Get_Struct(self, ruby_curl_postfield, rbcpf);
|
430
431
|
|
@@ -443,7 +444,7 @@ static VALUE ruby_curl_postfield_to_str(VALUE self) {
|
|
443
444
|
rb_raise(eCurlErrInvalidPostField, "Cannot convert unnamed field to string %s:%d, make sure your field name responds_to :to_s", __FILE__, __LINE__);
|
444
445
|
}
|
445
446
|
|
446
|
-
|
447
|
+
tmpchrs = curl_escape(StringValuePtr(name), (int)RSTRING_LEN(name));
|
447
448
|
|
448
449
|
if (!tmpchrs) {
|
449
450
|
rb_raise(eCurlErrInvalidPostField, "Failed to url-encode name `%s'", tmpchrs);
|
data/tests/tc_curl_easy.rb
CHANGED
@@ -565,8 +565,8 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
565
565
|
|
566
566
|
def test_post_remote
|
567
567
|
curl = Curl::Easy.new(TestServlet.url)
|
568
|
-
curl.http_post
|
569
|
-
assert_equal "POST\
|
568
|
+
curl.http_post([Curl::PostField.content('document_id', 5)])
|
569
|
+
assert_equal "POST\ndocument%5Fid=5", curl.body_str
|
570
570
|
end
|
571
571
|
|
572
572
|
def test_post_remote_is_easy_handle
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: curb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 7
|
9
|
-
-
|
10
|
-
version: 0.7.
|
9
|
+
- 10
|
10
|
+
version: 0.7.10
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ross Bamford
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2011-01-20 00:00:00 -05:00
|
20
20
|
default_executable:
|
21
21
|
dependencies: []
|
22
22
|
|