excon 0.109.0 → 1.5.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.
data/lib/excon/utils.rb CHANGED
@@ -1,14 +1,15 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Excon
3
4
  module Utils
4
- extend self
5
+ module_function
5
6
 
6
- CONTROL = (0x0..0x1f).map {|c| c.chr }.join + "\x7f"
7
+ CONTROL = "#{(0x0..0x1f).map(&:chr).join}\u007F"
7
8
  DELIMS = '<>#%"'
8
9
  UNWISE = '{}|\\^[]`'
9
- NONASCII = (0x80..0xff).map {|c| c.chr }.join
10
- UNESCAPED = /([#{ Regexp.escape(CONTROL + ' ' + DELIMS + UNWISE + NONASCII) }])/
11
- ESCAPED = /%([0-9a-fA-F]{2})/
10
+ NONASCII = (0x80..0xff).map(&:chr).join
11
+ UNESCAPED = /([#{Regexp.escape("#{CONTROL} #{DELIMS}#{UNWISE}#{NONASCII}")}])/.freeze
12
+ ESCAPED = /%([0-9a-fA-F]{2})/.freeze
12
13
 
13
14
  def binary_encode(string)
14
15
  if FORCE_ENC && string.encoding != Encoding::ASCII_8BIT
@@ -23,9 +24,8 @@ module Excon
23
24
  end
24
25
 
25
26
  def connection_uri(datum = @data)
26
- unless datum
27
- raise ArgumentError, '`datum` must be given unless called on a Connection'
28
- end
27
+ raise ArgumentError, '`datum` must be given unless called on a Connection' unless datum
28
+
29
29
  if datum[:scheme] == UNIX
30
30
  "#{datum[:scheme]}://#{datum[:socket]}"
31
31
  else
@@ -36,21 +36,15 @@ module Excon
36
36
  # Redact sensitive info from provided data
37
37
  def redact(datum)
38
38
  datum = datum.dup
39
- if datum.has_key?(:headers)
40
- if datum[:headers].has_key?('Authorization') || datum[:headers].has_key?('Proxy-Authorization')
39
+ if datum.key?(:headers)
40
+ if datum[:headers].key?('Authorization') || datum[:headers].key?('Proxy-Authorization')
41
41
  datum[:headers] = datum[:headers].dup
42
42
  end
43
- if datum[:headers].has_key?('Authorization')
44
- datum[:headers]['Authorization'] = REDACTED
45
- end
46
- if datum[:headers].has_key?('Proxy-Authorization')
47
- datum[:headers]['Proxy-Authorization'] = REDACTED
48
- end
49
- end
50
- if datum.has_key?(:password)
51
- datum[:password] = REDACTED
43
+ datum[:headers]['Authorization'] = REDACTED if datum[:headers].key?('Authorization')
44
+ datum[:headers]['Proxy-Authorization'] = REDACTED if datum[:headers].key?('Proxy-Authorization')
52
45
  end
53
- if datum.has_key?(:proxy) && datum[:proxy] && datum[:proxy].has_key?(:password)
46
+ datum[:password] = REDACTED if datum.key?(:password)
47
+ if datum.key?(:proxy) && datum[:proxy]&.key?(:password)
54
48
  datum[:proxy] = datum[:proxy].dup
55
49
  datum[:proxy][:password] = REDACTED
56
50
  end
@@ -62,21 +56,27 @@ module Excon
62
56
  end
63
57
 
64
58
  def port_string(datum)
65
- if datum[:port].nil? || (datum[:omit_default_port] && ((datum[:scheme].casecmp('http') == 0 && datum[:port] == 80) || (datum[:scheme].casecmp('https') == 0 && datum[:port] == 443)))
66
- ''
59
+ if !default_port?(datum) || datum[:include_default_port] || !datum[:omit_default_port]
60
+ ":#{datum[:port]}"
67
61
  else
68
- ':' + datum[:port].to_s
62
+ ''
69
63
  end
70
64
  end
71
65
 
66
+ def default_port?(datum)
67
+ (!datum[:scheme]&.casecmp?('unix') && datum[:port].nil?) ||
68
+ (datum[:scheme]&.casecmp?('http') && datum[:port] == 80) ||
69
+ (datum[:scheme]&.casecmp?('https') && datum[:port] == 443)
70
+ end
71
+
72
72
  def query_string(datum)
73
- str = String.new
73
+ str = +''
74
74
  case datum[:query]
75
75
  when String
76
76
  str << '?' << datum[:query]
77
77
  when Hash
78
78
  str << '?'
79
- datum[:query].sort_by {|k,_| k.to_s }.each do |key, values|
79
+ datum[:query].sort_by { |k, _| k.to_s }.each do |key, values|
80
80
  key = CGI.escape(key.to_s)
81
81
  if values.nil?
82
82
  str << key << '&'
@@ -94,46 +94,49 @@ module Excon
94
94
  # Splits a header value +str+ according to HTTP specification.
95
95
  def split_header_value(str)
96
96
  return [] if str.nil?
97
+
97
98
  str = str.dup.strip
98
99
  str = binary_encode(str)
99
- str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",])+)
100
- (?:,\s*|\Z)'xn).flatten
100
+ str.scan(/\G((?:"(?:\\.|[^"])+?"|[^",])+)
101
+ (?:,\s*|\Z)/xn).flatten
101
102
  end
102
103
 
103
104
  # Escapes HTTP reserved and unwise characters in +str+
104
105
  def escape_uri(str)
105
106
  str = str.dup
106
107
  str = binary_encode(str)
107
- str.gsub(UNESCAPED) { "%%%02X" % $1[0].ord }
108
+ str.gsub(UNESCAPED) { format('%%%02X', ::Regexp.last_match(1)[0].ord) }
108
109
  end
109
110
 
110
111
  # Unescapes HTTP reserved and unwise characters in +str+
111
112
  def unescape_uri(str)
112
113
  str = str.dup
113
114
  str = binary_encode(str)
114
- str.gsub(ESCAPED) { $1.hex.chr }
115
+ str.gsub(ESCAPED) { ::Regexp.last_match(1).hex.chr }
115
116
  end
116
117
 
117
118
  # Unescape form encoded values in +str+
118
119
  def unescape_form(str)
119
120
  str = str.dup
120
121
  str = binary_encode(str)
121
- str.gsub!(/\+/, ' ')
122
- str.gsub(ESCAPED) { $1.hex.chr }
122
+ str.tr!('+', ' ')
123
+ str.gsub(ESCAPED) { ::Regexp.last_match(1).hex.chr }
123
124
  end
124
125
 
125
126
  # Performs validation on the passed header hash and returns a string representation of the headers
126
127
  def headers_hash_to_s(headers)
127
- headers_str = String.new
128
+ headers_str = +''
128
129
  headers.each do |key, values|
129
- if key.to_s.match(/[\r\n]/)
130
- raise Excon::Errors::InvalidHeaderKey.new(key.to_s.inspect + ' contains forbidden "\r" or "\n"')
130
+ if key.to_s.match?(/[\r\n]/)
131
+ raise Excon::Errors::InvalidHeaderKey, "#{key.to_s.inspect} contains forbidden \"\\r\" or \"\\n\""
131
132
  end
133
+
132
134
  [values].flatten.each do |value|
133
- if value.to_s.match(/[\r\n]/)
135
+ if value.to_s.match?(/[\r\n]/)
134
136
  # Don't include the potentially sensitive header value (i.e. authorization token) in the message
135
- raise Excon::Errors::InvalidHeaderValue.new(key.to_s + ' header value contains forbidden "\r" or "\n"')
137
+ raise Excon::Errors::InvalidHeaderValue, "#{key} header value contains forbidden \"\\r\" or \"\\n\""
136
138
  end
139
+
137
140
  headers_str << key.to_s << ': ' << value.to_s << CR_NL
138
141
  end
139
142
  end
data/lib/excon/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Excon
4
- VERSION = '0.109.0'
4
+ VERSION = '1.5.0'
5
5
  end
data/lib/excon.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  $:.unshift(File.dirname(__FILE__)) unless
3
4
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
4
5
 
5
- require 'cgi'
6
+ require 'cgi/escape'
6
7
  require 'forwardable'
8
+ require 'ipaddr'
7
9
  require 'openssl'
8
10
  require 'rbconfig'
9
11
  require 'socket'
@@ -17,6 +19,7 @@ require 'excon/version'
17
19
  require 'excon/extensions/uri'
18
20
 
19
21
  require 'excon/middlewares/base'
22
+ require 'excon/middlewares/decompress'
20
23
  require 'excon/middlewares/expects'
21
24
  require 'excon/middlewares/idempotent'
22
25
  require 'excon/middlewares/instrumentor'
@@ -24,19 +27,21 @@ require 'excon/middlewares/mock'
24
27
  require 'excon/middlewares/response_parser'
25
28
 
26
29
  require 'excon/error'
30
+ require 'excon/resolver_factory'
27
31
  require 'excon/constants'
28
32
  require 'excon/utils'
29
33
 
30
34
  require 'excon/connection'
31
35
  require 'excon/headers'
32
36
  require 'excon/response'
33
- require 'excon/middlewares/decompress'
34
37
  require 'excon/middlewares/escape_path'
35
38
  require 'excon/middlewares/redirect_follower'
36
- require 'excon/middlewares/capture_cookies'
37
39
  require 'excon/pretty_printer'
38
40
  require 'excon/socket'
39
41
  require 'excon/ssl_socket'
42
+ require 'excon/socks5'
43
+ require 'excon/socks5_socket'
44
+ require 'excon/socks5_ssl_socket'
40
45
  require 'excon/instrumentors/standard_instrumentor'
41
46
  require 'excon/instrumentors/logging_instrumentor'
42
47
  require 'excon/unix_socket'
@@ -44,27 +49,22 @@ require 'excon/unix_socket'
44
49
  # Define defaults first so they will be available to other files
45
50
  module Excon
46
51
  class << self
47
-
48
52
  # @return [Hash] defaults for Excon connections
49
53
  def defaults
50
- @defaults ||= DEFAULTS
54
+ @defaults ||= DEFAULTS.dup
51
55
  end
52
56
 
53
57
  # Change defaults for Excon connections
54
58
  # @return [Hash] defaults for Excon connections
55
- def defaults=(new_defaults)
56
- @defaults = new_defaults
57
- end
59
+ attr_writer :defaults
58
60
 
59
61
  def display_warning(warning)
60
62
  # Show warning if $VERBOSE or ENV['EXCON_DEBUG'] is set
61
- if $VERBOSE || ENV['EXCON_DEBUG']
62
- $stderr.puts "[excon][WARNING] #{warning}\n#{ caller.join("\n") }"
63
- end
63
+ ($VERBOSE || ENV['EXCON_DEBUG']) && Warning.warn("[excon][WARNING] #{warning}\n#{caller.join("\n")}")
64
64
 
65
- if @raise_on_warnings
66
- raise Error::Warning.new(warning)
67
- end
65
+ return unless @raise_on_warnings
66
+
67
+ raise(Error::Warning, warning)
68
68
  end
69
69
 
70
70
  def set_raise_on_warnings!(should_raise)
@@ -119,32 +119,25 @@ module Excon
119
119
  def new(url, params = {})
120
120
  uri_parser = params[:uri_parser] || defaults[:uri_parser]
121
121
  uri = uri_parser.parse(url)
122
- if params[:path]
123
- uri_parser.parse(params[:path])
124
- end
125
- unless uri.scheme
126
- raise ArgumentError.new("Invalid URI: #{uri}")
127
- end
122
+ params[:path] && uri_parser.parse(params[:path])
123
+ raise(ArgumentError, "Invalid URI: #{uri}") unless uri.scheme
124
+
128
125
  params = {
129
- :host => uri.host,
130
- :hostname => uri.hostname,
131
- :path => uri.path,
132
- :port => uri.port,
133
- :query => uri.query,
134
- :scheme => uri.scheme
126
+ host: uri.host,
127
+ hostname: uri.hostname,
128
+ path: uri.path,
129
+ port: uri.port,
130
+ query: uri.query,
131
+ scheme: uri.scheme
135
132
  }.merge(params)
136
- if uri.password
137
- params[:password] = Utils.unescape_uri(uri.password)
138
- end
139
- if uri.user
140
- params[:user] = Utils.unescape_uri(uri.user)
141
- end
133
+ uri.password && params[:password] = Utils.unescape_uri(uri.password)
134
+ uri.user && params[:user] = Utils.unescape_uri(uri.user)
142
135
  Excon::Connection.new(params)
143
136
  end
144
137
 
145
138
  # push an additional stub onto the list to check for mock requests
146
139
  # @param request_params [Hash<Symbol, >] request params to match against, omitted params match all
147
- # @param response_params [Hash<Symbol, >] response params to return from matched request or block to call with params
140
+ # @param response_params [Hash<Symbol, >] response params to return or block to call with matched params
148
141
  def stub(request_params = {}, response_params = nil, &block)
149
142
  if (method = request_params.delete(:method))
150
143
  request_params[:method] = method.to_s.downcase.to_sym
@@ -152,35 +145,35 @@ module Excon
152
145
  if (url = request_params.delete(:url))
153
146
  uri = URI.parse(url)
154
147
  request_params = {
155
- :host => uri.host,
156
- :path => uri.path,
157
- :port => uri.port,
158
- :query => uri.query,
159
- :scheme => uri.scheme
148
+ host: uri.host,
149
+ path: uri.path.empty? ? '/' : uri.path,
150
+ port: uri.port,
151
+ query: uri.query,
152
+ scheme: uri.scheme
160
153
  }.merge!(request_params)
161
154
  if uri.user || uri.password
162
155
  request_params[:headers] ||= {}
163
- user, pass = Utils.unescape_form(uri.user.to_s), Utils.unescape_form(uri.password.to_s)
156
+ user = Utils.unescape_form(uri.user.to_s)
157
+ pass = Utils.unescape_form(uri.password.to_s)
164
158
  request_params[:headers]['Authorization'] ||= 'Basic ' + ["#{user}:#{pass}"].pack('m').delete(Excon::CR_NL)
165
159
  end
166
160
  end
167
- if request_params.has_key?(:headers)
161
+ if request_params.key?(:headers)
168
162
  headers = Excon::Headers.new
169
163
  request_params[:headers].each do |key, value|
170
164
  headers[key] = value
171
165
  end
172
166
  request_params[:headers] = headers
173
167
  end
168
+ request_params[:query] = Utils.query_string(request_params)[1...] if request_params.key?(:query)
174
169
  if block_given?
175
- if response_params
176
- raise(ArgumentError.new("stub requires either response_params OR a block"))
177
- else
178
- stub = [request_params, block]
179
- end
170
+ raise(ArgumentError, 'stub requires either response_params OR a block') if response_params
171
+
172
+ stub = [request_params, block]
180
173
  elsif response_params
181
174
  stub = [request_params, response_params]
182
175
  else
183
- raise(ArgumentError.new("stub requires either response_params OR a block"))
176
+ raise(ArgumentError, 'stub requires either response_params OR a block')
184
177
  end
185
178
  stubs.unshift(stub)
186
179
  stub
@@ -193,9 +186,10 @@ module Excon
193
186
  if (method = request_params.delete(:method))
194
187
  request_params[:method] = method.to_s.downcase.to_sym
195
188
  end
189
+ request_params[:query] = Utils.query_string(request_params)[1...] if request_params.key?(:query)
196
190
  Excon.stubs.each do |stub, response_params|
197
- captures = { :headers => {} }
198
- headers_match = !stub.has_key?(:headers) || stub[:headers].keys.all? do |key|
191
+ captures = { headers: {} }
192
+ headers_match = !stub.key?(:headers) || stub[:headers].keys.all? do |key|
199
193
  case value = stub[:headers][key]
200
194
  when Regexp
201
195
  case request_params[:headers][key]
@@ -249,9 +243,9 @@ module Excon
249
243
  # @param request_params [Hash<Symbol, >] request params to match against, omitted params match all
250
244
  # @return [Hash<Symbol, >] response params from deleted stub
251
245
  def unstub(request_params = {})
252
- if (stub = stub_for(request_params))
253
- Excon.stubs.delete_at(Excon.stubs.index(stub))
254
- end
246
+ return unless (stub = stub_for(request_params))
247
+
248
+ Excon.stubs.delete_at(Excon.stubs.index(stub))
255
249
  end
256
250
 
257
251
  # Generic non-persistent HTTP methods
metadata CHANGED
@@ -1,31 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.109.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - dpiddy (Dan Peterson)
8
8
  - geemus (Wesley Beary)
9
9
  - nextmat (Matt Sanders)
10
- autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2024-01-03 00:00:00.000000000 Z
12
+ date: 1980-01-02 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
- name: rspec
15
+ name: logger
17
16
  requirement: !ruby/object:Gem::Requirement
18
17
  requirements:
19
18
  - - ">="
20
19
  - !ruby/object:Gem::Version
21
- version: 3.5.0
22
- type: :development
20
+ version: '0'
21
+ type: :runtime
23
22
  prerelease: false
24
23
  version_requirements: !ruby/object:Gem::Requirement
25
24
  requirements:
26
25
  - - ">="
27
26
  - !ruby/object:Gem::Version
28
- version: 3.5.0
27
+ version: '0'
29
28
  - !ruby/object:Gem::Dependency
30
29
  name: activesupport
31
30
  requirement: !ruby/object:Gem::Requirement
@@ -68,6 +67,20 @@ dependencies:
68
67
  - - ">="
69
68
  - !ruby/object:Gem::Version
70
69
  version: 1.0.4
70
+ - !ruby/object:Gem::Dependency
71
+ name: json
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 1.8.5
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 1.8.5
71
84
  - !ruby/object:Gem::Dependency
72
85
  name: open4
73
86
  requirement: !ruby/object:Gem::Requirement
@@ -83,7 +96,7 @@ dependencies:
83
96
  - !ruby/object:Gem::Version
84
97
  version: '0'
85
98
  - !ruby/object:Gem::Dependency
86
- name: rake
99
+ name: puma
87
100
  requirement: !ruby/object:Gem::Requirement
88
101
  requirements:
89
102
  - - ">="
@@ -97,7 +110,7 @@ dependencies:
97
110
  - !ruby/object:Gem::Version
98
111
  version: '0'
99
112
  - !ruby/object:Gem::Dependency
100
- name: shindo
113
+ name: rake
101
114
  requirement: !ruby/object:Gem::Requirement
102
115
  requirements:
103
116
  - - ">="
@@ -111,7 +124,7 @@ dependencies:
111
124
  - !ruby/object:Gem::Version
112
125
  version: '0'
113
126
  - !ruby/object:Gem::Dependency
114
- name: sinatra
127
+ name: rdoc
115
128
  requirement: !ruby/object:Gem::Requirement
116
129
  requirements:
117
130
  - - ">="
@@ -125,7 +138,21 @@ dependencies:
125
138
  - !ruby/object:Gem::Version
126
139
  version: '0'
127
140
  - !ruby/object:Gem::Dependency
128
- name: sinatra-contrib
141
+ name: rspec
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: 3.5.0
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: 3.5.0
154
+ - !ruby/object:Gem::Dependency
155
+ name: shindo
129
156
  requirement: !ruby/object:Gem::Requirement
130
157
  requirements:
131
158
  - - ">="
@@ -139,21 +166,21 @@ dependencies:
139
166
  - !ruby/object:Gem::Version
140
167
  version: '0'
141
168
  - !ruby/object:Gem::Dependency
142
- name: json
169
+ name: sinatra
143
170
  requirement: !ruby/object:Gem::Requirement
144
171
  requirements:
145
172
  - - ">="
146
173
  - !ruby/object:Gem::Version
147
- version: 1.8.5
174
+ version: '0'
148
175
  type: :development
149
176
  prerelease: false
150
177
  version_requirements: !ruby/object:Gem::Requirement
151
178
  requirements:
152
179
  - - ">="
153
180
  - !ruby/object:Gem::Version
154
- version: 1.8.5
181
+ version: '0'
155
182
  - !ruby/object:Gem::Dependency
156
- name: puma
183
+ name: sinatra-contrib
157
184
  requirement: !ruby/object:Gem::Requirement
158
185
  requirements:
159
186
  - - ">="
@@ -185,9 +212,9 @@ email: geemus@gmail.com
185
212
  executables: []
186
213
  extensions: []
187
214
  extra_rdoc_files:
188
- - README.md
189
- - CONTRIBUTORS.md
190
215
  - CONTRIBUTING.md
216
+ - CONTRIBUTORS.md
217
+ - README.md
191
218
  files:
192
219
  - CONTRIBUTING.md
193
220
  - CONTRIBUTORS.md
@@ -204,7 +231,6 @@ files:
204
231
  - lib/excon/instrumentors/logging_instrumentor.rb
205
232
  - lib/excon/instrumentors/standard_instrumentor.rb
206
233
  - lib/excon/middlewares/base.rb
207
- - lib/excon/middlewares/capture_cookies.rb
208
234
  - lib/excon/middlewares/decompress.rb
209
235
  - lib/excon/middlewares/escape_path.rb
210
236
  - lib/excon/middlewares/expects.rb
@@ -214,8 +240,12 @@ files:
214
240
  - lib/excon/middlewares/redirect_follower.rb
215
241
  - lib/excon/middlewares/response_parser.rb
216
242
  - lib/excon/pretty_printer.rb
243
+ - lib/excon/resolver_factory.rb
217
244
  - lib/excon/response.rb
218
245
  - lib/excon/socket.rb
246
+ - lib/excon/socks5.rb
247
+ - lib/excon/socks5_socket.rb
248
+ - lib/excon/socks5_ssl_socket.rb
219
249
  - lib/excon/ssl_socket.rb
220
250
  - lib/excon/test/plugin/server/exec.rb
221
251
  - lib/excon/test/plugin/server/puma.rb
@@ -229,13 +259,13 @@ homepage: https://github.com/excon/excon
229
259
  licenses:
230
260
  - MIT
231
261
  metadata:
232
- homepage_uri: https://github.com/excon/excon
233
262
  bug_tracker_uri: https://github.com/excon/excon/issues
234
263
  changelog_uri: https://github.com/excon/excon/blob/master/changelog.txt
235
264
  documentation_uri: https://github.com/excon/excon/blob/master/README.md
265
+ funding_uri: https://github.com/sponsors/geemus
266
+ homepage_uri: https://github.com/excon/excon
236
267
  source_code_uri: https://github.com/excon/excon
237
268
  wiki_uri: https://github.com/excon/excon/wiki
238
- post_install_message:
239
269
  rdoc_options:
240
270
  - "--charset=UTF-8"
241
271
  require_paths:
@@ -244,15 +274,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
244
274
  requirements:
245
275
  - - ">="
246
276
  - !ruby/object:Gem::Version
247
- version: '0'
277
+ version: 3.1.0
248
278
  required_rubygems_version: !ruby/object:Gem::Requirement
249
279
  requirements:
250
280
  - - ">="
251
281
  - !ruby/object:Gem::Version
252
282
  version: '0'
253
283
  requirements: []
254
- rubygems_version: 3.4.10
255
- signing_key:
284
+ rubygems_version: 4.0.3
256
285
  specification_version: 4
257
286
  summary: speed, persistence, http(s)
258
287
  test_files: []
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
- module Excon
3
- module Middleware
4
- class CaptureCookies < Excon::Middleware::Base
5
-
6
- def extract_cookies_from_set_cookie(set_cookie)
7
- set_cookie.split(',').map { |full| full.split(';').first.strip }.join('; ')
8
- end
9
-
10
- def get_header(datum, header)
11
- _, header_value = datum[:response][:headers].detect do |key, _|
12
- key.casecmp(header) == 0
13
- end
14
- header_value
15
- end
16
-
17
- def response_call(datum)
18
- cookie = get_header(datum, 'Set-Cookie')
19
- if cookie
20
- cookie = extract_cookies_from_set_cookie(cookie)
21
- unless datum[:headers].key?("Cookie")
22
- datum[:headers]["Cookie"] = cookie
23
- else
24
- original_cookies = datum[:headers]["Cookie"]
25
- datum[:headers]["Cookie"] = original_cookies.empty? ? cookie : [original_cookies,cookie].join('; ')
26
- end
27
- end
28
- super(datum)
29
- end
30
- end
31
- end
32
- end