ethon 0.15.0 → 0.16.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 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: