taf2-curb 0.4.0.0 → 0.4.1.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.c +51 -51
- data/ext/curb.h +7 -8
- data/ext/curb_easy.c +720 -640
- data/ext/curb_easy.h +12 -11
- data/ext/curb_errors.c +84 -84
- data/ext/curb_errors.h +2 -2
- data/ext/curb_multi.c +16 -15
- data/ext/curb_multi.h +2 -2
- data/ext/curb_upload.c +56 -0
- data/ext/curb_upload.h +30 -0
- data/lib/curb.rb +0 -1
- data/tests/tc_curl_easy.rb +23 -3
- metadata +4 -2
data/ext/curb_errors.h
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/* curb_errors.h - Ruby exception types for curl errors
|
2
|
-
* Copyright (c)2006 Ross Bamford.
|
2
|
+
* Copyright (c)2006 Ross Bamford.
|
3
3
|
* Licensed under the Ruby License. See LICENSE for details.
|
4
|
-
*
|
4
|
+
*
|
5
5
|
* $Id: curb_errors.h 4 2006-11-17 18:35:31Z roscopeco $
|
6
6
|
*/
|
7
7
|
#ifndef __CURB_ERRORS_H
|
data/ext/curb_multi.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/* curb_easy.c - Curl easy mode
|
2
|
-
* Copyright (c)2008 Todd A. Fisher.
|
2
|
+
* Copyright (c)2008 Todd A. Fisher.
|
3
3
|
* Licensed under the Ruby License. See LICENSE for details.
|
4
|
-
*
|
4
|
+
*
|
5
5
|
* $Id$
|
6
6
|
*/
|
7
7
|
|
@@ -66,17 +66,18 @@ static void curl_multi_free(ruby_curl_multi *rbcm) {
|
|
66
66
|
//rb_hash_clear(rbcm->requests)
|
67
67
|
rbcm->requests = Qnil;
|
68
68
|
}
|
69
|
+
free(rbcm);
|
69
70
|
}
|
70
71
|
|
71
72
|
/*
|
72
73
|
* call-seq:
|
73
74
|
* Curl::Multi.new => #<Curl::Easy...>
|
74
|
-
*
|
75
|
+
*
|
75
76
|
* Create a new Curl::Multi instance
|
76
77
|
*/
|
77
|
-
static VALUE ruby_curl_multi_new(VALUE
|
78
|
+
static VALUE ruby_curl_multi_new(VALUE klass) {
|
78
79
|
VALUE new_curlm;
|
79
|
-
|
80
|
+
|
80
81
|
ruby_curl_multi *rbcm = ALLOC(ruby_curl_multi);
|
81
82
|
|
82
83
|
rbcm->handle = curl_multi_init();
|
@@ -85,8 +86,8 @@ static VALUE ruby_curl_multi_new(VALUE self) {
|
|
85
86
|
|
86
87
|
rbcm->active = 0;
|
87
88
|
rbcm->running = 0;
|
88
|
-
|
89
|
-
new_curlm = Data_Wrap_Struct(
|
89
|
+
|
90
|
+
new_curlm = Data_Wrap_Struct(klass, curl_multi_mark, curl_multi_free, rbcm);
|
90
91
|
|
91
92
|
return new_curlm;
|
92
93
|
}
|
@@ -179,7 +180,7 @@ static VALUE ruby_curl_multi_add(VALUE self, VALUE easy) {
|
|
179
180
|
* easy = Curl::Easy.new('url')
|
180
181
|
*
|
181
182
|
* multi.add(easy)
|
182
|
-
*
|
183
|
+
*
|
183
184
|
* # sometime later
|
184
185
|
* multi.remove(easy)
|
185
186
|
*
|
@@ -203,7 +204,7 @@ static void rb_curl_multi_remove(ruby_curl_multi *rbcm, VALUE easy) {
|
|
203
204
|
CURLMcode result;
|
204
205
|
ruby_curl_easy *rbce;
|
205
206
|
Data_Get_Struct(easy, ruby_curl_easy, rbce);
|
206
|
-
|
207
|
+
|
207
208
|
rbcm->active--;
|
208
209
|
|
209
210
|
//printf( "calling rb_curl_multi_remove: 0x%X, active: %d\n", (long)easy, rbcm->active );
|
@@ -212,7 +213,7 @@ static void rb_curl_multi_remove(ruby_curl_multi *rbcm, VALUE easy) {
|
|
212
213
|
if (result != 0) {
|
213
214
|
raise_curl_multi_error_exception(result);
|
214
215
|
}
|
215
|
-
|
216
|
+
|
216
217
|
ruby_curl_easy_cleanup( easy, rbce, rbce->bodybuf, rbce->headerbuf, rbce->curl_headers );
|
217
218
|
rbce->headerbuf = Qnil;
|
218
219
|
rbce->bodybuf = Qnil;
|
@@ -253,7 +254,7 @@ static void rb_curl_multi_read_info(VALUE self, CURLM *multi_handle) {
|
|
253
254
|
|
254
255
|
long response_code = -1;
|
255
256
|
curl_easy_getinfo(rbce->curl, CURLINFO_RESPONSE_CODE, &response_code);
|
256
|
-
|
257
|
+
|
257
258
|
if (result != 0) {
|
258
259
|
if (rbce->failure_proc != Qnil) {
|
259
260
|
rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, INT2FIX(result) );
|
@@ -320,7 +321,7 @@ static VALUE ruby_curl_multi_perform(VALUE self) {
|
|
320
321
|
|
321
322
|
rb_curl_multi_run( self, rbcm->handle, &(rbcm->running) );
|
322
323
|
|
323
|
-
while(rbcm->running) {
|
324
|
+
while(rbcm->running) {
|
324
325
|
FD_ZERO(&fdread);
|
325
326
|
FD_ZERO(&fdwrite);
|
326
327
|
FD_ZERO(&fdexcep);
|
@@ -331,7 +332,7 @@ static VALUE ruby_curl_multi_perform(VALUE self) {
|
|
331
332
|
raise_curl_multi_error_exception(mcode);
|
332
333
|
}
|
333
334
|
|
334
|
-
#ifdef HAVE_CURL_MULTI_TIMEOUT
|
335
|
+
#ifdef HAVE_CURL_MULTI_TIMEOUT
|
335
336
|
/* get the curl suggested time out */
|
336
337
|
mcode = curl_multi_timeout(rbcm->handle, &timeout);
|
337
338
|
if (mcode != CURLM_OK) {
|
@@ -353,7 +354,7 @@ static VALUE ruby_curl_multi_perform(VALUE self) {
|
|
353
354
|
if (rb_block_given_p()) {
|
354
355
|
rb_yield(self);
|
355
356
|
}
|
356
|
-
|
357
|
+
|
357
358
|
tv.tv_sec = timeout / 1000;
|
358
359
|
tv.tv_usec = (timeout * 1000) % 1000000;
|
359
360
|
|
@@ -376,7 +377,7 @@ void init_curb_multi() {
|
|
376
377
|
cCurlMulti = rb_define_class_under(mCurl, "Multi", rb_cObject);
|
377
378
|
|
378
379
|
/* Class methods */
|
379
|
-
rb_define_singleton_method(cCurlMulti, "new", ruby_curl_multi_new,
|
380
|
+
rb_define_singleton_method(cCurlMulti, "new", ruby_curl_multi_new, 0);
|
380
381
|
|
381
382
|
/* Instnace methods */
|
382
383
|
rb_define_method(cCurlMulti, "max_connects=", ruby_curl_multi_max_connects, 1);
|
data/ext/curb_multi.h
CHANGED
data/ext/curb_upload.c
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
/* curb_upload.c - Curl upload handle
|
2
|
+
* Copyright (c)2009 Todd A Fisher.
|
3
|
+
* Licensed under the Ruby License. See LICENSE for details.
|
4
|
+
*/
|
5
|
+
#include "curb_upload.h"
|
6
|
+
extern VALUE mCurl;
|
7
|
+
VALUE cCurlUpload;
|
8
|
+
|
9
|
+
static void curl_upload_mark(ruby_curl_upload *rbcu) {
|
10
|
+
if (rbcu->stream) rb_gc_mark(rbcu->stream);
|
11
|
+
}
|
12
|
+
static void curl_upload_free(ruby_curl_upload *rbcu) {
|
13
|
+
free(rbcu);
|
14
|
+
}
|
15
|
+
|
16
|
+
VALUE ruby_curl_upload_new(VALUE klass) {
|
17
|
+
VALUE upload;
|
18
|
+
ruby_curl_upload *rbcu = ALLOC(ruby_curl_upload);
|
19
|
+
rbcu->stream = Qnil;
|
20
|
+
rbcu->offset = 0;
|
21
|
+
upload = Data_Wrap_Struct(klass, curl_upload_mark, curl_upload_free, rbcu);
|
22
|
+
return upload;
|
23
|
+
}
|
24
|
+
|
25
|
+
VALUE ruby_curl_upload_stream_set(VALUE self, VALUE stream) {
|
26
|
+
ruby_curl_upload *rbcu;
|
27
|
+
Data_Get_Struct(self, ruby_curl_upload, rbcu);
|
28
|
+
rbcu->stream = stream;
|
29
|
+
return stream;
|
30
|
+
}
|
31
|
+
VALUE ruby_curl_upload_stream_get(VALUE self) {
|
32
|
+
ruby_curl_upload *rbcu;
|
33
|
+
Data_Get_Struct(self, ruby_curl_upload, rbcu);
|
34
|
+
return rbcu->stream;
|
35
|
+
}
|
36
|
+
VALUE ruby_curl_upload_offset_set(VALUE self, VALUE offset) {
|
37
|
+
ruby_curl_upload *rbcu;
|
38
|
+
Data_Get_Struct(self, ruby_curl_upload, rbcu);
|
39
|
+
rbcu->offset = FIX2INT(offset);
|
40
|
+
return offset;
|
41
|
+
}
|
42
|
+
VALUE ruby_curl_upload_offset_get(VALUE self) {
|
43
|
+
ruby_curl_upload *rbcu;
|
44
|
+
Data_Get_Struct(self, ruby_curl_upload, rbcu);
|
45
|
+
return INT2FIX(rbcu->offset);
|
46
|
+
}
|
47
|
+
|
48
|
+
/* =================== INIT LIB =====================*/
|
49
|
+
void init_curb_upload() {
|
50
|
+
cCurlUpload = rb_define_class_under(mCurl, "Upload", rb_cObject);
|
51
|
+
rb_define_singleton_method(cCurlUpload, "new", ruby_curl_upload_new, 0);
|
52
|
+
rb_define_method(cCurlUpload, "stream=", ruby_curl_upload_stream_set, 1);
|
53
|
+
rb_define_method(cCurlUpload, "stream", ruby_curl_upload_stream_get, 0);
|
54
|
+
rb_define_method(cCurlUpload, "offset=", ruby_curl_upload_offset_set, 1);
|
55
|
+
rb_define_method(cCurlUpload, "offset", ruby_curl_upload_offset_get, 0);
|
56
|
+
}
|
data/ext/curb_upload.h
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
/* curb_upload.h - Curl upload handle
|
2
|
+
* Copyright (c)2009 Todd A Fisher.
|
3
|
+
* Licensed under the Ruby License. See LICENSE for details.
|
4
|
+
*/
|
5
|
+
#ifndef __CURB_UPLOAD_H
|
6
|
+
#define __CURB_UPLOAD_H
|
7
|
+
|
8
|
+
#include "curb.h"
|
9
|
+
|
10
|
+
#include <curl/easy.h>
|
11
|
+
|
12
|
+
/*
|
13
|
+
* Maintain the state of an upload e.g. for putting large streams with very little memory
|
14
|
+
* out to a server. via PUT requests
|
15
|
+
*/
|
16
|
+
typedef struct {
|
17
|
+
VALUE stream;
|
18
|
+
size_t offset;
|
19
|
+
} ruby_curl_upload;
|
20
|
+
|
21
|
+
extern VALUE cCurlUpload;
|
22
|
+
void init_curb_upload();
|
23
|
+
|
24
|
+
VALUE ruby_curl_upload_new(VALUE klass);
|
25
|
+
VALUE ruby_curl_upload_stream_set(VALUE self, VALUE stream);
|
26
|
+
VALUE ruby_curl_upload_stream_get(VALUE self);
|
27
|
+
VALUE ruby_curl_upload_offset_set(VALUE self, VALUE offset);
|
28
|
+
VALUE ruby_curl_upload_offset_get(VALUE self);
|
29
|
+
|
30
|
+
#endif
|
data/lib/curb.rb
CHANGED
data/tests/tc_curl_easy.rb
CHANGED
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), 'helper')
|
|
2
2
|
|
3
3
|
class TestCurbCurlEasy < Test::Unit::TestCase
|
4
4
|
def test_class_perform_01
|
5
|
-
assert_instance_of Curl::Easy, c = Curl::Easy.perform($TEST_URL)
|
5
|
+
assert_instance_of Curl::Easy, c = Curl::Easy.perform($TEST_URL)
|
6
6
|
assert_match(/^# DO NOT REMOVE THIS COMMENT/, c.body_str)
|
7
7
|
assert_equal "", c.header_str
|
8
8
|
end
|
@@ -22,6 +22,7 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
22
22
|
|
23
23
|
def test_new_01
|
24
24
|
c = Curl::Easy.new
|
25
|
+
assert_equal Curl::Easy, c.class
|
25
26
|
assert_nil c.url
|
26
27
|
assert_nil c.body_str
|
27
28
|
assert_nil c.header_str
|
@@ -54,8 +55,19 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
54
55
|
assert_equal $TEST_URL, c.url
|
55
56
|
assert_equal blk, c.on_body # sets handler nil, returns old handler
|
56
57
|
assert_equal nil, c.on_body
|
57
|
-
end
|
58
|
-
|
58
|
+
end
|
59
|
+
|
60
|
+
class Foo < Curl::Easy
|
61
|
+
end
|
62
|
+
def test_new_05
|
63
|
+
# can use Curl::Easy as a base class
|
64
|
+
c = Foo.new
|
65
|
+
assert_equal Foo, c.class
|
66
|
+
c.url = $TEST_URL
|
67
|
+
c.perform
|
68
|
+
assert_match(/^# DO NOT REMOVE THIS COMMENT/, c.body_str)
|
69
|
+
end
|
70
|
+
|
59
71
|
def test_escape
|
60
72
|
c = Curl::Easy.new
|
61
73
|
|
@@ -525,6 +537,14 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
525
537
|
assert_match /message$/, curl.body_str
|
526
538
|
end
|
527
539
|
|
540
|
+
def test_put_remote_file
|
541
|
+
curl = Curl::Easy.new(TestServlet.url)
|
542
|
+
File.open(__FILE__,'r') do|f|
|
543
|
+
assert curl.http_put(f)
|
544
|
+
end
|
545
|
+
assert_equal "PUT\n#{File.read(__FILE__)}", curl.body_str
|
546
|
+
end
|
547
|
+
|
528
548
|
include TestServerMethods
|
529
549
|
|
530
550
|
def setup
|
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.1.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-06-
|
13
|
+
date: 2009-06-19 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|
@@ -36,8 +36,10 @@ files:
|
|
36
36
|
- ext/curb_multi.c
|
37
37
|
- ext/curb_errors.c
|
38
38
|
- ext/curb_easy.c
|
39
|
+
- ext/curb_upload.c
|
39
40
|
- ext/curb_easy.h
|
40
41
|
- ext/curb_errors.h
|
42
|
+
- ext/curb_upload.h
|
41
43
|
- ext/curb_macros.h
|
42
44
|
- ext/curb.h
|
43
45
|
- ext/curb_postfield.h
|