curb 0.8.4 → 1.3.5
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 +7 -0
- data/README.md +522 -0
- data/Rakefile +79 -26
- data/ext/banned.h +32 -0
- data/ext/curb.c +549 -230
- data/ext/curb.h +19 -10
- data/ext/curb_easy.c +1935 -366
- data/ext/curb_easy.h +16 -0
- data/ext/curb_errors.c +115 -18
- data/ext/curb_errors.h +8 -5
- data/ext/curb_macros.h +33 -21
- data/ext/curb_multi.c +1858 -272
- data/ext/curb_multi.h +10 -3
- data/ext/curb_postfield.c +149 -77
- data/ext/curb_postfield.h +1 -0
- data/ext/curb_upload.c +38 -11
- data/ext/curb_upload.h +2 -0
- data/ext/extconf.rb +353 -35
- data/lib/curb.rb +1 -0
- data/lib/curl/easy.rb +314 -78
- data/lib/curl/multi.rb +134 -28
- data/lib/curl.rb +217 -11
- data/tests/bug_crash_on_debug.rb +14 -28
- data/tests/bug_crash_on_progress.rb +32 -16
- data/tests/bug_curb_easy_blocks_ruby_threads.rb +10 -15
- data/tests/bug_curb_easy_post_with_string_no_content_length_header.rb +6 -30
- data/tests/bug_follow_redirect_288.rb +83 -0
- data/tests/bug_instance_post_differs_from_class_post.rb +3 -5
- data/tests/bug_issue102.rb +1 -1
- data/tests/bug_issue_noproxy.rb +56 -0
- data/tests/bug_issue_post_redirect.rb +93 -0
- data/tests/bug_issue_spnego.rb +41 -0
- data/tests/bug_multi_segfault.rb +1 -0
- data/tests/bug_raise_on_callback.rb +30 -0
- data/tests/helper.rb +400 -44
- data/tests/leak_trace.rb +237 -0
- data/tests/mem_check.rb +3 -0
- data/tests/tc_curl.rb +31 -1
- data/tests/tc_curl_download.rb +12 -7
- data/tests/tc_curl_easy.rb +911 -63
- data/tests/tc_curl_easy_cookielist.rb +277 -0
- data/tests/tc_curl_easy_request_target.rb +41 -0
- data/tests/tc_curl_easy_resolve.rb +48 -0
- data/tests/tc_curl_maxfilesize.rb +12 -0
- data/tests/tc_curl_multi.rb +855 -53
- data/tests/tc_curl_native_coverage.rb +145 -0
- data/tests/tc_curl_postfield.rb +207 -30
- data/tests/tc_curl_protocols.rb +37 -0
- data/tests/tc_fiber_scheduler.rb +543 -0
- data/tests/tc_ftp_options.rb +39 -0
- data/tests/tc_gc_compact.rb +223 -0
- data/tests/tc_test_server_methods.rb +110 -0
- data/tests/timeout.rb +30 -6
- metadata +59 -36
- data/README +0 -194
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require File.expand_path('helper', __dir__)
|
|
4
|
+
|
|
5
|
+
class TestGcCompact < Test::Unit::TestCase
|
|
6
|
+
ITERATIONS = (ENV['CURB_GC_COMPACT_ITERATIONS'] || 50).to_i
|
|
7
|
+
EASY_PER_MULTI = 3
|
|
8
|
+
GC_CRASH_REGRESSION_ITERATIONS = (ENV['CURB_GC_CRASH_REGRESSION_ITERATIONS'] || [ITERATIONS, 10].min).to_i
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
omit('GC.compact unavailable on this Ruby') unless defined?(GC.compact)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_multi_perform_with_gc_compact
|
|
15
|
+
ITERATIONS.times do
|
|
16
|
+
run_multi_perform_compact_iteration
|
|
17
|
+
collect_after_iteration
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_gc_compact_during_multi_cleanup
|
|
22
|
+
omit('GC cleanup isolation requires fork') if NO_FORK || WINDOWS
|
|
23
|
+
|
|
24
|
+
pid = fork do
|
|
25
|
+
begin
|
|
26
|
+
ITERATIONS.times do
|
|
27
|
+
run_multi_cleanup_compact_iteration
|
|
28
|
+
collect_after_iteration
|
|
29
|
+
end
|
|
30
|
+
exit! 0
|
|
31
|
+
rescue StandardError => e
|
|
32
|
+
warn("#{e.class}: #{e.message}")
|
|
33
|
+
warn(e.backtrace.join("\n")) if e.backtrace
|
|
34
|
+
exit! 1
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
_child_pid, status = Process.wait2(pid)
|
|
39
|
+
assert_predicate status, :success?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_gc_compact_after_detach
|
|
43
|
+
run_multi_detach_compact_iteration
|
|
44
|
+
collect_after_iteration
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_gc_compact_after_failed_implicit_multi_cleanup
|
|
48
|
+
GC_CRASH_REGRESSION_ITERATIONS.times do
|
|
49
|
+
run_failed_implicit_multi_cleanup_iteration(compact: true, cleanup_with_objectspace: false)
|
|
50
|
+
collect_after_iteration
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_gc_cleanup_after_failed_implicit_multi_callback
|
|
55
|
+
omit('GC cleanup isolation requires fork') if NO_FORK || WINDOWS
|
|
56
|
+
|
|
57
|
+
assert_child_process_success do
|
|
58
|
+
GC_CRASH_REGRESSION_ITERATIONS.times do
|
|
59
|
+
run_failed_implicit_multi_cleanup_iteration(compact: true, cleanup_with_objectspace: true)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_gc_cleanup_after_invalid_multi_assignment_rejection
|
|
65
|
+
omit('GC cleanup isolation requires fork') if NO_FORK || WINDOWS
|
|
66
|
+
|
|
67
|
+
assert_child_process_success do
|
|
68
|
+
GC_CRASH_REGRESSION_ITERATIONS.times do
|
|
69
|
+
easy = Curl::Easy.new($TEST_URL)
|
|
70
|
+
|
|
71
|
+
begin
|
|
72
|
+
easy.multi = Object.new
|
|
73
|
+
raise 'expected TypeError from Curl::Easy#multi='
|
|
74
|
+
rescue TypeError => error
|
|
75
|
+
raise "unexpected error message: #{error.message}" unless /Curl::Multi/.match?(error.message)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
easy = nil
|
|
79
|
+
full_gc(compact: true)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_gc_compact_easy
|
|
85
|
+
iteration = 0
|
|
86
|
+
responses = []
|
|
87
|
+
while iteration < ITERATIONS
|
|
88
|
+
res = Curl.get($TEST_URL) do |easy|
|
|
89
|
+
easy.timeout = 5
|
|
90
|
+
easy.on_complete { |_e| }
|
|
91
|
+
easy.on_failure { |_e, _code| }
|
|
92
|
+
end
|
|
93
|
+
iteration += 1
|
|
94
|
+
responses << res.body
|
|
95
|
+
compact
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
def run_multi_perform_compact_iteration
|
|
102
|
+
multi = Curl::Multi.new
|
|
103
|
+
handles = add_easy_handles(multi)
|
|
104
|
+
|
|
105
|
+
compact
|
|
106
|
+
multi.perform { compact }
|
|
107
|
+
compact
|
|
108
|
+
ensure
|
|
109
|
+
handles&.each do |easy|
|
|
110
|
+
begin
|
|
111
|
+
easy.close
|
|
112
|
+
rescue StandardError
|
|
113
|
+
nil
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
multi&.close
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def run_multi_cleanup_compact_iteration
|
|
120
|
+
multi = Curl::Multi.new
|
|
121
|
+
add_easy_handles(multi)
|
|
122
|
+
|
|
123
|
+
compact
|
|
124
|
+
multi = nil
|
|
125
|
+
compact
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def run_multi_detach_compact_iteration
|
|
129
|
+
multi = Curl::Multi.new
|
|
130
|
+
handles = add_easy_handles(multi)
|
|
131
|
+
|
|
132
|
+
compact
|
|
133
|
+
multi.perform { compact }
|
|
134
|
+
|
|
135
|
+
handles.each { |easy| multi.remove(easy); compact }
|
|
136
|
+
compact
|
|
137
|
+
ensure
|
|
138
|
+
multi&.close
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def run_failed_implicit_multi_cleanup_iteration(compact:, cleanup_with_objectspace:)
|
|
142
|
+
easy = Curl::Easy.new($TEST_URL)
|
|
143
|
+
easy.on_complete { raise 'complete blew up' }
|
|
144
|
+
|
|
145
|
+
begin
|
|
146
|
+
easy.perform
|
|
147
|
+
raise 'expected callback abort'
|
|
148
|
+
rescue Curl::Err::AbortedByCallbackError => error
|
|
149
|
+
raise "unexpected callback message: #{error.message}" unless error.message == 'complete blew up'
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
raise 'expected implicit cleanup to clear easy.multi' unless easy.multi.nil?
|
|
153
|
+
ensure
|
|
154
|
+
easy = nil
|
|
155
|
+
if cleanup_with_objectspace
|
|
156
|
+
run_teardown_multi_cleanup
|
|
157
|
+
flush_deferred_multi_closes_all
|
|
158
|
+
else
|
|
159
|
+
flush_deferred_multi_closes_all
|
|
160
|
+
end
|
|
161
|
+
full_gc(compact: compact)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def add_easy_handles(multi)
|
|
165
|
+
Array.new(EASY_PER_MULTI) do
|
|
166
|
+
Curl::Easy.new($TEST_URL) do |easy|
|
|
167
|
+
easy.timeout = 5
|
|
168
|
+
easy.on_complete { |_e| }
|
|
169
|
+
easy.on_failure { |_e, _code| }
|
|
170
|
+
end.tap { |easy| multi.add(easy) }
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def compact
|
|
175
|
+
GC.compact
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def full_gc(compact: false)
|
|
179
|
+
GC.start(full_mark: true, immediate_sweep: true)
|
|
180
|
+
GC.compact if compact && GC.respond_to?(:compact)
|
|
181
|
+
GC.start(full_mark: true, immediate_sweep: true)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def flush_deferred_multi_closes_all
|
|
185
|
+
return unless Curl::Easy.respond_to?(:flush_deferred_multi_closes)
|
|
186
|
+
|
|
187
|
+
Curl::Easy.flush_deferred_multi_closes(all_threads: true)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def run_teardown_multi_cleanup
|
|
191
|
+
ObjectSpace.each_object(Curl::Multi) do |multi|
|
|
192
|
+
begin
|
|
193
|
+
next if multi.instance_variable_defined?(:@deferred_close) && multi.instance_variable_get(:@deferred_close)
|
|
194
|
+
|
|
195
|
+
multi.instance_variable_set(:@requests, {})
|
|
196
|
+
multi._close
|
|
197
|
+
rescue StandardError
|
|
198
|
+
nil
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def assert_child_process_success
|
|
204
|
+
pid = fork do
|
|
205
|
+
begin
|
|
206
|
+
yield
|
|
207
|
+
exit! 0
|
|
208
|
+
rescue Exception => e
|
|
209
|
+
warn("#{e.class}: #{e.message}")
|
|
210
|
+
warn(e.backtrace.join("\n")) if e.backtrace
|
|
211
|
+
exit! 1
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
_child_pid, status = Process.wait2(pid)
|
|
216
|
+
assert_predicate status, :success?
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def collect_after_iteration
|
|
220
|
+
ObjectSpace.garbage_collect
|
|
221
|
+
ObjectSpace.garbage_collect
|
|
222
|
+
end
|
|
223
|
+
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
|
2
|
+
require 'tmpdir'
|
|
3
|
+
|
|
4
|
+
class TestServerMethodsWaitForServerReady < Test::Unit::TestCase
|
|
5
|
+
include TestServerMethods
|
|
6
|
+
|
|
7
|
+
def server_startup_timeout
|
|
8
|
+
0.05
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def unused_port
|
|
12
|
+
server = TCPServer.new('127.0.0.1', 0)
|
|
13
|
+
port = server.addr[1]
|
|
14
|
+
server.close
|
|
15
|
+
port
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_wait_for_server_ready_returns_false_when_thread_dies
|
|
19
|
+
thread = Thread.new {}
|
|
20
|
+
thread.join
|
|
21
|
+
|
|
22
|
+
started = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
23
|
+
assert_equal false, wait_for_server_ready(unused_port, thread: thread)
|
|
24
|
+
elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started
|
|
25
|
+
|
|
26
|
+
assert_operator elapsed, :<, 0.5
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_wait_for_server_ready_times_out_when_server_never_starts
|
|
30
|
+
error = assert_raise(RuntimeError) do
|
|
31
|
+
wait_for_server_ready(unused_port)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
assert_match(/Failed to startup test server/, error.message)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
class TestServerMethodsLockHandling < Test::Unit::TestCase
|
|
39
|
+
include TestServerMethods
|
|
40
|
+
|
|
41
|
+
def setup
|
|
42
|
+
@lock_dir = Dir.mktmpdir('curb-server-lock')
|
|
43
|
+
@__port = unused_port
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def teardown
|
|
47
|
+
super
|
|
48
|
+
FileUtils.remove_entry(@lock_dir) if @lock_dir && File.exist?(@lock_dir)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def server_startup_timeout
|
|
52
|
+
0.05
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def locked_file
|
|
56
|
+
File.join(@lock_dir, "server_lock-#{@__port}")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def unused_port
|
|
60
|
+
server = TCPServer.new('127.0.0.1', 0)
|
|
61
|
+
port = server.addr[1]
|
|
62
|
+
server.close
|
|
63
|
+
port
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_clear_stale_server_lock_removes_legacy_lock_when_server_is_down
|
|
67
|
+
File.write(locked_file, 'locked')
|
|
68
|
+
|
|
69
|
+
clear_stale_server_lock(@__port)
|
|
70
|
+
|
|
71
|
+
assert_equal false, File.exist?(locked_file)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_clear_stale_server_lock_removes_dead_pid_lock_when_server_is_down
|
|
75
|
+
File.write(locked_file, "999999\n")
|
|
76
|
+
|
|
77
|
+
clear_stale_server_lock(@__port)
|
|
78
|
+
|
|
79
|
+
assert_equal false, File.exist?(locked_file)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_clear_stale_server_lock_keeps_live_pid_lock_during_startup_window
|
|
83
|
+
write_server_lock(Process.pid)
|
|
84
|
+
|
|
85
|
+
clear_stale_server_lock(@__port)
|
|
86
|
+
|
|
87
|
+
assert_equal true, File.exist?(locked_file)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_clear_stale_server_lock_removes_non_responding_live_pid_lock_after_timeout
|
|
91
|
+
write_server_lock(Process.pid)
|
|
92
|
+
stale_time = Time.now - 1
|
|
93
|
+
File.utime(stale_time, stale_time, locked_file)
|
|
94
|
+
|
|
95
|
+
clear_stale_server_lock(@__port)
|
|
96
|
+
|
|
97
|
+
assert_equal false, File.exist?(locked_file)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_stop_test_server_removes_owned_lock_and_shuts_listener_down
|
|
101
|
+
server_setup(@__port)
|
|
102
|
+
assert_equal true, File.exist?(locked_file)
|
|
103
|
+
assert_equal true, server_responding?(@__port)
|
|
104
|
+
|
|
105
|
+
stop_test_server
|
|
106
|
+
|
|
107
|
+
assert_equal false, File.exist?(locked_file)
|
|
108
|
+
assert_equal false, server_responding?(@__port)
|
|
109
|
+
end
|
|
110
|
+
end
|
data/tests/timeout.rb
CHANGED
|
@@ -13,15 +13,27 @@ class TestCurbTimeouts < Test::Unit::TestCase
|
|
|
13
13
|
elapsed = Time.now - start
|
|
14
14
|
assert elapsed > 2
|
|
15
15
|
end
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
def test_overall_timeout_on_dead_transfer
|
|
18
18
|
curl = Curl::Easy.new(wait_url(2))
|
|
19
19
|
curl.timeout = 1
|
|
20
|
+
exception = assert_raise(Curl::Err::TimeoutError) do
|
|
21
|
+
curl.http_get
|
|
22
|
+
end
|
|
23
|
+
assert_match(
|
|
24
|
+
/^Timeout was reached: Operation timed out after/,
|
|
25
|
+
exception.message
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_overall_timeout_ms_on_dead_transfer
|
|
30
|
+
curl = Curl::Easy.new(wait_url(2))
|
|
31
|
+
curl.timeout_ms = 1000
|
|
20
32
|
assert_raise(Curl::Err::TimeoutError) do
|
|
21
33
|
curl.http_get
|
|
22
34
|
end
|
|
23
35
|
end
|
|
24
|
-
|
|
36
|
+
|
|
25
37
|
def test_clearing_timeout
|
|
26
38
|
curl = Curl::Easy.new(wait_url(2))
|
|
27
39
|
curl.timeout = 1
|
|
@@ -36,16 +48,20 @@ class TestCurbTimeouts < Test::Unit::TestCase
|
|
|
36
48
|
curl = Curl::Easy.new(serve_url(100, 2, 3))
|
|
37
49
|
curl.timeout = 1
|
|
38
50
|
# transfer is aborted despite data being exchanged
|
|
39
|
-
assert_raise(Curl::Err::TimeoutError) do
|
|
51
|
+
exception = assert_raise(Curl::Err::TimeoutError) do
|
|
40
52
|
curl.http_get
|
|
41
53
|
end
|
|
54
|
+
assert_match(
|
|
55
|
+
/^Timeout was reached: Operation timed out after/,
|
|
56
|
+
exception.message
|
|
57
|
+
)
|
|
42
58
|
end
|
|
43
59
|
|
|
44
60
|
def test_low_speed_time_on_slow_transfer
|
|
45
61
|
curl = Curl::Easy.new(serve_url(100, 1, 3))
|
|
46
62
|
curl.low_speed_time = 2
|
|
47
63
|
# use default low_speed_limit of 1
|
|
48
|
-
|
|
64
|
+
assert_equal true, curl.http_get
|
|
49
65
|
end
|
|
50
66
|
|
|
51
67
|
def test_low_speed_time_on_very_slow_transfer
|
|
@@ -55,18 +71,26 @@ class TestCurbTimeouts < Test::Unit::TestCase
|
|
|
55
71
|
# XXX for some reason this test fails if low speed limit is not specified
|
|
56
72
|
curl.low_speed_limit = 1
|
|
57
73
|
# use default low_speed_limit of 1
|
|
58
|
-
assert_raise(Curl::Err::TimeoutError) do
|
|
74
|
+
exception = assert_raise(Curl::Err::TimeoutError) do
|
|
59
75
|
curl.http_get
|
|
60
76
|
end
|
|
77
|
+
assert_match(
|
|
78
|
+
/^Timeout was reached: Operation too slow/,
|
|
79
|
+
exception.message
|
|
80
|
+
)
|
|
61
81
|
end
|
|
62
82
|
|
|
63
83
|
def test_low_speed_limit_on_slow_transfer
|
|
64
84
|
curl = Curl::Easy.new(serve_url(10, 1, 3))
|
|
65
85
|
curl.low_speed_time = 2
|
|
66
86
|
curl.low_speed_limit = 1000
|
|
67
|
-
assert_raise(Curl::Err::TimeoutError) do
|
|
87
|
+
exception = assert_raise(Curl::Err::TimeoutError) do
|
|
68
88
|
curl.http_get
|
|
69
89
|
end
|
|
90
|
+
assert_match(
|
|
91
|
+
/^Timeout was reached: Operation too slow/,
|
|
92
|
+
exception.message
|
|
93
|
+
)
|
|
70
94
|
end
|
|
71
95
|
|
|
72
96
|
def test_clearing_low_speed_time
|
metadata
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: curb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 1.3.5
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Ross Bamford
|
|
9
8
|
- Todd A. Fisher
|
|
10
|
-
autorequire:
|
|
11
9
|
bindir: bin
|
|
12
10
|
cert_chain: []
|
|
13
|
-
date:
|
|
11
|
+
date: 2026-05-14 00:00:00.000000000 Z
|
|
14
12
|
dependencies: []
|
|
15
13
|
description: Curb (probably CUrl-RuBy or something) provides Ruby-language bindings
|
|
16
14
|
for the libcurl(3), a fully-featured client-side URL transfer library. cURL and
|
|
@@ -21,87 +19,96 @@ extensions:
|
|
|
21
19
|
- ext/extconf.rb
|
|
22
20
|
extra_rdoc_files:
|
|
23
21
|
- LICENSE
|
|
24
|
-
- README
|
|
22
|
+
- README.md
|
|
25
23
|
files:
|
|
26
24
|
- LICENSE
|
|
27
|
-
- README
|
|
25
|
+
- README.md
|
|
28
26
|
- Rakefile
|
|
29
27
|
- doc.rb
|
|
30
|
-
- ext/
|
|
31
|
-
- lib/curb.rb
|
|
32
|
-
- lib/curl/easy.rb
|
|
33
|
-
- lib/curl/multi.rb
|
|
34
|
-
- lib/curl.rb
|
|
28
|
+
- ext/banned.h
|
|
35
29
|
- ext/curb.c
|
|
36
|
-
- ext/curb_easy.c
|
|
37
|
-
- ext/curb_errors.c
|
|
38
|
-
- ext/curb_multi.c
|
|
39
|
-
- ext/curb_postfield.c
|
|
40
|
-
- ext/curb_upload.c
|
|
41
30
|
- ext/curb.h
|
|
31
|
+
- ext/curb_easy.c
|
|
42
32
|
- ext/curb_easy.h
|
|
33
|
+
- ext/curb_errors.c
|
|
43
34
|
- ext/curb_errors.h
|
|
44
35
|
- ext/curb_macros.h
|
|
36
|
+
- ext/curb_multi.c
|
|
45
37
|
- ext/curb_multi.h
|
|
38
|
+
- ext/curb_postfield.c
|
|
46
39
|
- ext/curb_postfield.h
|
|
40
|
+
- ext/curb_upload.c
|
|
47
41
|
- ext/curb_upload.h
|
|
42
|
+
- ext/extconf.rb
|
|
43
|
+
- lib/curb.rb
|
|
44
|
+
- lib/curl.rb
|
|
45
|
+
- lib/curl/easy.rb
|
|
46
|
+
- lib/curl/multi.rb
|
|
48
47
|
- tests/alltests.rb
|
|
49
48
|
- tests/bug_crash_on_debug.rb
|
|
50
49
|
- tests/bug_crash_on_progress.rb
|
|
51
50
|
- tests/bug_curb_easy_blocks_ruby_threads.rb
|
|
52
51
|
- tests/bug_curb_easy_post_with_string_no_content_length_header.rb
|
|
52
|
+
- tests/bug_follow_redirect_288.rb
|
|
53
53
|
- tests/bug_instance_post_differs_from_class_post.rb
|
|
54
54
|
- tests/bug_issue102.rb
|
|
55
|
+
- tests/bug_issue_noproxy.rb
|
|
56
|
+
- tests/bug_issue_post_redirect.rb
|
|
57
|
+
- tests/bug_issue_spnego.rb
|
|
55
58
|
- tests/bug_multi_segfault.rb
|
|
56
59
|
- tests/bug_postfields_crash.rb
|
|
57
60
|
- tests/bug_postfields_crash2.rb
|
|
61
|
+
- tests/bug_raise_on_callback.rb
|
|
58
62
|
- tests/bug_require_last_or_segfault.rb
|
|
59
63
|
- tests/bugtests.rb
|
|
60
64
|
- tests/helper.rb
|
|
65
|
+
- tests/leak_trace.rb
|
|
61
66
|
- tests/mem_check.rb
|
|
62
67
|
- tests/require_last_or_segfault_script.rb
|
|
63
68
|
- tests/signals.rb
|
|
64
69
|
- tests/tc_curl.rb
|
|
65
70
|
- tests/tc_curl_download.rb
|
|
66
71
|
- tests/tc_curl_easy.rb
|
|
72
|
+
- tests/tc_curl_easy_cookielist.rb
|
|
73
|
+
- tests/tc_curl_easy_request_target.rb
|
|
74
|
+
- tests/tc_curl_easy_resolve.rb
|
|
67
75
|
- tests/tc_curl_easy_setopt.rb
|
|
76
|
+
- tests/tc_curl_maxfilesize.rb
|
|
68
77
|
- tests/tc_curl_multi.rb
|
|
78
|
+
- tests/tc_curl_native_coverage.rb
|
|
69
79
|
- tests/tc_curl_postfield.rb
|
|
80
|
+
- tests/tc_curl_protocols.rb
|
|
81
|
+
- tests/tc_fiber_scheduler.rb
|
|
82
|
+
- tests/tc_ftp_options.rb
|
|
83
|
+
- tests/tc_gc_compact.rb
|
|
84
|
+
- tests/tc_test_server_methods.rb
|
|
70
85
|
- tests/timeout.rb
|
|
71
86
|
- tests/timeout_server.rb
|
|
72
87
|
- tests/unittests.rb
|
|
73
|
-
homepage:
|
|
74
|
-
licenses:
|
|
75
|
-
|
|
88
|
+
homepage: https://github.com/taf2/curb
|
|
89
|
+
licenses:
|
|
90
|
+
- Ruby
|
|
91
|
+
metadata:
|
|
92
|
+
changelog_uri: https://github.com/taf2/curb/blob/master/ChangeLog.md
|
|
76
93
|
rdoc_options:
|
|
77
|
-
- --main
|
|
78
|
-
- README
|
|
94
|
+
- "--main"
|
|
95
|
+
- README.md
|
|
79
96
|
require_paths:
|
|
80
97
|
- lib
|
|
81
98
|
- ext
|
|
82
99
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
83
|
-
none: false
|
|
84
100
|
requirements:
|
|
85
|
-
- -
|
|
101
|
+
- - ">="
|
|
86
102
|
- !ruby/object:Gem::Version
|
|
87
|
-
version: '
|
|
88
|
-
segments:
|
|
89
|
-
- 0
|
|
90
|
-
hash: -243569426931689339
|
|
103
|
+
version: '2.2'
|
|
91
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
|
-
none: false
|
|
93
105
|
requirements:
|
|
94
|
-
- -
|
|
106
|
+
- - ">="
|
|
95
107
|
- !ruby/object:Gem::Version
|
|
96
108
|
version: '0'
|
|
97
|
-
segments:
|
|
98
|
-
- 0
|
|
99
|
-
hash: -243569426931689339
|
|
100
109
|
requirements: []
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
signing_key:
|
|
104
|
-
specification_version: 3
|
|
110
|
+
rubygems_version: 4.0.10
|
|
111
|
+
specification_version: 4
|
|
105
112
|
summary: Ruby libcurl bindings
|
|
106
113
|
test_files:
|
|
107
114
|
- tests/alltests.rb
|
|
@@ -109,23 +116,39 @@ test_files:
|
|
|
109
116
|
- tests/bug_crash_on_progress.rb
|
|
110
117
|
- tests/bug_curb_easy_blocks_ruby_threads.rb
|
|
111
118
|
- tests/bug_curb_easy_post_with_string_no_content_length_header.rb
|
|
119
|
+
- tests/bug_follow_redirect_288.rb
|
|
112
120
|
- tests/bug_instance_post_differs_from_class_post.rb
|
|
113
121
|
- tests/bug_issue102.rb
|
|
122
|
+
- tests/bug_issue_noproxy.rb
|
|
123
|
+
- tests/bug_issue_post_redirect.rb
|
|
124
|
+
- tests/bug_issue_spnego.rb
|
|
114
125
|
- tests/bug_multi_segfault.rb
|
|
115
126
|
- tests/bug_postfields_crash.rb
|
|
116
127
|
- tests/bug_postfields_crash2.rb
|
|
128
|
+
- tests/bug_raise_on_callback.rb
|
|
117
129
|
- tests/bug_require_last_or_segfault.rb
|
|
118
130
|
- tests/bugtests.rb
|
|
119
131
|
- tests/helper.rb
|
|
132
|
+
- tests/leak_trace.rb
|
|
120
133
|
- tests/mem_check.rb
|
|
121
134
|
- tests/require_last_or_segfault_script.rb
|
|
122
135
|
- tests/signals.rb
|
|
123
136
|
- tests/tc_curl.rb
|
|
124
137
|
- tests/tc_curl_download.rb
|
|
125
138
|
- tests/tc_curl_easy.rb
|
|
139
|
+
- tests/tc_curl_easy_cookielist.rb
|
|
140
|
+
- tests/tc_curl_easy_request_target.rb
|
|
141
|
+
- tests/tc_curl_easy_resolve.rb
|
|
126
142
|
- tests/tc_curl_easy_setopt.rb
|
|
143
|
+
- tests/tc_curl_maxfilesize.rb
|
|
127
144
|
- tests/tc_curl_multi.rb
|
|
145
|
+
- tests/tc_curl_native_coverage.rb
|
|
128
146
|
- tests/tc_curl_postfield.rb
|
|
147
|
+
- tests/tc_curl_protocols.rb
|
|
148
|
+
- tests/tc_fiber_scheduler.rb
|
|
149
|
+
- tests/tc_ftp_options.rb
|
|
150
|
+
- tests/tc_gc_compact.rb
|
|
151
|
+
- tests/tc_test_server_methods.rb
|
|
129
152
|
- tests/timeout.rb
|
|
130
153
|
- tests/timeout_server.rb
|
|
131
154
|
- tests/unittests.rb
|