curb 0.9.4 → 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.markdown +13 -13
- data/ext/curb.c +13 -6
- data/ext/curb.h +3 -3
- data/ext/curb_easy.c +125 -38
- data/ext/curb_easy.h +1 -0
- data/ext/curb_errors.c +79 -0
- data/ext/extconf.rb +19 -6
- data/lib/curl.rb +7 -1
- data/lib/curl/easy.rb +1 -1
- data/tests/tc_curl_easy_resolve.rb +16 -0
- metadata +21 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3b322d2ebc81428defb20ae37afc57287d05cc7
|
4
|
+
data.tar.gz: e2b87dc289c5c0268b927d78afd5d1ccdd3b3e73
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56080e5ef72c525be4b575c74b3832aa62d1074923237922f1568d7c3027e2eb654770a5a6187e0cc1f359c5228cae0aa7ea02cb95cafe6218d848595cb1a1f9
|
7
|
+
data.tar.gz: c9625176e56a5bb0b3716b1d6c8604f3bcfe406933a78a1cb371e20b9b4c4072477c1cebb52772ce793ab94adc3cbf8b9cba8264df0a3bf2498fdabb23885852
|
data/README.markdown
CHANGED
@@ -11,8 +11,8 @@ Curb is a work-in-progress, and currently only supports libcurl's 'easy' and 'mu
|
|
11
11
|
|
12
12
|
## License
|
13
13
|
|
14
|
-
Curb is copyright (c)2006 Ross Bamford, and released under the terms of the
|
15
|
-
Ruby license. See the LICENSE file for the gory details.
|
14
|
+
Curb is copyright (c)2006 Ross Bamford, and released under the terms of the
|
15
|
+
Ruby license. See the LICENSE file for the gory details.
|
16
16
|
|
17
17
|
## You will need
|
18
18
|
|
@@ -32,17 +32,17 @@ line (alter paths to your curl location, but remember to use forward slashes):
|
|
32
32
|
|
33
33
|
gem install curb --platform=ruby -- --with-curl-lib=C:/curl-7.39.0-devel-mingw32/bin --with-curl-include=C:/curl-7.39.0-devel-mingw32/include
|
34
34
|
|
35
|
-
Or, if you downloaded the archive:
|
35
|
+
Or, if you downloaded the archive:
|
36
36
|
|
37
|
-
$ rake install
|
37
|
+
$ rake compile && rake install
|
38
38
|
|
39
39
|
If you have a weird setup, you might need extconf options. In this case, pass
|
40
40
|
them like so:
|
41
41
|
|
42
|
-
$ rake
|
43
|
-
|
42
|
+
$ rake compile EXTCONF_OPTS='--with-curl-dir=/path/to/libcurl --prefix=/what/ever' && rake install
|
43
|
+
|
44
44
|
Curb is tested only on GNU/Linux x86 and Mac OSX - YMMV on other platforms.
|
45
|
-
If you do use another platform and experience problems, or if you can
|
45
|
+
If you do use another platform and experience problems, or if you can
|
46
46
|
expand on the above instructions, please report the issue at http://github.com/taf2/curb/issues
|
47
47
|
|
48
48
|
On Ubuntu, the dependencies can be satisfied by installing the following packages:
|
@@ -52,7 +52,7 @@ On Ubuntu, the dependencies can be satisfied by installing the following package
|
|
52
52
|
On RedHat:
|
53
53
|
|
54
54
|
$ sudo yum install ruby-devel libcurl-devel openssl-devel
|
55
|
-
|
55
|
+
|
56
56
|
Curb has fairly extensive RDoc comments in the source. You can build the
|
57
57
|
documentation with:
|
58
58
|
|
@@ -80,7 +80,7 @@ puts http.body_str
|
|
80
80
|
http = Curl.post("http://www.google.com/", {:foo => "bar"})
|
81
81
|
puts http.body_str
|
82
82
|
|
83
|
-
http = Curl.get("http://www.google.com/") do|http|
|
83
|
+
http = Curl.get("http://www.google.com/") do |http|
|
84
84
|
http.headers['Cookie'] = 'foo=1;bar=2'
|
85
85
|
end
|
86
86
|
puts http.body_str
|
@@ -104,7 +104,7 @@ puts c.body_str
|
|
104
104
|
### Additional config:
|
105
105
|
|
106
106
|
```ruby
|
107
|
-
Curl::Easy.perform("http://www.google.co.uk") do |curl|
|
107
|
+
Curl::Easy.perform("http://www.google.co.uk") do |curl|
|
108
108
|
curl.headers["User-Agent"] = "myapp-0.0"
|
109
109
|
curl.verbose = true
|
110
110
|
end
|
@@ -113,7 +113,7 @@ end
|
|
113
113
|
Same thing, more manual:
|
114
114
|
|
115
115
|
```ruby
|
116
|
-
c = Curl::Easy.new("http://www.google.co.uk") do |curl|
|
116
|
+
c = Curl::Easy.new("http://www.google.co.uk") do |curl|
|
117
117
|
curl.headers["User-Agent"] = "myapp-0.0"
|
118
118
|
curl.verbose = true
|
119
119
|
end
|
@@ -134,7 +134,7 @@ c.perform
|
|
134
134
|
### HTTP "insecure" SSL connections (like curl -k, --insecure) to avoid Curl::Err::SSLCACertificateError:
|
135
135
|
|
136
136
|
```ruby
|
137
|
-
c = Curl::Easy.new("
|
137
|
+
c = Curl::Easy.new("https://github.com/")
|
138
138
|
c.ssl_verify_peer = false
|
139
139
|
c.perform
|
140
140
|
```
|
@@ -194,7 +194,7 @@ puts (c.body_str.include? "You are using HTTP/2 right now!") ? "HTTP/2" : "HTTP/
|
|
194
194
|
# make multiple GET requests
|
195
195
|
easy_options = {:follow_location => true}
|
196
196
|
# Use Curl::CURLPIPE_MULTIPLEX for HTTP/2 multiplexing
|
197
|
-
multi_options = {:pipeline => Curl::CURLPIPE_HTTP1}
|
197
|
+
multi_options = {:pipeline => Curl::CURLPIPE_HTTP1}
|
198
198
|
|
199
199
|
Curl::Multi.get(['url1','url2','url3','url4','url5'], easy_options, multi_options) do|easy|
|
200
200
|
# do something interesting with the easy response
|
data/ext/curb.c
CHANGED
@@ -272,15 +272,15 @@ void Init_curb_core() {
|
|
272
272
|
/* Passed to on_debug handler to indicate that the data is protocol data sent to the peer. */
|
273
273
|
rb_define_const(mCurl, "CURLINFO_DATA_OUT", LONG2NUM(CURLINFO_DATA_OUT));
|
274
274
|
|
275
|
-
#ifdef HAVE_CURLFTPMETHOD_MULTICWD
|
275
|
+
#ifdef HAVE_CURLFTPMETHOD_MULTICWD
|
276
276
|
rb_define_const(mCurl, "CURL_MULTICWD", LONG2NUM(CURLFTPMETHOD_MULTICWD));
|
277
277
|
#endif
|
278
278
|
|
279
|
-
#ifdef HAVE_CURLFTPMETHOD_NOCWD
|
279
|
+
#ifdef HAVE_CURLFTPMETHOD_NOCWD
|
280
280
|
rb_define_const(mCurl, "CURL_NOCWD", LONG2NUM(CURLFTPMETHOD_NOCWD));
|
281
281
|
#endif
|
282
282
|
|
283
|
-
#ifdef HAVE_CURLFTPMETHOD_SINGLECWD
|
283
|
+
#ifdef HAVE_CURLFTPMETHOD_SINGLECWD
|
284
284
|
rb_define_const(mCurl, "CURL_SINGLECWD", LONG2NUM(CURLFTPMETHOD_SINGLECWD));
|
285
285
|
#endif
|
286
286
|
|
@@ -296,13 +296,13 @@ void Init_curb_core() {
|
|
296
296
|
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1", LONG2NUM(CURL_SSLVERSION_TLSv1));
|
297
297
|
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv2", LONG2NUM(CURL_SSLVERSION_SSLv2));
|
298
298
|
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv3", LONG2NUM(CURL_SSLVERSION_SSLv3));
|
299
|
-
#if
|
299
|
+
#if HAVE_CURL_SSLVERSION_TLSV1_0
|
300
300
|
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_0", LONG2NUM(CURL_SSLVERSION_TLSv1_0));
|
301
301
|
#endif
|
302
|
-
#if
|
302
|
+
#if HAVE_CURL_SSLVERSION_TLSV1_1
|
303
303
|
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_1", LONG2NUM(CURL_SSLVERSION_TLSv1_1));
|
304
304
|
#endif
|
305
|
-
#if
|
305
|
+
#if HAVE_CURL_SSLVERSION_TLSV1_2
|
306
306
|
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_2", LONG2NUM(CURL_SSLVERSION_TLSv1_2));
|
307
307
|
#endif
|
308
308
|
|
@@ -609,6 +609,9 @@ void Init_curb_core() {
|
|
609
609
|
#if LIBCURL_VERSION_NUM >= 0x072100 /* 7.33.0 */
|
610
610
|
CURB_DEFINE(CURL_HTTP_VERSION_2_0);
|
611
611
|
#endif
|
612
|
+
#if LIBCURL_VERSION_NUM >= 0x072f00 /* 7.47.0 */
|
613
|
+
CURB_DEFINE(CURL_HTTP_VERSION_2TLS);
|
614
|
+
#endif
|
612
615
|
#if HAVE_CURLOPT_IGNORE_CONTENT_LENGTH
|
613
616
|
CURB_DEFINE(CURLOPT_IGNORE_CONTENT_LENGTH);
|
614
617
|
#endif
|
@@ -1023,6 +1026,10 @@ void Init_curb_core() {
|
|
1023
1026
|
CURB_DEFINE(CURLOPT_UNIX_SOCKET_PATH);
|
1024
1027
|
#endif
|
1025
1028
|
|
1029
|
+
#if HAVE_CURLOPT_PIPEWAIT
|
1030
|
+
CURB_DEFINE(CURLOPT_PIPEWAIT);
|
1031
|
+
#endif
|
1032
|
+
|
1026
1033
|
#if LIBCURL_VERSION_NUM >= 0x072B00 /* 7.43.0 */
|
1027
1034
|
CURB_DEFINE(CURLPIPE_NOTHING);
|
1028
1035
|
CURB_DEFINE(CURLPIPE_HTTP1);
|
data/ext/curb.h
CHANGED
@@ -20,10 +20,10 @@
|
|
20
20
|
#include "curb_macros.h"
|
21
21
|
|
22
22
|
// These should be managed from the Rake 'release' task.
|
23
|
-
#define CURB_VERSION "0.9.
|
24
|
-
#define CURB_VER_NUM
|
23
|
+
#define CURB_VERSION "0.9.5"
|
24
|
+
#define CURB_VER_NUM 905
|
25
25
|
#define CURB_VER_MAJ 0
|
26
|
-
#define CURB_VER_MIN
|
26
|
+
#define CURB_VER_MIN 5
|
27
27
|
#define CURB_VER_MIC 0
|
28
28
|
#define CURB_VER_PATCH 0
|
29
29
|
|
data/ext/curb_easy.c
CHANGED
@@ -30,7 +30,7 @@ VALUE cCurlEasy;
|
|
30
30
|
|
31
31
|
static VALUE callback_exception(VALUE unused) {
|
32
32
|
return Qfalse;
|
33
|
-
}
|
33
|
+
}
|
34
34
|
|
35
35
|
/* These handle both body and header data */
|
36
36
|
static size_t default_data_handler(char *stream,
|
@@ -227,6 +227,10 @@ static void ruby_curl_easy_free(ruby_curl_easy *rbce) {
|
|
227
227
|
curl_slist_free_all(rbce->curl_ftp_commands);
|
228
228
|
}
|
229
229
|
|
230
|
+
if (rbce->curl_resolve) {
|
231
|
+
curl_slist_free_all(rbce->curl_resolve);
|
232
|
+
}
|
233
|
+
|
230
234
|
if (rbce->curl) {
|
231
235
|
/* disable any progress or debug events */
|
232
236
|
curl_easy_setopt(rbce->curl, CURLOPT_WRITEFUNCTION, NULL);
|
@@ -255,6 +259,7 @@ static void ruby_curl_easy_zero(ruby_curl_easy *rbce) {
|
|
255
259
|
|
256
260
|
rbce->curl_headers = NULL;
|
257
261
|
rbce->curl_ftp_commands = NULL;
|
262
|
+
rbce->curl_resolve = NULL;
|
258
263
|
|
259
264
|
/* various-typed opts */
|
260
265
|
rbce->local_port = 0;
|
@@ -293,25 +298,37 @@ static void ruby_curl_easy_zero(ruby_curl_easy *rbce) {
|
|
293
298
|
rbce->callback_active = 0;
|
294
299
|
}
|
295
300
|
|
301
|
+
/*
|
302
|
+
* Allocate space for a Curl::Easy instance.
|
303
|
+
*/
|
304
|
+
static VALUE ruby_curl_easy_allocate(VALUE klass) {
|
305
|
+
ruby_curl_easy *rbce;
|
306
|
+
rbce = ALLOC(ruby_curl_easy);
|
307
|
+
rbce->curl = NULL;
|
308
|
+
rbce->opts = Qnil;
|
309
|
+
rbce->multi = Qnil;
|
310
|
+
ruby_curl_easy_zero(rbce);
|
311
|
+
return Data_Wrap_Struct(klass, curl_easy_mark, curl_easy_free, rbce);
|
312
|
+
}
|
313
|
+
|
296
314
|
/*
|
297
315
|
* call-seq:
|
298
316
|
* Curl::Easy.new => #<Curl::Easy...>
|
299
317
|
* Curl::Easy.new(url = nil) => #<Curl::Easy...>
|
300
318
|
* Curl::Easy.new(url = nil) { |self| ... } => #<Curl::Easy...>
|
301
319
|
*
|
302
|
-
*
|
320
|
+
* Initialize a new Curl::Easy instance, optionally supplying the URL.
|
303
321
|
* The block form allows further configuration to be supplied before
|
304
322
|
* the instance is returned.
|
305
323
|
*/
|
306
|
-
static VALUE
|
324
|
+
static VALUE ruby_curl_easy_initialize(int argc, VALUE *argv, VALUE self) {
|
307
325
|
CURLcode ecode;
|
308
326
|
VALUE url, blk;
|
309
|
-
VALUE new_curl;
|
310
327
|
ruby_curl_easy *rbce;
|
311
328
|
|
312
329
|
rb_scan_args(argc, argv, "01&", &url, &blk);
|
313
330
|
|
314
|
-
|
331
|
+
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
315
332
|
|
316
333
|
/* handler */
|
317
334
|
rbce->curl = curl_easy_init();
|
@@ -319,8 +336,6 @@ static VALUE ruby_curl_easy_new(int argc, VALUE *argv, VALUE klass) {
|
|
319
336
|
rb_raise(eCurlErrFailedInit, "Failed to initialize easy handle");
|
320
337
|
}
|
321
338
|
|
322
|
-
new_curl = Data_Wrap_Struct(klass, curl_easy_mark, curl_easy_free, rbce);
|
323
|
-
|
324
339
|
rbce->multi = Qnil;
|
325
340
|
rbce->opts = Qnil;
|
326
341
|
|
@@ -329,16 +344,16 @@ static VALUE ruby_curl_easy_new(int argc, VALUE *argv, VALUE klass) {
|
|
329
344
|
rb_easy_set("url", url);
|
330
345
|
|
331
346
|
/* set the new_curl pointer to the curl handle */
|
332
|
-
ecode = curl_easy_setopt(rbce->curl, CURLOPT_PRIVATE, (void*)
|
347
|
+
ecode = curl_easy_setopt(rbce->curl, CURLOPT_PRIVATE, (void*)self);
|
333
348
|
if (ecode != CURLE_OK) {
|
334
349
|
raise_curl_easy_error_exception(ecode);
|
335
350
|
}
|
336
351
|
|
337
352
|
if (blk != Qnil) {
|
338
|
-
rb_funcall(blk, idCall, 1,
|
353
|
+
rb_funcall(blk, idCall, 1, self);
|
339
354
|
}
|
340
355
|
|
341
|
-
return
|
356
|
+
return self;
|
342
357
|
}
|
343
358
|
|
344
359
|
/*
|
@@ -359,6 +374,7 @@ static VALUE ruby_curl_easy_clone(VALUE self) {
|
|
359
374
|
newrbce->curl = curl_easy_duphandle(rbce->curl);
|
360
375
|
newrbce->curl_headers = NULL;
|
361
376
|
newrbce->curl_ftp_commands = NULL;
|
377
|
+
newrbce->curl_resolve = NULL;
|
362
378
|
|
363
379
|
return Data_Wrap_Struct(cCurlEasy, curl_easy_mark, curl_easy_free, newrbce);
|
364
380
|
}
|
@@ -368,7 +384,7 @@ static VALUE ruby_curl_easy_clone(VALUE self) {
|
|
368
384
|
* easy.close => nil
|
369
385
|
*
|
370
386
|
* Close the Curl::Easy instance. Any open connections are closed
|
371
|
-
* The easy handle is reinitialized. If a previous multi handle was
|
387
|
+
* The easy handle is reinitialized. If a previous multi handle was
|
372
388
|
* open it is set to nil and will be cleared after a GC.
|
373
389
|
*/
|
374
390
|
static VALUE ruby_curl_easy_close(VALUE self) {
|
@@ -503,7 +519,7 @@ static VALUE ruby_curl_easy_headers_get(VALUE self) {
|
|
503
519
|
ruby_curl_easy *rbce;
|
504
520
|
VALUE headers;
|
505
521
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
506
|
-
headers = rb_easy_get("headers");//rb_hash_aref(rbce->opts, rb_intern("headers"));
|
522
|
+
headers = rb_easy_get("headers");//rb_hash_aref(rbce->opts, rb_intern("headers"));
|
507
523
|
if (headers == Qnil) { headers = rb_easy_set("headers", rb_hash_new()); }
|
508
524
|
return headers;
|
509
525
|
}
|
@@ -715,29 +731,29 @@ static VALUE ruby_curl_easy_useragent_get(VALUE self) {
|
|
715
731
|
/*
|
716
732
|
* call-seq:
|
717
733
|
* easy.post_body = "some=form%20data&to=send" => string or nil
|
718
|
-
*
|
734
|
+
*
|
719
735
|
* Sets the POST body of this Curl::Easy instance. This is expected to be
|
720
736
|
* URL encoded; no additional processing or encoding is done on the string.
|
721
737
|
* The content-type header will be set to application/x-www-form-urlencoded.
|
722
|
-
*
|
738
|
+
*
|
723
739
|
* This is handy if you want to perform a POST against a Curl::Multi instance.
|
724
740
|
*/
|
725
741
|
static VALUE ruby_curl_easy_post_body_set(VALUE self, VALUE post_body) {
|
726
742
|
ruby_curl_easy *rbce;
|
727
743
|
CURL *curl;
|
728
|
-
|
744
|
+
|
729
745
|
char *data;
|
730
746
|
long len;
|
731
747
|
|
732
748
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
733
|
-
|
749
|
+
|
734
750
|
curl = rbce->curl;
|
735
|
-
|
751
|
+
|
736
752
|
if ( post_body == Qnil ) {
|
737
753
|
rb_easy_del("postdata_buffer");
|
738
754
|
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
|
739
|
-
|
740
|
-
} else {
|
755
|
+
|
756
|
+
} else {
|
741
757
|
if (rb_type(post_body) == T_STRING) {
|
742
758
|
data = StringValuePtr(post_body);
|
743
759
|
len = RSTRING_LEN(post_body);
|
@@ -750,19 +766,19 @@ static VALUE ruby_curl_easy_post_body_set(VALUE self, VALUE post_body) {
|
|
750
766
|
else {
|
751
767
|
rb_raise(rb_eRuntimeError, "post data must respond_to .to_s");
|
752
768
|
}
|
753
|
-
|
754
|
-
// Store the string, since it has to hang around for the duration of the
|
769
|
+
|
770
|
+
// Store the string, since it has to hang around for the duration of the
|
755
771
|
// request. See CURLOPT_POSTFIELDS in the libcurl docs.
|
756
772
|
//rbce->postdata_buffer = post_body;
|
757
773
|
rb_easy_set("postdata_buffer", post_body);
|
758
|
-
|
774
|
+
|
759
775
|
curl_easy_setopt(curl, CURLOPT_POST, 1);
|
760
776
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
|
761
777
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, len);
|
762
|
-
|
778
|
+
|
763
779
|
return post_body;
|
764
780
|
}
|
765
|
-
|
781
|
+
|
766
782
|
return Qnil;
|
767
783
|
}
|
768
784
|
|
@@ -779,7 +795,7 @@ static VALUE ruby_curl_easy_post_body_get(VALUE self) {
|
|
779
795
|
/*
|
780
796
|
* call-seq:
|
781
797
|
* easy.put_data = data => ""
|
782
|
-
*
|
798
|
+
*
|
783
799
|
* Points this Curl::Easy instance to data to be uploaded via PUT. This
|
784
800
|
* sets the request to a PUT type request - useful if you want to PUT via
|
785
801
|
* a multi handle.
|
@@ -811,7 +827,7 @@ static VALUE ruby_curl_easy_put_data_set(VALUE self, VALUE data) {
|
|
811
827
|
curl_easy_setopt(curl, CURLOPT_SEEKDATA, rbce);
|
812
828
|
#endif
|
813
829
|
|
814
|
-
/*
|
830
|
+
/*
|
815
831
|
* we need to set specific headers for the PUT to work... so
|
816
832
|
* convert the internal headers structure to a HASH if one is set
|
817
833
|
*/
|
@@ -825,7 +841,7 @@ static VALUE ruby_curl_easy_put_data_set(VALUE self, VALUE data) {
|
|
825
841
|
if (NIL_P(data)) { return data; }
|
826
842
|
|
827
843
|
headers = rb_easy_get("headers");
|
828
|
-
if( headers == Qnil ) {
|
844
|
+
if( headers == Qnil ) {
|
829
845
|
headers = rb_hash_new();
|
830
846
|
}
|
831
847
|
|
@@ -880,6 +896,25 @@ static VALUE ruby_curl_easy_ftp_commands_get(VALUE self) {
|
|
880
896
|
CURB_OBJECT_HGETTER(ruby_curl_easy, ftp_commands);
|
881
897
|
}
|
882
898
|
|
899
|
+
/*
|
900
|
+
* call-seq:
|
901
|
+
* easy.resolve = [ "example.com:80:127.0.0.1" ] => [ "example.com:80:127.0.0.1" ]
|
902
|
+
*
|
903
|
+
* Set the resolve list to statically resolve hostnames to IP addresses,
|
904
|
+
* bypassing DNS for matching hostname/port combinations.
|
905
|
+
*/
|
906
|
+
static VALUE ruby_curl_easy_resolve_set(VALUE self, VALUE resolve) {
|
907
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, resolve);
|
908
|
+
}
|
909
|
+
|
910
|
+
/*
|
911
|
+
* call-seq
|
912
|
+
* easy.resolve => array or nil
|
913
|
+
*/
|
914
|
+
static VALUE ruby_curl_easy_resolve_get(VALUE self) {
|
915
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, resolve);
|
916
|
+
}
|
917
|
+
|
883
918
|
/* ================== IMMED ATTRS ==================*/
|
884
919
|
|
885
920
|
/*
|
@@ -990,7 +1025,7 @@ static VALUE ruby_curl_easy_proxy_type_get(VALUE self) {
|
|
990
1025
|
(!strncmp("ntlm",node,4)) ? CURLAUTH_NTLM : \
|
991
1026
|
(!strncmp("anysafe",node,7)) ? CURLAUTH_ANYSAFE : \
|
992
1027
|
(!strncmp("any",node,3)) ? CURLAUTH_ANY : 0
|
993
|
-
#else
|
1028
|
+
#else
|
994
1029
|
#define CURL_HTTPAUTH_STR_TO_NUM(node) \
|
995
1030
|
(!strncmp("basic",node,5)) ? CURLAUTH_BASIC : \
|
996
1031
|
(!strncmp("digest",node,6)) ? CURLAUTH_DIGEST : \
|
@@ -1022,7 +1057,7 @@ static VALUE ruby_curl_easy_http_auth_types_set(int argc, VALUE *argv, VALUE sel
|
|
1022
1057
|
|
1023
1058
|
if (len == 1 && (rb_ary_entry(args_ary,0) == Qnil || TYPE(rb_ary_entry(args_ary,0)) == T_FIXNUM ||
|
1024
1059
|
TYPE(rb_ary_entry(args_ary,0)) == T_BIGNUM)) {
|
1025
|
-
if (rb_ary_entry(args_ary,0) == Qnil) {
|
1060
|
+
if (rb_ary_entry(args_ary,0) == Qnil) {
|
1026
1061
|
rbce->http_auth_types = 0;
|
1027
1062
|
}
|
1028
1063
|
else {
|
@@ -1320,7 +1355,7 @@ static VALUE ruby_curl_easy_username_set(VALUE self, VALUE username) {
|
|
1320
1355
|
/*
|
1321
1356
|
* call-seq:
|
1322
1357
|
* easy.username => string
|
1323
|
-
*
|
1358
|
+
*
|
1324
1359
|
* Get the current username
|
1325
1360
|
*/
|
1326
1361
|
static VALUE ruby_curl_easy_username_get(VALUE self, VALUE username) {
|
@@ -1348,7 +1383,7 @@ static VALUE ruby_curl_easy_password_set(VALUE self, VALUE password) {
|
|
1348
1383
|
/*
|
1349
1384
|
* call-seq:
|
1350
1385
|
* easy.password => string
|
1351
|
-
*
|
1386
|
+
*
|
1352
1387
|
* Get the current password
|
1353
1388
|
*/
|
1354
1389
|
static VALUE ruby_curl_easy_password_get(VALUE self, VALUE password) {
|
@@ -1391,7 +1426,7 @@ static VALUE ruby_curl_easy_ssl_version_get(VALUE self, VALUE ssl_version) {
|
|
1391
1426
|
/*
|
1392
1427
|
* call-seq:
|
1393
1428
|
* easy.use_ssl = value => fixnum or nil
|
1394
|
-
*
|
1429
|
+
*
|
1395
1430
|
* Ensure libcurl uses SSL for FTP connections. Valid options are Curl::CURL_USESSL_NONE,
|
1396
1431
|
* Curl::CURL_USESSL_TRY, Curl::CURL_USESSL_CONTROL, and Curl::CURL_USESSL_ALL.
|
1397
1432
|
*/
|
@@ -1848,7 +1883,7 @@ static VALUE ruby_curl_easy_on_failure_set(int argc, VALUE *argv, VALUE self) {
|
|
1848
1883
|
* To remove a previously-supplied handler, call this method with no attached
|
1849
1884
|
* block.
|
1850
1885
|
*
|
1851
|
-
* The +on_missing+ handler is called when request is finished with a
|
1886
|
+
* The +on_missing+ handler is called when request is finished with a
|
1852
1887
|
* status of 40x
|
1853
1888
|
*/
|
1854
1889
|
static VALUE ruby_curl_easy_on_missing_set(int argc, VALUE *argv, VALUE self) {
|
@@ -1863,7 +1898,7 @@ static VALUE ruby_curl_easy_on_missing_set(int argc, VALUE *argv, VALUE self) {
|
|
1863
1898
|
* To remove a previously-supplied handler, call this method with no attached
|
1864
1899
|
* block.
|
1865
1900
|
*
|
1866
|
-
* The +on_redirect+ handler is called when request is finished with a
|
1901
|
+
* The +on_redirect+ handler is called when request is finished with a
|
1867
1902
|
* status of 30x
|
1868
1903
|
*/
|
1869
1904
|
static VALUE ruby_curl_easy_on_redirect_set(int argc, VALUE *argv, VALUE self) {
|
@@ -1991,6 +2026,20 @@ static VALUE cb_each_ftp_command(VALUE ftp_command, VALUE wrap) {
|
|
1991
2026
|
return ftp_command_string;
|
1992
2027
|
}
|
1993
2028
|
|
2029
|
+
/***********************************************
|
2030
|
+
* This is an rb_iterate callback used to set up the resolve list.
|
2031
|
+
*/
|
2032
|
+
static VALUE cb_each_resolve(VALUE resolve, VALUE wrap) {
|
2033
|
+
struct curl_slist **list;
|
2034
|
+
VALUE resolve_string;
|
2035
|
+
Data_Get_Struct(wrap, struct curl_slist *, list);
|
2036
|
+
|
2037
|
+
resolve_string = rb_obj_as_string(resolve);
|
2038
|
+
*list = curl_slist_append(*list, StringValuePtr(resolve));
|
2039
|
+
|
2040
|
+
return resolve_string;
|
2041
|
+
}
|
2042
|
+
|
1994
2043
|
/***********************************************
|
1995
2044
|
*
|
1996
2045
|
* Setup a connection
|
@@ -2003,6 +2052,7 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2003
2052
|
VALUE url, _url = rb_easy_get("url");
|
2004
2053
|
struct curl_slist **hdrs = &(rbce->curl_headers);
|
2005
2054
|
struct curl_slist **cmds = &(rbce->curl_ftp_commands);
|
2055
|
+
struct curl_slist **rslv = &(rbce->curl_resolve);
|
2006
2056
|
|
2007
2057
|
curl = rbce->curl;
|
2008
2058
|
|
@@ -2257,7 +2307,7 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2257
2307
|
rb_warn("libcurl is not configured with SSL support");
|
2258
2308
|
}
|
2259
2309
|
#endif
|
2260
|
-
|
2310
|
+
|
2261
2311
|
if (rbce->ftp_filemethod > 0) {
|
2262
2312
|
curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD, rbce->ftp_filemethod);
|
2263
2313
|
}
|
@@ -2296,6 +2346,18 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2296
2346
|
}
|
2297
2347
|
}
|
2298
2348
|
|
2349
|
+
/* Setup resolve list if necessary */
|
2350
|
+
if (!rb_easy_nil("resolve")) {
|
2351
|
+
if (rb_easy_type_check("resolve", T_ARRAY)) {
|
2352
|
+
VALUE wrap = Data_Wrap_Struct(rb_cObject, 0, 0, rslv);
|
2353
|
+
rb_iterate(rb_each, rb_easy_get("resolve"), cb_each_resolve, wrap);
|
2354
|
+
}
|
2355
|
+
|
2356
|
+
if (*rslv) {
|
2357
|
+
curl_easy_setopt(curl, CURLOPT_RESOLVE, *rslv);
|
2358
|
+
}
|
2359
|
+
}
|
2360
|
+
|
2299
2361
|
return Qnil;
|
2300
2362
|
}
|
2301
2363
|
/***********************************************
|
@@ -2308,6 +2370,7 @@ VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce ) {
|
|
2308
2370
|
|
2309
2371
|
CURL *curl = rbce->curl;
|
2310
2372
|
struct curl_slist *ftp_commands;
|
2373
|
+
struct curl_slist *resolve;
|
2311
2374
|
|
2312
2375
|
/* Free everything up */
|
2313
2376
|
if (rbce->curl_headers) {
|
@@ -2321,6 +2384,12 @@ VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce ) {
|
|
2321
2384
|
rbce->curl_ftp_commands = NULL;
|
2322
2385
|
}
|
2323
2386
|
|
2387
|
+
resolve = rbce->curl_resolve;
|
2388
|
+
if (resolve) {
|
2389
|
+
curl_slist_free_all(resolve);
|
2390
|
+
rbce->curl_resolve = NULL;
|
2391
|
+
}
|
2392
|
+
|
2324
2393
|
/* clean up a PUT request's curl options. */
|
2325
2394
|
if (!rb_easy_nil("upload")) {
|
2326
2395
|
rb_easy_del("upload"); // set the upload object to Qnil to let the GC clean up
|
@@ -2574,7 +2643,7 @@ static VALUE ruby_curl_easy_response_code_get(VALUE self) {
|
|
2574
2643
|
static VALUE ruby_curl_easy_primary_ip_get(VALUE self) {
|
2575
2644
|
ruby_curl_easy *rbce;
|
2576
2645
|
char* ip;
|
2577
|
-
|
2646
|
+
|
2578
2647
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
2579
2648
|
curl_easy_getinfo(rbce->curl, CURLINFO_PRIMARY_IP, &ip);
|
2580
2649
|
|
@@ -2799,7 +2868,7 @@ static VALUE ruby_curl_easy_redirect_count_get(VALUE self) {
|
|
2799
2868
|
* call-seq:
|
2800
2869
|
* easy.redirect_url => "http://some.url" or nil
|
2801
2870
|
*
|
2802
|
-
* Retrieve the URL a redirect would take you to if you
|
2871
|
+
* Retrieve the URL a redirect would take you to if you
|
2803
2872
|
* would enable CURLOPT_FOLLOWLOCATION.
|
2804
2873
|
*
|
2805
2874
|
* Requires libcurl 7.18.2 or higher, otherwise -1 is always returned.
|
@@ -3233,6 +3302,9 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
|
3233
3302
|
case CURLOPT_NOSIGNAL:
|
3234
3303
|
#if HAVE_CURLOPT_PATH_AS_IS
|
3235
3304
|
case CURLOPT_PATH_AS_IS:
|
3305
|
+
#endif
|
3306
|
+
#if HAVE_CURLOPT_PIPEWAIT
|
3307
|
+
case CURLOPT_PIPEWAIT:
|
3236
3308
|
#endif
|
3237
3309
|
case CURLOPT_HTTPGET:
|
3238
3310
|
case CURLOPT_NOBODY: {
|
@@ -3300,6 +3372,16 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
|
3300
3372
|
case CURLOPT_UNIX_SOCKET_PATH: {
|
3301
3373
|
curl_easy_setopt(rbce->curl, CURLOPT_UNIX_SOCKET_PATH, StringValueCStr(val));
|
3302
3374
|
} break;
|
3375
|
+
#endif
|
3376
|
+
#if HAVE_CURLOPT_MAX_SEND_SPEED_LARGE
|
3377
|
+
case CURLOPT_MAX_SEND_SPEED_LARGE: {
|
3378
|
+
curl_easy_setopt(rbce->curl, CURLOPT_MAX_SEND_SPEED_LARGE, (curl_off_t) NUM2LL(val));
|
3379
|
+
} break;
|
3380
|
+
#endif
|
3381
|
+
#if HAVE_CURLOPT_MAX_RECV_SPEED_LARGE
|
3382
|
+
case CURLOPT_MAX_RECV_SPEED_LARGE: {
|
3383
|
+
curl_easy_setopt(rbce->curl, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t) NUM2LL(val));
|
3384
|
+
} break;
|
3303
3385
|
#endif
|
3304
3386
|
default:
|
3305
3387
|
rb_raise(rb_eTypeError, "Curb unsupported option");
|
@@ -3427,9 +3509,12 @@ void init_curb_easy() {
|
|
3427
3509
|
cCurlEasy = rb_define_class_under(mCurl, "Easy", rb_cObject);
|
3428
3510
|
|
3429
3511
|
/* Class methods */
|
3430
|
-
|
3512
|
+
rb_define_alloc_func(cCurlEasy, ruby_curl_easy_allocate);
|
3431
3513
|
rb_define_singleton_method(cCurlEasy, "error", ruby_curl_easy_error_message, 1);
|
3432
3514
|
|
3515
|
+
/* Initialize method */
|
3516
|
+
rb_define_method(cCurlEasy, "initialize", ruby_curl_easy_initialize, -1);
|
3517
|
+
|
3433
3518
|
/* Attributes for config next perform */
|
3434
3519
|
rb_define_method(cCurlEasy, "url", ruby_curl_easy_url_get, 0);
|
3435
3520
|
rb_define_method(cCurlEasy, "proxy_url", ruby_curl_easy_proxy_url_get, 0);
|
@@ -3459,6 +3544,8 @@ void init_curb_easy() {
|
|
3459
3544
|
rb_define_method(cCurlEasy, "put_data=", ruby_curl_easy_put_data_set, 1);
|
3460
3545
|
rb_define_method(cCurlEasy, "ftp_commands=", ruby_curl_easy_ftp_commands_set, 1);
|
3461
3546
|
rb_define_method(cCurlEasy, "ftp_commands", ruby_curl_easy_ftp_commands_get, 0);
|
3547
|
+
rb_define_method(cCurlEasy, "resolve=", ruby_curl_easy_resolve_set, 1);
|
3548
|
+
rb_define_method(cCurlEasy, "resolve", ruby_curl_easy_resolve_get, 0);
|
3462
3549
|
|
3463
3550
|
rb_define_method(cCurlEasy, "local_port=", ruby_curl_easy_local_port_set, 1);
|
3464
3551
|
rb_define_method(cCurlEasy, "local_port", ruby_curl_easy_local_port_get, 0);
|
data/ext/curb_easy.h
CHANGED
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;
|
@@ -445,6 +458,61 @@ VALUE rb_curl_easy_error(CURLcode code) {
|
|
445
458
|
exclz = eCurlErrSSLIssuerError;
|
446
459
|
break;
|
447
460
|
#endif
|
461
|
+
|
462
|
+
#ifdef HAVE_CURLE_FTP_PRET_FAILED
|
463
|
+
case CURLE_FTP_PRET_FAILED: /* 84 */
|
464
|
+
exclz = eCurlErrFTPPRETFailed;
|
465
|
+
break;
|
466
|
+
#endif
|
467
|
+
|
468
|
+
#ifdef HAVE_CURLE_RTSP_CSEQ_ERROR
|
469
|
+
case CURLE_RTSP_CSEQ_ERROR: /* 85 */
|
470
|
+
exclz = eCurlErrRTSPCseqError;
|
471
|
+
break;
|
472
|
+
#endif
|
473
|
+
|
474
|
+
#ifdef HAVE_CURLE_RTSP_SESSION_ERROR
|
475
|
+
case CURLE_RTSP_SESSION_ERROR: /* 86 */
|
476
|
+
exclz = eCurlErrRTSPSessionError;
|
477
|
+
break;
|
478
|
+
#endif
|
479
|
+
|
480
|
+
#ifdef HAVE_CURLE_FTP_BAD_FILE_LIST
|
481
|
+
case CURLE_FTP_BAD_FILE_LIST: /* 87 */
|
482
|
+
exclz = eCurlErrFTPBadFileList;
|
483
|
+
break;
|
484
|
+
#endif
|
485
|
+
|
486
|
+
#ifdef HAVE_CURLE_CHUNK_FAILED
|
487
|
+
case CURLE_CHUNK_FAILED: /* 88 */
|
488
|
+
exclz = eCurlErrChunkFailed;
|
489
|
+
break;
|
490
|
+
#endif
|
491
|
+
|
492
|
+
#ifdef HAVE_CURLE_NO_CONNECTION_AVAILABLE
|
493
|
+
case CURLE_NO_CONNECTION_AVAILABLE: /* 89 */
|
494
|
+
exclz = eCurlErrNoConnectionAvailable;
|
495
|
+
break;
|
496
|
+
#endif
|
497
|
+
|
498
|
+
#ifdef HAVE_CURLE_SSL_PINNEDPUBKEYNOTMATCH
|
499
|
+
case CURLE_SSL_PINNEDPUBKEYNOTMATCH: /* 90 */
|
500
|
+
exclz = eCurlErrSSLPinnedPubKeyNotMatch;
|
501
|
+
break;
|
502
|
+
#endif
|
503
|
+
|
504
|
+
#ifdef HAVE_CURLE_SSL_INVALIDCERTSTATUS
|
505
|
+
case CURLE_SSL_INVALIDCERTSTATUS: /* 91 */
|
506
|
+
exclz = eCurlErrSSLInvalidCertStatus;
|
507
|
+
break;
|
508
|
+
#endif
|
509
|
+
|
510
|
+
#ifdef HAVE_CURLE_HTTP2_STREAM
|
511
|
+
case CURLE_HTTP2_STREAM: /* 92 */
|
512
|
+
exclz = eCurlErrHTTP2Stream;
|
513
|
+
break;
|
514
|
+
#endif
|
515
|
+
|
448
516
|
default:
|
449
517
|
exclz = eCurlErrError;
|
450
518
|
exmsg = "Unknown error result from libcurl";
|
@@ -532,6 +600,7 @@ void init_curb_errors() {
|
|
532
600
|
eCurlErrLDAPError = rb_define_class_under(mCurlErr, "LDAPError", eCurlErrError);
|
533
601
|
eCurlErrTelnetError = rb_define_class_under(mCurlErr, "TelnetError", eCurlErrError);
|
534
602
|
eCurlErrTFTPError = rb_define_class_under(mCurlErr, "TFTPError", eCurlErrError);
|
603
|
+
eCurlErrRTSPError = rb_define_class_under(mCurlErr, "RTSPError", eCurlErrError);
|
535
604
|
|
536
605
|
eCurlErrOK = rb_define_class_under(mCurlErr, "CurlOK", eCurlErrError);
|
537
606
|
eCurlErrUnsupportedProtocol = rb_define_class_under(mCurlErr, "UnsupportedProtocolError", eCurlErrError);
|
@@ -657,4 +726,14 @@ void init_curb_errors() {
|
|
657
726
|
eCurlErrTFTPNoSuchUser = rb_define_class_under(mCurlErr, "NoSuchUserError", eCurlErrTFTPError);
|
658
727
|
|
659
728
|
eCurlErrInvalidPostField = rb_define_class_under(mCurlErr, "InvalidPostFieldError", eCurlErrError);
|
729
|
+
|
730
|
+
eCurlErrFTPPRETFailed = rb_define_class_under(mCurlErr, "PPRETFailedError", eCurlErrFTPError);
|
731
|
+
eCurlErrRTSPCseqError = rb_define_class_under(mCurlErr, "CseqError", eCurlErrRTSPError);
|
732
|
+
eCurlErrRTSPSessionError = rb_define_class_under(mCurlErr, "SessionError", eCurlErrRTSPError);
|
733
|
+
eCurlErrFTPBadFileList = rb_define_class_under(mCurlErr, "BadFileListError", eCurlErrFTPError);
|
734
|
+
eCurlErrChunkFailed = rb_define_class_under(mCurlErr, "ChunkFailedError", eCurlErrError);
|
735
|
+
eCurlErrNoConnectionAvailable = rb_define_class_under(mCurlErr, "NoConnectionAvailableError", eCurlErrError);
|
736
|
+
eCurlErrSSLPinnedPubKeyNotMatch = rb_define_class_under(mCurlErr, "SSLPinnedPubKeyNotMatchError", eCurlErrError);
|
737
|
+
eCurlErrSSLInvalidCertStatus = rb_define_class_under(mCurlErr, "SSLInvalidCertStatusError", eCurlErrError);
|
738
|
+
eCurlErrHTTP2Stream = rb_define_class_under(mCurlErr, "HTTP2StreamError", eCurlErrHTTPError);
|
660
739
|
}
|
data/ext/extconf.rb
CHANGED
@@ -322,14 +322,14 @@ have_constant "curlopt_sslengine"
|
|
322
322
|
have_constant "curlopt_sslengine_default"
|
323
323
|
have_constant "curlopt_sslversion"
|
324
324
|
have_constant "curl_sslversion_default"
|
325
|
-
have_constant
|
326
|
-
have_constant
|
327
|
-
have_constant
|
325
|
+
have_constant :CURL_SSLVERSION_TLSv1
|
326
|
+
have_constant :CURL_SSLVERSION_SSLv2
|
327
|
+
have_constant :CURL_SSLVERSION_SSLv3
|
328
328
|
|
329
329
|
# Added in 7.34.0
|
330
|
-
have_constant
|
331
|
-
have_constant
|
332
|
-
have_constant
|
330
|
+
have_constant :CURL_SSLVERSION_TLSv1_0
|
331
|
+
have_constant :CURL_SSLVERSION_TLSv1_1
|
332
|
+
have_constant :CURL_SSLVERSION_TLSv1_2
|
333
333
|
|
334
334
|
have_constant "curlopt_ssl_verifypeer"
|
335
335
|
have_constant "curlopt_cainfo"
|
@@ -364,6 +364,16 @@ have_constant "curle_not_built_in"
|
|
364
364
|
|
365
365
|
have_constant "curle_obsolete" # removed in 7.24 ?
|
366
366
|
|
367
|
+
have_constant "curle_ftp_pret_failed"
|
368
|
+
have_constant "curle_rtsp_cseq_error"
|
369
|
+
have_constant "curle_rtsp_session_error"
|
370
|
+
have_constant "curle_ftp_bad_file_list"
|
371
|
+
have_constant "curle_chunk_failed"
|
372
|
+
have_constant "curle_no_connection_available"
|
373
|
+
have_constant "curle_ssl_pinnedpubkeynotmatch"
|
374
|
+
have_constant "curle_ssl_invalidcertstatus"
|
375
|
+
have_constant "curle_http2_stream"
|
376
|
+
|
367
377
|
# gssapi/spnego delegation related constants
|
368
378
|
have_constant "curlopt_gssapi_delegation"
|
369
379
|
have_constant "curlgssapi_delegation_policy_flag"
|
@@ -377,6 +387,9 @@ have_constant "curlopt_unix_socket_path"
|
|
377
387
|
# added in 7.42.0
|
378
388
|
have_constant "curlopt_path_as_is"
|
379
389
|
|
390
|
+
# added in 7.43.0
|
391
|
+
have_constant "curlopt_pipewait"
|
392
|
+
|
380
393
|
if try_compile('int main() { return 0; }','-Wall')
|
381
394
|
$CFLAGS << ' -Wall'
|
382
395
|
end
|
data/lib/curl.rb
CHANGED
@@ -48,7 +48,13 @@ module Curl
|
|
48
48
|
|
49
49
|
def self.urlalize(url, params={})
|
50
50
|
uri = URI(url)
|
51
|
-
|
51
|
+
params_query = params.map {|k,v| "#{URI.escape(k.to_s)}=#{URI.escape(v.to_s)}" }.join("&")
|
52
|
+
# both uri.query and params_query not blank
|
53
|
+
if !(uri.query.nil? || uri.query.empty?) && !params_query.empty?
|
54
|
+
uri.query = "#{uri.query}&#{params_query}"
|
55
|
+
else
|
56
|
+
uri.query = "#{uri.query}#{params_query}"
|
57
|
+
end
|
52
58
|
uri.to_s
|
53
59
|
end
|
54
60
|
|
data/lib/curl/easy.rb
CHANGED
@@ -21,7 +21,7 @@ module Curl
|
|
21
21
|
def status
|
22
22
|
# Matches the last HTTP Status - following the HTTP protocol specification 'Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF'
|
23
23
|
statuses = self.header_str.scan(/HTTP\/\d\.\d\s(\d+\s.*)\r\n/).map{ |match| match[0] }
|
24
|
-
statuses.last.strip
|
24
|
+
statuses.last.strip if statuses.length > 0
|
25
25
|
end
|
26
26
|
|
27
27
|
#
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
2
|
+
|
3
|
+
class TestCurbCurlEasyResolve < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@easy = Curl::Easy.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_resolve
|
9
|
+
@easy.resolve = [ "example.com:80:127.0.0.1" ]
|
10
|
+
assert_equal @easy.resolve, [ "example.com:80:127.0.0.1" ]
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_empty_resolve
|
14
|
+
assert_equal @easy.resolve, nil
|
15
|
+
end
|
16
|
+
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: 0.9.
|
4
|
+
version: 0.9.5
|
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:
|
12
|
+
date: 2018-05-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
|
@@ -63,6 +63,7 @@ files:
|
|
63
63
|
- tests/tc_curl.rb
|
64
64
|
- tests/tc_curl_download.rb
|
65
65
|
- tests/tc_curl_easy.rb
|
66
|
+
- tests/tc_curl_easy_resolve.rb
|
66
67
|
- tests/tc_curl_easy_setopt.rb
|
67
68
|
- tests/tc_curl_multi.rb
|
68
69
|
- tests/tc_curl_postfield.rb
|
@@ -97,28 +98,29 @@ signing_key:
|
|
97
98
|
specification_version: 4
|
98
99
|
summary: Ruby libcurl bindings
|
99
100
|
test_files:
|
101
|
+
- tests/tc_curl_multi.rb
|
100
102
|
- tests/alltests.rb
|
101
|
-
- tests/
|
102
|
-
- tests/
|
103
|
-
- tests/bug_curb_easy_blocks_ruby_threads.rb
|
104
|
-
- tests/bug_curb_easy_post_with_string_no_content_length_header.rb
|
105
|
-
- tests/bug_instance_post_differs_from_class_post.rb
|
106
|
-
- tests/bug_issue102.rb
|
107
|
-
- tests/bug_multi_segfault.rb
|
103
|
+
- tests/tc_curl_easy_setopt.rb
|
104
|
+
- tests/tc_curl.rb
|
108
105
|
- tests/bug_postfields_crash.rb
|
106
|
+
- tests/bug_crash_on_progress.rb
|
107
|
+
- tests/helper.rb
|
109
108
|
- tests/bug_postfields_crash2.rb
|
110
109
|
- tests/bug_require_last_or_segfault.rb
|
111
|
-
- tests/
|
112
|
-
- tests/
|
113
|
-
- tests/
|
110
|
+
- tests/timeout.rb
|
111
|
+
- tests/bug_crash_on_debug.rb
|
112
|
+
- tests/unittests.rb
|
113
|
+
- tests/bug_issue102.rb
|
114
|
+
- tests/bug_curb_easy_blocks_ruby_threads.rb
|
115
|
+
- tests/bug_multi_segfault.rb
|
116
|
+
- tests/bug_instance_post_differs_from_class_post.rb
|
114
117
|
- tests/require_last_or_segfault_script.rb
|
115
|
-
- tests/
|
116
|
-
- tests/tc_curl.rb
|
118
|
+
- tests/timeout_server.rb
|
117
119
|
- tests/tc_curl_download.rb
|
118
120
|
- tests/tc_curl_easy.rb
|
119
|
-
- tests/
|
120
|
-
- tests/tc_curl_multi.rb
|
121
|
+
- tests/mem_check.rb
|
121
122
|
- tests/tc_curl_postfield.rb
|
122
|
-
- tests/
|
123
|
-
- tests/
|
124
|
-
- tests/
|
123
|
+
- tests/bugtests.rb
|
124
|
+
- tests/tc_curl_easy_resolve.rb
|
125
|
+
- tests/signals.rb
|
126
|
+
- tests/bug_curb_easy_post_with_string_no_content_length_header.rb
|