curb 1.0.8 → 1.1.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 +4 -4
- data/{README.markdown → README.md} +118 -16
- data/Rakefile +4 -0
- data/ext/curb.h +4 -4
- data/ext/curb_easy.c +22 -1
- data/ext/curb_multi.c +20 -0
- data/ext/extconf.rb +3 -0
- data/lib/curl.rb +0 -1
- data/tests/bug_resolve.rb +15 -0
- data/tests/helper.rb +1 -0
- data/tests/tc_curl_easy.rb +22 -9
- data/tests/tc_curl_multi.rb +19 -0
- data/tests/tc_curl_postfield.rb +2 -1
- metadata +10 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25a6615cec70148cb19373a5ad0326a93b2e1b4424bd2d02734038857e261659
|
4
|
+
data.tar.gz: 85f2b05e3fd7e8b400d8cd86d65aa2778e4c60e55337442e34d6cda673278c55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de609adca7bcd45c867a8fa91a20caa429e0064c68587d498bf25f455a1d4c49c6d00ec851af7c80aa1cc2694b4d0dd19291ebfb9b3010793dd8fa8c28e22d4c
|
7
|
+
data.tar.gz: af3d577715760e6b6ca977c5a6295d0af5d8b60858d673675d778deff7b06120876b72975ea35062c5299ac45fbab2d45a70b375cf94d07b410eb8c649a443d1
|
@@ -10,6 +10,8 @@ cURL and libcurl live at [https://curl.se/libcurl/](https://curl.se/libcurl/) .
|
|
10
10
|
|
11
11
|
Curb is a work-in-progress, and currently only supports libcurl's `easy` and `multi` modes.
|
12
12
|
|
13
|
+
A big advantage to Curb over all other known ruby http libraries is it's ability to handle timeouts without the use of threads.
|
14
|
+
|
13
15
|
## License
|
14
16
|
|
15
17
|
Curb is copyright (c) 2006 Ross Bamford, and released under the terms of the
|
@@ -37,6 +39,103 @@ POST request
|
|
37
39
|
puts res.body
|
38
40
|
```
|
39
41
|
|
42
|
+
## FTP Support
|
43
|
+
|
44
|
+
require 'curb'
|
45
|
+
|
46
|
+
### Basic FTP Download
|
47
|
+
```ruby
|
48
|
+
puts "=== FTP Download Example ==="
|
49
|
+
ftp = Curl::Easy.new('ftp://ftp.example.com/remote/file.txt')
|
50
|
+
ftp.username = 'user'
|
51
|
+
ftp.password = 'password'
|
52
|
+
ftp.perform
|
53
|
+
puts ftp.body
|
54
|
+
```
|
55
|
+
|
56
|
+
### FTP Upload
|
57
|
+
```ruby
|
58
|
+
puts "\n=== FTP Upload Example ==="
|
59
|
+
upload = Curl::Easy.new('ftp://ftp.example.com/remote/upload.txt')
|
60
|
+
upload.username = 'user'
|
61
|
+
upload.password = 'password'
|
62
|
+
upload.upload = true
|
63
|
+
upload.put_data = File.read('local_file.txt')
|
64
|
+
upload.perform
|
65
|
+
```
|
66
|
+
|
67
|
+
### List Directory Contents
|
68
|
+
```ruby
|
69
|
+
puts "\n=== FTP Directory Listing Example ==="
|
70
|
+
list = Curl::Easy.new('ftp://ftp.example.com/remote/directory/')
|
71
|
+
list.username = 'user'
|
72
|
+
list.password = 'password'
|
73
|
+
list.dirlistonly = true
|
74
|
+
list.perform
|
75
|
+
puts list.body
|
76
|
+
```
|
77
|
+
|
78
|
+
### Advanced FTP Usage with Various Options
|
79
|
+
```
|
80
|
+
puts "\n=== Advanced FTP Example ==="
|
81
|
+
advanced = Curl::Easy.new do |curl|
|
82
|
+
curl.url = 'ftp://ftp.example.com/remote/file.txt'
|
83
|
+
curl.username = 'user'
|
84
|
+
curl.password = 'password'
|
85
|
+
|
86
|
+
# FTP Options
|
87
|
+
curl.ftp_response_timeout = 30
|
88
|
+
curl.ftp_create_missing_dirs = true # Create directories if they don't exist
|
89
|
+
curl.ftp_filemethod = Curl::CURL_MULTICWD # Use multicwd method for traversing paths
|
90
|
+
|
91
|
+
# SSL/TLS Options for FTPS
|
92
|
+
curl.use_ssl = Curl::CURLUSESSL_ALL # Use SSL/TLS for control and data
|
93
|
+
curl.ssl_verify_peer = true
|
94
|
+
curl.ssl_verify_host = true
|
95
|
+
curl.cacert = "/path/to/cacert.pem"
|
96
|
+
|
97
|
+
# Progress callback
|
98
|
+
curl.on_progress do |dl_total, dl_now, ul_total, ul_now|
|
99
|
+
puts "Download: #{dl_now}/#{dl_total} Upload: #{ul_now}/#{ul_total}"
|
100
|
+
true # must return true to continue
|
101
|
+
end
|
102
|
+
|
103
|
+
# Debug output
|
104
|
+
curl.verbose = true
|
105
|
+
curl.on_debug do |type, data|
|
106
|
+
puts "#{type}: #{data}"
|
107
|
+
true
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
advanced.perform
|
112
|
+
```
|
113
|
+
|
114
|
+
### Parallel FTP Downloads
|
115
|
+
```
|
116
|
+
puts "\n=== Parallel FTP Downloads Example ==="
|
117
|
+
urls = [
|
118
|
+
'ftp://ftp.example.com/file1.txt',
|
119
|
+
'ftp://ftp.example.com/file2.txt',
|
120
|
+
'ftp://ftp.example.com/file3.txt'
|
121
|
+
]
|
122
|
+
```
|
123
|
+
|
124
|
+
### Common options for all connections
|
125
|
+
```
|
126
|
+
options = {
|
127
|
+
:username => 'user',
|
128
|
+
:password => 'password',
|
129
|
+
:timeout => 30,
|
130
|
+
:on_success => proc { |easy| puts "Successfully downloaded: #{easy.url}" },
|
131
|
+
:on_failure => proc { |easy, code| puts "Failed to download: #{easy.url} (#{code})" }
|
132
|
+
}
|
133
|
+
|
134
|
+
Curl::Multi.download(urls, options) do |curl, file_path|
|
135
|
+
puts "Completed downloading to: #{file_path}"
|
136
|
+
end
|
137
|
+
```
|
138
|
+
|
40
139
|
## You will need
|
41
140
|
|
42
141
|
* A working Ruby installation (`2.0.0+` will work but `2.1+` preferred) (it's possible it still works with 1.8.7 but you'd have to tell me if not...)
|
@@ -50,20 +149,23 @@ A **non-exhaustive** set of compatibility versions of the libcurl library
|
|
50
149
|
with this gem are as follows. (Note that these are only the ones that have been
|
51
150
|
tested and reported to work across a variety of platforms / rubies)
|
52
151
|
|
53
|
-
| Gem Version | Release Date
|
54
|
-
| ----------- |
|
55
|
-
| 1.0.
|
56
|
-
| 1.0.
|
57
|
-
| 1.0.
|
58
|
-
| 1.0.
|
59
|
-
| 1.0.
|
60
|
-
| 1.0.
|
61
|
-
| 0.
|
62
|
-
| 0.
|
63
|
-
| 0.
|
64
|
-
| 0.9.
|
65
|
-
| 0.9.
|
66
|
-
| 0.9.
|
152
|
+
| Gem Version | Release Date | libcurl versions |
|
153
|
+
| ----------- | -------------- | ----------------- |
|
154
|
+
| 1.0.8 | Feb 10, 2025 | 7.58 – 8.12.1 |
|
155
|
+
| 1.0.7 | Feb 09, 2025 | 7.58 – 8.12.1 |
|
156
|
+
| 1.0.6 | Aug 23, 2024 | 7.58 – 8.12.1 |
|
157
|
+
| 1.0.5 | Jan 2023 | 7.58 – 8.12.1 |
|
158
|
+
| 1.0.4 | Jan 2023 | 7.58 – 8.12.1 |
|
159
|
+
| 1.0.3* | Dec 2022 | 7.58 – 8.12.1 |
|
160
|
+
| 1.0.2* | Dec 2022 | 7.58 – 8.12.1 |
|
161
|
+
| 1.0.1 | Apr 2022 | 7.58 – 8.12.1 |
|
162
|
+
| 1.0.0 | Jan 2022 | 7.58 – 8.12.1 |
|
163
|
+
| 0.9.8 | Jan 2019 | 7.58 – 7.81 |
|
164
|
+
| 0.9.7 | Nov 2018 | 7.56 – 7.60 |
|
165
|
+
| 0.9.6 | May 2018 | 7.51 – 7.59 |
|
166
|
+
| 0.9.5 | May 2018 | 7.51 – 7.59 |
|
167
|
+
| 0.9.4 | Aug 2017 | 7.41 – 7.58 |
|
168
|
+
| 0.9.3 | Apr 2016 | 7.26 – 7.58 |
|
67
169
|
|
68
170
|
```*avoid using these version are known to have issues with segmentation faults```
|
69
171
|
|
@@ -215,7 +317,7 @@ c = Curl::Easy.new
|
|
215
317
|
["http://www.google.co.uk", "http://www.ruby-lang.org/"].map do |url|
|
216
318
|
c.url = url
|
217
319
|
c.perform
|
218
|
-
c.
|
320
|
+
c.body
|
219
321
|
end
|
220
322
|
```
|
221
323
|
|
@@ -242,7 +344,7 @@ c = Curl::Easy.new("https://http2.akamai.com")
|
|
242
344
|
c.set(:HTTP_VERSION, Curl::HTTP_2_0)
|
243
345
|
|
244
346
|
c.perform
|
245
|
-
puts (c.
|
347
|
+
puts (c.body.include? "You are using HTTP/2 right now!") ? "HTTP/2" : "HTTP/1.x"
|
246
348
|
```
|
247
349
|
|
248
350
|
### Multi Interface (Basic HTTP GET):
|
data/Rakefile
CHANGED
data/ext/curb.h
CHANGED
@@ -28,11 +28,11 @@
|
|
28
28
|
#include "curb_macros.h"
|
29
29
|
|
30
30
|
// These should be managed from the Rake 'release' task.
|
31
|
-
#define CURB_VERSION "1.0
|
32
|
-
#define CURB_VER_NUM
|
31
|
+
#define CURB_VERSION "1.1.0"
|
32
|
+
#define CURB_VER_NUM 1010
|
33
33
|
#define CURB_VER_MAJ 1
|
34
|
-
#define CURB_VER_MIN
|
35
|
-
#define CURB_VER_MIC
|
34
|
+
#define CURB_VER_MIN 1
|
35
|
+
#define CURB_VER_MIC 0
|
36
36
|
#define CURB_VER_PATCH 0
|
37
37
|
|
38
38
|
|
data/ext/curb_easy.c
CHANGED
@@ -2535,7 +2535,7 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2535
2535
|
rb_iterate(rb_each, rb_easy_get("proxy_headers"), cb_each_http_proxy_header, wrap);
|
2536
2536
|
} else {
|
2537
2537
|
VALUE proxy_headers_str = rb_obj_as_string(rb_easy_get("proxy_headers"));
|
2538
|
-
*phdrs = curl_slist_append(*
|
2538
|
+
*phdrs = curl_slist_append(*phdrs, StringValuePtr(proxy_headers_str));
|
2539
2539
|
}
|
2540
2540
|
|
2541
2541
|
if (*phdrs) {
|
@@ -3821,6 +3821,27 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
|
3821
3821
|
case CURLOPT_PROXY_SSL_VERIFYHOST:
|
3822
3822
|
curl_easy_setopt(rbce->curl, CURLOPT_PROXY_SSL_VERIFYHOST, NUM2LONG(val));
|
3823
3823
|
break;
|
3824
|
+
#endif
|
3825
|
+
#if HAVE_CURLOPT_RESOLVE
|
3826
|
+
case CURLOPT_RESOLVE: {
|
3827
|
+
struct curl_slist *list = NULL;
|
3828
|
+
if (NIL_P(val)) {
|
3829
|
+
/* When nil is passed, we clear any previous resolve list */
|
3830
|
+
list = NULL;
|
3831
|
+
} else if (TYPE(val) == T_ARRAY) {
|
3832
|
+
long i, len = RARRAY_LEN(val);
|
3833
|
+
for (i = 0; i < len; i++) {
|
3834
|
+
VALUE item = rb_ary_entry(val, i);
|
3835
|
+
list = curl_slist_append(list, StringValueCStr(item));
|
3836
|
+
}
|
3837
|
+
} else {
|
3838
|
+
/* If a single string is passed, use it directly */
|
3839
|
+
list = curl_slist_append(NULL, StringValueCStr(val));
|
3840
|
+
}
|
3841
|
+
/* Save the list pointer in the ruby_curl_easy structure for cleanup later */
|
3842
|
+
rbce->curl_resolve = list;
|
3843
|
+
curl_easy_setopt(rbce->curl, CURLOPT_RESOLVE, list);
|
3844
|
+
} break;
|
3824
3845
|
#endif
|
3825
3846
|
default:
|
3826
3847
|
rb_raise(rb_eTypeError, "Curb unsupported option");
|
data/ext/curb_multi.c
CHANGED
@@ -187,6 +187,25 @@ static VALUE ruby_curl_multi_max_connects(VALUE self, VALUE count) {
|
|
187
187
|
return count;
|
188
188
|
}
|
189
189
|
|
190
|
+
/*
|
191
|
+
* call-seq:
|
192
|
+
* multi = Curl::Multi.new
|
193
|
+
* multi.max_host_connections = 1
|
194
|
+
*
|
195
|
+
* Set the max number of connections per host
|
196
|
+
*/
|
197
|
+
static VALUE ruby_curl_multi_max_host_connections(VALUE self, VALUE count) {
|
198
|
+
#ifdef HAVE_CURLMOPT_MAX_HOST_CONNECTIONS
|
199
|
+
ruby_curl_multi *rbcm;
|
200
|
+
|
201
|
+
Data_Get_Struct(self, ruby_curl_multi, rbcm);
|
202
|
+
|
203
|
+
curl_multi_setopt(rbcm->handle, CURLMOPT_MAX_HOST_CONNECTIONS, NUM2LONG(count));
|
204
|
+
#endif
|
205
|
+
|
206
|
+
return count;
|
207
|
+
}
|
208
|
+
|
190
209
|
/*
|
191
210
|
* call-seq:
|
192
211
|
* multi = Curl::Multi.new
|
@@ -704,6 +723,7 @@ void init_curb_multi() {
|
|
704
723
|
rb_define_singleton_method(cCurlMulti, "autoclose", ruby_curl_multi_get_autoclose, 0);
|
705
724
|
/* Instance methods */
|
706
725
|
rb_define_method(cCurlMulti, "max_connects=", ruby_curl_multi_max_connects, 1);
|
726
|
+
rb_define_method(cCurlMulti, "max_host_connections=", ruby_curl_multi_max_host_connections, 1);
|
707
727
|
rb_define_method(cCurlMulti, "pipeline=", ruby_curl_multi_pipeline, 1);
|
708
728
|
rb_define_method(cCurlMulti, "_add", ruby_curl_multi_add, 1);
|
709
729
|
rb_define_method(cCurlMulti, "_remove", ruby_curl_multi_remove, 1);
|
data/ext/extconf.rb
CHANGED
@@ -338,6 +338,9 @@ have_constant :CURL_SSLVERSION_TLSv1
|
|
338
338
|
have_constant :CURL_SSLVERSION_SSLv2
|
339
339
|
have_constant :CURL_SSLVERSION_SSLv3
|
340
340
|
|
341
|
+
# Added in 7.30.0
|
342
|
+
have_constant "curlmopt_max_host_connections"
|
343
|
+
|
341
344
|
# Added in 7.34.0
|
342
345
|
have_constant :CURL_SSLVERSION_TLSv1_0
|
343
346
|
have_constant :CURL_SSLVERSION_TLSv1_1
|
data/lib/curl.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
2
|
+
|
3
|
+
class BugResolve < Test::Unit::TestCase
|
4
|
+
include BugTestServerSetupTeardown
|
5
|
+
|
6
|
+
def test_abuse_resolve
|
7
|
+
c = Curl::Easy.new("http://localhost:#{@port}/test")
|
8
|
+
while true
|
9
|
+
c.get
|
10
|
+
assert_equal 200, c.response_code
|
11
|
+
assert_match(/hi/, c.body)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
data/tests/helper.rb
CHANGED
data/tests/tc_curl_easy.rb
CHANGED
@@ -18,6 +18,20 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
18
18
|
assert_equal 200, easy.code
|
19
19
|
end
|
20
20
|
|
21
|
+
def test_curlopt_resolve
|
22
|
+
require 'resolv'
|
23
|
+
uri = URI.parse(TestServlet.url)
|
24
|
+
resolved_ip = Resolv.getaddress(uri.host) # perform DNS lookup once
|
25
|
+
mapping = "#{uri.host}:#{uri.port}:#{resolved_ip}"
|
26
|
+
|
27
|
+
http = Curl::Easy.new(TestServlet.url)
|
28
|
+
http.setopt(Curl::CURLOPT_RESOLVE, [mapping])
|
29
|
+
|
30
|
+
http.get
|
31
|
+
|
32
|
+
assert_match(/GET/, http.body)
|
33
|
+
end
|
34
|
+
|
21
35
|
def test_curlopt_stderr_with_file
|
22
36
|
# does not work with Tempfile directly
|
23
37
|
path = Tempfile.new('curb_test_curlopt_stderr').path
|
@@ -805,8 +819,8 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
805
819
|
curl = Curl::Easy.new(TestServlet.url)
|
806
820
|
curl.multipart_form_post = true
|
807
821
|
fields = [
|
808
|
-
Curl::PostField.file('foo', File.expand_path(File.join(File.dirname(__FILE__),'..','README.
|
809
|
-
Curl::PostField.file('bar', File.expand_path(File.join(File.dirname(__FILE__),'..','README.
|
822
|
+
Curl::PostField.file('foo', File.expand_path(File.join(File.dirname(__FILE__),'..','README.md'))),
|
823
|
+
Curl::PostField.file('bar', File.expand_path(File.join(File.dirname(__FILE__),'..','README.md')))
|
810
824
|
]
|
811
825
|
curl.http_post(fields)
|
812
826
|
assert_match(/HTTP POST file upload/, curl.body_str)
|
@@ -815,8 +829,8 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
815
829
|
curl = Curl::Easy.new(TestServlet.url)
|
816
830
|
curl.multipart_form_post = true
|
817
831
|
fields = [
|
818
|
-
Curl::PostField.file('foo', File.expand_path(File.join(File.dirname(__FILE__),'..','README.
|
819
|
-
Curl::PostField.file('bar', File.expand_path(File.join(File.dirname(__FILE__),'..','README.
|
832
|
+
Curl::PostField.file('foo', File.expand_path(File.join(File.dirname(__FILE__),'..','README.md'))),
|
833
|
+
Curl::PostField.file('bar', File.expand_path(File.join(File.dirname(__FILE__),'..','README.md')))
|
820
834
|
]
|
821
835
|
curl.http_put(fields)
|
822
836
|
assert_match(/HTTP POST file upload/, curl.body_str)
|
@@ -866,7 +880,7 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
866
880
|
[:put, :post, :patch].each {|method|
|
867
881
|
curl = Curl::Easy.new(TestServlet.url)
|
868
882
|
curl.multipart_form_post = true
|
869
|
-
pf = Curl::PostField.file('readme', File.expand_path(File.join(File.dirname(__FILE__),'..','README.
|
883
|
+
pf = Curl::PostField.file('readme', File.expand_path(File.join(File.dirname(__FILE__),'..','README.md')))
|
870
884
|
curl.send("http_#{method}", pf)
|
871
885
|
assert_match(/HTTP POST file upload/, curl.body_str)
|
872
886
|
assert_match(/Content-Disposition: form-data/, curl.body_str)
|
@@ -1048,7 +1062,7 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
1048
1062
|
end
|
1049
1063
|
|
1050
1064
|
def test_post_streaming
|
1051
|
-
readme = File.expand_path(File.join(File.dirname(__FILE__),'..','README.
|
1065
|
+
readme = File.expand_path(File.join(File.dirname(__FILE__),'..','README.md'))
|
1052
1066
|
|
1053
1067
|
pf = Curl::PostField.file("filename", readme)
|
1054
1068
|
|
@@ -1058,11 +1072,10 @@ class TestCurbCurlEasy < Test::Unit::TestCase
|
|
1058
1072
|
easy.multipart_form_post = true
|
1059
1073
|
easy.http_post(pf)
|
1060
1074
|
|
1061
|
-
assert_not_equal(0,easy.
|
1062
|
-
assert_equal(easy.
|
1075
|
+
assert_not_equal(0,easy.body.size)
|
1076
|
+
assert_equal(Digest::MD5.hexdigest(easy.body), Digest::MD5.hexdigest(File.read(readme)))
|
1063
1077
|
end
|
1064
1078
|
|
1065
|
-
|
1066
1079
|
def test_easy_close
|
1067
1080
|
easy = Curl::Easy.new
|
1068
1081
|
easy.close
|
data/tests/tc_curl_multi.rb
CHANGED
@@ -552,6 +552,25 @@ class TestCurbCurlMulti < Test::Unit::TestCase
|
|
552
552
|
end
|
553
553
|
end
|
554
554
|
|
555
|
+
def test_multi_easy_http_with_max_host_connections
|
556
|
+
urls = [
|
557
|
+
{ :url => TestServlet.url + '?q=1', :method => :get },
|
558
|
+
{ :url => TestServlet.url + '?q=2', :method => :get },
|
559
|
+
{ :url => TestServlet.url + '?q=3', :method => :get }
|
560
|
+
]
|
561
|
+
Curl::Multi.http(urls, {:pipeline => true, :max_host_connections => 1}) do|easy, code, method|
|
562
|
+
assert_equal 200, code
|
563
|
+
case method
|
564
|
+
when :post
|
565
|
+
assert_match(/POST/, easy.body)
|
566
|
+
when :get
|
567
|
+
assert_match(/GET/, easy.body)
|
568
|
+
when :put
|
569
|
+
assert_match(/PUT/, easy.body)
|
570
|
+
end
|
571
|
+
end
|
572
|
+
end
|
573
|
+
|
555
574
|
def test_multi_recieves_500
|
556
575
|
m = Curl::Multi.new
|
557
576
|
e = Curl::Easy.new("http://127.0.0.1:9129/methods")
|
data/tests/tc_curl_postfield.rb
CHANGED
@@ -58,12 +58,13 @@ class TestCurbCurlPostfield < Test::Unit::TestCase
|
|
58
58
|
|
59
59
|
def test_new_file_01
|
60
60
|
pf = Curl::PostField.file('foo', 'localname')
|
61
|
+
pf.content_type = 'text/super'
|
61
62
|
|
62
63
|
assert_equal 'foo', pf.name
|
63
64
|
assert_equal 'localname', pf.local_file
|
64
65
|
assert_equal 'localname', pf.remote_file
|
65
66
|
assert_nothing_raised { pf.to_s }
|
66
|
-
|
67
|
+
assert_equal 'text/super', pf.content_type
|
67
68
|
assert_nil pf.content
|
68
69
|
assert_nil pf.set_content_proc
|
69
70
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: curb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ross Bamford
|
8
8
|
- Todd A. Fisher
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Curb (probably CUrl-RuBy or something) provides Ruby-language bindings
|
14
14
|
for the libcurl(3), a fully-featured client-side URL transfer library. cURL and
|
@@ -19,10 +19,10 @@ extensions:
|
|
19
19
|
- ext/extconf.rb
|
20
20
|
extra_rdoc_files:
|
21
21
|
- LICENSE
|
22
|
-
- README.
|
22
|
+
- README.md
|
23
23
|
files:
|
24
24
|
- LICENSE
|
25
|
-
- README.
|
25
|
+
- README.md
|
26
26
|
- Rakefile
|
27
27
|
- doc.rb
|
28
28
|
- ext/banned.h
|
@@ -58,6 +58,7 @@ files:
|
|
58
58
|
- tests/bug_postfields_crash2.rb
|
59
59
|
- tests/bug_raise_on_callback.rb
|
60
60
|
- tests/bug_require_last_or_segfault.rb
|
61
|
+
- tests/bug_resolve.rb
|
61
62
|
- tests/bugtests.rb
|
62
63
|
- tests/helper.rb
|
63
64
|
- tests/mem_check.rb
|
@@ -79,10 +80,11 @@ files:
|
|
79
80
|
homepage: https://github.com/taf2/curb
|
80
81
|
licenses:
|
81
82
|
- Ruby
|
82
|
-
metadata:
|
83
|
+
metadata:
|
84
|
+
changelog_uri: https://github.com/taf2/curb/blob/master/ChangeLog.md
|
83
85
|
rdoc_options:
|
84
86
|
- "--main"
|
85
|
-
- README.
|
87
|
+
- README.md
|
86
88
|
require_paths:
|
87
89
|
- lib
|
88
90
|
- ext
|
@@ -97,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
99
|
- !ruby/object:Gem::Version
|
98
100
|
version: '0'
|
99
101
|
requirements: []
|
100
|
-
rubygems_version: 3.6.
|
102
|
+
rubygems_version: 3.6.9
|
101
103
|
specification_version: 4
|
102
104
|
summary: Ruby libcurl bindings
|
103
105
|
test_files:
|
@@ -115,6 +117,7 @@ test_files:
|
|
115
117
|
- tests/bug_postfields_crash2.rb
|
116
118
|
- tests/bug_raise_on_callback.rb
|
117
119
|
- tests/bug_require_last_or_segfault.rb
|
120
|
+
- tests/bug_resolve.rb
|
118
121
|
- tests/bugtests.rb
|
119
122
|
- tests/helper.rb
|
120
123
|
- tests/mem_check.rb
|