curb 0.9.3 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,16 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+
3
+ class TestCurbCurlEasyResolve < Test::Unit::TestCase
4
+ def setup
5
+ @easy = Curl::Easy.new
6
+ end
7
+
8
+ def test_resolve
9
+ @easy.resolve = [ "example.com:80:127.0.0.1" ]
10
+ assert_equal @easy.resolve, [ "example.com:80:127.0.0.1" ]
11
+ end
12
+
13
+ def test_empty_resolve
14
+ assert_equal @easy.resolve, nil
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+
3
+ class TestCurbCurlMaxFileSize < Test::Unit::TestCase
4
+ def setup
5
+ @easy = Curl::Easy.new
6
+ end
7
+
8
+ def test_maxfilesize
9
+ @easy.set(Curl::CURLOPT_MAXFILESIZE, 5000000)
10
+ end
11
+
12
+ end
@@ -1,4 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+ require 'set'
2
3
 
3
4
  class TestCurbCurlMulti < Test::Unit::TestCase
4
5
  def teardown
@@ -6,6 +7,112 @@ class TestCurbCurlMulti < Test::Unit::TestCase
6
7
  ObjectSpace.garbage_collect
7
8
  end
8
9
 
10
+ # for https://github.com/taf2/curb/issues/277
11
+ # must connect to an external
12
+ def test_connection_keepalive
13
+ # this test fails with libcurl 7.22.0. I didn't investigate, but it may be related
14
+ # to CURLOPT_MAXCONNECTS bug fixed in 7.30.0:
15
+ # https://github.com/curl/curl/commit/e87e76e2dc108efb1cae87df496416f49c55fca0
16
+ omit("Skip, libcurl too old (< 7.22.0)") if Curl::CURL_VERSION.split('.')[1].to_i <= 22
17
+
18
+ @server.shutdown if @server
19
+ @test_thread.kill if @test_thread
20
+ @server = nil
21
+ File.unlink(locked_file)
22
+ Curl::Multi.autoclose = true
23
+ assert Curl::Multi.autoclose
24
+ # XXX: thought maybe we can clean house here to have the full suite pass in osx... but for now running this test in isolate does pass
25
+ # additionally, if ss allows this to pass on linux without requesting google i think this is a good trade off... leaving some of the thoughts below
26
+ # in hopes that coming back to this later will find it and remember how to fix it
27
+ # types = Set.new
28
+ # close_types = Set.new([TCPServer,TCPSocket,Socket,Curl::Multi, Curl::Easy,WEBrick::Log])
29
+ # ObjectSpace.each_object {|o|
30
+ # if o.respond_to?(:close)
31
+ # types << o.class
32
+ # end
33
+ # if close_types.include?(o.class)
34
+ # o.close
35
+ # end
36
+ # }
37
+ #puts "unique types: #{types.to_a.join("\n")}"
38
+ GC.start # cleanup FDs left over from other tests
39
+ server_setup
40
+ GC.start # cleanup FDs left over from other tests
41
+
42
+ if `which ss`.strip.size == 0
43
+ # osx need lsof still :(
44
+ open_fds = lambda do
45
+ out = `/usr/sbin/lsof -p #{Process.pid} | egrep "TCP|UDP"`# | egrep ':#{TestServlet.port} ' | egrep ESTABLISHED`# | wc -l`.strip.to_i
46
+ #puts out.lines.join("\n")
47
+ out.lines.size
48
+ end
49
+ else
50
+ ss = `which ss`.strip
51
+ open_fds = lambda do
52
+ `#{ss} -n4 state established dport = :#{TestServlet.port} | wc -l`.strip.to_i
53
+ end
54
+ end
55
+ Curl::Multi.autoclose = false
56
+ before_open = open_fds.call
57
+ #puts "before_open: #{before_open.inspect}"
58
+ assert !Curl::Multi.autoclose
59
+ multi = Curl::Multi.new
60
+ multi.max_connects = 1 # limit to 1 connection within the multi handle
61
+
62
+ did_complete = false
63
+ 5.times do |n|
64
+ easy = Curl::Easy.new(TestServlet.url) do |curl|
65
+ curl.timeout = 5 # ensure we don't hang for ever connecting to an external host
66
+ curl.on_complete {
67
+ did_complete = true
68
+ }
69
+ end
70
+ multi.add(easy)
71
+ end
72
+
73
+ multi.perform
74
+ assert did_complete
75
+ after_open = open_fds.call
76
+ #puts "after_open: #{after_open} before_open: #{before_open.inspect}"
77
+ # ruby process may keep a connection alive
78
+ assert (after_open - before_open) < 3, "with max connections set to 1 at this point the connection to google should still be open"
79
+ assert (after_open - before_open) > 0, "with max connections set to 1 at this point the connection to google should still be open"
80
+ multi.close
81
+
82
+ after_open = open_fds.call
83
+ #puts "after_open: #{after_open} before_open: #{before_open.inspect}"
84
+ assert_equal 0, (after_open - before_open), "after closing the multi handle all connections should be closed"
85
+
86
+ Curl::Multi.autoclose = true
87
+ multi = Curl::Multi.new
88
+ did_complete = false
89
+ 5.times do |n|
90
+ easy = Curl::Easy.new(TestServlet.url) do |curl|
91
+ curl.timeout = 5 # ensure we don't hang for ever connecting to an external host
92
+ curl.on_complete {
93
+ did_complete = true
94
+ }
95
+ end
96
+ multi.add(easy)
97
+ end
98
+
99
+ multi.perform
100
+ assert did_complete
101
+ after_open = open_fds.call
102
+ #puts "after_open: #{after_open} before_open: #{before_open.inspect}"
103
+ assert_equal 0, (after_open - before_open), "auto close the connections"
104
+ ensure
105
+ Curl::Multi.autoclose = false # restore default
106
+ end
107
+
108
+ def test_connection_autoclose
109
+ assert !Curl::Multi.autoclose
110
+ Curl::Multi.autoclose = true
111
+ assert Curl::Multi.autoclose
112
+ ensure
113
+ Curl::Multi.autoclose = false # restore default
114
+ end
115
+
9
116
  def test_new_multi_01
10
117
  d1 = ""
11
118
  c1 = Curl::Easy.new($TEST_URL) do |curl|
@@ -125,7 +232,7 @@ class TestCurbCurlMulti < Test::Unit::TestCase
125
232
  def test_requests
126
233
  m = Curl::Multi.new
127
234
 
128
- assert_equal([], m.requests, 'A new Curl::Multi handle should have no requests')
235
+ assert_equal(0, m.requests.length, 'A new Curl::Multi handle should have no requests')
129
236
 
130
237
  10.times do
131
238
  m.add(Curl::Easy.new($TEST_URL))
@@ -135,7 +242,7 @@ class TestCurbCurlMulti < Test::Unit::TestCase
135
242
 
136
243
  m.perform
137
244
 
138
- assert_equal([], m.requests, 'A new Curl::Multi handle should have no requests after a perform')
245
+ assert_equal(0, m.requests.length, 'A new Curl::Multi handle should have no requests after a perform')
139
246
  end
140
247
 
141
248
  def test_cancel
@@ -148,7 +255,7 @@ class TestCurbCurlMulti < Test::Unit::TestCase
148
255
 
149
256
  m.cancel!
150
257
 
151
- assert_equal([], m.requests, 'A new Curl::Multi handle should have no requests after being canceled')
258
+ assert_equal(0, m.requests.size, 'A new Curl::Multi handle should have no requests after being canceled')
152
259
  end
153
260
 
154
261
  def test_with_success
@@ -192,7 +299,7 @@ class TestCurbCurlMulti < Test::Unit::TestCase
192
299
  c1.on_success do|c|
193
300
  success_called1 = true
194
301
  #puts "success 1 called: #{c.body_str.inspect}"
195
- #assert_match(/^# DO NOT REMOVE THIS COMMENT/, c.body_str)
302
+ assert_match(/^# DO NOT REMOVE THIS COMMENT/, c.body_str)
196
303
  end
197
304
 
198
305
  c1.on_failure do|c,rc|
@@ -331,7 +438,6 @@ class TestCurbCurlMulti < Test::Unit::TestCase
331
438
  Curl::Multi.download(urls,{},{},downloads) do|curl,download_path|
332
439
  assert_equal 200, curl.response_code
333
440
  assert File.exist?(download_path)
334
- store = file_info[File.basename(download_path)]
335
441
  assert_equal file_info[File.basename(download_path)][:size], File.size(download_path), "incomplete download: #{download_path}"
336
442
  end
337
443
  ensure
@@ -346,7 +452,7 @@ class TestCurbCurlMulti < Test::Unit::TestCase
346
452
  ]
347
453
  Curl::Multi.post(urls, {:follow_location => true, :multipart_form_post => true}, {:pipeline => true}) do|easy|
348
454
  str = easy.body_str
349
- assert_match /POST/, str
455
+ assert_match(/POST/, str)
350
456
  fields = {}
351
457
  str.gsub(/POST\n/,'').split('&').map{|sv| k, v = sv.split('='); fields[k] = v }
352
458
  expected = urls.find{|s| s[:url] == easy.last_effective_url }
@@ -361,8 +467,8 @@ class TestCurbCurlMulti < Test::Unit::TestCase
361
467
  { :url => TestServlet.url, :method => :put, :put_data => "message",
362
468
  :headers => {'Content-Type' => 'application/json' } }]
363
469
  Curl::Multi.put(urls, {}, {:pipeline => true}) do|easy|
364
- assert_match /PUT/, easy.body_str
365
- assert_match /message/, easy.body_str
470
+ assert_match(/PUT/, easy.body_str)
471
+ assert_match(/message/, easy.body_str)
366
472
  end
367
473
  end
368
474
 
@@ -376,34 +482,34 @@ class TestCurbCurlMulti < Test::Unit::TestCase
376
482
  { :url => TestServlet.url, :method => :get }
377
483
  ]
378
484
  Curl::Multi.http(urls, {:pipeline => true}) do|easy, code, method|
379
- assert_equal nil, code
485
+ assert_equal 200, code
380
486
  case method
381
487
  when :post
382
- assert_match /POST/, easy.body_str
488
+ assert_match(/POST/, easy.body_str)
383
489
  when :get
384
- assert_match /GET/, easy.body_str
490
+ assert_match(/GET/, easy.body_str)
385
491
  when :put
386
- assert_match /PUT/, easy.body_str
492
+ assert_match(/PUT/, easy.body_str)
387
493
  end
388
494
  #puts "#{easy.body_str.inspect}, #{method.inspect}, #{code.inspect}"
389
495
  end
390
496
  end
391
497
 
392
498
  def test_multi_easy_http_with_max_connects
393
- urls = [
499
+ urls = [
394
500
  { :url => TestServlet.url + '?q=1', :method => :get },
395
501
  { :url => TestServlet.url + '?q=2', :method => :get },
396
502
  { :url => TestServlet.url + '?q=3', :method => :get }
397
503
  ]
398
504
  Curl::Multi.http(urls, {:pipeline => true, :max_connects => 1}) do|easy, code, method|
399
- assert_equal nil, code
505
+ assert_equal 200, code
400
506
  case method
401
507
  when :post
402
- assert_match /POST/, easy.body_str
508
+ assert_match(/POST/, easy.body)
403
509
  when :get
404
- assert_match /GET/, easy.body_str
510
+ assert_match(/GET/, easy.body)
405
511
  when :put
406
- assert_match /PUT/, easy.body_str
512
+ assert_match(/PUT/, easy.body)
407
513
  end
408
514
  end
409
515
  end
@@ -485,5 +591,4 @@ class TestCurbCurlMulti < Test::Unit::TestCase
485
591
  def setup
486
592
  server_setup
487
593
  end
488
-
489
594
  end
@@ -2,63 +2,63 @@ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
2
 
3
3
  class TestCurbCurlPostfield < Test::Unit::TestCase
4
4
  def test_private_new
5
- assert_raise(NoMethodError) { Curl::PostField.new }
5
+ assert_raise(NoMethodError) { Curl::PostField.new }
6
6
  end
7
-
7
+
8
8
  def test_new_content_01
9
9
  pf = Curl::PostField.content('foo', 'bar')
10
-
10
+
11
11
  assert_equal 'foo', pf.name
12
12
  assert_equal 'bar', pf.content
13
13
  assert_nil pf.content_type
14
14
  assert_nil pf.local_file
15
- assert_nil pf.remote_file
15
+ assert_nil pf.remote_file
16
16
  assert_nil pf.set_content_proc
17
17
  end
18
-
18
+
19
19
  def test_new_content_02
20
20
  pf = Curl::PostField.content('foo', 'bar', 'text/html')
21
-
21
+
22
22
  assert_equal 'foo', pf.name
23
23
  assert_equal 'bar', pf.content
24
24
  assert_equal 'text/html', pf.content_type
25
25
  assert_nil pf.local_file
26
26
  assert_nil pf.remote_file
27
- assert_nil pf.set_content_proc
28
- end
29
-
27
+ assert_nil pf.set_content_proc
28
+ end
29
+
30
30
  def test_new_content_03
31
31
  l = lambda { |field| "never gets run" }
32
32
  pf = Curl::PostField.content('foo', &l)
33
-
33
+
34
34
  assert_equal 'foo', pf.name
35
35
  assert_nil pf.content
36
36
  assert_nil pf.content_type
37
37
  assert_nil pf.local_file
38
38
  assert_nil pf.remote_file
39
-
39
+
40
40
  # N.B. This doesn't just get the proc, but also removes it.
41
41
  assert_equal l, pf.set_content_proc
42
- end
42
+ end
43
43
 
44
44
  def test_new_content_04
45
45
  l = lambda { |field| "never gets run" }
46
46
  pf = Curl::PostField.content('foo', 'text/html', &l)
47
-
47
+
48
48
  assert_equal 'foo', pf.name
49
49
  assert_nil pf.content
50
50
  assert_equal 'text/html', pf.content_type
51
51
  assert_nil pf.local_file
52
52
  assert_nil pf.remote_file
53
-
53
+
54
54
  # N.B. This doesn't just get the proc, but also removes it.
55
55
  assert_equal l, pf.set_content_proc
56
- end
56
+ end
57
57
 
58
58
 
59
59
  def test_new_file_01
60
60
  pf = Curl::PostField.file('foo', 'localname')
61
-
61
+
62
62
  assert_equal 'foo', pf.name
63
63
  assert_equal 'localname', pf.local_file
64
64
  assert_equal 'localname', pf.remote_file
@@ -67,44 +67,44 @@ class TestCurbCurlPostfield < Test::Unit::TestCase
67
67
  assert_nil pf.content
68
68
  assert_nil pf.set_content_proc
69
69
  end
70
-
70
+
71
71
  def test_new_file_02
72
72
  pf = Curl::PostField.file('foo', 'localname', 'remotename')
73
-
73
+
74
74
  assert_equal 'foo', pf.name
75
75
  assert_equal 'localname', pf.local_file
76
76
  assert_equal 'remotename', pf.remote_file
77
77
  assert_nil pf.content_type
78
78
  assert_nil pf.content
79
79
  assert_nil pf.set_content_proc
80
- end
81
-
80
+ end
81
+
82
82
  def test_new_file_03
83
83
  l = lambda { |field| "never gets run" }
84
84
  pf = Curl::PostField.file('foo', 'remotename', &l)
85
-
85
+
86
86
  assert_equal 'foo', pf.name
87
87
  assert_equal 'remotename', pf.remote_file
88
88
  assert_nil pf.local_file
89
89
  assert_nil pf.content_type
90
90
  assert_nil pf.content
91
-
91
+
92
92
  # N.B. This doesn't just get the proc, but also removes it.
93
93
  assert_equal l, pf.set_content_proc
94
- end
94
+ end
95
95
 
96
96
  def test_new_file_04
97
97
  assert_raise(ArgumentError) do
98
98
  # no local name, no block
99
99
  Curl::PostField.file('foo')
100
100
  end
101
-
101
+
102
102
  assert_raise(ArgumentError) do
103
103
  # no remote name with block
104
104
  Curl::PostField.file('foo') { |field| "never runs" }
105
105
  end
106
106
  end
107
-
107
+
108
108
  def test_new_file_05
109
109
  # local gets ignored when supplying a block, but remote
110
110
  # is still set up properly.
@@ -118,15 +118,15 @@ class TestCurbCurlPostfield < Test::Unit::TestCase
118
118
  assert_nil pf.content
119
119
 
120
120
  assert_equal l, pf.set_content_proc
121
- end
122
-
121
+ end
122
+
123
123
  def test_to_s_01
124
- pf = Curl::PostField.content('foo', 'bar')
124
+ pf = Curl::PostField.content('foo', 'bar')
125
125
  assert_equal "foo=bar", pf.to_s
126
126
  end
127
127
 
128
128
  def test_to_s_02
129
- pf = Curl::PostField.content('foo', 'bar ton')
129
+ pf = Curl::PostField.content('foo', 'bar ton')
130
130
  assert_equal "foo=bar%20ton", pf.to_s
131
131
  end
132
132
 
@@ -0,0 +1,37 @@
1
+ class TestCurbCurlProtocols < Test::Unit::TestCase
2
+ include TestServerMethods
3
+
4
+ def setup
5
+ @easy = Curl::Easy.new
6
+ @easy.set :protocols, Curl::CURLPROTO_HTTP | Curl::CURLPROTO_HTTPS
7
+ @easy.follow_location = true
8
+ server_setup
9
+ end
10
+
11
+ def test_protocol_allowed
12
+ @easy.set :url, "http://127.0.0.1:9129/this_file_does_not_exist.html"
13
+ @easy.perform
14
+ assert_equal 404, @easy.response_code
15
+ end
16
+
17
+ def test_protocol_denied
18
+ @easy.set :url, "gopher://google.com/"
19
+ assert_raises Curl::Err::UnsupportedProtocolError do
20
+ @easy.perform
21
+ end
22
+ end
23
+
24
+ def test_redir_protocol_allowed
25
+ @easy.set :url, TestServlet.url + "/redirect"
26
+ @easy.set :redir_protocols, Curl::CURLPROTO_HTTP
27
+ @easy.perform
28
+ end
29
+
30
+ def test_redir_protocol_denied
31
+ @easy.set :url, TestServlet.url + "/redirect"
32
+ @easy.set :redir_protocols, Curl::CURLPROTO_HTTPS
33
+ assert_raises Curl::Err::UnsupportedProtocolError do
34
+ @easy.perform
35
+ end
36
+ end
37
+ end
data/tests/timeout.rb CHANGED
@@ -17,9 +17,13 @@ class TestCurbTimeouts < Test::Unit::TestCase
17
17
  def test_overall_timeout_on_dead_transfer
18
18
  curl = Curl::Easy.new(wait_url(2))
19
19
  curl.timeout = 1
20
- assert_raise(Curl::Err::TimeoutError) do
20
+ exception = assert_raise(Curl::Err::TimeoutError) do
21
21
  curl.http_get
22
22
  end
23
+ assert_match(
24
+ /^Timeout was reached: Operation timed out after/,
25
+ exception.message
26
+ )
23
27
  end
24
28
 
25
29
  def test_overall_timeout_ms_on_dead_transfer
@@ -44,16 +48,20 @@ class TestCurbTimeouts < Test::Unit::TestCase
44
48
  curl = Curl::Easy.new(serve_url(100, 2, 3))
45
49
  curl.timeout = 1
46
50
  # transfer is aborted despite data being exchanged
47
- assert_raise(Curl::Err::TimeoutError) do
51
+ exception = assert_raise(Curl::Err::TimeoutError) do
48
52
  curl.http_get
49
53
  end
54
+ assert_match(
55
+ /^Timeout was reached: Operation timed out after/,
56
+ exception.message
57
+ )
50
58
  end
51
59
 
52
60
  def test_low_speed_time_on_slow_transfer
53
61
  curl = Curl::Easy.new(serve_url(100, 1, 3))
54
62
  curl.low_speed_time = 2
55
63
  # use default low_speed_limit of 1
56
- assert true, curl.http_get
64
+ assert_equal true, curl.http_get
57
65
  end
58
66
 
59
67
  def test_low_speed_time_on_very_slow_transfer
@@ -63,18 +71,26 @@ class TestCurbTimeouts < Test::Unit::TestCase
63
71
  # XXX for some reason this test fails if low speed limit is not specified
64
72
  curl.low_speed_limit = 1
65
73
  # use default low_speed_limit of 1
66
- assert_raise(Curl::Err::TimeoutError) do
74
+ exception = assert_raise(Curl::Err::TimeoutError) do
67
75
  curl.http_get
68
76
  end
77
+ assert_match(
78
+ /^Timeout was reached: Operation too slow/,
79
+ exception.message
80
+ )
69
81
  end
70
82
 
71
83
  def test_low_speed_limit_on_slow_transfer
72
84
  curl = Curl::Easy.new(serve_url(10, 1, 3))
73
85
  curl.low_speed_time = 2
74
86
  curl.low_speed_limit = 1000
75
- assert_raise(Curl::Err::TimeoutError) do
87
+ exception = assert_raise(Curl::Err::TimeoutError) do
76
88
  curl.http_get
77
89
  end
90
+ assert_match(
91
+ /^Timeout was reached: Operation too slow/,
92
+ exception.message
93
+ )
78
94
  end
79
95
 
80
96
  def test_clearing_low_speed_time
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ross Bamford
8
8
  - Todd A. Fisher
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-04-11 00:00:00.000000000 Z
12
+ date: 2022-12-28 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Curb (probably CUrl-RuBy or something) provides Ruby-language bindings
15
15
  for the libcurl(3), a fully-featured client-side URL transfer library. cURL and
@@ -26,6 +26,7 @@ files:
26
26
  - README.markdown
27
27
  - Rakefile
28
28
  - doc.rb
29
+ - ext/banned.h
29
30
  - ext/curb.c
30
31
  - ext/curb.h
31
32
  - ext/curb_easy.c
@@ -49,11 +50,14 @@ files:
49
50
  - tests/bug_crash_on_progress.rb
50
51
  - tests/bug_curb_easy_blocks_ruby_threads.rb
51
52
  - tests/bug_curb_easy_post_with_string_no_content_length_header.rb
53
+ - tests/bug_follow_redirect_288.rb
52
54
  - tests/bug_instance_post_differs_from_class_post.rb
53
55
  - tests/bug_issue102.rb
56
+ - tests/bug_issue277.rb
54
57
  - tests/bug_multi_segfault.rb
55
58
  - tests/bug_postfields_crash.rb
56
59
  - tests/bug_postfields_crash2.rb
60
+ - tests/bug_raise_on_callback.rb
57
61
  - tests/bug_require_last_or_segfault.rb
58
62
  - tests/bugtests.rb
59
63
  - tests/helper.rb
@@ -63,17 +67,20 @@ files:
63
67
  - tests/tc_curl.rb
64
68
  - tests/tc_curl_download.rb
65
69
  - tests/tc_curl_easy.rb
70
+ - tests/tc_curl_easy_resolve.rb
66
71
  - tests/tc_curl_easy_setopt.rb
72
+ - tests/tc_curl_maxfilesize.rb
67
73
  - tests/tc_curl_multi.rb
68
74
  - tests/tc_curl_postfield.rb
75
+ - tests/tc_curl_protocols.rb
69
76
  - tests/timeout.rb
70
77
  - tests/timeout_server.rb
71
78
  - tests/unittests.rb
72
- homepage: http://curb.rubyforge.org/
79
+ homepage: https://github.com/taf2/curb
73
80
  licenses:
74
81
  - MIT
75
82
  metadata: {}
76
- post_install_message:
83
+ post_install_message:
77
84
  rdoc_options:
78
85
  - "--main"
79
86
  - README.markdown
@@ -91,9 +98,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
98
  - !ruby/object:Gem::Version
92
99
  version: '0'
93
100
  requirements: []
94
- rubyforge_project: curb
95
- rubygems_version: 2.4.3
96
- signing_key:
101
+ rubygems_version: 3.2.33
102
+ signing_key:
97
103
  specification_version: 4
98
104
  summary: Ruby libcurl bindings
99
105
  test_files:
@@ -102,11 +108,14 @@ test_files:
102
108
  - tests/bug_crash_on_progress.rb
103
109
  - tests/bug_curb_easy_blocks_ruby_threads.rb
104
110
  - tests/bug_curb_easy_post_with_string_no_content_length_header.rb
111
+ - tests/bug_follow_redirect_288.rb
105
112
  - tests/bug_instance_post_differs_from_class_post.rb
106
113
  - tests/bug_issue102.rb
114
+ - tests/bug_issue277.rb
107
115
  - tests/bug_multi_segfault.rb
108
116
  - tests/bug_postfields_crash.rb
109
117
  - tests/bug_postfields_crash2.rb
118
+ - tests/bug_raise_on_callback.rb
110
119
  - tests/bug_require_last_or_segfault.rb
111
120
  - tests/bugtests.rb
112
121
  - tests/helper.rb
@@ -116,9 +125,12 @@ test_files:
116
125
  - tests/tc_curl.rb
117
126
  - tests/tc_curl_download.rb
118
127
  - tests/tc_curl_easy.rb
128
+ - tests/tc_curl_easy_resolve.rb
119
129
  - tests/tc_curl_easy_setopt.rb
130
+ - tests/tc_curl_maxfilesize.rb
120
131
  - tests/tc_curl_multi.rb
121
132
  - tests/tc_curl_postfield.rb
133
+ - tests/tc_curl_protocols.rb
122
134
  - tests/timeout.rb
123
135
  - tests/timeout_server.rb
124
136
  - tests/unittests.rb