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.
- checksums.yaml +4 -4
- data/README.md +21 -4
- data/data/cacert.pem +337 -914
- data/excon.gemspec +24 -17
- data/lib/excon/connection.rb +33 -11
- data/lib/excon/constants.rb +139 -126
- data/lib/excon/error.rb +3 -2
- data/lib/excon/middlewares/decompress.rb +17 -22
- data/lib/excon/middlewares/redirect_follower.rb +19 -7
- data/lib/excon/resolver_factory.rb +18 -0
- data/lib/excon/response.rb +4 -4
- data/lib/excon/socket.rb +32 -48
- data/lib/excon/socks5.rb +194 -0
- data/lib/excon/socks5_socket.rb +36 -0
- data/lib/excon/socks5_ssl_socket.rb +44 -0
- data/lib/excon/ssl_socket.rb +4 -3
- data/lib/excon/test/plugin/server/puma.rb +1 -1
- data/lib/excon/test/plugin/server/unicorn.rb +5 -5
- data/lib/excon/test/plugin/server/webrick.rb +1 -1
- data/lib/excon/test/server.rb +2 -7
- data/lib/excon/unix_socket.rb +1 -1
- data/lib/excon/utils.rb +39 -36
- data/lib/excon/version.rb +1 -1
- data/lib/excon.rb +45 -51
- metadata +52 -23
- data/lib/excon/middlewares/capture_cookies.rb +0 -32
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
|
-
|
|
5
|
+
module_function
|
|
5
6
|
|
|
6
|
-
CONTROL = (0x0..0x1f).map
|
|
7
|
+
CONTROL = "#{(0x0..0x1f).map(&:chr).join}\u007F"
|
|
7
8
|
DELIMS = '<>#%"'
|
|
8
9
|
UNWISE = '{}|\\^[]`'
|
|
9
|
-
NONASCII = (0x80..0xff).map
|
|
10
|
-
UNESCAPED = /([#{
|
|
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
|
-
|
|
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.
|
|
40
|
-
if datum[:headers].
|
|
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].
|
|
44
|
-
|
|
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
|
-
|
|
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
|
|
66
|
-
|
|
59
|
+
if !default_port?(datum) || datum[:include_default_port] || !datum[:omit_default_port]
|
|
60
|
+
":#{datum[:port]}"
|
|
67
61
|
else
|
|
68
|
-
'
|
|
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 =
|
|
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(
|
|
100
|
-
(?:,\s*|\Z)
|
|
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) {
|
|
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) {
|
|
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.
|
|
122
|
-
str.gsub(ESCAPED) {
|
|
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 =
|
|
128
|
+
headers_str = +''
|
|
128
129
|
headers.each do |key, values|
|
|
129
|
-
if key.to_s.match(/[\r\n]/)
|
|
130
|
-
raise Excon::Errors::InvalidHeaderKey
|
|
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
|
|
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
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
:
|
|
130
|
-
:
|
|
131
|
-
:
|
|
132
|
-
:
|
|
133
|
-
:
|
|
134
|
-
:
|
|
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
|
-
|
|
137
|
-
|
|
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
|
|
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
|
-
:
|
|
156
|
-
:path
|
|
157
|
-
:
|
|
158
|
-
:
|
|
159
|
-
:
|
|
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
|
|
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.
|
|
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
|
-
|
|
177
|
-
|
|
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
|
|
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 = { :
|
|
198
|
-
headers_match = !stub.
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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:
|
|
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:
|
|
12
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
14
13
|
dependencies:
|
|
15
14
|
- !ruby/object:Gem::Dependency
|
|
16
|
-
name:
|
|
15
|
+
name: logger
|
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
|
18
17
|
requirements:
|
|
19
18
|
- - ">="
|
|
20
19
|
- !ruby/object:Gem::Version
|
|
21
|
-
version:
|
|
22
|
-
type: :
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
169
|
+
name: sinatra
|
|
143
170
|
requirement: !ruby/object:Gem::Requirement
|
|
144
171
|
requirements:
|
|
145
172
|
- - ">="
|
|
146
173
|
- !ruby/object:Gem::Version
|
|
147
|
-
version:
|
|
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:
|
|
181
|
+
version: '0'
|
|
155
182
|
- !ruby/object:Gem::Dependency
|
|
156
|
-
name:
|
|
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:
|
|
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:
|
|
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
|