taf2-curb 0.3.5.0 → 0.3.6.0

Sign up to get free protection for your applications and to get access to all the features.
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.3.5.0"
24
- #define CURB_VER_NUM 350
23
+ #define CURB_VERSION "0.3.6.0"
24
+ #define CURB_VER_NUM 360
25
25
  #define CURB_VER_MAJ 0
26
26
  #define CURB_VER_MIN 3
27
- #define CURB_VER_MIC 5
27
+ #define CURB_VER_MIC 6
28
28
  #define CURB_VER_PATCH 0
29
29
 
30
30
 
data/ext/curb_easy.c CHANGED
@@ -128,6 +128,8 @@ void curl_easy_mark(ruby_curl_easy *rbce) {
128
128
  rb_gc_mark(rbce->userpwd);
129
129
  rb_gc_mark(rbce->proxypwd);
130
130
  rb_gc_mark(rbce->headers);
131
+ rb_gc_mark(rbce->cookies);
132
+ rb_gc_mark(rbce->cookiefile);
131
133
  rb_gc_mark(rbce->cookiejar);
132
134
  rb_gc_mark(rbce->cert);
133
135
  rb_gc_mark(rbce->encoding);
@@ -190,6 +192,8 @@ static VALUE ruby_curl_easy_new(int argc, VALUE *argv, VALUE klass) {
190
192
  rbce->userpwd = Qnil;
191
193
  rbce->proxypwd = Qnil;
192
194
  rbce->headers = rb_hash_new();
195
+ rbce->cookies = Qnil;
196
+ rbce->cookiefile = Qnil;
193
197
  rbce->cookiejar = Qnil;
194
198
  rbce->cert = Qnil;
195
199
  rbce->encoding = Qnil;
@@ -435,12 +439,58 @@ static VALUE ruby_curl_easy_proxypwd_get(VALUE self) {
435
439
  CURB_OBJECT_GETTER(ruby_curl_easy, proxypwd);
436
440
  }
437
441
 
442
+
443
+ /*
444
+ * call-seq:
445
+ * easy.cookies = "name1=content1; name2=content2;" => "pwd string"
446
+ *
447
+ * Set cookies to be sent by this Curl::Easy instance. The format of the string should
448
+ * be NAME=CONTENTS, where NAME is the cookie name and CONTENTS is what the cookie should contain.
449
+ * Set multiple cookies in one string like this: "name1=content1; name2=content2;" etc.
450
+ */
451
+ static VALUE ruby_curl_easy_cookies_set(VALUE self, VALUE cookies) {
452
+ CURB_OBJECT_SETTER(ruby_curl_easy, cookies);
453
+ }
454
+
455
+ /*
456
+ * call-seq:
457
+ * easy.cookies => "name1=content1; name2=content2;"
458
+ *
459
+ * Obtain the cookies for this Curl::Easy instance.
460
+ */
461
+ static VALUE ruby_curl_easy_cookies_get(VALUE self) {
462
+ CURB_OBJECT_GETTER(ruby_curl_easy, cookies);
463
+ }
464
+
465
+ /*
466
+ * call-seq:
467
+ * easy.cookiefile = "cookies.txt" => "pwd string"
468
+ *
469
+ * Set a file that contains cookies to be sent in subsequent requests by this Curl::Easy instance.
470
+ *
471
+ * *Note* that you must set enable_cookies true to enable the cookie
472
+ * engine, or this option will be ignored.
473
+ */
474
+ static VALUE ruby_curl_easy_cookiefile_set(VALUE self, VALUE cookiefile) {
475
+ CURB_OBJECT_SETTER(ruby_curl_easy, cookiefile);
476
+ }
477
+
478
+ /*
479
+ * call-seq:
480
+ * easy.cookiefile => "cookies.txt"
481
+ *
482
+ * Obtain the cookiefile file for this Curl::Easy instance.
483
+ */
484
+ static VALUE ruby_curl_easy_cookiefile_get(VALUE self) {
485
+ CURB_OBJECT_GETTER(ruby_curl_easy, cookiefile);
486
+ }
487
+
438
488
  /*
439
489
  * call-seq:
440
490
  * easy.cookiejar = "cookiejar.file" => "pwd string"
441
491
  *
442
- * Set a cookiejar file to use for this Curl::Easy instance. This file
443
- * will be used to persist cookies.
492
+ * Set a cookiejar file to use for this Curl::Easy instance.
493
+ * Cookies from the response will be written into this file.
444
494
  *
445
495
  * *Note* that you must set enable_cookies true to enable the cookie
446
496
  * engine, or this option will be ignored.
@@ -1380,11 +1430,19 @@ VALUE ruby_curl_easy_setup( ruby_curl_easy *rbce, VALUE *body_buffer, VALUE *hea
1380
1430
  if (rbce->enable_cookies) {
1381
1431
  if (rbce->cookiejar != Qnil) {
1382
1432
  curl_easy_setopt(curl, CURLOPT_COOKIEJAR, StringValuePtr(rbce->cookiejar));
1433
+ }
1434
+
1435
+ if (rbce->cookiefile != Qnil) {
1436
+ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, StringValuePtr(rbce->cookiefile));
1383
1437
  } else {
1384
1438
  curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* "" = magic to just enable */
1385
1439
  }
1386
1440
  }
1387
1441
 
1442
+ if (rbce->cookies != Qnil) {
1443
+ curl_easy_setopt(curl, CURLOPT_COOKIE, StringValuePtr(rbce->cookies));
1444
+ }
1445
+
1388
1446
  /* Set up HTTPS cert handling if necessary */
1389
1447
  if (rbce->cert != Qnil) {
1390
1448
  curl_easy_setopt(curl, CURLOPT_SSLCERT, StringValuePtr(rbce->cert));
@@ -2556,6 +2614,10 @@ void init_curb_easy() {
2556
2614
  rb_define_method(cCurlEasy, "userpwd", ruby_curl_easy_userpwd_get, 0);
2557
2615
  rb_define_method(cCurlEasy, "proxypwd=", ruby_curl_easy_proxypwd_set, 1);
2558
2616
  rb_define_method(cCurlEasy, "proxypwd", ruby_curl_easy_proxypwd_get, 0);
2617
+ rb_define_method(cCurlEasy, "cookies=", ruby_curl_easy_cookies_set, 1);
2618
+ rb_define_method(cCurlEasy, "cookies", ruby_curl_easy_cookies_get, 0);
2619
+ rb_define_method(cCurlEasy, "cookiefile=", ruby_curl_easy_cookiefile_set, 1);
2620
+ rb_define_method(cCurlEasy, "cookiefile", ruby_curl_easy_cookiefile_get, 0);
2559
2621
  rb_define_method(cCurlEasy, "cookiejar=", ruby_curl_easy_cookiejar_set, 1);
2560
2622
  rb_define_method(cCurlEasy, "cookiejar", ruby_curl_easy_cookiejar_get, 0);
2561
2623
  rb_define_method(cCurlEasy, "cert=", ruby_curl_easy_cert_set, 1);
data/ext/curb_easy.h CHANGED
@@ -32,6 +32,8 @@ typedef struct {
32
32
  VALUE userpwd;
33
33
  VALUE proxypwd;
34
34
  VALUE headers; /* ruby array of strings with headers to set */
35
+ VALUE cookies; /* string */
36
+ VALUE cookiefile; /* filename */
35
37
  VALUE cookiejar; /* filename */
36
38
  VALUE cert;
37
39
  VALUE encoding;
data/ext/curb_errors.c CHANGED
@@ -98,6 +98,16 @@ VALUE eCurlErrTFTPUnknownID;
98
98
  VALUE eCurlErrTFTPFileExists;
99
99
  VALUE eCurlErrTFTPNoSuchUser;
100
100
 
101
+ VALUE eCurlErrConvFailed;
102
+ VALUE eCurlErrConvReqd;
103
+ VALUE eCurlErrSSLCacertBadfile;
104
+ VALUE eCurlErrRemoteFileNotFound;
105
+ VALUE eCurlErrSSH;
106
+ VALUE eCurlErrSSLShutdownFailed;
107
+ VALUE eCurlErrAgain;
108
+ VALUE eCurlErrSSLCRLBadfile;
109
+ VALUE eCurlErrSSLIssuerError;
110
+
101
111
  /* multi errors */
102
112
  VALUE mCurlErrCallMultiPerform;
103
113
  VALUE mCurlErrBadHandle;
@@ -360,6 +370,63 @@ void raise_curl_easy_error_exception(CURLcode code) {
360
370
  case CURLE_TFTP_NOSUCHUSER: /* 74 - No such user */
361
371
  exclz = eCurlErrTFTPNotFound;
362
372
  break;
373
+ #endif
374
+ #ifdef HAVE_CURLE_CONV_FAILED
375
+ case CURLE_CONV_FAILED: /* 75 - conversion failed */
376
+ exclz = eCurlErrConvFailed;
377
+ break;
378
+ #endif
379
+ #ifdef HAVE_CURLE_CONV_REQD
380
+ case CURLE_CONV_REQD: /* 76 - caller must register conversion
381
+ callbacks using curl_easy_setopt options
382
+ CURLOPT_CONV_FROM_NETWORK_FUNCTION,
383
+ CURLOPT_CONV_TO_NETWORK_FUNCTION, and
384
+ CURLOPT_CONV_FROM_UTF8_FUNCTION */
385
+ exclz = eCurlErrConvReqd;
386
+ break;
387
+ #endif
388
+ #ifdef HAVE_CURLE_SSL_CACERT_BADFILE
389
+ case CURLE_SSL_CACERT_BADFILE: /* 77 - could not load CACERT file, missing
390
+ or wrong format */
391
+ exclz = eCurlErrSSLCacertBadfile;
392
+ break;
393
+ #endif
394
+ #ifdef HAVE_CURLE_REMOTE_FILE_NOT_FOUND
395
+ case CURLE_REMOTE_FILE_NOT_FOUND: /* 78 - remote file not found */
396
+ exclz = eCurlErrRemoteFileNotFound;
397
+ break;
398
+ #endif
399
+ #ifdef HAVE_CURLE_SSH
400
+ case CURLE_SSH: /* 79 - error from the SSH layer, somewhat
401
+ generic so the error message will be of
402
+ interest when this has happened */
403
+ exclz = eCurlErrSSH;
404
+ break;
405
+ #endif
406
+ #ifdef HAVE_CURLE_SSL_SHUTDOWN_FAILED
407
+ case CURLE_SSL_SHUTDOWN_FAILED: /* 80 - Failed to shut down the SSL
408
+ connection */
409
+ exclz = eCurlErrSSLShutdownFailed;
410
+ break;
411
+ #endif
412
+ #ifdef HAVE_CURLE_AGAIN
413
+ case CURLE_AGAIN: /* 81 - socket is not ready for send/recv,
414
+ wait till it's ready and try again (Added
415
+ in 7.18.2) */
416
+ exclz = eCurlErrAgain;
417
+ break;
418
+ #endif
419
+ #ifdef HAVE_CURLE_SSL_CRL_BADFILE
420
+ case CURLE_SSL_CRL_BADFILE: /* 82 - could not load CRL file, missing or
421
+ wrong format (Added in 7.19.0) */
422
+ exclz = eCurlErrSSLCRLBadfile;
423
+ break;
424
+ #endif
425
+ #ifdef HAVE_CURLE_SSL_ISSUER_ERROR
426
+ case CURLE_SSL_ISSUER_ERROR: /* 83 - Issuer check failed. (Added in
427
+ 7.19.0) */
428
+ exclz = eCurlErrSSLIssuerError;
429
+ break;
363
430
  #endif
364
431
  default:
365
432
  exclz = eCurlErrError;
@@ -501,10 +568,20 @@ void init_curb_errors() {
501
568
  eCurlErrRecvError = rb_define_class_under(mCurlErr, "RecvError", eCurlErrError);
502
569
  eCurlErrShareInUse = rb_define_class_under(mCurlErr, "ShareInUseError", eCurlErrError);
503
570
 
571
+ eCurlErrConvFailed = rb_define_class_under(mCurlErr, "ConvFailed", eCurlErrError);
572
+ eCurlErrConvReqd = rb_define_class_under(mCurlErr, "ConvReqd", eCurlErrError);
573
+ eCurlErrRemoteFileNotFound = rb_define_class_under(mCurlErr, "RemoteFileNotFound", eCurlErrError);
574
+ eCurlErrAgain = rb_define_class_under(mCurlErr, "Again", eCurlErrError);
575
+
504
576
  eCurlErrSSLCertificate = rb_define_class_under(mCurlErr, "SSLCertificateError", eCurlErrError);
505
577
  eCurlErrSSLCipher = rb_define_class_under(mCurlErr, "SSLCypherError", eCurlErrError);
506
578
  eCurlErrSSLCACertificate = rb_define_class_under(mCurlErr, "SSLCACertificateError", eCurlErrError);
507
579
  eCurlErrBadContentEncoding = rb_define_class_under(mCurlErr, "BadContentEncodingError", eCurlErrError);
580
+ eCurlErrSSLCacertBadfile = rb_define_class_under(mCurlErr, "SSLCaertBadFile", eCurlErrError);
581
+ eCurlErrSSLCRLBadfile = rb_define_class_under(mCurlErr, "SSLCRLBadfile", eCurlErrError);
582
+ eCurlErrSSLIssuerError = rb_define_class_under(mCurlErr, "SSLIssuerError", eCurlErrError);
583
+ eCurlErrSSLShutdownFailed = rb_define_class_under(mCurlErr, "SSLShutdownFailed", eCurlErrError);
584
+ eCurlErrSSH = rb_define_class_under(mCurlErr, "SSH", eCurlErrError);
508
585
 
509
586
  eCurlErrLDAPInvalidURL = rb_define_class_under(mCurlErr, "InvalidLDAPURLError", eCurlErrLDAPError);
510
587
 
data/ext/curb_errors.h CHANGED
@@ -97,6 +97,15 @@ extern VALUE eCurlErrTFTPIllegalOperation;
97
97
  extern VALUE eCurlErrTFTPUnknownID;
98
98
  extern VALUE eCurlErrTFTPFileExists;
99
99
  extern VALUE eCurlErrTFTPNoSuchUser;
100
+ extern VALUE eCurlErrConvFailed;
101
+ extern VALUE eCurlErrConvReqd;
102
+ extern VALUE eCurlErrSSLCacertBadfile;
103
+ extern VALUE eCurlErrRemoteFileNotFound;
104
+ extern VALUE eCurlErrSSH;
105
+ extern VALUE eCurlErrSSLShutdownFailed;
106
+ extern VALUE eCurlErrAgain;
107
+ extern VALUE eCurlErrSSLCRLBadfile;
108
+ extern VALUE eCurlErrSSLIssuerError;
100
109
 
101
110
  /* multi errors */
102
111
  extern VALUE mCurlErrCallMultiPerform;
data/ext/curb_multi.c CHANGED
@@ -42,7 +42,19 @@ static void curl_multi_mark(ruby_curl_multi *rbcm) {
42
42
  }
43
43
 
44
44
  static void curl_multi_flush_easy(VALUE key, VALUE easy, ruby_curl_multi *rbcm) {
45
- rb_curl_multi_remove(rbcm, easy);
45
+ //rb_curl_multi_remove(rbcm, easy);
46
+ CURLMcode result;
47
+ ruby_curl_easy *rbce;
48
+ Data_Get_Struct(easy, ruby_curl_easy, rbce);
49
+ result = curl_multi_remove_handle(rbcm->handle, rbce->curl);
50
+ if (result != 0) {
51
+ raise_curl_multi_error_exception(result);
52
+ }
53
+ // XXX: easy handle may not be finished yet... so don't clean it GC pass will get it next time
54
+ VALUE r = rb_hash_delete( rbcm->requests, easy );
55
+ if( r != easy || r == Qnil ) {
56
+ rb_raise(rb_eRuntimeError, "Critical:: Unable to remove easy from requests");
57
+ }
46
58
  }
47
59
 
48
60
  static void curl_multi_free(ruby_curl_multi *rbcm) {
@@ -187,7 +199,7 @@ static void rb_curl_multi_remove(ruby_curl_multi *rbcm, VALUE easy) {
187
199
  // active should equal INT2FIX(RHASH(rbcm->requests)->tbl->num_entries)
188
200
  VALUE r = rb_hash_delete( rbcm->requests, easy );
189
201
  if( r != easy || r == Qnil ) {
190
- fprintf(stderr, "Critical:: Unable to remove easy from requests\n");
202
+ rb_raise(rb_eRuntimeError, "Critical:: Unable to remove easy from requests");
191
203
  }
192
204
  }
193
205
 
data/ext/extconf.rb CHANGED
@@ -78,6 +78,17 @@ have_constant "curle_login_denied"
78
78
  # older than 7.16.3
79
79
  have_constant "curlmopt_maxconnects"
80
80
 
81
+ # additional consts
82
+ have_constant "curle_conv_failed"
83
+ have_constant "curle_conv_reqd"
84
+ have_constant "curle_ssl_cacert_badfile"
85
+ have_constant "curle_remote_file_not_found"
86
+ have_constant "curle_ssh"
87
+ have_constant "curle_ssl_shutdown_failed"
88
+ have_constant "curle_again"
89
+ have_constant "curle_ssl_crl_badfile"
90
+ have_constant "curle_ssl_issuer_error"
91
+
81
92
  # centos 4.5 build of libcurl
82
93
  have_constant "curlm_bad_socket"
83
94
  have_constant "curlm_unknown_option"
@@ -432,7 +432,21 @@ class TestCurbCurlEasy < Test::Unit::TestCase
432
432
  assert c.enable_cookies = true
433
433
  assert c.enable_cookies?
434
434
  end
435
-
435
+
436
+ def test_cookies_option
437
+ c = Curl::Easy.new
438
+ assert_nil c.cookies
439
+ assert_equal "name1=content1; name2=content2;", c.cookies = "name1=content1; name2=content2;"
440
+ assert_equal "name1=content1; name2=content2;", c.cookies
441
+ end
442
+
443
+ def test_cookiefile
444
+ c = Curl::Easy.new
445
+ assert_nil c.cookiefile
446
+ assert_equal "some.file", c.cookiefile = "some.file"
447
+ assert_equal "some.file", c.cookiefile
448
+ end
449
+
436
450
  def test_cookiejar
437
451
  c = Curl::Easy.new
438
452
  assert_nil c.cookiejar
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: taf2-curb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5.0
4
+ version: 0.3.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ross Bamford
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-06-09 00:00:00 -07:00
13
+ date: 2009-06-13 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies: []
16
16