ghazel-curb 0.6.1.0 → 0.6.2.1
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 +267 -175
- data/ext/curb_easy.h +3 -45
- data/ext/curb_errors.c +5 -0
- data/ext/curb_macros.h +41 -0
- data/ext/curb_multi.c +11 -13
- data/ext/curb_postfield.c +3 -3
- data/ext/extconf.rb +7 -0
- data/tests/helper.rb +1 -0
- data/tests/tc_curl_easy.rb +29 -0
- data/tests/tc_curl_multi.rb +1 -1
- metadata +2 -2
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.6.
|
24
|
-
#define CURB_VER_NUM
|
23
|
+
#define CURB_VERSION "0.6.4.0"
|
24
|
+
#define CURB_VER_NUM 640
|
25
25
|
#define CURB_VER_MAJ 0
|
26
26
|
#define CURB_VER_MIN 6
|
27
|
-
#define CURB_VER_MIC
|
27
|
+
#define CURB_VER_MIC 4
|
28
28
|
#define CURB_VER_PATCH 0
|
29
29
|
|
30
30
|
|
data/ext/curb_easy.c
CHANGED
@@ -42,8 +42,9 @@ static size_t read_data_handler(void *ptr,
|
|
42
42
|
size_t size,
|
43
43
|
size_t nmemb,
|
44
44
|
ruby_curl_easy *rbce) {
|
45
|
+
VALUE upload = rb_easy_get("upload");
|
45
46
|
size_t read_bytes = (size*nmemb);
|
46
|
-
VALUE stream = ruby_curl_upload_stream_get(
|
47
|
+
VALUE stream = ruby_curl_upload_stream_get(upload);
|
47
48
|
|
48
49
|
if (rb_respond_to(stream, rb_intern("read"))) {//if (rb_respond_to(stream, rb_intern("to_s"))) {
|
49
50
|
/* copy read_bytes from stream into ptr */
|
@@ -62,7 +63,7 @@ static size_t read_data_handler(void *ptr,
|
|
62
63
|
size_t len;
|
63
64
|
size_t remaining;
|
64
65
|
char *str_ptr;
|
65
|
-
Data_Get_Struct(
|
66
|
+
Data_Get_Struct(upload, ruby_curl_upload, rbcu);
|
66
67
|
str = rb_funcall(stream, rb_intern("to_s"), 0);
|
67
68
|
len = RSTRING_LEN(str);
|
68
69
|
remaining = len - rbcu->offset;
|
@@ -133,6 +134,7 @@ static int proc_debug_handler(CURL *curl,
|
|
133
134
|
|
134
135
|
/* ================== MARK/FREE FUNC ==================*/
|
135
136
|
void curl_easy_mark(ruby_curl_easy *rbce) {
|
137
|
+
#if 0
|
136
138
|
rb_gc_mark(rbce->url);
|
137
139
|
rb_gc_mark(rbce->proxy_url);
|
138
140
|
rb_gc_mark(rbce->body_proc);
|
@@ -143,6 +145,12 @@ void curl_easy_mark(ruby_curl_easy *rbce) {
|
|
143
145
|
rb_gc_mark(rbce->debug_proc);
|
144
146
|
rb_gc_mark(rbce->interface_hm);
|
145
147
|
rb_gc_mark(rbce->userpwd);
|
148
|
+
#if HAVE_CURLOPT_USERNAME
|
149
|
+
rb_gc_mark(rbce->username);
|
150
|
+
#endif
|
151
|
+
#if HAVE_CURLOPT_PASSWORD
|
152
|
+
rb_gc_mark(rbce->password);
|
153
|
+
#endif
|
146
154
|
rb_gc_mark(rbce->proxypwd);
|
147
155
|
rb_gc_mark(rbce->headers);
|
148
156
|
rb_gc_mark(rbce->cookies);
|
@@ -165,6 +173,8 @@ void curl_easy_mark(ruby_curl_easy *rbce) {
|
|
165
173
|
if( rbce->upload != Qnil ) {
|
166
174
|
rb_gc_mark(rbce->upload);
|
167
175
|
}
|
176
|
+
#endif
|
177
|
+
rb_gc_mark(rbce->opts);
|
168
178
|
}
|
169
179
|
|
170
180
|
void curl_easy_free(ruby_curl_easy *rbce) {
|
@@ -201,31 +211,11 @@ static VALUE ruby_curl_easy_new(int argc, VALUE *argv, VALUE klass) {
|
|
201
211
|
/* handler */
|
202
212
|
rbce->curl = curl_easy_init();
|
203
213
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
rbce->
|
209
|
-
rbce->header_data = Qnil;
|
210
|
-
rbce->header_proc = Qnil;
|
211
|
-
rbce->progress_proc = Qnil;
|
212
|
-
rbce->debug_proc = Qnil;
|
213
|
-
rbce->interface_hm = Qnil;
|
214
|
-
rbce->userpwd = Qnil;
|
215
|
-
rbce->proxypwd = Qnil;
|
216
|
-
rbce->headers = rb_hash_new();
|
217
|
-
rbce->cookies = Qnil;
|
218
|
-
rbce->cookiefile = Qnil;
|
219
|
-
rbce->cookiejar = Qnil;
|
220
|
-
rbce->cert = Qnil;
|
221
|
-
rbce->cacert = Qnil;
|
222
|
-
rbce->certpassword = Qnil;
|
223
|
-
rbce->certtype = rb_str_new2("PEM");
|
224
|
-
rbce->encoding = Qnil;
|
225
|
-
rbce->useragent = Qnil;
|
226
|
-
rbce->success_proc = Qnil;
|
227
|
-
rbce->failure_proc = Qnil;
|
228
|
-
rbce->complete_proc = Qnil;
|
214
|
+
rbce->opts = rb_hash_new();
|
215
|
+
|
216
|
+
rb_easy_set("url", url);
|
217
|
+
|
218
|
+
rbce->curl_headers = NULL;
|
229
219
|
|
230
220
|
/* various-typed opts */
|
231
221
|
rbce->local_port = 0;
|
@@ -253,14 +243,6 @@ static VALUE ruby_curl_easy_new(int argc, VALUE *argv, VALUE klass) {
|
|
253
243
|
rbce->multipart_form_post = 0;
|
254
244
|
rbce->enable_cookies = 0;
|
255
245
|
|
256
|
-
/* buffers */
|
257
|
-
rbce->postdata_buffer = Qnil;
|
258
|
-
rbce->bodybuf = Qnil;
|
259
|
-
rbce->headerbuf = Qnil;
|
260
|
-
rbce->curl_headers = NULL;
|
261
|
-
|
262
|
-
rbce->upload = Qnil;
|
263
|
-
|
264
246
|
new_curl = Data_Wrap_Struct(klass, curl_easy_mark, curl_easy_free, rbce);
|
265
247
|
|
266
248
|
/* set the new_curl pointer to the curl handle */
|
@@ -309,7 +291,7 @@ static VALUE ruby_curl_easy_clone(VALUE self) {
|
|
309
291
|
* the URL between calls to +perform+.
|
310
292
|
*/
|
311
293
|
static VALUE ruby_curl_easy_url_set(VALUE self, VALUE url) {
|
312
|
-
|
294
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, url);
|
313
295
|
}
|
314
296
|
|
315
297
|
/*
|
@@ -319,7 +301,7 @@ static VALUE ruby_curl_easy_url_set(VALUE self, VALUE url) {
|
|
319
301
|
* Obtain the URL that will be used by subsequent calls to +perform+.
|
320
302
|
*/
|
321
303
|
static VALUE ruby_curl_easy_url_get(VALUE self) {
|
322
|
-
|
304
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, url);
|
323
305
|
}
|
324
306
|
|
325
307
|
/*
|
@@ -348,7 +330,7 @@ static VALUE ruby_curl_easy_url_get(VALUE self) {
|
|
348
330
|
* proxy_url, including protocol prefix (http://) and embedded user + password.
|
349
331
|
*/
|
350
332
|
static VALUE ruby_curl_easy_proxy_url_set(VALUE self, VALUE proxy_url) {
|
351
|
-
|
333
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, proxy_url);
|
352
334
|
}
|
353
335
|
|
354
336
|
/*
|
@@ -358,7 +340,7 @@ static VALUE ruby_curl_easy_proxy_url_set(VALUE self, VALUE proxy_url) {
|
|
358
340
|
* Obtain the HTTP Proxy URL that will be used by subsequent calls to +perform+.
|
359
341
|
*/
|
360
342
|
static VALUE ruby_curl_easy_proxy_url_get(VALUE self) {
|
361
|
-
|
343
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, proxy_url);
|
362
344
|
}
|
363
345
|
|
364
346
|
/*
|
@@ -384,7 +366,7 @@ static VALUE ruby_curl_easy_proxy_url_get(VALUE self) {
|
|
384
366
|
* the perform step.
|
385
367
|
*/
|
386
368
|
static VALUE ruby_curl_easy_headers_set(VALUE self, VALUE headers) {
|
387
|
-
|
369
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, headers);
|
388
370
|
}
|
389
371
|
|
390
372
|
/*
|
@@ -394,7 +376,12 @@ static VALUE ruby_curl_easy_headers_set(VALUE self, VALUE headers) {
|
|
394
376
|
* Obtain the custom HTTP headers for following requests.
|
395
377
|
*/
|
396
378
|
static VALUE ruby_curl_easy_headers_get(VALUE self) {
|
397
|
-
|
379
|
+
ruby_curl_easy *rbce;
|
380
|
+
VALUE headers;
|
381
|
+
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
382
|
+
headers = rb_easy_get("headers");//rb_hash_aref(rbce->opts, rb_intern("headers"));
|
383
|
+
if (headers == Qnil) { headers = rb_easy_set("headers", rb_hash_new()); }
|
384
|
+
return headers;
|
398
385
|
}
|
399
386
|
|
400
387
|
/*
|
@@ -405,7 +392,7 @@ static VALUE ruby_curl_easy_headers_get(VALUE self) {
|
|
405
392
|
* The name can be an interface name, an IP address or a host name.
|
406
393
|
*/
|
407
394
|
static VALUE ruby_curl_easy_interface_set(VALUE self, VALUE interface_hm) {
|
408
|
-
|
395
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, interface_hm);
|
409
396
|
}
|
410
397
|
|
411
398
|
/*
|
@@ -416,7 +403,7 @@ static VALUE ruby_curl_easy_interface_set(VALUE self, VALUE interface_hm) {
|
|
416
403
|
* The name can be an interface name, an IP address or a host name.
|
417
404
|
*/
|
418
405
|
static VALUE ruby_curl_easy_interface_get(VALUE self) {
|
419
|
-
|
406
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, interface_hm);
|
420
407
|
}
|
421
408
|
|
422
409
|
/*
|
@@ -427,7 +414,7 @@ static VALUE ruby_curl_easy_interface_get(VALUE self) {
|
|
427
414
|
* The supplied string should have the form "username:password"
|
428
415
|
*/
|
429
416
|
static VALUE ruby_curl_easy_userpwd_set(VALUE self, VALUE userpwd) {
|
430
|
-
|
417
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, userpwd);
|
431
418
|
}
|
432
419
|
|
433
420
|
/*
|
@@ -438,7 +425,7 @@ static VALUE ruby_curl_easy_userpwd_set(VALUE self, VALUE userpwd) {
|
|
438
425
|
* calls to +perform+.
|
439
426
|
*/
|
440
427
|
static VALUE ruby_curl_easy_userpwd_get(VALUE self) {
|
441
|
-
|
428
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, userpwd);
|
442
429
|
}
|
443
430
|
|
444
431
|
/*
|
@@ -450,7 +437,7 @@ static VALUE ruby_curl_easy_userpwd_get(VALUE self) {
|
|
450
437
|
* form "username:password"
|
451
438
|
*/
|
452
439
|
static VALUE ruby_curl_easy_proxypwd_set(VALUE self, VALUE proxypwd) {
|
453
|
-
|
440
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, proxypwd);
|
454
441
|
}
|
455
442
|
|
456
443
|
/*
|
@@ -462,7 +449,7 @@ static VALUE ruby_curl_easy_proxypwd_set(VALUE self, VALUE proxypwd) {
|
|
462
449
|
* should have the form "username:password"
|
463
450
|
*/
|
464
451
|
static VALUE ruby_curl_easy_proxypwd_get(VALUE self) {
|
465
|
-
|
452
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, proxypwd);
|
466
453
|
}
|
467
454
|
|
468
455
|
|
@@ -475,7 +462,7 @@ static VALUE ruby_curl_easy_proxypwd_get(VALUE self) {
|
|
475
462
|
* Set multiple cookies in one string like this: "name1=content1; name2=content2;" etc.
|
476
463
|
*/
|
477
464
|
static VALUE ruby_curl_easy_cookies_set(VALUE self, VALUE cookies) {
|
478
|
-
|
465
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, cookies);
|
479
466
|
}
|
480
467
|
|
481
468
|
/*
|
@@ -485,7 +472,7 @@ static VALUE ruby_curl_easy_cookies_set(VALUE self, VALUE cookies) {
|
|
485
472
|
* Obtain the cookies for this Curl::Easy instance.
|
486
473
|
*/
|
487
474
|
static VALUE ruby_curl_easy_cookies_get(VALUE self) {
|
488
|
-
|
475
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, cookies);
|
489
476
|
}
|
490
477
|
|
491
478
|
/*
|
@@ -498,7 +485,7 @@ static VALUE ruby_curl_easy_cookies_get(VALUE self) {
|
|
498
485
|
* engine, or this option will be ignored.
|
499
486
|
*/
|
500
487
|
static VALUE ruby_curl_easy_cookiefile_set(VALUE self, VALUE cookiefile) {
|
501
|
-
|
488
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, cookiefile);
|
502
489
|
}
|
503
490
|
|
504
491
|
/*
|
@@ -508,7 +495,7 @@ static VALUE ruby_curl_easy_cookiefile_set(VALUE self, VALUE cookiefile) {
|
|
508
495
|
* Obtain the cookiefile file for this Curl::Easy instance.
|
509
496
|
*/
|
510
497
|
static VALUE ruby_curl_easy_cookiefile_get(VALUE self) {
|
511
|
-
|
498
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, cookiefile);
|
512
499
|
}
|
513
500
|
|
514
501
|
/*
|
@@ -522,7 +509,7 @@ static VALUE ruby_curl_easy_cookiefile_get(VALUE self) {
|
|
522
509
|
* engine, or this option will be ignored.
|
523
510
|
*/
|
524
511
|
static VALUE ruby_curl_easy_cookiejar_set(VALUE self, VALUE cookiejar) {
|
525
|
-
|
512
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, cookiejar);
|
526
513
|
}
|
527
514
|
|
528
515
|
/*
|
@@ -532,7 +519,7 @@ static VALUE ruby_curl_easy_cookiejar_set(VALUE self, VALUE cookiejar) {
|
|
532
519
|
* Obtain the cookiejar file to use for this Curl::Easy instance.
|
533
520
|
*/
|
534
521
|
static VALUE ruby_curl_easy_cookiejar_get(VALUE self) {
|
535
|
-
|
522
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, cookiejar);
|
536
523
|
}
|
537
524
|
|
538
525
|
/*
|
@@ -544,7 +531,7 @@ static VALUE ruby_curl_easy_cookiejar_get(VALUE self) {
|
|
544
531
|
*
|
545
532
|
*/
|
546
533
|
static VALUE ruby_curl_easy_cert_set(VALUE self, VALUE cert) {
|
547
|
-
|
534
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, cert);
|
548
535
|
}
|
549
536
|
|
550
537
|
/*
|
@@ -554,7 +541,7 @@ static VALUE ruby_curl_easy_cert_set(VALUE self, VALUE cert) {
|
|
554
541
|
* Obtain the cert file to use for this Curl::Easy instance.
|
555
542
|
*/
|
556
543
|
static VALUE ruby_curl_easy_cert_get(VALUE self) {
|
557
|
-
|
544
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, cert);
|
558
545
|
}
|
559
546
|
|
560
547
|
/*
|
@@ -566,7 +553,7 @@ static VALUE ruby_curl_easy_cert_get(VALUE self) {
|
|
566
553
|
*
|
567
554
|
*/
|
568
555
|
static VALUE ruby_curl_easy_cacert_set(VALUE self, VALUE cacert) {
|
569
|
-
|
556
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, cacert);
|
570
557
|
}
|
571
558
|
|
572
559
|
/*
|
@@ -576,7 +563,7 @@ static VALUE ruby_curl_easy_cacert_set(VALUE self, VALUE cacert) {
|
|
576
563
|
* Obtain the cacert file to use for this Curl::Easy instance.
|
577
564
|
*/
|
578
565
|
static VALUE ruby_curl_easy_cacert_get(VALUE self) {
|
579
|
-
|
566
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, cacert);
|
580
567
|
}
|
581
568
|
|
582
569
|
/*
|
@@ -586,7 +573,7 @@ static VALUE ruby_curl_easy_cacert_get(VALUE self) {
|
|
586
573
|
* Set a password used to open the specified cert
|
587
574
|
*/
|
588
575
|
static VALUE ruby_curl_easy_certpassword_set(VALUE self, VALUE certpassword) {
|
589
|
-
|
576
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, certpassword);
|
590
577
|
}
|
591
578
|
|
592
579
|
/*
|
@@ -598,7 +585,7 @@ static VALUE ruby_curl_easy_certpassword_set(VALUE self, VALUE certpassword) {
|
|
598
585
|
*
|
599
586
|
*/
|
600
587
|
static VALUE ruby_curl_easy_certtype_set(VALUE self, VALUE certtype) {
|
601
|
-
|
588
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, certtype);
|
602
589
|
}
|
603
590
|
|
604
591
|
/*
|
@@ -608,7 +595,7 @@ static VALUE ruby_curl_easy_certtype_set(VALUE self, VALUE certtype) {
|
|
608
595
|
* Obtain the cert type used for this Curl::Easy instance
|
609
596
|
*/
|
610
597
|
static VALUE ruby_curl_easy_certtype_get(VALUE self) {
|
611
|
-
|
598
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, certtype);
|
612
599
|
}
|
613
600
|
|
614
601
|
/*
|
@@ -619,7 +606,7 @@ static VALUE ruby_curl_easy_certtype_get(VALUE self) {
|
|
619
606
|
*
|
620
607
|
*/
|
621
608
|
static VALUE ruby_curl_easy_encoding_set(VALUE self, VALUE encoding) {
|
622
|
-
|
609
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, encoding);
|
623
610
|
}
|
624
611
|
/*
|
625
612
|
* call-seq:
|
@@ -629,7 +616,7 @@ static VALUE ruby_curl_easy_encoding_set(VALUE self, VALUE encoding) {
|
|
629
616
|
*
|
630
617
|
*/
|
631
618
|
static VALUE ruby_curl_easy_encoding_get(VALUE self) {
|
632
|
-
|
619
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, encoding);
|
633
620
|
}
|
634
621
|
|
635
622
|
/*
|
@@ -640,7 +627,7 @@ static VALUE ruby_curl_easy_encoding_get(VALUE self) {
|
|
640
627
|
*
|
641
628
|
*/
|
642
629
|
static VALUE ruby_curl_easy_useragent_set(VALUE self, VALUE useragent) {
|
643
|
-
|
630
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, useragent);
|
644
631
|
}
|
645
632
|
|
646
633
|
/*
|
@@ -650,7 +637,7 @@ static VALUE ruby_curl_easy_useragent_set(VALUE self, VALUE useragent) {
|
|
650
637
|
* Obtain the user agent string used for this Curl::Easy instance
|
651
638
|
*/
|
652
639
|
static VALUE ruby_curl_easy_useragent_get(VALUE self) {
|
653
|
-
|
640
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, useragent);
|
654
641
|
}
|
655
642
|
|
656
643
|
/*
|
@@ -675,7 +662,8 @@ static VALUE ruby_curl_easy_post_body_set(VALUE self, VALUE post_body) {
|
|
675
662
|
curl = rbce->curl;
|
676
663
|
|
677
664
|
if ( post_body == Qnil ) {
|
678
|
-
rbce->postdata_buffer = Qnil;
|
665
|
+
//rbce->postdata_buffer = Qnil;
|
666
|
+
rb_easy_del("postdata_buffer");
|
679
667
|
|
680
668
|
} else {
|
681
669
|
data = StringValuePtr(post_body);
|
@@ -683,7 +671,8 @@ static VALUE ruby_curl_easy_post_body_set(VALUE self, VALUE post_body) {
|
|
683
671
|
|
684
672
|
// Store the string, since it has to hang around for the duration of the
|
685
673
|
// request. See CURLOPT_POSTFIELDS in the libcurl docs.
|
686
|
-
rbce->postdata_buffer = post_body;
|
674
|
+
//rbce->postdata_buffer = post_body;
|
675
|
+
rb_easy_set("postdata_buffer", post_body);
|
687
676
|
|
688
677
|
curl_easy_setopt(curl, CURLOPT_POST, 1);
|
689
678
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
|
@@ -702,7 +691,7 @@ static VALUE ruby_curl_easy_post_body_set(VALUE self, VALUE post_body) {
|
|
702
691
|
* Obtain the POST body used in this Curl::Easy instance.
|
703
692
|
*/
|
704
693
|
static VALUE ruby_curl_easy_post_body_get(VALUE self) {
|
705
|
-
|
694
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, postdata_buffer);
|
706
695
|
}
|
707
696
|
|
708
697
|
/*
|
@@ -724,9 +713,9 @@ static VALUE ruby_curl_easy_put_data_set(VALUE self, VALUE data) {
|
|
724
713
|
ruby_curl_upload_stream_set(upload,data);
|
725
714
|
|
726
715
|
curl = rbce->curl;
|
727
|
-
|
728
|
-
|
729
|
-
|
716
|
+
rb_easy_set("upload", upload); /* keep the upload object alive as long as
|
717
|
+
the easy handle is active or until the upload
|
718
|
+
is complete or terminated... */
|
730
719
|
|
731
720
|
curl_easy_setopt(curl, CURLOPT_NOBODY,0);
|
732
721
|
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
|
@@ -737,35 +726,40 @@ static VALUE ruby_curl_easy_put_data_set(VALUE self, VALUE data) {
|
|
737
726
|
* we need to set specific headers for the PUT to work... so
|
738
727
|
* convert the internal headers structure to a HASH if one is set
|
739
728
|
*/
|
740
|
-
if (
|
741
|
-
if (
|
729
|
+
if (!rb_easy_nil("headers")) {
|
730
|
+
if (rb_easy_type_check("headers", T_ARRAY) || rb_easy_type_check("headers", T_STRING)) {
|
742
731
|
rb_raise(rb_eRuntimeError, "Must set headers as a HASH to modify the headers in an PUT request");
|
743
732
|
}
|
744
733
|
}
|
745
734
|
|
735
|
+
VALUE headers = rb_easy_get("headers");
|
736
|
+
if( headers == Qnil ) {
|
737
|
+
headers = rb_hash_new();
|
738
|
+
}
|
746
739
|
if (rb_respond_to(data, rb_intern("read"))) {
|
747
740
|
VALUE stat = rb_funcall(data, rb_intern("stat"), 0);
|
748
741
|
if( stat ) {
|
749
742
|
VALUE size;
|
750
|
-
if( rb_hash_aref(
|
751
|
-
rb_hash_aset(
|
743
|
+
if( rb_hash_aref(headers, rb_str_new2("Expect")) == Qnil ) {
|
744
|
+
rb_hash_aset(headers, rb_str_new2("Expect"), rb_str_new2(""));
|
752
745
|
}
|
753
746
|
size = rb_funcall(stat, rb_intern("size"), 0);
|
754
747
|
curl_easy_setopt(curl, CURLOPT_INFILESIZE, FIX2INT(size));
|
755
748
|
}
|
756
|
-
else if( rb_hash_aref(
|
757
|
-
rb_hash_aset(
|
749
|
+
else if( rb_hash_aref(headers, rb_str_new2("Transfer-Encoding")) == Qnil ) {
|
750
|
+
rb_hash_aset(headers, rb_str_new2("Transfer-Encoding"), rb_str_new2("chunked"));
|
758
751
|
}
|
759
752
|
}
|
760
753
|
else if (rb_respond_to(data, rb_intern("to_s"))) {
|
761
754
|
curl_easy_setopt(curl, CURLOPT_INFILESIZE, RSTRING_LEN(data));
|
762
|
-
if( rb_hash_aref(
|
763
|
-
rb_hash_aset(
|
755
|
+
if( rb_hash_aref(headers, rb_str_new2("Expect")) == Qnil ) {
|
756
|
+
rb_hash_aset(headers, rb_str_new2("Expect"), rb_str_new2(""));
|
764
757
|
}
|
765
758
|
}
|
766
759
|
else {
|
767
760
|
rb_raise(rb_eRuntimeError, "PUT data must respond to read or to_s");
|
768
761
|
}
|
762
|
+
rb_easy_set("headers",headers);
|
769
763
|
|
770
764
|
// if we made it this far, all should be well.
|
771
765
|
return data;
|
@@ -872,16 +866,61 @@ static VALUE ruby_curl_easy_proxy_type_get(VALUE self) {
|
|
872
866
|
CURB_IMMED_GETTER(ruby_curl_easy, proxy_type, -1);
|
873
867
|
}
|
874
868
|
|
869
|
+
#if defined(HAVE_CURLAUTH_DIGEST_IE)
|
870
|
+
#define CURL_HTTPAUTH_STR_TO_NUM(node) \
|
871
|
+
(!strncmp("basic",node,5)) ? CURLAUTH_BASIC : \
|
872
|
+
(!strncmp("digest_ie",node,9)) ? CURLAUTH_DIGEST_IE : \
|
873
|
+
(!strncmp("digest",node,6)) ? CURLAUTH_DIGEST : \
|
874
|
+
(!strncmp("gssnegotiate",node,12)) ? CURLAUTH_GSSNEGOTIATE : \
|
875
|
+
(!strncmp("ntlm",node,4)) ? CURLAUTH_NTLM : \
|
876
|
+
(!strncmp("any",node,3)) ? CURLAUTH_ANY : \
|
877
|
+
(!strncmp("anysafe",node,7)) ? CURLAUTH_ANYSAFE : 0
|
878
|
+
#else
|
879
|
+
#define CURL_HTTPAUTH_STR_TO_NUM(node) \
|
880
|
+
(!strncmp("basic",node,5)) ? CURLAUTH_BASIC : \
|
881
|
+
(!strncmp("digest",node,6)) ? CURLAUTH_DIGEST : \
|
882
|
+
(!strncmp("gssnegotiate",node,12)) ? CURLAUTH_GSSNEGOTIATE : \
|
883
|
+
(!strncmp("ntlm",node,4)) ? CURLAUTH_NTLM : \
|
884
|
+
(!strncmp("any",node,3)) ? CURLAUTH_ANY : \
|
885
|
+
(!strncmp("anysafe",node,7)) ? CURLAUTH_ANYSAFE : 0
|
886
|
+
#endif
|
875
887
|
/*
|
876
888
|
* call-seq:
|
877
889
|
* easy.http_auth_types = fixnum or nil => fixnum or nil
|
890
|
+
* easy.http_auth_types = [:basic,:digest,:digest_ie,:gssnegotiate, :ntlm, :any, :anysafe]
|
878
891
|
*
|
879
892
|
* Set the HTTP authentication types that may be used for the following
|
880
893
|
* +perform+ calls. This is a bitmap made by ORing together the
|
881
894
|
* Curl::CURLAUTH constants.
|
882
895
|
*/
|
883
|
-
static VALUE ruby_curl_easy_http_auth_types_set(VALUE self, VALUE http_auth_types) {
|
884
|
-
|
896
|
+
static VALUE ruby_curl_easy_http_auth_types_set(int argc, VALUE *argv, VALUE self) {//VALUE self, VALUE http_auth_types) {
|
897
|
+
ruby_curl_easy *rbce;
|
898
|
+
VALUE args_ary;
|
899
|
+
rb_scan_args(argc, argv, "*", &args_ary);
|
900
|
+
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
901
|
+
int i, len = RARRAY_LEN(args_ary);
|
902
|
+
char* node = NULL;
|
903
|
+
long mask = 0x000000;
|
904
|
+
|
905
|
+
if (len == 1 && (TYPE(rb_ary_entry(args_ary,0)) == T_FIXNUM || rb_ary_entry(args_ary,0) == Qnil)) {
|
906
|
+
if (rb_ary_entry(args_ary,0) == Qnil) {
|
907
|
+
rbce->http_auth_types = 0;
|
908
|
+
}
|
909
|
+
else {
|
910
|
+
rbce->http_auth_types = NUM2INT(rb_ary_entry(args_ary,0));
|
911
|
+
}
|
912
|
+
}
|
913
|
+
else {
|
914
|
+
// we could have multiple values, but they should be symbols
|
915
|
+
node = RSTRING_PTR(rb_funcall(rb_ary_entry(args_ary,0),rb_intern("to_s"),0));
|
916
|
+
mask = CURL_HTTPAUTH_STR_TO_NUM(node);
|
917
|
+
for( i = 1; i < len; ++i ) {
|
918
|
+
node = RSTRING_PTR(rb_funcall(rb_ary_entry(args_ary,i),rb_intern("to_s"),0));
|
919
|
+
mask |= CURL_HTTPAUTH_STR_TO_NUM(node);
|
920
|
+
}
|
921
|
+
rbce->http_auth_types = mask;
|
922
|
+
}
|
923
|
+
return INT2NUM(rbce->http_auth_types);
|
885
924
|
}
|
886
925
|
|
887
926
|
/*
|
@@ -1047,6 +1086,62 @@ static VALUE ruby_curl_easy_ftp_response_timeout_get(VALUE self, VALUE ftp_respo
|
|
1047
1086
|
CURB_IMMED_GETTER(ruby_curl_easy, ftp_response_timeout, 0);
|
1048
1087
|
}
|
1049
1088
|
|
1089
|
+
/*
|
1090
|
+
* call-seq:
|
1091
|
+
* easy.username = "foo" => String
|
1092
|
+
*
|
1093
|
+
* Set the HTTP Authentication username.
|
1094
|
+
*/
|
1095
|
+
static VALUE ruby_curl_easy_username_set(VALUE self, VALUE username) {
|
1096
|
+
#if HAVE_CURLOPT_USERNAME
|
1097
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, username);
|
1098
|
+
#else
|
1099
|
+
return Qnil;
|
1100
|
+
#endif
|
1101
|
+
}
|
1102
|
+
|
1103
|
+
/*
|
1104
|
+
* call-seq:
|
1105
|
+
* easy.username => String
|
1106
|
+
*
|
1107
|
+
* Get the current username
|
1108
|
+
*/
|
1109
|
+
static VALUE ruby_curl_easy_username_get(VALUE self, VALUE username) {
|
1110
|
+
#if HAVE_CURLOPT_USERNAME
|
1111
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, username);
|
1112
|
+
#else
|
1113
|
+
return Qnil;
|
1114
|
+
#endif
|
1115
|
+
}
|
1116
|
+
|
1117
|
+
/*
|
1118
|
+
* call-seq:
|
1119
|
+
* easy.password = "foo" => String
|
1120
|
+
*
|
1121
|
+
* Set the HTTP Authentication password.
|
1122
|
+
*/
|
1123
|
+
static VALUE ruby_curl_easy_password_set(VALUE self, VALUE password) {
|
1124
|
+
#if HAVE_CURLOPT_PASSWORD
|
1125
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, password);
|
1126
|
+
#else
|
1127
|
+
return Qnil;
|
1128
|
+
#endif
|
1129
|
+
}
|
1130
|
+
|
1131
|
+
/*
|
1132
|
+
* call-seq:
|
1133
|
+
* easy.password => String
|
1134
|
+
*
|
1135
|
+
* Get the current password
|
1136
|
+
*/
|
1137
|
+
static VALUE ruby_curl_easy_password_get(VALUE self, VALUE password) {
|
1138
|
+
#if HAVE_CURLOPT_PASSWORD
|
1139
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, password);
|
1140
|
+
#else
|
1141
|
+
return Qnil;
|
1142
|
+
#endif
|
1143
|
+
}
|
1144
|
+
|
1050
1145
|
/* ================== BOOL ATTRS ===================*/
|
1051
1146
|
|
1052
1147
|
/*
|
@@ -1330,12 +1425,12 @@ static VALUE ruby_curl_easy_enable_cookies_q(VALUE self) {
|
|
1330
1425
|
* the processing with a Curl::Err::AbortedByCallbackError.
|
1331
1426
|
*/
|
1332
1427
|
static VALUE ruby_curl_easy_on_body_set(int argc, VALUE *argv, VALUE self) {
|
1333
|
-
|
1428
|
+
CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, body_proc);
|
1334
1429
|
}
|
1335
1430
|
|
1336
1431
|
/*
|
1337
1432
|
* call-seq:
|
1338
|
-
* easy.on_success { ... } => <old handler>
|
1433
|
+
* easy.on_success { |easy| ... } => <old handler>
|
1339
1434
|
*
|
1340
1435
|
* Assign or remove the +on_success+ handler for this Curl::Easy instance.
|
1341
1436
|
* To remove a previously-supplied handler, call this method with no
|
@@ -1345,12 +1440,12 @@ static VALUE ruby_curl_easy_on_body_set(int argc, VALUE *argv, VALUE self) {
|
|
1345
1440
|
* status of 20x
|
1346
1441
|
*/
|
1347
1442
|
static VALUE ruby_curl_easy_on_success_set(int argc, VALUE *argv, VALUE self) {
|
1348
|
-
|
1443
|
+
CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, success_proc);
|
1349
1444
|
}
|
1350
1445
|
|
1351
1446
|
/*
|
1352
1447
|
* call-seq:
|
1353
|
-
* easy.on_failure { ... } => <old handler>
|
1448
|
+
* easy.on_failure {|easy,code| ... } => <old handler>
|
1354
1449
|
*
|
1355
1450
|
* Assign or remove the +on_failure+ handler for this Curl::Easy instance.
|
1356
1451
|
* To remove a previously-supplied handler, call this method with no
|
@@ -1360,12 +1455,12 @@ static VALUE ruby_curl_easy_on_success_set(int argc, VALUE *argv, VALUE self) {
|
|
1360
1455
|
* status of 50x
|
1361
1456
|
*/
|
1362
1457
|
static VALUE ruby_curl_easy_on_failure_set(int argc, VALUE *argv, VALUE self) {
|
1363
|
-
|
1458
|
+
CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, failure_proc);
|
1364
1459
|
}
|
1365
1460
|
|
1366
1461
|
/*
|
1367
1462
|
* call-seq:
|
1368
|
-
* easy.on_complete { ... } => <old handler>
|
1463
|
+
* easy.on_complete {|easy| ... } => <old handler>
|
1369
1464
|
*
|
1370
1465
|
* Assign or remove the +on_complete+ handler for this Curl::Easy instance.
|
1371
1466
|
* To remove a previously-supplied handler, call this method with no
|
@@ -1374,7 +1469,7 @@ static VALUE ruby_curl_easy_on_failure_set(int argc, VALUE *argv, VALUE self) {
|
|
1374
1469
|
* The +on_complete+ handler is called when the request is finished.
|
1375
1470
|
*/
|
1376
1471
|
static VALUE ruby_curl_easy_on_complete_set(int argc, VALUE *argv, VALUE self) {
|
1377
|
-
|
1472
|
+
CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, complete_proc);
|
1378
1473
|
}
|
1379
1474
|
|
1380
1475
|
/*
|
@@ -1390,7 +1485,7 @@ static VALUE ruby_curl_easy_on_complete_set(int argc, VALUE *argv, VALUE self) {
|
|
1390
1485
|
* block supplied to +on_body+.
|
1391
1486
|
*/
|
1392
1487
|
static VALUE ruby_curl_easy_on_header_set(int argc, VALUE *argv, VALUE self) {
|
1393
|
-
|
1488
|
+
CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, header_proc);
|
1394
1489
|
}
|
1395
1490
|
|
1396
1491
|
/*
|
@@ -1411,7 +1506,7 @@ static VALUE ruby_curl_easy_on_header_set(int argc, VALUE *argv, VALUE self) {
|
|
1411
1506
|
* throwing a Curl::Err::AbortedByCallbackError.
|
1412
1507
|
*/
|
1413
1508
|
static VALUE ruby_curl_easy_on_progress_set(int argc, VALUE *argv, VALUE self) {
|
1414
|
-
|
1509
|
+
CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, progress_proc);
|
1415
1510
|
}
|
1416
1511
|
|
1417
1512
|
/*
|
@@ -1432,7 +1527,7 @@ static VALUE ruby_curl_easy_on_progress_set(int argc, VALUE *argv, VALUE self) {
|
|
1432
1527
|
* data. The data is passed as a String.
|
1433
1528
|
*/
|
1434
1529
|
static VALUE ruby_curl_easy_on_debug_set(int argc, VALUE *argv, VALUE self) {
|
1435
|
-
|
1530
|
+
CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, debug_proc);
|
1436
1531
|
}
|
1437
1532
|
|
1438
1533
|
|
@@ -1473,85 +1568,105 @@ static VALUE cb_each_http_header(VALUE header, struct curl_slist **list) {
|
|
1473
1568
|
*
|
1474
1569
|
* Always returns Qtrue, rb_raise on error.
|
1475
1570
|
*/
|
1476
|
-
VALUE ruby_curl_easy_setup( ruby_curl_easy *rbce,
|
1571
|
+
VALUE ruby_curl_easy_setup( ruby_curl_easy *rbce, struct curl_slist **hdrs ) {
|
1477
1572
|
// TODO this could do with a bit of refactoring...
|
1478
1573
|
CURL *curl;
|
1479
|
-
VALUE url;
|
1574
|
+
VALUE url, _url = rb_easy_get("url");
|
1480
1575
|
|
1481
1576
|
curl = rbce->curl;
|
1482
1577
|
|
1483
|
-
if (
|
1578
|
+
if (_url == Qnil) {
|
1484
1579
|
rb_raise(eCurlErrError, "No URL supplied");
|
1485
1580
|
}
|
1486
1581
|
|
1487
|
-
url = rb_check_string_type(
|
1582
|
+
url = rb_check_string_type(_url);
|
1488
1583
|
|
1489
1584
|
// Need to configure the handler as per settings in rbce
|
1490
1585
|
curl_easy_setopt(curl, CURLOPT_URL, StringValuePtr(url));
|
1491
1586
|
|
1492
1587
|
// network stuff and auth
|
1493
|
-
if (
|
1494
|
-
curl_easy_setopt(curl, CURLOPT_INTERFACE,
|
1588
|
+
if (!rb_easy_nil("interface_hm")) {
|
1589
|
+
curl_easy_setopt(curl, CURLOPT_INTERFACE, rb_easy_get_str("interface_hm"));
|
1495
1590
|
} else {
|
1496
1591
|
curl_easy_setopt(curl, CURLOPT_INTERFACE, NULL);
|
1497
1592
|
}
|
1498
1593
|
|
1499
|
-
|
1500
|
-
|
1594
|
+
#if HAVE_CURLOPT_USERNAME == 1 && HAVE_CURLOPT_PASSWORD == 1
|
1595
|
+
if (!rb_easy_nil("username")) {
|
1596
|
+
curl_easy_setopt(curl, CURLOPT_USERNAME, rb_easy_get_str("username"));
|
1597
|
+
} else {
|
1598
|
+
curl_easy_setopt(curl, CURLOPT_USERNAME, NULL);
|
1599
|
+
}
|
1600
|
+
if (!rb_easy_nil("password")) {
|
1601
|
+
curl_easy_setopt(curl, CURLOPT_PASSWORD, rb_easy_get_str("password"));
|
1602
|
+
}
|
1603
|
+
else {
|
1604
|
+
curl_easy_setopt(curl, CURLOPT_PASSWORD, NULL);
|
1605
|
+
}
|
1606
|
+
#endif
|
1607
|
+
|
1608
|
+
if (!rb_easy_nil("userpwd")) {
|
1609
|
+
curl_easy_setopt(curl, CURLOPT_USERPWD, rb_easy_get_str("userpwd"));
|
1610
|
+
#if HAVE_CURLOPT_USERNAME == 1
|
1611
|
+
} else if (rb_easy_nil("username") && rb_easy_nil("password")) { /* don't set this even to NULL if we have set username and password */
|
1612
|
+
#else
|
1501
1613
|
} else {
|
1614
|
+
#endif
|
1502
1615
|
curl_easy_setopt(curl, CURLOPT_USERPWD, NULL);
|
1503
1616
|
}
|
1504
1617
|
|
1505
|
-
if (
|
1506
|
-
curl_easy_setopt(curl, CURLOPT_PROXY,
|
1618
|
+
if (!rb_easy_nil("proxy_url")) {
|
1619
|
+
curl_easy_setopt(curl, CURLOPT_PROXY, rb_easy_get_str("proxy_url"));
|
1507
1620
|
} else {
|
1508
1621
|
curl_easy_setopt(curl, CURLOPT_PROXY, NULL);
|
1509
1622
|
}
|
1510
1623
|
|
1511
|
-
if (
|
1512
|
-
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD,
|
1624
|
+
if (!rb_easy_nil("proxypwd")) {
|
1625
|
+
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, rb_easy_get_str("proxy_pwd"));
|
1513
1626
|
} else {
|
1514
1627
|
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, NULL);
|
1515
1628
|
}
|
1516
1629
|
|
1517
1630
|
// body/header procs
|
1518
|
-
if (
|
1519
|
-
*body_buffer = Qnil;
|
1631
|
+
if (!rb_easy_nil("body_proc")) {
|
1520
1632
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, (curl_write_callback)&proc_data_handler);
|
1521
|
-
curl_easy_setopt(curl, CURLOPT_WRITEDATA, rbce->body_proc);
|
1633
|
+
curl_easy_setopt(curl, CURLOPT_WRITEDATA, rb_easy_get("body_proc"));//rbce->body_proc);
|
1634
|
+
/* clear out the body_data if it was set */
|
1635
|
+
rb_easy_del("body_data");
|
1522
1636
|
} else {
|
1523
|
-
|
1637
|
+
VALUE body_buffer = rb_easy_set("body_data", rb_str_buf_new(32768));
|
1524
1638
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, (curl_write_callback)&default_data_handler);
|
1525
|
-
curl_easy_setopt(curl, CURLOPT_WRITEDATA,
|
1639
|
+
curl_easy_setopt(curl, CURLOPT_WRITEDATA, body_buffer);
|
1526
1640
|
}
|
1527
1641
|
|
1528
|
-
if (
|
1529
|
-
*header_buffer = Qnil;
|
1642
|
+
if (!rb_easy_nil("header_proc")) {
|
1530
1643
|
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, (curl_write_callback)&proc_data_handler);
|
1531
|
-
curl_easy_setopt(curl, CURLOPT_HEADERDATA,
|
1644
|
+
curl_easy_setopt(curl, CURLOPT_HEADERDATA, rb_easy_get("header_proc"));
|
1645
|
+
/* clear out the header_data if it was set */
|
1646
|
+
rb_easy_del("header_data");
|
1532
1647
|
} else {
|
1533
|
-
|
1648
|
+
VALUE header_buffer = rb_easy_set("header_data", rb_str_buf_new(16384));
|
1534
1649
|
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, (curl_write_callback)&default_data_handler);
|
1535
|
-
curl_easy_setopt(curl, CURLOPT_HEADERDATA,
|
1650
|
+
curl_easy_setopt(curl, CURLOPT_HEADERDATA, header_buffer);
|
1536
1651
|
}
|
1537
1652
|
|
1538
1653
|
/* encoding */
|
1539
|
-
if (
|
1540
|
-
curl_easy_setopt(curl, CURLOPT_ENCODING,
|
1654
|
+
if (!rb_easy_nil("encoding")) {
|
1655
|
+
curl_easy_setopt(curl, CURLOPT_ENCODING, rb_easy_get_str("encoding"));
|
1541
1656
|
}
|
1542
1657
|
|
1543
1658
|
// progress and debug procs
|
1544
|
-
if (
|
1659
|
+
if (!rb_easy_nil("progress_proc")) {
|
1545
1660
|
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, (curl_progress_callback)&proc_progress_handler);
|
1546
|
-
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA,
|
1661
|
+
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, rb_easy_get("progress_proc"));
|
1547
1662
|
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
|
1548
1663
|
} else {
|
1549
1664
|
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
|
1550
1665
|
}
|
1551
1666
|
|
1552
|
-
if (
|
1667
|
+
if (!rb_easy_nil("debug_proc")) {
|
1553
1668
|
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, (curl_debug_callback)&proc_debug_handler);
|
1554
|
-
curl_easy_setopt(curl, CURLOPT_DEBUGDATA,
|
1669
|
+
curl_easy_setopt(curl, CURLOPT_DEBUGDATA, rb_easy_get("debug_proc"));
|
1555
1670
|
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
|
1556
1671
|
} else {
|
1557
1672
|
// have to remove handler to re-enable standard verbosity
|
@@ -1648,30 +1763,30 @@ VALUE ruby_curl_easy_setup( ruby_curl_easy *rbce, VALUE *body_buffer, VALUE *hea
|
|
1648
1763
|
FIXME this may not get disabled if it's enabled, the disabled again from ruby.
|
1649
1764
|
*/
|
1650
1765
|
if (rbce->enable_cookies) {
|
1651
|
-
if (
|
1652
|
-
curl_easy_setopt(curl, CURLOPT_COOKIEJAR,
|
1766
|
+
if (!rb_easy_nil("cookiejar")) {
|
1767
|
+
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, rb_easy_get_str("cookiejar"));
|
1653
1768
|
}
|
1654
1769
|
|
1655
|
-
if (
|
1656
|
-
curl_easy_setopt(curl, CURLOPT_COOKIEFILE,
|
1770
|
+
if (!rb_easy_nil("cookiefile")) {
|
1771
|
+
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, rb_easy_get_str("cookiefile"));
|
1657
1772
|
} else {
|
1658
1773
|
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* "" = magic to just enable */
|
1659
1774
|
}
|
1660
1775
|
}
|
1661
1776
|
|
1662
|
-
if (
|
1663
|
-
curl_easy_setopt(curl, CURLOPT_COOKIE,
|
1777
|
+
if (!rb_easy_nil("cookies")) {
|
1778
|
+
curl_easy_setopt(curl, CURLOPT_COOKIE, rb_easy_get_str("cookies"));
|
1664
1779
|
}
|
1665
1780
|
|
1666
1781
|
/* Set up HTTPS cert handling if necessary */
|
1667
|
-
if (
|
1668
|
-
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE,
|
1669
|
-
curl_easy_setopt(curl, CURLOPT_SSLCERT,
|
1670
|
-
if (
|
1671
|
-
curl_easy_setopt(curl, CURLOPT_SSLCERTPASSWD,
|
1782
|
+
if (!rb_easy_nil("cert")) {
|
1783
|
+
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, rb_easy_get_str("certtype"));
|
1784
|
+
curl_easy_setopt(curl, CURLOPT_SSLCERT, rb_easy_get_str("cert"));
|
1785
|
+
if (!rb_easy_nil("certpassword")) {
|
1786
|
+
curl_easy_setopt(curl, CURLOPT_SSLCERTPASSWD, rb_easy_get_str("certpassword"));
|
1672
1787
|
}
|
1673
1788
|
}
|
1674
|
-
if (
|
1789
|
+
if (!rb_easy_nil("cacert")) {
|
1675
1790
|
#ifdef HAVE_CURL_CONFIG_CA
|
1676
1791
|
curl_easy_setopt(curl, CURLOPT_CAINFO, CURL_CONFIG_CA);
|
1677
1792
|
#else
|
@@ -1680,18 +1795,18 @@ VALUE ruby_curl_easy_setup( ruby_curl_easy *rbce, VALUE *body_buffer, VALUE *hea
|
|
1680
1795
|
}
|
1681
1796
|
|
1682
1797
|
/* Set the user-agent string if specified */
|
1683
|
-
if (
|
1684
|
-
curl_easy_setopt(curl, CURLOPT_USERAGENT,
|
1798
|
+
if (!rb_easy_nil("useragent")) {
|
1799
|
+
curl_easy_setopt(curl, CURLOPT_USERAGENT, rb_easy_get_str("useragent"));
|
1685
1800
|
}
|
1686
1801
|
|
1687
1802
|
/* Setup HTTP headers if necessary */
|
1688
1803
|
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, NULL); // XXX: maybe we shouldn't be clearing this?
|
1689
1804
|
|
1690
|
-
if (
|
1691
|
-
if ((
|
1692
|
-
rb_iterate(rb_each,
|
1805
|
+
if (!rb_easy_nil("headers")) {
|
1806
|
+
if (rb_easy_type_check("headers", T_ARRAY) || rb_easy_type_check("headers", T_HASH)) {
|
1807
|
+
rb_iterate(rb_each, rb_easy_get("headers"), cb_each_http_header, (VALUE)hdrs);
|
1693
1808
|
} else {
|
1694
|
-
VALUE headers_str = rb_obj_as_string(
|
1809
|
+
VALUE headers_str = rb_obj_as_string(rb_easy_get("headers"));
|
1695
1810
|
*hdrs = curl_slist_append(*hdrs, StringValuePtr(headers_str));
|
1696
1811
|
}
|
1697
1812
|
|
@@ -1708,7 +1823,7 @@ VALUE ruby_curl_easy_setup( ruby_curl_easy *rbce, VALUE *body_buffer, VALUE *hea
|
|
1708
1823
|
*
|
1709
1824
|
* Always returns Qtrue.
|
1710
1825
|
*/
|
1711
|
-
VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce,
|
1826
|
+
VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce, struct curl_slist *headers ) {
|
1712
1827
|
|
1713
1828
|
CURL *curl = rbce->curl;
|
1714
1829
|
|
@@ -1718,38 +1833,9 @@ VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce, VALUE bodybuf, V
|
|
1718
1833
|
rbce->curl_headers = NULL;
|
1719
1834
|
}
|
1720
1835
|
|
1721
|
-
// Sort out the built-in body/header data.
|
1722
|
-
if (bodybuf != Qnil) {
|
1723
|
-
if (TYPE(bodybuf) == T_STRING) {
|
1724
|
-
rbce->body_data = rb_str_to_str(bodybuf);
|
1725
|
-
}
|
1726
|
-
else if (rb_respond_to(bodybuf, rb_intern("to_s"))) {
|
1727
|
-
rbce->body_data = rb_funcall(bodybuf, rb_intern("to_s"), 0);
|
1728
|
-
}
|
1729
|
-
else {
|
1730
|
-
rbce->body_data = Qnil;
|
1731
|
-
}
|
1732
|
-
} else {
|
1733
|
-
rbce->body_data = Qnil;
|
1734
|
-
}
|
1735
|
-
|
1736
|
-
if (headerbuf != Qnil) {
|
1737
|
-
if (TYPE(headerbuf) == T_STRING) {
|
1738
|
-
rbce->header_data = rb_str_to_str(headerbuf);
|
1739
|
-
}
|
1740
|
-
else if (rb_respond_to(headerbuf, rb_intern("to_s"))) {
|
1741
|
-
rbce->header_data = rb_funcall(headerbuf, rb_intern("to_s"), 0);
|
1742
|
-
}
|
1743
|
-
else {
|
1744
|
-
rbce->header_data = Qnil;
|
1745
|
-
}
|
1746
|
-
} else {
|
1747
|
-
rbce->header_data = Qnil;
|
1748
|
-
}
|
1749
|
-
|
1750
1836
|
// clean up a PUT request's curl options.
|
1751
|
-
if (
|
1752
|
-
|
1837
|
+
if (!rb_easy_nil("upload")) {
|
1838
|
+
rb_easy_del("upload"); // set the upload object to Qnil to let the GC clean up
|
1753
1839
|
curl_easy_setopt(curl, CURLOPT_UPLOAD, 0);
|
1754
1840
|
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
|
1755
1841
|
curl_easy_setopt(curl, CURLOPT_READDATA, NULL);
|
@@ -1778,7 +1864,7 @@ static VALUE handle_perform(VALUE self, ruby_curl_easy *rbce) {
|
|
1778
1864
|
ret = rb_funcall(multi, rb_intern("perform"), 0);
|
1779
1865
|
|
1780
1866
|
/* check for errors in the easy response and raise exceptions if anything went wrong and their is no on_failure handler */
|
1781
|
-
if(
|
1867
|
+
if (rbce->last_result != 0 && rb_easy_nil("failure_proc")) {
|
1782
1868
|
raise_curl_easy_error_exception(rbce->last_result);
|
1783
1869
|
}
|
1784
1870
|
|
@@ -2026,7 +2112,7 @@ static VALUE ruby_curl_easy_class_perform_put(VALUE klass, VALUE url, VALUE data
|
|
2026
2112
|
* your own body handler, this string will be empty.
|
2027
2113
|
*/
|
2028
2114
|
static VALUE ruby_curl_easy_body_str_get(VALUE self) {
|
2029
|
-
|
2115
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, body_data);
|
2030
2116
|
}
|
2031
2117
|
|
2032
2118
|
/*
|
@@ -2038,7 +2124,7 @@ static VALUE ruby_curl_easy_body_str_get(VALUE self) {
|
|
2038
2124
|
* your own header handler, this string will be empty.
|
2039
2125
|
*/
|
2040
2126
|
static VALUE ruby_curl_easy_header_str_get(VALUE self) {
|
2041
|
-
|
2127
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, header_data);
|
2042
2128
|
}
|
2043
2129
|
|
2044
2130
|
|
@@ -2583,11 +2669,12 @@ static VALUE ruby_curl_easy_inspect(VALUE self) {
|
|
2583
2669
|
ruby_curl_easy *rbce;
|
2584
2670
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
2585
2671
|
/* if we don't have a url set... we'll crash... */
|
2586
|
-
if(
|
2587
|
-
|
2672
|
+
if( !rb_easy_nil("url") && rb_easy_type_check("url", T_STRING)) {
|
2673
|
+
VALUE url = rb_easy_get("url");
|
2674
|
+
size_t len = 13+((RSTRING_LEN(url) > 50) ? 50 : RSTRING_LEN(url));
|
2588
2675
|
/* "#<Net::HTTP http://www.google.com/:80 open=false>" */
|
2589
2676
|
memcpy(buf,"#<Curl::Easy ", 13);
|
2590
|
-
memcpy(buf+13,RSTRING_PTR(
|
2677
|
+
memcpy(buf+13,RSTRING_PTR(url), (len - 13));
|
2591
2678
|
buf[len-1] = '>';
|
2592
2679
|
return rb_str_new(buf,len);
|
2593
2680
|
}
|
@@ -2832,7 +2919,7 @@ void init_curb_easy() {
|
|
2832
2919
|
rb_define_method(cCurlEasy, "proxy_port", ruby_curl_easy_proxy_port_get, 0);
|
2833
2920
|
rb_define_method(cCurlEasy, "proxy_type=", ruby_curl_easy_proxy_type_set, 1);
|
2834
2921
|
rb_define_method(cCurlEasy, "proxy_type", ruby_curl_easy_proxy_type_get, 0);
|
2835
|
-
rb_define_method(cCurlEasy, "http_auth_types=", ruby_curl_easy_http_auth_types_set, 1);
|
2922
|
+
rb_define_method(cCurlEasy, "http_auth_types=", ruby_curl_easy_http_auth_types_set, -1);
|
2836
2923
|
rb_define_method(cCurlEasy, "http_auth_types", ruby_curl_easy_http_auth_types_get, 0);
|
2837
2924
|
rb_define_method(cCurlEasy, "proxy_auth_types=", ruby_curl_easy_proxy_auth_types_set, 1);
|
2838
2925
|
rb_define_method(cCurlEasy, "proxy_auth_types", ruby_curl_easy_proxy_auth_types_get, 0);
|
@@ -2847,6 +2934,11 @@ void init_curb_easy() {
|
|
2847
2934
|
rb_define_method(cCurlEasy, "ftp_response_timeout=", ruby_curl_easy_ftp_response_timeout_set, 1);
|
2848
2935
|
rb_define_method(cCurlEasy, "ftp_response_timeout", ruby_curl_easy_ftp_response_timeout_get, 0);
|
2849
2936
|
|
2937
|
+
rb_define_method(cCurlEasy, "username=", ruby_curl_easy_username_set, 1);
|
2938
|
+
rb_define_method(cCurlEasy, "username", ruby_curl_easy_username_get, 0);
|
2939
|
+
rb_define_method(cCurlEasy, "password=", ruby_curl_easy_password_set, 1);
|
2940
|
+
rb_define_method(cCurlEasy, "password", ruby_curl_easy_password_get, 0);
|
2941
|
+
|
2850
2942
|
rb_define_method(cCurlEasy, "proxy_tunnel=", ruby_curl_easy_proxy_tunnel_set, 1);
|
2851
2943
|
rb_define_method(cCurlEasy, "proxy_tunnel?", ruby_curl_easy_proxy_tunnel_q, 0);
|
2852
2944
|
rb_define_method(cCurlEasy, "fetch_file_time=", ruby_curl_easy_fetch_file_time_set, 1);
|
data/ext/curb_easy.h
CHANGED
@@ -18,33 +18,7 @@ typedef struct {
|
|
18
18
|
/* The handler */
|
19
19
|
CURL *curl;
|
20
20
|
|
21
|
-
/*
|
22
|
-
VALUE url;
|
23
|
-
VALUE proxy_url;
|
24
|
-
|
25
|
-
VALUE body_proc;
|
26
|
-
VALUE header_proc;
|
27
|
-
VALUE body_data; /* Holds the response body from the last call to curl_easy_perform */
|
28
|
-
VALUE header_data; /* unless a block is supplied (they'll be nil) */
|
29
|
-
VALUE progress_proc;
|
30
|
-
VALUE debug_proc;
|
31
|
-
VALUE interface_hm;
|
32
|
-
VALUE userpwd;
|
33
|
-
VALUE proxypwd;
|
34
|
-
VALUE headers; /* ruby array of strings with headers to set */
|
35
|
-
VALUE cookies; /* string */
|
36
|
-
VALUE cookiefile; /* filename */
|
37
|
-
VALUE cookiejar; /* filename */
|
38
|
-
VALUE cert;
|
39
|
-
VALUE cacert;
|
40
|
-
VALUE certpassword;
|
41
|
-
VALUE certtype;
|
42
|
-
VALUE encoding;
|
43
|
-
VALUE useragent;
|
44
|
-
|
45
|
-
VALUE success_proc;
|
46
|
-
VALUE failure_proc;
|
47
|
-
VALUE complete_proc;
|
21
|
+
VALUE opts; /* rather then allocate everything we might need to store, allocate a Hash and only store objects we actually use... */
|
48
22
|
|
49
23
|
/* Other opts */
|
50
24
|
unsigned short local_port; // 0 is no port
|
@@ -71,32 +45,16 @@ typedef struct {
|
|
71
45
|
char verbose;
|
72
46
|
char multipart_form_post;
|
73
47
|
char enable_cookies;
|
74
|
-
|
75
|
-
/* this is sometimes used as a buffer for a form data string,
|
76
|
-
* which we alloc in C and need to hang around for the call,
|
77
|
-
* and in case it's asked for before the next call.
|
78
|
-
*/
|
79
|
-
VALUE postdata_buffer;
|
80
|
-
|
81
|
-
/* when added to a multi handle these buffers are needed
|
82
|
-
* when the easy handle isn't supplied the body proc
|
83
|
-
* or a custom http header is passed.
|
84
|
-
*/
|
85
|
-
VALUE bodybuf;
|
86
|
-
VALUE headerbuf;
|
87
48
|
struct curl_slist *curl_headers;
|
88
49
|
|
89
|
-
// VALUE self; /* pointer to self, used by multi interface */
|
90
|
-
VALUE upload; /* pointer to an active upload otherwise Qnil */
|
91
|
-
|
92
50
|
int last_result; /* last result code from multi loop */
|
93
51
|
|
94
52
|
} ruby_curl_easy;
|
95
53
|
|
96
54
|
extern VALUE cCurlEasy;
|
97
55
|
|
98
|
-
VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce,
|
99
|
-
VALUE ruby_curl_easy_cleanup(VALUE self, ruby_curl_easy *rbce,
|
56
|
+
VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce, struct curl_slist **headers);
|
57
|
+
VALUE ruby_curl_easy_cleanup(VALUE self, ruby_curl_easy *rbce, struct curl_slist *headers);
|
100
58
|
|
101
59
|
void init_curb_easy();
|
102
60
|
|
data/ext/curb_errors.c
CHANGED
@@ -23,6 +23,7 @@ VALUE eCurlErrTelnetError;
|
|
23
23
|
VALUE eCurlErrTFTPError;
|
24
24
|
|
25
25
|
/* Specific libcurl errors */
|
26
|
+
VALUE eCurlErrOK; /* not really an error but a return code */
|
26
27
|
VALUE eCurlErrUnsupportedProtocol;
|
27
28
|
VALUE eCurlErrFailedInit;
|
28
29
|
VALUE eCurlErrMalformedURL;
|
@@ -127,6 +128,9 @@ VALUE rb_curl_easy_error(CURLcode code) {
|
|
127
128
|
VALUE results;
|
128
129
|
|
129
130
|
switch (code) {
|
131
|
+
case CURLE_OK: /* 0 */
|
132
|
+
exclz = eCurlErrOK;
|
133
|
+
break;
|
130
134
|
case CURLE_UNSUPPORTED_PROTOCOL: /* 1 */
|
131
135
|
exclz = eCurlErrUnsupportedProtocol;
|
132
136
|
break;
|
@@ -509,6 +513,7 @@ void init_curb_errors() {
|
|
509
513
|
eCurlErrTelnetError = rb_define_class_under(mCurlErr, "TelnetError", eCurlErrError);
|
510
514
|
eCurlErrTFTPError = rb_define_class_under(mCurlErr, "TFTPError", eCurlErrError);
|
511
515
|
|
516
|
+
eCurlErrOK = rb_define_class_under(mCurlErr, "CurlOK", eCurlErrError);
|
512
517
|
eCurlErrUnsupportedProtocol = rb_define_class_under(mCurlErr, "UnsupportedProtocolError", eCurlErrError);
|
513
518
|
eCurlErrFailedInit = rb_define_class_under(mCurlErr, "FailedInitError", eCurlErrError);
|
514
519
|
eCurlErrMalformedURL = rb_define_class_under(mCurlErr, "MalformedURLError", eCurlErrError);
|
data/ext/curb_macros.h
CHANGED
@@ -8,6 +8,17 @@
|
|
8
8
|
#ifndef __CURB_MACROS_H
|
9
9
|
#define __CURB_MACROS_H
|
10
10
|
|
11
|
+
#define rb_easy_hkey(key) ID2SYM(rb_intern(key))
|
12
|
+
#define rb_easy_set(key,val) rb_hash_aset(rbce->opts, rb_easy_hkey(key) , val)
|
13
|
+
#define rb_easy_get(key) rb_hash_aref(rbce->opts, rb_easy_hkey(key))
|
14
|
+
#define rb_easy_del(key) rb_hash_delete(rbce->opts, rb_easy_hkey(key))
|
15
|
+
#define rb_easy_nil(key) (rb_hash_lookup(rbce->opts, rb_easy_hkey(key)) == Qnil)
|
16
|
+
#define rb_easy_type_check(key,type) (rb_type(rb_hash_aref(rbce->opts, rb_easy_hkey(key))) == type)
|
17
|
+
|
18
|
+
// TODO: rb_sym_to_s may not be defined?
|
19
|
+
#define rb_easy_get_str(key) \
|
20
|
+
RSTRING_PTR((rb_easy_type_check(key,T_STRING) ? rb_easy_get(key) : rb_str_to_str(rb_easy_get(key))))
|
21
|
+
|
11
22
|
/* getter/setter macros for various things */
|
12
23
|
/* setter for anything that stores a ruby VALUE in the struct */
|
13
24
|
#define CURB_OBJECT_SETTER(type, attr) \
|
@@ -25,6 +36,22 @@
|
|
25
36
|
Data_Get_Struct(self, type, ptr); \
|
26
37
|
return ptr->attr;
|
27
38
|
|
39
|
+
/* setter for anything that stores a ruby VALUE in the struct opts hash */
|
40
|
+
#define CURB_OBJECT_HSETTER(type, attr) \
|
41
|
+
type *ptr; \
|
42
|
+
\
|
43
|
+
Data_Get_Struct(self, type, ptr); \
|
44
|
+
rb_hash_aset(ptr->opts, rb_easy_hkey(#attr), attr); \
|
45
|
+
\
|
46
|
+
return attr;
|
47
|
+
|
48
|
+
/* getter for anything that stores a ruby VALUE in the struct opts hash */
|
49
|
+
#define CURB_OBJECT_HGETTER(type, attr) \
|
50
|
+
type *ptr; \
|
51
|
+
\
|
52
|
+
Data_Get_Struct(self, type, ptr); \
|
53
|
+
return rb_hash_aref(ptr->opts, rb_easy_hkey(#attr));
|
54
|
+
|
28
55
|
/* setter for bool flags */
|
29
56
|
#define CURB_BOOLEAN_SETTER(type, attr) \
|
30
57
|
type *ptr; \
|
@@ -57,6 +84,20 @@
|
|
57
84
|
\
|
58
85
|
return oldproc; \
|
59
86
|
|
87
|
+
/* special setter for on_event handlers that take a block, same as above but stores int he opts hash */
|
88
|
+
#define CURB_HANDLER_PROC_HSETTER(type, handler) \
|
89
|
+
type *ptr; \
|
90
|
+
VALUE oldproc, newproc; \
|
91
|
+
\
|
92
|
+
Data_Get_Struct(self, type, ptr); \
|
93
|
+
\
|
94
|
+
oldproc = rb_hash_aref(ptr->opts, rb_easy_hkey(#handler)); \
|
95
|
+
rb_scan_args(argc, argv, "0&", &newproc); \
|
96
|
+
\
|
97
|
+
rb_hash_aset(ptr->opts, rb_easy_hkey(#handler), newproc); \
|
98
|
+
\
|
99
|
+
return oldproc;
|
100
|
+
|
60
101
|
/* setter for numerics that are kept in c ints */
|
61
102
|
#define CURB_IMMED_SETTER(type, attr, nilval) \
|
62
103
|
type *ptr; \
|
data/ext/curb_multi.c
CHANGED
@@ -200,7 +200,7 @@ VALUE ruby_curl_multi_add(VALUE self, VALUE easy) {
|
|
200
200
|
}
|
201
201
|
|
202
202
|
/* setup the easy handle */
|
203
|
-
ruby_curl_easy_setup( rbce, &(rbce->
|
203
|
+
ruby_curl_easy_setup( rbce, &(rbce->curl_headers) );
|
204
204
|
|
205
205
|
rbcm->active++;
|
206
206
|
|
@@ -253,14 +253,12 @@ static void rb_curl_multi_remove(ruby_curl_multi *rbcm, VALUE easy) {
|
|
253
253
|
|
254
254
|
rbcm->active--;
|
255
255
|
|
256
|
-
ruby_curl_easy_cleanup( easy, rbce, rbce->
|
257
|
-
rbce->headerbuf = Qnil;
|
258
|
-
rbce->bodybuf = Qnil;
|
256
|
+
ruby_curl_easy_cleanup( easy, rbce, rbce->curl_headers );
|
259
257
|
|
260
258
|
// active should equal INT2FIX(RHASH(rbcm->requests)->tbl->num_entries)
|
261
259
|
r = rb_hash_delete( rbcm->requests, easy );
|
262
260
|
if( r != easy || r == Qnil ) {
|
263
|
-
rb_warn("Possibly lost
|
261
|
+
rb_warn("Possibly lost track of Curl::Easy VALUE, it may not be reclaimed by GC");
|
264
262
|
}
|
265
263
|
}
|
266
264
|
|
@@ -306,25 +304,25 @@ static void rb_curl_mutli_handle_complete(VALUE self, CURL *easy_handle, int res
|
|
306
304
|
|
307
305
|
ruby_curl_multi_remove( self, easy );
|
308
306
|
|
309
|
-
if (
|
310
|
-
rb_funcall(
|
307
|
+
if (!rb_easy_nil("complete_proc")) {
|
308
|
+
rb_funcall( rb_easy_get("complete_proc"), idCall, 1, easy );
|
311
309
|
}
|
312
310
|
|
313
311
|
curl_easy_getinfo(rbce->curl, CURLINFO_RESPONSE_CODE, &response_code);
|
314
312
|
|
315
313
|
if (result != 0) {
|
316
|
-
if (
|
317
|
-
rb_funcall(
|
314
|
+
if (!rb_easy_nil("failure_proc")) {
|
315
|
+
rb_funcall( rb_easy_get("failure_proc"), idCall, 2, easy, rb_curl_easy_error(result) );
|
318
316
|
}
|
319
317
|
}
|
320
|
-
else if (
|
318
|
+
else if (!rb_easy_nil("success_proc") &&
|
321
319
|
((response_code >= 200 && response_code < 300) || response_code == 0)) {
|
322
320
|
/* NOTE: we allow response_code == 0, in the case of non http requests e.g. reading from disk */
|
323
|
-
rb_funcall(
|
321
|
+
rb_funcall( rb_easy_get("success_proc"), idCall, 1, easy );
|
324
322
|
}
|
325
|
-
else if (
|
323
|
+
else if (!rb_easy_nil("failure_proc") &&
|
326
324
|
(response_code >= 300 && response_code <= 999)) {
|
327
|
-
rb_funcall(
|
325
|
+
rb_funcall( rb_easy_get("failure_proc"), idCall, 2, easy, rb_curl_easy_error(result) );
|
328
326
|
}
|
329
327
|
}
|
330
328
|
|
data/ext/curb_postfield.c
CHANGED
@@ -41,7 +41,7 @@ void append_to_form(VALUE self,
|
|
41
41
|
// is a file upload field
|
42
42
|
if (rbcpf->content_proc != Qnil) {
|
43
43
|
// with content proc
|
44
|
-
rbcpf->buffer_str = rb_funcall(rbcpf->content_proc, idCall, self);
|
44
|
+
rbcpf->buffer_str = rb_funcall(rbcpf->content_proc, idCall, 1, self);
|
45
45
|
|
46
46
|
if (rbcpf->remote_file == Qnil) {
|
47
47
|
rb_raise(eCurlErrInvalidPostField, "Cannot post file upload field with no filename");
|
@@ -468,10 +468,10 @@ static VALUE ruby_curl_postfield_to_str(VALUE self) {
|
|
468
468
|
}
|
469
469
|
}
|
470
470
|
} else {
|
471
|
-
rb_raise(eCurlErrInvalidPostField, "Cannot convert unnamed field to string");
|
471
|
+
rb_raise(eCurlErrInvalidPostField, "Cannot convert unnamed field to string %s:%d", __FILE__, __LINE__);
|
472
472
|
}
|
473
473
|
} else {
|
474
|
-
rb_raise(eCurlErrInvalidPostField, "Cannot convert non-content field to string");
|
474
|
+
rb_raise(eCurlErrInvalidPostField, "Cannot convert non-content field to string %s:%d", __FILE__, __LINE__);
|
475
475
|
}
|
476
476
|
|
477
477
|
return result;
|
data/ext/extconf.rb
CHANGED
@@ -111,6 +111,13 @@ have_constant "curle_again"
|
|
111
111
|
have_constant "curle_ssl_crl_badfile"
|
112
112
|
have_constant "curle_ssl_issuer_error"
|
113
113
|
|
114
|
+
# username/password added in 7.19.1
|
115
|
+
have_constant "curlopt_username"
|
116
|
+
have_constant "curlopt_password"
|
117
|
+
|
118
|
+
# ie quirk added in 7.19.3
|
119
|
+
have_constant "curlauth_digest_ie"
|
120
|
+
|
114
121
|
# centos 4.5 build of libcurl
|
115
122
|
have_constant "curlm_bad_socket"
|
116
123
|
have_constant "curlm_unknown_option"
|
data/tests/helper.rb
CHANGED
data/tests/tc_curl_easy.rb
CHANGED
@@ -655,6 +655,35 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
655
655
|
assert /ScrubDog$/,curl.useragent
|
656
656
|
end
|
657
657
|
|
658
|
+
def test_username_password
|
659
|
+
curl = Curl::Easy.new(TestServlet.url)
|
660
|
+
curl.username = "foo"
|
661
|
+
curl.password = "bar"
|
662
|
+
if !curl.username.nil?
|
663
|
+
assert_equal "foo", curl.username
|
664
|
+
assert_equal "bar", curl.password
|
665
|
+
else
|
666
|
+
curl.userpwd = "foo:bar"
|
667
|
+
end
|
668
|
+
curl.http_auth_types = :basic
|
669
|
+
#curl.verbose = true
|
670
|
+
curl.perform
|
671
|
+
assert_equal 'Basic Zm9vOmJhcg==', $auth_header
|
672
|
+
|
673
|
+
# curl checks the auth type supported by the server, so we have to create a
|
674
|
+
# new easy handle if we're going to change the auth type...
|
675
|
+
|
676
|
+
curl = Curl::Easy.new(TestServlet.url)
|
677
|
+
curl.username = "foo"
|
678
|
+
curl.password = "bar"
|
679
|
+
if curl.username.nil?
|
680
|
+
curl.userpwd = "foo:bar"
|
681
|
+
end
|
682
|
+
curl.http_auth_types = :ntlm
|
683
|
+
curl.perform
|
684
|
+
assert_equal 'NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=', $auth_header
|
685
|
+
end
|
686
|
+
|
658
687
|
include TestServerMethods
|
659
688
|
|
660
689
|
def setup
|
data/tests/tc_curl_multi.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ghazel-curb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.1
|
4
|
+
version: 0.6.2.1
|
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-12-
|
13
|
+
date: 2009-12-26 00:00:00 -08:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|