curb 1.3.6 → 1.4.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.md +71 -14
- data/Rakefile +12 -1
- data/ext/curb.c +26 -4
- data/ext/curb.h +4 -4
- data/ext/curb_easy.c +178 -77
- data/ext/curb_easy.h +1 -0
- data/ext/curb_multi.c +639 -225
- data/ext/curb_multi.h +4 -0
- data/ext/curb_postfield.c +31 -31
- data/ext/extconf.rb +10 -0
- data/lib/curl/easy.rb +18 -9
- data/lib/curl.rb +49 -12
- data/tests/helper.rb +300 -4
- data/tests/io_select_less_scheduler_probe.rb +105 -0
- data/tests/tc_curl_easy.rb +60 -4
- data/tests/tc_curl_easy_cookielist.rb +8 -4
- data/tests/tc_curl_easy_resolve.rb +2 -0
- data/tests/tc_curl_multi.rb +29 -0
- data/tests/tc_curl_multi_poll.rb +223 -0
- data/tests/tc_curl_multi_socket_poller.rb +374 -0
- data/tests/tc_curl_native_coverage.rb +1 -0
- data/tests/tc_curl_postfield.rb +39 -0
- data/tests/tc_fiber_scheduler.rb +433 -6
- data/tests/tc_ftp_options.rb +58 -0
- data/tests/tc_gc_compact.rb +53 -0
- data/tests/tc_ractor.rb +94 -0
- data/tests/tc_test_server_methods.rb +15 -0
- metadata +10 -2
data/tests/tc_ractor.rb
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require File.expand_path('helper', __dir__)
|
|
2
|
+
|
|
3
|
+
class TestCurbRactor < Test::Unit::TestCase
|
|
4
|
+
include TestServerMethods
|
|
5
|
+
|
|
6
|
+
RACTOR_WORKERS = 4
|
|
7
|
+
REQUESTS_PER_WORKER = 3
|
|
8
|
+
|
|
9
|
+
def setup
|
|
10
|
+
super
|
|
11
|
+
server_setup
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_exported_string_constants_are_shareable
|
|
15
|
+
omit('Ractor is unavailable on this Ruby') unless defined?(Ractor)
|
|
16
|
+
|
|
17
|
+
%i[CURB_VERSION VERSION CURL_VERSION LONG_VERSION CURL_LONG_VERSION].each do |name|
|
|
18
|
+
value = Curl.const_get(name)
|
|
19
|
+
assert_predicate value, :frozen?, "Curl::#{name} should be frozen"
|
|
20
|
+
assert Ractor.shareable?(value), "Curl::#{name} should be Ractor-shareable"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_independent_ractors_can_perform_requests_concurrently
|
|
25
|
+
original_timeout = Curl::Multi.default_timeout
|
|
26
|
+
original_autoclose = Curl::Multi.autoclose
|
|
27
|
+
omit_unless_curb_ractor_safe
|
|
28
|
+
|
|
29
|
+
url = TestServlet.url
|
|
30
|
+
|
|
31
|
+
workers = RACTOR_WORKERS.times.map do |worker_id|
|
|
32
|
+
Ractor.new(url, worker_id, REQUESTS_PER_WORKER) do |target, id, request_count|
|
|
33
|
+
Curl.safe! { |config| config.protocols = [:http] }
|
|
34
|
+
Curl::Multi.default_timeout = 25 + id
|
|
35
|
+
Curl::Multi.autoclose = true
|
|
36
|
+
|
|
37
|
+
responses = request_count.times.map do
|
|
38
|
+
chunks = 0
|
|
39
|
+
easy = Curl::Easy.new(target)
|
|
40
|
+
easy.on_body do |data|
|
|
41
|
+
chunks += 1
|
|
42
|
+
data.bytesize
|
|
43
|
+
end
|
|
44
|
+
easy.perform
|
|
45
|
+
[easy.response_code, chunks]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
{
|
|
49
|
+
responses: responses,
|
|
50
|
+
timeout: Curl::Multi.default_timeout,
|
|
51
|
+
autoclose: Curl::Multi.autoclose,
|
|
52
|
+
deferred_closes: Curl::Easy.deferred_multi_closes.length,
|
|
53
|
+
version: Curl::VERSION,
|
|
54
|
+
}
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
results = workers.map { |worker| ractor_value(worker) }
|
|
59
|
+
|
|
60
|
+
results.each_with_index do |result, worker_id|
|
|
61
|
+
assert_equal REQUESTS_PER_WORKER, result[:responses].length
|
|
62
|
+
result[:responses].each do |status, chunks|
|
|
63
|
+
assert_equal 200, status
|
|
64
|
+
assert_operator chunks, :>=, 1
|
|
65
|
+
end
|
|
66
|
+
assert_equal 25 + worker_id, result[:timeout]
|
|
67
|
+
assert_equal true, result[:autoclose]
|
|
68
|
+
assert_equal 0, result[:deferred_closes]
|
|
69
|
+
assert_equal Curl::VERSION, result[:version]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
assert_equal original_timeout, Curl::Multi.default_timeout
|
|
73
|
+
assert_equal original_autoclose, Curl::Multi.autoclose
|
|
74
|
+
ensure
|
|
75
|
+
Curl::Multi.default_timeout = original_timeout if defined?(original_timeout)
|
|
76
|
+
Curl::Multi.autoclose = original_autoclose if defined?(original_autoclose)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def omit_unless_curb_ractor_safe
|
|
82
|
+
omit('Ractor is unavailable on this Ruby') unless defined?(Ractor)
|
|
83
|
+
omit('This build does not advertise Ractor-safe native support') unless
|
|
84
|
+
Curl.const_defined?(:RACTOR_SAFE) && Curl::RACTOR_SAFE
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def ractor_value(ractor)
|
|
88
|
+
if ractor.respond_to?(:value)
|
|
89
|
+
ractor.value
|
|
90
|
+
else
|
|
91
|
+
ractor.take
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -107,4 +107,19 @@ class TestServerMethodsLockHandling < Test::Unit::TestCase
|
|
|
107
107
|
assert_equal false, File.exist?(locked_file)
|
|
108
108
|
assert_equal false, server_responding?(@__port)
|
|
109
109
|
end
|
|
110
|
+
|
|
111
|
+
def test_server_setup_reuses_the_process_server
|
|
112
|
+
server_setup(@__port)
|
|
113
|
+
first_server = @server
|
|
114
|
+
|
|
115
|
+
other = Object.new
|
|
116
|
+
other.extend(TestServerMethods)
|
|
117
|
+
lock_path = locked_file
|
|
118
|
+
other.define_singleton_method(:locked_file) { lock_path }
|
|
119
|
+
other.server_setup(@__port)
|
|
120
|
+
|
|
121
|
+
assert_same first_server, other.instance_variable_get(:@server)
|
|
122
|
+
ensure
|
|
123
|
+
other.stop_test_server if defined?(other) && other
|
|
124
|
+
end
|
|
110
125
|
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.
|
|
4
|
+
version: 1.4.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: 2026-
|
|
11
|
+
date: 2026-09-27 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
|
|
@@ -64,6 +64,7 @@ files:
|
|
|
64
64
|
- tests/bug_require_last_or_segfault.rb
|
|
65
65
|
- tests/bugtests.rb
|
|
66
66
|
- tests/helper.rb
|
|
67
|
+
- tests/io_select_less_scheduler_probe.rb
|
|
67
68
|
- tests/leak_trace.rb
|
|
68
69
|
- tests/mem_check.rb
|
|
69
70
|
- tests/require_last_or_segfault_script.rb
|
|
@@ -77,6 +78,8 @@ files:
|
|
|
77
78
|
- tests/tc_curl_easy_setopt.rb
|
|
78
79
|
- tests/tc_curl_maxfilesize.rb
|
|
79
80
|
- tests/tc_curl_multi.rb
|
|
81
|
+
- tests/tc_curl_multi_poll.rb
|
|
82
|
+
- tests/tc_curl_multi_socket_poller.rb
|
|
80
83
|
- tests/tc_curl_native_coverage.rb
|
|
81
84
|
- tests/tc_curl_network_policy.rb
|
|
82
85
|
- tests/tc_curl_postfield.rb
|
|
@@ -84,6 +87,7 @@ files:
|
|
|
84
87
|
- tests/tc_fiber_scheduler.rb
|
|
85
88
|
- tests/tc_ftp_options.rb
|
|
86
89
|
- tests/tc_gc_compact.rb
|
|
90
|
+
- tests/tc_ractor.rb
|
|
87
91
|
- tests/tc_test_server_methods.rb
|
|
88
92
|
- tests/timeout.rb
|
|
89
93
|
- tests/timeout_server.rb
|
|
@@ -133,6 +137,7 @@ test_files:
|
|
|
133
137
|
- tests/bug_require_last_or_segfault.rb
|
|
134
138
|
- tests/bugtests.rb
|
|
135
139
|
- tests/helper.rb
|
|
140
|
+
- tests/io_select_less_scheduler_probe.rb
|
|
136
141
|
- tests/leak_trace.rb
|
|
137
142
|
- tests/mem_check.rb
|
|
138
143
|
- tests/require_last_or_segfault_script.rb
|
|
@@ -146,6 +151,8 @@ test_files:
|
|
|
146
151
|
- tests/tc_curl_easy_setopt.rb
|
|
147
152
|
- tests/tc_curl_maxfilesize.rb
|
|
148
153
|
- tests/tc_curl_multi.rb
|
|
154
|
+
- tests/tc_curl_multi_poll.rb
|
|
155
|
+
- tests/tc_curl_multi_socket_poller.rb
|
|
149
156
|
- tests/tc_curl_native_coverage.rb
|
|
150
157
|
- tests/tc_curl_network_policy.rb
|
|
151
158
|
- tests/tc_curl_postfield.rb
|
|
@@ -153,6 +160,7 @@ test_files:
|
|
|
153
160
|
- tests/tc_fiber_scheduler.rb
|
|
154
161
|
- tests/tc_ftp_options.rb
|
|
155
162
|
- tests/tc_gc_compact.rb
|
|
163
|
+
- tests/tc_ractor.rb
|
|
156
164
|
- tests/tc_test_server_methods.rb
|
|
157
165
|
- tests/timeout.rb
|
|
158
166
|
- tests/timeout_server.rb
|