ruby-curl 1.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 13f93a17df3585dd60eebdd91ebd2595a3278b3076a86eadc9324ddb3c952d73
4
- data.tar.gz: 950c69c1206777280e5baea3eedf80df8d5ca2c54852b9d4e57ae8ecaecb15ea
3
+ metadata.gz: db064c18f442a946d1a99c455d2b838e133cb9acbc103f0eeb0a9588d1ebfff1
4
+ data.tar.gz: 7e603e2b87f653d7c8cc3be86f63325586fea95b8d5c522b493cd34956d5afec
5
5
  SHA512:
6
- metadata.gz: 0b75b69a4b95aeec5d42d29f196162fde96ea0ba647bce18626f96b9c6545dfa97e4c3de7609c818a48508533c575deda4da870120a8dccdb8ac237cff2ffefa
7
- data.tar.gz: 0e39eb0dca94ba1101a21a126dae4d94419dd890d6e1fc627234c5f93a8c6e4ecc95199fac0056f5e6dbdb5e2b590f8c43ae82f496a5c2d9dffdc0ba2d98af11
6
+ metadata.gz: 3dd4cc7dfedc122584dd9f09e3c58ec6b9e6c936879b4c689b3b24f8a11b5eed2ecb818a29be083b3a605454f5ed06520d1be840cb855708d21963ef9def1ca0
7
+ data.tar.gz: 814b67e4949cc544ee11ed05d2c96e049c1738e310469e9912e03fa40b80a59309468b4bfd9ad2102b82ee8bff754629d113a0b2a0f63144c336ed301f720f96
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec :name => 'ruby-curl'
data/README.md CHANGED
@@ -10,9 +10,9 @@ Ruby-curl aims to be a true libcurl binding for Ruby. Currently, ruby-curl offer
10
10
  # Requirements
11
11
 
12
12
  ```
13
- Ruby 1.9.3 or higher
13
+ Ruby 2.7 or higher
14
14
 
15
- Libcurl 7.19.0 or higher
15
+ Libcurl 7.28.0 or higher
16
16
  ```
17
17
 
18
18
 
data/ext/curl.c CHANGED
@@ -3,10 +3,11 @@
3
3
  VALUE rb_mCurl;
4
4
 
5
5
  void Init_curl() {
6
- VALUE rb_mOpt, rb_mInfo, rb_mProxy, rb_mAuth, rb_mProto, rb_mError;
6
+ VALUE rb_mOpt, rb_mMOpt, rb_mInfo, rb_mProxy, rb_mAuth, rb_mProto, rb_mError;
7
7
 
8
8
  rb_mCurl = rb_define_module("Curl");
9
9
  rb_mOpt = rb_define_module_under(rb_mCurl, "Opt");
10
+ rb_mMOpt = rb_define_module_under(rb_mCurl, "MOpt");
10
11
  rb_mInfo = rb_define_module_under(rb_mCurl, "Info");
11
12
  rb_mProxy = rb_define_module_under(rb_mCurl, "Proxy");
12
13
  rb_mAuth = rb_define_module_under(rb_mCurl, "Auth");
@@ -15,6 +16,8 @@ void Init_curl() {
15
16
 
16
17
  curl_global_init(CURL_GLOBAL_ALL);
17
18
 
19
+ rb_define_const(rb_mCurl, "LIBCURL_VERSION", rb_str_new_cstr(curl_version()));
20
+
18
21
  /* Curl constants */
19
22
  RB_DEFINE_M_CURL_CONST("HTTP_VERSION_NONE", CURL_HTTP_VERSION_NONE);
20
23
  RB_DEFINE_M_CURL_CONST("HTTP_VERSION_1_0", CURL_HTTP_VERSION_1_0);
@@ -222,6 +225,10 @@ void Init_curl() {
222
225
  RB_DEFINE_M_OPT_CONST("PROXYHEADER", CURLOPT_PROXYHEADER);
223
226
  #endif
224
227
 
228
+ /* Curl::MOpt constants */
229
+ RB_DEFINE_M_MOPT_CONST("MAXCONNECTS", CURLMOPT_MAXCONNECTS);
230
+ RB_DEFINE_M_MOPT_CONST("PIPELINING", CURLMOPT_PIPELINING);
231
+
225
232
  /* Curl::Info constants */
226
233
  RB_DEFINE_M_INFO_CONST("EFFECTIVE_URL", CURLINFO_EFFECTIVE_URL);
227
234
  RB_DEFINE_M_INFO_CONST("FILETIME", CURLINFO_FILETIME);
@@ -391,4 +398,5 @@ void Init_curl() {
391
398
  RB_DEFINE_M_ERROR_CONST("HTTP2_STREAM", CURLE_HTTP2_STREAM);
392
399
 
393
400
  Init_easy();
401
+ Init_multi();
394
402
  }
data/ext/curl.h CHANGED
@@ -12,6 +12,9 @@
12
12
  #define RB_DEFINE_M_OPT_CONST(name, curl_opt_name) \
13
13
  rb_define_const(rb_mOpt, name, LONG2NUM(curl_opt_name))
14
14
 
15
+ #define RB_DEFINE_M_MOPT_CONST(name, curl_mopt_name) \
16
+ rb_define_const(rb_mMOpt, name, LONG2NUM(curl_mopt_name))
17
+
15
18
  #define RB_DEFINE_M_INFO_CONST(name, curl_info_name) \
16
19
  rb_define_const(rb_mInfo, name, LONG2NUM(curl_info_name))
17
20
 
data/ext/easy.c CHANGED
@@ -58,6 +58,9 @@ void rb_curl_free(rb_curl_easy *rb_ch) {
58
58
  curl_slist_free_all(rb_ch->curl_http200aliases_slist);
59
59
  curl_slist_free_all(rb_ch->curl_hosts_slist);
60
60
  curl_slist_free_all(rb_ch->curl_headers_slist);
61
+ free(rb_ch->write_function);
62
+ free(rb_ch->write_header_function);
63
+ free(rb_ch->read_function);
61
64
  free(rb_ch);
62
65
  }
63
66
 
@@ -438,27 +441,39 @@ static VALUE rb_curl_easy_setopt(VALUE self, VALUE opt, VALUE val) {
438
441
  c_err_code = curl_easy_setopt(rb_ch->ch, option, NIL_P(val) ? NULL : StringValueCStr(val));
439
442
  break;
440
443
  case CURLOPT_WRITEFUNCTION:
441
- rb_ch->write_function = NIL_P(val) ? NULL : rb_normalized_str(val);
442
- curl_easy_setopt(rb_ch->ch, CURLOPT_WRITEDATA, rb_ch);
443
- c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_WRITEFUNCTION, rb_curl_write);
444
+ if (NIL_P(val)) {
445
+ c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_WRITEFUNCTION, NULL);
446
+ } else {
447
+ rb_ch->write_function = strdup(rb_normalized_str(val));
448
+ curl_easy_setopt(rb_ch->ch, CURLOPT_WRITEDATA, rb_ch);
449
+ c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_WRITEFUNCTION, rb_curl_write);
450
+ }
444
451
  break;
445
452
  case CURLOPT_WRITEDATA:
446
453
  rb_ch->write_data = val;
447
454
  c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_WRITEDATA, rb_ch);
448
455
  break;
449
456
  case CURLOPT_HEADERFUNCTION:
450
- rb_ch->write_header_function = NIL_P(val) ? NULL : rb_normalized_str(val);
451
- curl_easy_setopt(rb_ch->ch, CURLOPT_HEADERDATA, rb_ch);
452
- c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_HEADERFUNCTION, rb_curl_write_header);
457
+ if (NIL_P(val)) {
458
+ c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_HEADERFUNCTION, NULL);
459
+ } else {
460
+ rb_ch->write_header_function = strdup(rb_normalized_str(val));
461
+ curl_easy_setopt(rb_ch->ch, CURLOPT_HEADERDATA, rb_ch);
462
+ c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_HEADERFUNCTION, rb_curl_write_header);
463
+ }
453
464
  break;
454
465
  case CURLOPT_HEADERDATA:
455
466
  rb_ch->write_header_data = val;
456
467
  c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_HEADERDATA, rb_ch);
457
468
  break;
458
469
  case CURLOPT_READFUNCTION:
459
- rb_ch->read_function = NIL_P(val) ? NULL : rb_normalized_str(val);
460
- curl_easy_setopt(rb_ch->ch, CURLOPT_READDATA, rb_ch);
461
- c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_READFUNCTION, rb_curl_read);
470
+ if (NIL_P(val)) {
471
+ c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_READFUNCTION, NULL);
472
+ } else {
473
+ rb_ch->read_function = strdup(rb_normalized_str(val));
474
+ curl_easy_setopt(rb_ch->ch, CURLOPT_READDATA, rb_ch);
475
+ c_err_code = curl_easy_setopt(rb_ch->ch, CURLOPT_READFUNCTION, rb_curl_read);
476
+ }
462
477
  break;
463
478
  case CURLOPT_READDATA:
464
479
  rb_ch->read_data = val;
data/ext/multi.c ADDED
@@ -0,0 +1,133 @@
1
+ #include "easy.h"
2
+ #include "multi.h"
3
+
4
+ extern VALUE rb_mCurl;
5
+
6
+ VALUE rb_cMulti;
7
+
8
+ static VALUE rb_curl_multi_strerror(VALUE self, VALUE errornum) {
9
+ const char *error_str;
10
+
11
+ error_str = curl_multi_strerror(NUM2LONG(errornum));
12
+
13
+ return rb_str_new2(error_str);
14
+ }
15
+
16
+ void rb_curl_multi_mark(rb_curl_multi *rb_cmh) {
17
+ rb_gc_mark(rb_cmh->self);
18
+ }
19
+
20
+ void rb_curl_multi_free(rb_curl_multi *rb_cmh) {
21
+ free(rb_cmh);
22
+ }
23
+
24
+ static void rb_curl_multi_zero_state(rb_curl_multi *rb_cmh) {
25
+ rb_cmh->cmh = NULL;
26
+ }
27
+
28
+ static CURLMcode rb_curl_multi_add_handle(VALUE self, VALUE easy) {
29
+ CURLMcode cm_err_code;
30
+ rb_curl_easy *rb_ch;
31
+ rb_curl_multi *rb_cmh;
32
+
33
+ Data_Get_Struct(self, rb_curl_multi, rb_cmh);
34
+ Data_Get_Struct(easy, rb_curl_easy, rb_ch);
35
+
36
+ cm_err_code = curl_multi_add_handle(rb_cmh->cmh, rb_ch->ch);
37
+
38
+ return LONG2NUM(cm_err_code);
39
+ }
40
+
41
+ static CURLMcode rb_curl_multi_remove_handle(VALUE self, VALUE easy) {
42
+ CURLMcode cm_err_code;
43
+ rb_curl_easy *rb_ch;
44
+ rb_curl_multi *rb_cmh;
45
+
46
+ Data_Get_Struct(self, rb_curl_multi, rb_cmh);
47
+ Data_Get_Struct(easy, rb_curl_easy, rb_ch);
48
+
49
+ cm_err_code = curl_multi_remove_handle(rb_cmh->cmh, rb_ch->ch);
50
+
51
+ return LONG2NUM(cm_err_code);
52
+ }
53
+
54
+ static CURLMcode rb_curl_multi_cleanup(VALUE self) {
55
+ CURLMcode cm_err_code;
56
+ rb_curl_multi *rb_cmh;
57
+
58
+ Data_Get_Struct(self, rb_curl_multi, rb_cmh);
59
+
60
+ cm_err_code = curl_multi_cleanup(rb_cmh->cmh);
61
+
62
+ return LONG2NUM(cm_err_code);
63
+ }
64
+
65
+ static VALUE rb_curl_multi_setopt(VALUE self, VALUE opt, VALUE val) {
66
+ CURLMcode cm_err_code;
67
+ rb_curl_multi *rb_cmh;
68
+ long option = NUM2LONG(opt);
69
+
70
+ Data_Get_Struct(self, rb_curl_multi, rb_cmh);
71
+
72
+ switch (option) {
73
+ case CURLMOPT_MAXCONNECTS:
74
+ case CURLMOPT_PIPELINING:
75
+ cm_err_code = curl_multi_setopt(rb_cmh->cmh, option, NUM2LONG(val));
76
+ break;
77
+ default:
78
+ rb_raise(rb_eTypeError, "Unsupported option.");
79
+ }
80
+
81
+ return LONG2NUM(cm_err_code);
82
+ }
83
+
84
+ static VALUE rb_curl_multi_perform(VALUE self) {
85
+ rb_curl_multi *rb_cmh;
86
+ int running_handles;
87
+
88
+ Data_Get_Struct(self, rb_curl_multi, rb_cmh);
89
+
90
+ do {
91
+ curl_multi_perform(rb_cmh->cmh, &running_handles);
92
+
93
+ curl_multi_wait(rb_cmh->cmh, NULL, 0, 100000, NULL);
94
+ } while (running_handles);
95
+
96
+ return LONG2NUM(0);
97
+ }
98
+
99
+ static VALUE rb_curl_multi_allocate(VALUE klass) {
100
+ rb_curl_multi *rb_cmh;
101
+
102
+ rb_cmh = ALLOC(rb_curl_multi);
103
+ rb_curl_multi_zero_state(rb_cmh);
104
+
105
+ return Data_Wrap_Struct(klass, rb_curl_multi_mark, rb_curl_multi_free, rb_cmh);
106
+ }
107
+
108
+ static VALUE rb_curl_multi_initialize(int argc, VALUE *argv, VALUE self) {
109
+ rb_curl_multi *rb_cmh;
110
+
111
+ Data_Get_Struct(self, rb_curl_multi, rb_cmh);
112
+
113
+ rb_cmh->cmh = curl_multi_init();
114
+ if (!rb_cmh->cmh) {
115
+ rb_raise(rb_eRuntimeError, "Failed to initialize multi handle");
116
+ }
117
+
118
+ rb_cmh->self = self;
119
+
120
+ return self;
121
+ }
122
+
123
+ void Init_multi() {
124
+ rb_cMulti = rb_define_class_under(rb_mCurl, "Multi", rb_cObject);
125
+ rb_define_alloc_func(rb_cMulti, rb_curl_multi_allocate);
126
+ rb_define_singleton_method(rb_cMulti, "strerror", rb_curl_multi_strerror, 1);
127
+ rb_define_method(rb_cMulti, "initialize", rb_curl_multi_initialize, -1);
128
+ rb_define_method(rb_cMulti, "setopt", rb_curl_multi_setopt, 2);
129
+ rb_define_method(rb_cMulti, "add_handle", rb_curl_multi_add_handle, 1);
130
+ rb_define_method(rb_cMulti, "remove_handle", rb_curl_multi_remove_handle, 1);
131
+ rb_define_method(rb_cMulti, "perform", rb_curl_multi_perform, 0);
132
+ rb_define_method(rb_cMulti, "cleanup", rb_curl_multi_cleanup, 0);
133
+ }
data/ext/multi.h ADDED
@@ -0,0 +1,18 @@
1
+ #ifndef RUBY_CURL_MULTI_H
2
+ #define RUBY_CURL_MULTI_H
3
+
4
+ #include <ruby.h>
5
+ #include <curl/curl.h>
6
+ #include <curl/easy.h>
7
+ #include <curl/multi.h>
8
+
9
+ typedef struct {
10
+ CURLM *cmh;
11
+ VALUE self;
12
+ } rb_curl_multi;
13
+
14
+ extern VALUE rb_cMulti;
15
+
16
+ extern void Init_multi();
17
+
18
+ #endif
@@ -1,3 +1,3 @@
1
1
  module Curl
2
- VERSION = '1.0.2'
2
+ VERSION = '2.0.0'
3
3
  end
data/ruby-curl.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.email = ["vijayrepomailzbox@gmail.com", "singhshivam.172@gmail.com"]
13
13
  spec.homepage = "https://github.com/vijayrsv/ruby-curl"
14
14
  spec.license = "MIT"
15
- spec.required_ruby_version = ">= 1.9.3"
15
+ spec.required_ruby_version = ">= 2.7"
16
16
 
17
17
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
18
  # to allow pushing to a single host or delete this section to allow pushing to any host.
@@ -33,4 +33,8 @@ Gem::Specification.new do |spec|
33
33
 
34
34
  spec.add_development_dependency "bundler", "~> 1.15"
35
35
  spec.add_development_dependency "rake", "~> 10.0"
36
+
37
+ spec.add_dependency "stringio", "~> 3.0", ">= 3.0.8"
38
+
39
+ spec.requirements << "libcurl, >= 7.28.0"
36
40
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-curl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vijayakumar Ramachandran
8
8
  - Shivam Singh
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2019-04-27 00:00:00.000000000 Z
12
+ date: 2023-10-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -39,6 +39,26 @@ dependencies:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: '10.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: stringio
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.0'
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: 3.0.8
52
+ type: :runtime
53
+ prerelease: false
54
+ version_requirements: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: '3.0'
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 3.0.8
42
62
  description: True Ruby binding for cURL.
43
63
  email:
44
64
  - vijayrepomailzbox@gmail.com
@@ -48,6 +68,7 @@ extensions:
48
68
  - ext/extconf.rb
49
69
  extra_rdoc_files: []
50
70
  files:
71
+ - Gemfile
51
72
  - LICENSE.txt
52
73
  - README.md
53
74
  - ext/curl.c
@@ -55,6 +76,8 @@ files:
55
76
  - ext/easy.c
56
77
  - ext/easy.h
57
78
  - ext/extconf.rb
79
+ - ext/multi.c
80
+ - ext/multi.h
58
81
  - lib/ruby-curl.rb
59
82
  - lib/ruby-curl/version.rb
60
83
  - ruby-curl.gemspec
@@ -63,7 +86,7 @@ licenses:
63
86
  - MIT
64
87
  metadata:
65
88
  allowed_push_host: https://rubygems.org
66
- post_install_message:
89
+ post_install_message:
67
90
  rdoc_options: []
68
91
  require_paths:
69
92
  - lib
@@ -71,16 +94,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
71
94
  requirements:
72
95
  - - ">="
73
96
  - !ruby/object:Gem::Version
74
- version: 1.9.3
97
+ version: '2.7'
75
98
  required_rubygems_version: !ruby/object:Gem::Requirement
76
99
  requirements:
77
100
  - - ">="
78
101
  - !ruby/object:Gem::Version
79
102
  version: '0'
80
- requirements: []
81
- rubyforge_project:
82
- rubygems_version: 2.7.8
83
- signing_key:
103
+ requirements:
104
+ - libcurl, >= 7.28.0
105
+ rubygems_version: 3.3.26
106
+ signing_key:
84
107
  specification_version: 4
85
108
  summary: ''
86
109
  test_files: []