ethon 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 04b0080762fbe70bea3b3d5717749a8afb60feb1d843543fc313705dc245b2b8
4
- data.tar.gz: fab2787f5a0eebd10ed2d6004ba9b6e3cdc5b60f776e9e5ee0d811529a9a50c6
3
+ metadata.gz: 30f75feeae963db1b4648a0b88e028361c78fda7aec43524a35f93b287ab2305
4
+ data.tar.gz: eb0ccd002c324dedaaceaa001172a61c520cd58e34d1a92440182faada17df74
5
5
  SHA512:
6
- metadata.gz: c8d9d0214408c48e702b0d8256d5d6c9d62540d57b9ce142c4a90ff667bbf4db4661e9423ce372d0652c9df4b0147110c3dcc2f317418d3b0e33fe245b4b876b
7
- data.tar.gz: 1d351ae5e4b45e736a7eef6d4068cec779bfba6a71097c102a3998315aa391789d86725b173eafc5f15d55e587730334ec6c1eb60d4c5eb63b3cacbd11ddddb1
6
+ metadata.gz: b6ec09378cd37ec552caee9a9153fb9e0582a770b18da882ec27f59028799885e1a9d9d7c496f1cfb4803ba3eb14bdd5e508f930cdc9523d16747d2a87ba1dfb
7
+ data.tar.gz: 77a50827108e8c6bc44f293bae5c2bfe6e871c94f40f93904ff611245143ef7900cf4cc2aa8a1511d0797dd80c03578e06b4e256f929deab544c73f9ef0d9e33
@@ -20,7 +20,7 @@ jobs:
20
20
  fail-fast: false
21
21
  matrix:
22
22
  os: [ubuntu, macos]
23
- ruby-version: [2.5, 2.6, 2.7, 3.0, head, debug, truffleruby, truffleruby-head]
23
+ ruby-version: [2.5, 2.6, 2.7, 3.0, head, debug, truffleruby]
24
24
  continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
25
25
  steps:
26
26
  - uses: actions/checkout@v2
@@ -30,7 +30,7 @@ jobs:
30
30
  then
31
31
  brew install curl
32
32
  else
33
- sudo apt install -y libcurl4-openssl-dev
33
+ sudo apt update && sudo apt install -y --no-install-recommends libcurl4-openssl-dev
34
34
  fi
35
35
  - name: Set up Ruby
36
36
  uses: ruby/setup-ruby@v1
data/CHANGELOG.md CHANGED
@@ -4,6 +4,9 @@
4
4
 
5
5
  [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.15.0...master)
6
6
 
7
+ * Added `redirect_url` value to available informations and `Easy::Mirror`.
8
+ ([Adrien Rey-Jarthon](https://github.com/jarthod)
9
+
7
10
  ## 0.15.0
8
11
 
9
12
  [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.14.0...v0.15.0)
data/README.md CHANGED
@@ -70,6 +70,29 @@ easy.perform
70
70
  This is really handy when making requests since you don't have to care about setting
71
71
  everything up correctly.
72
72
 
73
+ ## Http2
74
+ Standard http2 servers require the client to connect once and create a session (multi) and then add simple requests to the multi handler.
75
+ The `perform` method then takes all the requests in the multi handler and sends them to the server.
76
+
77
+ See the following example
78
+ ```ruby
79
+ multi = Ethon::Multi.new
80
+ easy = Ethon::Easy.new
81
+
82
+ easy.http_request("www.example.com/get", :get, { http_version: :httpv2_0 })
83
+
84
+ # Sending a request with http version 2 will send an Upgrade header to the server, which many older servers will not support
85
+ # See below for more info: https://everything.curl.dev/http/http2
86
+ # If this is a problem, send the below:
87
+ easy.http_request("www.example.com/get", :get, { http_version: :httpv2_prior_knowledge })
88
+
89
+ # To set the server to use http2 with https and http1 with http, send the following:
90
+ easy.http_request("www.example.com/get", :get, { http_version: :httpv2_tls }
91
+
92
+ multi.add(easy)
93
+ multi.perform
94
+ ```
95
+
73
96
  ## LICENSE
74
97
 
75
98
  (The MIT License)
@@ -32,8 +32,18 @@ module Ethon
32
32
 
33
33
  def clear; self[:fd_count] = 0; end
34
34
  else
35
- # FD Set size.
36
- FD_SETSIZE = ::Ethon::Libc.getdtablesize
35
+ # https://github.com/typhoeus/ethon/issues/182
36
+ FD_SETSIZE = begin
37
+ # Allow to override the (new) default cap
38
+ if ENV['ETHON_FD_SIZE']
39
+ ENV['ETHON_FD_SIZE']
40
+
41
+ # auto-detect ulimit, but cap at 2^16
42
+ else
43
+ [::Ethon::Libc.getdtablesize, 65_536].min
44
+ end
45
+ end
46
+
37
47
  layout :fds_bits, [:long, FD_SETSIZE / ::FFI::Type::LONG.size]
38
48
 
39
49
  # :nodoc:
@@ -307,6 +307,7 @@ module Ethon
307
307
  option :easy, :port, :int, 3
308
308
  option :easy, :tcp_nodelay, :bool, 121
309
309
  option :easy, :address_scope, :int, 171
310
+ option :easy, :tcp_fastopen, :bool, 212
310
311
  option :easy, :tcp_keepalive, :bool, 213
311
312
  option :easy, :tcp_keepidle, :int, 214
312
313
  option :easy, :tcp_keepintvl, :int, 215
@@ -352,7 +353,7 @@ module Ethon
352
353
  option :easy, :cookiesession, :bool, 96
353
354
  option :easy, :cookielist, :string, 135
354
355
  option :easy, :httpget, :bool, 80
355
- option :easy, :http_version, :enum, 84, [:none, :httpv1_0, :httpv1_1, :httpv2_0]
356
+ option :easy, :http_version, :enum, 84, [:none, :httpv1_0, :httpv1_1, :httpv2_0, :httpv2_tls, :httpv2_prior_knowledge]
356
357
  option :easy, :ignore_content_length, :bool, 136
357
358
  option :easy, :http_content_decoding, :bool, 158
358
359
  option :easy, :http_transfer_decoding, :bool, 157
@@ -440,7 +441,7 @@ module Ethon
440
441
  option_alias :easy, :keypasswd, :sslkeypasswd
441
442
  option :easy, :sslengine, :string, 89
442
443
  option :easy, :sslengine_default, :none, 90
443
- option :easy, :sslversion, :enum, 32, [:default, :tlsv1, :sslv2, :sslv3, :tlsv1_0, :tlsv1_1, :tlsv1_2]
444
+ option :easy, :sslversion, :enum, 32, [:default, :tlsv1, :sslv2, :sslv3, :tlsv1_0, :tlsv1_1, :tlsv1_2, :tlsv1_3]
444
445
  option :easy, :ssl_verifypeer, :bool, 64
445
446
  option :easy, :cainfo, :string, 65
446
447
  option :easy, :issuercert, :string, 170
@@ -463,7 +464,7 @@ module Ethon
463
464
  option :easy, :proxy_capath, :string, 247
464
465
  option :easy, :proxy_ssl_verifypeer, :bool, 248
465
466
  option :easy, :proxy_ssl_verifyhost, :int, 249
466
- option :easy, :proxy_sslversion, :enum, 250, [:default, :tlsv1, :sslv2, :sslv3, :tlsv1_0, :tlsv1_1, :tlsv1_2]
467
+ option :easy, :proxy_sslversion, :enum, 250, [:default, :tlsv1, :sslv2, :sslv3, :tlsv1_0, :tlsv1_1, :tlsv1_2, :tlsv1_3]
467
468
  option :easy, :proxy_tlsauth_username, :string, 251
468
469
  option :easy, :proxy_tlsauth_password, :string, 252
469
470
  option :easy, :proxy_tlsauth_type, :enum, 253, [:none, :srp]
@@ -52,8 +52,9 @@ module Ethon
52
52
  # @return [ Proc ] The callback.
53
53
  def header_write_callback
54
54
  @header_write_callback ||= proc {|stream, size, num, object|
55
+ result = headers
55
56
  @response_headers << stream.read_string(size * num)
56
- size * num
57
+ result != :abort ? size * num : -1
57
58
  }
58
59
  end
59
60
 
@@ -73,6 +73,9 @@ module Ethon
73
73
  # actually followed.
74
74
  :redirect_count => :long,
75
75
 
76
+ # URL a redirect would take you to, had you enabled redirects (Added in 7.18.2)
77
+ :redirect_url => :string,
78
+
76
79
  # Return the bytes, the total amount of bytes that were uploaded
77
80
  :size_upload => :double,
78
81
 
@@ -43,7 +43,12 @@ module Ethon
43
43
  return if @headers_called
44
44
  @headers_called = true
45
45
  if defined?(@on_headers) and not @on_headers.nil?
46
- @on_headers.each{ |callback| callback.call(self) }
46
+ result = nil
47
+ @on_headers.each do |callback|
48
+ result = callback.call(self)
49
+ break if result == :abort
50
+ end
51
+ result
47
52
  end
48
53
  end
49
54
 
data/lib/ethon/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  module Ethon
3
3
 
4
4
  # Ethon version.
5
- VERSION = '0.15.0'
5
+ VERSION = '0.16.0'
6
6
  end
@@ -56,4 +56,26 @@ describe Ethon::Easy::Callbacks do
56
56
  end
57
57
  end
58
58
  end
59
+
60
+ describe "#header_write_callback" do
61
+ let(:header_write_callback) { easy.instance_variable_get(:@header_write_callback) }
62
+ let(:stream) { double(:read_string => "") }
63
+ context "when header returns not :abort" do
64
+ it "returns number bigger than 0" do
65
+ expect(header_write_callback.call(stream, 1, 1, nil) > 0).to be(true)
66
+ end
67
+ end
68
+
69
+ context "when header returns :abort" do
70
+ before do
71
+ easy.on_headers.clear
72
+ easy.on_headers { :abort }
73
+ end
74
+ let(:header_write_callback) { easy.instance_variable_get(:@header_write_callback) }
75
+
76
+ it "returns -1 to indicate abort to libcurl" do
77
+ expect(header_write_callback.call(stream, 1, 1, nil)).to eq(-1)
78
+ end
79
+ end
80
+ end
59
81
  end
@@ -81,6 +81,12 @@ describe Ethon::Easy::Informations do
81
81
  end
82
82
  end
83
83
 
84
+ describe "#redirect_url" do
85
+ it "returns nil as there is no redirect" do
86
+ expect(easy.redirect_url).to be(nil)
87
+ end
88
+ end
89
+
84
90
  describe "#request_size" do
85
91
  it "returns 53" do
86
92
  expect(easy.request_size).to eq(53)
@@ -11,7 +11,7 @@ describe Ethon::Easy::Mirror do
11
11
  :total_time, :starttransfer_time, :appconnect_time,
12
12
  :pretransfer_time, :connect_time, :namelookup_time, :redirect_time,
13
13
  :size_upload, :size_download, :speed_upload, :speed_upload,
14
- :effective_url, :primary_ip, :redirect_count, :debug_info
14
+ :effective_url, :primary_ip, :redirect_count, :redirect_url, :debug_info
15
15
  ].each do |name|
16
16
  it "contains #{name}" do
17
17
  expect(described_class::INFORMATIONS_TO_MIRROR).to include(name)
@@ -106,6 +106,7 @@ describe Ethon::Easy::Operations do
106
106
 
107
107
  it "doesn't follow" do
108
108
  expect(easy.response_code).to eq(302)
109
+ expect(easy.redirect_url).to eq("http://localhost:3001/")
109
110
  end
110
111
  end
111
112
 
@@ -115,6 +116,7 @@ describe Ethon::Easy::Operations do
115
116
 
116
117
  it "follows" do
117
118
  expect(easy.response_code).to eq(200)
119
+ expect(easy.redirect_url).to eq(nil)
118
120
  end
119
121
 
120
122
  context "when infinite redirect loop" do
@@ -124,6 +126,7 @@ describe Ethon::Easy::Operations do
124
126
  context "when max redirect set" do
125
127
  it "follows only x times" do
126
128
  expect(easy.response_code).to eq(302)
129
+ expect(easy.redirect_url).to eq("http://localhost:3001/bad_redirect")
127
130
  end
128
131
  end
129
132
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ethon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hans Hasselberg
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-12 00:00:00.000000000 Z
11
+ date: 2022-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -137,7 +137,7 @@ homepage: https://github.com/typhoeus/ethon
137
137
  licenses:
138
138
  - MIT
139
139
  metadata: {}
140
- post_install_message:
140
+ post_install_message:
141
141
  rdoc_options: []
142
142
  require_paths:
143
143
  - lib
@@ -152,8 +152,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
152
152
  - !ruby/object:Gem::Version
153
153
  version: 1.3.6
154
154
  requirements: []
155
- rubygems_version: 3.0.3
156
- signing_key:
155
+ rubygems_version: 3.3.7
156
+ signing_key:
157
157
  specification_version: 4
158
158
  summary: Libcurl wrapper.
159
159
  test_files: