ruby-curl 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []