excon 0.99.0 → 1.0.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 +24 -2
- data/data/cacert.pem +483 -189
- data/excon.gemspec +1 -0
- data/lib/excon/connection.rb +18 -5
- data/lib/excon/constants.rb +121 -113
- data/lib/excon/middlewares/decompress.rb +17 -22
- data/lib/excon/socket.rb +114 -24
- data/lib/excon/ssl_socket.rb +1 -1
- data/lib/excon/test/server.rb +0 -2
- data/lib/excon/utils.rb +25 -3
- data/lib/excon/version.rb +2 -1
- data/lib/excon.rb +43 -47
- metadata +7 -7
data/lib/excon/utils.rb
CHANGED
|
@@ -62,11 +62,33 @@ module Excon
|
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
def port_string(datum)
|
|
65
|
-
if
|
|
66
|
-
|
|
65
|
+
if !default_port?(datum) || datum[:include_default_port] || !datum[:omit_default_port]
|
|
66
|
+
":#{datum[:port]}"
|
|
67
67
|
else
|
|
68
|
-
'
|
|
68
|
+
''
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Used to normalize queries for stubs, based on Rack::Utils.parse_query
|
|
73
|
+
def parse_query_string(string)
|
|
74
|
+
params = {}
|
|
75
|
+
|
|
76
|
+
string.split(/[&;] */n).each do |pair|
|
|
77
|
+
key, value = pair.split('=', 2).map { |x| CGI.unescape(x) }
|
|
78
|
+
|
|
79
|
+
params[key] = if params[key]
|
|
80
|
+
[params[key], value].flatten
|
|
81
|
+
else
|
|
82
|
+
value
|
|
83
|
+
end
|
|
69
84
|
end
|
|
85
|
+
|
|
86
|
+
params
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def default_port?(datum)
|
|
90
|
+
(datum[:scheme].casecmp('http').zero? && datum[:port] == 80) ||
|
|
91
|
+
(datum[:scheme].casecmp('https').zero? && datum[:port] == 443)
|
|
70
92
|
end
|
|
71
93
|
|
|
72
94
|
def query_string(datum)
|
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
6
|
require 'cgi'
|
|
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'
|
|
@@ -30,7 +33,6 @@ require 'excon/utils'
|
|
|
30
33
|
require 'excon/connection'
|
|
31
34
|
require 'excon/headers'
|
|
32
35
|
require 'excon/response'
|
|
33
|
-
require 'excon/middlewares/decompress'
|
|
34
36
|
require 'excon/middlewares/escape_path'
|
|
35
37
|
require 'excon/middlewares/redirect_follower'
|
|
36
38
|
require 'excon/middlewares/capture_cookies'
|
|
@@ -44,7 +46,6 @@ require 'excon/unix_socket'
|
|
|
44
46
|
# Define defaults first so they will be available to other files
|
|
45
47
|
module Excon
|
|
46
48
|
class << self
|
|
47
|
-
|
|
48
49
|
# @return [Hash] defaults for Excon connections
|
|
49
50
|
def defaults
|
|
50
51
|
@defaults ||= DEFAULTS
|
|
@@ -52,19 +53,15 @@ module Excon
|
|
|
52
53
|
|
|
53
54
|
# Change defaults for Excon connections
|
|
54
55
|
# @return [Hash] defaults for Excon connections
|
|
55
|
-
|
|
56
|
-
@defaults = new_defaults
|
|
57
|
-
end
|
|
56
|
+
attr_writer :defaults
|
|
58
57
|
|
|
59
58
|
def display_warning(warning)
|
|
60
59
|
# Show warning if $VERBOSE or ENV['EXCON_DEBUG'] is set
|
|
61
|
-
|
|
62
|
-
$stderr.puts "[excon][WARNING] #{warning}\n#{ caller.join("\n") }"
|
|
63
|
-
end
|
|
60
|
+
($VERBOSE || ENV['EXCON_DEBUG']) && Warning.warn("[excon][WARNING] #{warning}\n#{caller.join("\n")}")
|
|
64
61
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
return unless @raise_on_warnings
|
|
63
|
+
|
|
64
|
+
raise(Error::Warning, warning)
|
|
68
65
|
end
|
|
69
66
|
|
|
70
67
|
def set_raise_on_warnings!(should_raise)
|
|
@@ -119,32 +116,25 @@ module Excon
|
|
|
119
116
|
def new(url, params = {})
|
|
120
117
|
uri_parser = params[:uri_parser] || defaults[:uri_parser]
|
|
121
118
|
uri = uri_parser.parse(url)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
unless uri.scheme
|
|
126
|
-
raise ArgumentError.new("Invalid URI: #{uri}")
|
|
127
|
-
end
|
|
119
|
+
params[:path] && uri_parser.parse(params[:path])
|
|
120
|
+
raise(ArgumentError, "Invalid URI: #{uri}") unless uri.scheme
|
|
121
|
+
|
|
128
122
|
params = {
|
|
129
|
-
:
|
|
130
|
-
:
|
|
131
|
-
:
|
|
132
|
-
:
|
|
133
|
-
:
|
|
134
|
-
:
|
|
123
|
+
host: uri.host,
|
|
124
|
+
hostname: uri.hostname,
|
|
125
|
+
path: uri.path,
|
|
126
|
+
port: uri.port,
|
|
127
|
+
query: uri.query,
|
|
128
|
+
scheme: uri.scheme
|
|
135
129
|
}.merge(params)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
end
|
|
139
|
-
if uri.user
|
|
140
|
-
params[:user] = Utils.unescape_uri(uri.user)
|
|
141
|
-
end
|
|
130
|
+
uri.password && params[:password] = Utils.unescape_uri(uri.password)
|
|
131
|
+
uri.user && params[:user] = Utils.unescape_uri(uri.user)
|
|
142
132
|
Excon::Connection.new(params)
|
|
143
133
|
end
|
|
144
134
|
|
|
145
135
|
# push an additional stub onto the list to check for mock requests
|
|
146
136
|
# @param request_params [Hash<Symbol, >] request params to match against, omitted params match all
|
|
147
|
-
# @param response_params [Hash<Symbol, >] response params to return
|
|
137
|
+
# @param response_params [Hash<Symbol, >] response params to return or block to call with matched params
|
|
148
138
|
def stub(request_params = {}, response_params = nil, &block)
|
|
149
139
|
if (method = request_params.delete(:method))
|
|
150
140
|
request_params[:method] = method.to_s.downcase.to_sym
|
|
@@ -152,35 +142,37 @@ module Excon
|
|
|
152
142
|
if (url = request_params.delete(:url))
|
|
153
143
|
uri = URI.parse(url)
|
|
154
144
|
request_params = {
|
|
155
|
-
:
|
|
156
|
-
:path
|
|
157
|
-
:
|
|
158
|
-
:
|
|
159
|
-
:
|
|
145
|
+
host: uri.host,
|
|
146
|
+
path: uri.path.empty? ? '/' : uri.path,
|
|
147
|
+
port: uri.port,
|
|
148
|
+
query: uri.query,
|
|
149
|
+
scheme: uri.scheme
|
|
160
150
|
}.merge!(request_params)
|
|
161
151
|
if uri.user || uri.password
|
|
162
152
|
request_params[:headers] ||= {}
|
|
163
|
-
user
|
|
153
|
+
user = Utils.unescape_form(uri.user.to_s)
|
|
154
|
+
pass = Utils.unescape_form(uri.password.to_s)
|
|
164
155
|
request_params[:headers]['Authorization'] ||= 'Basic ' + ["#{user}:#{pass}"].pack('m').delete(Excon::CR_NL)
|
|
165
156
|
end
|
|
166
157
|
end
|
|
167
|
-
if request_params.
|
|
158
|
+
if request_params.key?(:headers)
|
|
168
159
|
headers = Excon::Headers.new
|
|
169
160
|
request_params[:headers].each do |key, value|
|
|
170
161
|
headers[key] = value
|
|
171
162
|
end
|
|
172
163
|
request_params[:headers] = headers
|
|
173
164
|
end
|
|
165
|
+
if request_params.key?(:query) && request_params[:query].instance_of?(String)
|
|
166
|
+
request_params[:query] = Utils.parse_query_string(request_params[:query])
|
|
167
|
+
end
|
|
174
168
|
if block_given?
|
|
175
|
-
if response_params
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
stub = [request_params, block]
|
|
179
|
-
end
|
|
169
|
+
raise(ArgumentError, 'stub requires either response_params OR a block') if response_params
|
|
170
|
+
|
|
171
|
+
stub = [request_params, block]
|
|
180
172
|
elsif response_params
|
|
181
173
|
stub = [request_params, response_params]
|
|
182
174
|
else
|
|
183
|
-
raise(ArgumentError
|
|
175
|
+
raise(ArgumentError, 'stub requires either response_params OR a block')
|
|
184
176
|
end
|
|
185
177
|
stubs.unshift(stub)
|
|
186
178
|
stub
|
|
@@ -193,9 +185,12 @@ module Excon
|
|
|
193
185
|
if (method = request_params.delete(:method))
|
|
194
186
|
request_params[:method] = method.to_s.downcase.to_sym
|
|
195
187
|
end
|
|
188
|
+
if request_params.key?(:query) && request_params[:query].instance_of?(String)
|
|
189
|
+
request_params[:query] = Utils.parse_query_string(request_params[:query])
|
|
190
|
+
end
|
|
196
191
|
Excon.stubs.each do |stub, response_params|
|
|
197
|
-
captures = { :
|
|
198
|
-
headers_match = !stub.
|
|
192
|
+
captures = { headers: {} }
|
|
193
|
+
headers_match = !stub.key?(:headers) || stub[:headers].keys.all? do |key|
|
|
199
194
|
case value = stub[:headers][key]
|
|
200
195
|
when Regexp
|
|
201
196
|
case request_params[:headers][key]
|
|
@@ -245,11 +240,12 @@ module Excon
|
|
|
245
240
|
end
|
|
246
241
|
end
|
|
247
242
|
|
|
248
|
-
# remove first/oldest stub matching request_params
|
|
243
|
+
# remove first/oldest stub matching request_params or nil if none match
|
|
249
244
|
# @param request_params [Hash<Symbol, >] request params to match against, omitted params match all
|
|
250
245
|
# @return [Hash<Symbol, >] response params from deleted stub
|
|
251
246
|
def unstub(request_params = {})
|
|
252
|
-
stub = stub_for(request_params)
|
|
247
|
+
return unless (stub = stub_for(request_params))
|
|
248
|
+
|
|
253
249
|
Excon.stubs.delete_at(Excon.stubs.index(stub))
|
|
254
250
|
end
|
|
255
251
|
|
metadata
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: excon
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.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:
|
|
10
|
+
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date:
|
|
13
|
+
date: 2024-10-24 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: rspec
|
|
@@ -235,7 +235,7 @@ metadata:
|
|
|
235
235
|
documentation_uri: https://github.com/excon/excon/blob/master/README.md
|
|
236
236
|
source_code_uri: https://github.com/excon/excon
|
|
237
237
|
wiki_uri: https://github.com/excon/excon/wiki
|
|
238
|
-
post_install_message:
|
|
238
|
+
post_install_message:
|
|
239
239
|
rdoc_options:
|
|
240
240
|
- "--charset=UTF-8"
|
|
241
241
|
require_paths:
|
|
@@ -244,15 +244,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
244
244
|
requirements:
|
|
245
245
|
- - ">="
|
|
246
246
|
- !ruby/object:Gem::Version
|
|
247
|
-
version:
|
|
247
|
+
version: 2.7.0
|
|
248
248
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
249
|
requirements:
|
|
250
250
|
- - ">="
|
|
251
251
|
- !ruby/object:Gem::Version
|
|
252
252
|
version: '0'
|
|
253
253
|
requirements: []
|
|
254
|
-
rubygems_version: 3.
|
|
255
|
-
signing_key:
|
|
254
|
+
rubygems_version: 3.5.18
|
|
255
|
+
signing_key:
|
|
256
256
|
specification_version: 4
|
|
257
257
|
summary: speed, persistence, http(s)
|
|
258
258
|
test_files: []
|