curb 0.9.7 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,110 @@ 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
+ assert_equal 1, (after_open - before_open), "with max connections set to 1 at this point the connection to google should still be open"
78
+ multi.close
79
+
80
+ after_open = open_fds.call
81
+ #puts "after_open: #{after_open} before_open: #{before_open.inspect}"
82
+ assert_equal 0, (after_open - before_open), "after closing the multi handle all connections should be closed"
83
+
84
+ Curl::Multi.autoclose = true
85
+ multi = Curl::Multi.new
86
+ did_complete = false
87
+ 5.times do |n|
88
+ easy = Curl::Easy.new(TestServlet.url) do |curl|
89
+ curl.timeout = 5 # ensure we don't hang for ever connecting to an external host
90
+ curl.on_complete {
91
+ did_complete = true
92
+ }
93
+ end
94
+ multi.add(easy)
95
+ end
96
+
97
+ multi.perform
98
+ assert did_complete
99
+ after_open = open_fds.call
100
+ #puts "after_open: #{after_open} before_open: #{before_open.inspect}"
101
+ assert_equal 0, (after_open - before_open), "auto close the connections"
102
+ ensure
103
+ Curl::Multi.autoclose = false # restore default
104
+ end
105
+
106
+ def test_connection_autoclose
107
+ assert !Curl::Multi.autoclose
108
+ Curl::Multi.autoclose = true
109
+ assert Curl::Multi.autoclose
110
+ ensure
111
+ Curl::Multi.autoclose = false # restore default
112
+ end
113
+
9
114
  def test_new_multi_01
10
115
  d1 = ""
11
116
  c1 = Curl::Easy.new($TEST_URL) do |curl|
@@ -125,7 +230,7 @@ class TestCurbCurlMulti < Test::Unit::TestCase
125
230
  def test_requests
126
231
  m = Curl::Multi.new
127
232
 
128
- assert_equal([], m.requests, 'A new Curl::Multi handle should have no requests')
233
+ assert_equal(0, m.requests.length, 'A new Curl::Multi handle should have no requests')
129
234
 
130
235
  10.times do
131
236
  m.add(Curl::Easy.new($TEST_URL))
@@ -135,7 +240,7 @@ class TestCurbCurlMulti < Test::Unit::TestCase
135
240
 
136
241
  m.perform
137
242
 
138
- assert_equal([], m.requests, 'A new Curl::Multi handle should have no requests after a perform')
243
+ assert_equal(0, m.requests.length, 'A new Curl::Multi handle should have no requests after a perform')
139
244
  end
140
245
 
141
246
  def test_cancel
@@ -148,7 +253,7 @@ class TestCurbCurlMulti < Test::Unit::TestCase
148
253
 
149
254
  m.cancel!
150
255
 
151
- assert_equal([], m.requests, 'A new Curl::Multi handle should have no requests after being canceled')
256
+ assert_equal(0, m.requests.size, 'A new Curl::Multi handle should have no requests after being canceled')
152
257
  end
153
258
 
154
259
  def test_with_success
@@ -192,7 +297,7 @@ class TestCurbCurlMulti < Test::Unit::TestCase
192
297
  c1.on_success do|c|
193
298
  success_called1 = true
194
299
  #puts "success 1 called: #{c.body_str.inspect}"
195
- #assert_match(/^# DO NOT REMOVE THIS COMMENT/, c.body_str)
300
+ assert_match(/^# DO NOT REMOVE THIS COMMENT/, c.body_str)
196
301
  end
197
302
 
198
303
  c1.on_failure do|c,rc|
@@ -484,5 +589,4 @@ class TestCurbCurlMulti < Test::Unit::TestCase
484
589
  def setup
485
590
  server_setup
486
591
  end
487
-
488
592
  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.7
4
+ version: 1.0.1
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: 2018-11-26 00:00:00.000000000 Z
12
+ date: 2022-04-29 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
@@ -51,6 +52,7 @@ files:
51
52
  - tests/bug_curb_easy_post_with_string_no_content_length_header.rb
52
53
  - tests/bug_instance_post_differs_from_class_post.rb
53
54
  - tests/bug_issue102.rb
55
+ - tests/bug_issue277.rb
54
56
  - tests/bug_multi_segfault.rb
55
57
  - tests/bug_postfields_crash.rb
56
58
  - tests/bug_postfields_crash2.rb
@@ -65,16 +67,18 @@ files:
65
67
  - tests/tc_curl_easy.rb
66
68
  - tests/tc_curl_easy_resolve.rb
67
69
  - tests/tc_curl_easy_setopt.rb
70
+ - tests/tc_curl_maxfilesize.rb
68
71
  - tests/tc_curl_multi.rb
69
72
  - tests/tc_curl_postfield.rb
73
+ - tests/tc_curl_protocols.rb
70
74
  - tests/timeout.rb
71
75
  - tests/timeout_server.rb
72
76
  - tests/unittests.rb
73
- homepage: http://curb.rubyforge.org/
77
+ homepage: https://github.com/taf2/curb
74
78
  licenses:
75
79
  - MIT
76
80
  metadata: {}
77
- post_install_message:
81
+ post_install_message:
78
82
  rdoc_options:
79
83
  - "--main"
80
84
  - README.markdown
@@ -92,9 +96,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
96
  - !ruby/object:Gem::Version
93
97
  version: '0'
94
98
  requirements: []
95
- rubyforge_project: curb
96
- rubygems_version: 2.4.3
97
- signing_key:
99
+ rubygems_version: 3.1.4
100
+ signing_key:
98
101
  specification_version: 4
99
102
  summary: Ruby libcurl bindings
100
103
  test_files:
@@ -105,11 +108,13 @@ test_files:
105
108
  - tests/bug_postfields_crash.rb
106
109
  - tests/bug_crash_on_progress.rb
107
110
  - tests/helper.rb
111
+ - tests/bug_issue277.rb
108
112
  - tests/bug_postfields_crash2.rb
109
113
  - tests/bug_require_last_or_segfault.rb
110
114
  - tests/timeout.rb
111
115
  - tests/bug_crash_on_debug.rb
112
116
  - tests/unittests.rb
117
+ - tests/tc_curl_protocols.rb
113
118
  - tests/bug_issue102.rb
114
119
  - tests/bug_curb_easy_blocks_ruby_threads.rb
115
120
  - tests/bug_multi_segfault.rb
@@ -120,6 +125,7 @@ test_files:
120
125
  - tests/tc_curl_easy.rb
121
126
  - tests/mem_check.rb
122
127
  - tests/tc_curl_postfield.rb
128
+ - tests/tc_curl_maxfilesize.rb
123
129
  - tests/bugtests.rb
124
130
  - tests/tc_curl_easy_resolve.rb
125
131
  - tests/signals.rb