excon 0.62.0 → 0.79.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/LICENSE.md +1 -1
- data/README.md +5 -4
- data/data/cacert.pem +769 -1496
- data/excon.gemspec +17 -2
- data/lib/excon.rb +25 -17
- data/lib/excon/connection.rb +193 -119
- data/lib/excon/constants.rb +36 -13
- data/lib/excon/error.rb +15 -0
- data/lib/excon/headers.rb +4 -3
- data/lib/excon/instrumentors/logging_instrumentor.rb +4 -15
- data/lib/excon/instrumentors/standard_instrumentor.rb +2 -9
- data/lib/excon/middlewares/base.rb +6 -0
- data/lib/excon/middlewares/capture_cookies.rb +1 -1
- data/lib/excon/middlewares/decompress.rb +2 -2
- data/lib/excon/middlewares/expects.rb +7 -1
- data/lib/excon/middlewares/idempotent.rb +20 -3
- data/lib/excon/middlewares/instrumentor.rb +8 -0
- data/lib/excon/middlewares/mock.rb +12 -3
- data/lib/excon/middlewares/redirect_follower.rb +25 -3
- data/lib/excon/middlewares/response_parser.rb +3 -0
- data/lib/excon/pretty_printer.rb +1 -8
- data/lib/excon/response.rb +12 -9
- data/lib/excon/socket.rb +38 -21
- data/lib/excon/ssl_socket.rb +24 -13
- data/lib/excon/test/plugin/server/exec.rb +2 -2
- data/lib/excon/test/server.rb +1 -1
- data/lib/excon/unix_socket.rb +1 -0
- data/lib/excon/utils.rb +41 -5
- data/lib/excon/version.rb +1 -1
- metadata +27 -98
- data/.document +0 -5
- data/.gitignore +0 -13
- data/.rspec +0 -3
- data/.travis.yml +0 -29
- data/Gemfile +0 -19
- data/Rakefile +0 -41
- data/benchmarks/class_vs_lambda.rb +0 -50
- data/benchmarks/concat_vs_insert.rb +0 -21
- data/benchmarks/concat_vs_interpolate.rb +0 -22
- data/benchmarks/cr_lf.rb +0 -21
- data/benchmarks/downcase-eq-eq_vs_casecmp.rb +0 -169
- data/benchmarks/excon.rb +0 -69
- data/benchmarks/excon_vs.rb +0 -165
- data/benchmarks/for_vs_array_each.rb +0 -27
- data/benchmarks/for_vs_hash_each.rb +0 -27
- data/benchmarks/has_key-vs-lookup.rb +0 -177
- data/benchmarks/headers_case_sensitivity.rb +0 -83
- data/benchmarks/headers_split_vs_match.rb +0 -34
- data/benchmarks/implicit_block-vs-explicit_block.rb +0 -98
- data/benchmarks/merging.rb +0 -21
- data/benchmarks/single_vs_double_quotes.rb +0 -21
- data/benchmarks/string_ranged_index.rb +0 -87
- data/benchmarks/strip_newline.rb +0 -115
- data/benchmarks/vs_stdlib.rb +0 -82
- data/changelog.txt +0 -1083
- data/spec/excon/error_spec.rb +0 -139
- data/spec/excon/test/server_spec.rb +0 -28
- data/spec/excon_spec.rb +0 -7
- data/spec/helpers/file_path_helpers.rb +0 -22
- data/spec/requests/basic_spec.rb +0 -40
- data/spec/requests/eof_requests_spec.rb +0 -36
- data/spec/requests/unix_socket_spec.rb +0 -46
- data/spec/spec_helper.rb +0 -24
- data/spec/support/shared_contexts/test_server_context.rb +0 -83
- data/spec/support/shared_examples/shared_example_for_clients.rb +0 -218
- data/spec/support/shared_examples/shared_example_for_streaming_clients.rb +0 -20
- data/spec/support/shared_examples/shared_example_for_test_servers.rb +0 -16
- data/tests/authorization_header_tests.rb +0 -29
- data/tests/bad_tests.rb +0 -47
- data/tests/basic_tests.rb +0 -351
- data/tests/batch_requests.rb +0 -133
- data/tests/complete_responses.rb +0 -31
- data/tests/data/127.0.0.1.cert.crt +0 -20
- data/tests/data/127.0.0.1.cert.key +0 -27
- data/tests/data/excon.cert.crt +0 -20
- data/tests/data/excon.cert.key +0 -27
- data/tests/data/xs +0 -1
- data/tests/error_tests.rb +0 -145
- data/tests/header_tests.rb +0 -119
- data/tests/middlewares/canned_response_tests.rb +0 -34
- data/tests/middlewares/capture_cookies_tests.rb +0 -34
- data/tests/middlewares/decompress_tests.rb +0 -157
- data/tests/middlewares/escape_path_tests.rb +0 -36
- data/tests/middlewares/idempotent_tests.rb +0 -206
- data/tests/middlewares/instrumentation_tests.rb +0 -315
- data/tests/middlewares/mock_tests.rb +0 -304
- data/tests/middlewares/redirect_follower_tests.rb +0 -112
- data/tests/pipeline_tests.rb +0 -40
- data/tests/proxy_tests.rb +0 -306
- data/tests/query_string_tests.rb +0 -87
- data/tests/rackups/basic.rb +0 -41
- data/tests/rackups/basic.ru +0 -3
- data/tests/rackups/basic_auth.ru +0 -14
- data/tests/rackups/deflater.ru +0 -4
- data/tests/rackups/proxy.ru +0 -18
- data/tests/rackups/query_string.ru +0 -13
- data/tests/rackups/redirecting.ru +0 -23
- data/tests/rackups/redirecting_with_cookie.ru +0 -40
- data/tests/rackups/request_headers.ru +0 -15
- data/tests/rackups/request_methods.ru +0 -21
- data/tests/rackups/response_header.ru +0 -18
- data/tests/rackups/ssl.ru +0 -16
- data/tests/rackups/ssl_mismatched_cn.ru +0 -15
- data/tests/rackups/ssl_verify_peer.ru +0 -16
- data/tests/rackups/streaming.ru +0 -30
- data/tests/rackups/thread_safety.ru +0 -17
- data/tests/rackups/timeout.ru +0 -14
- data/tests/rackups/webrick_patch.rb +0 -34
- data/tests/request_headers_tests.rb +0 -21
- data/tests/request_method_tests.rb +0 -47
- data/tests/request_tests.rb +0 -59
- data/tests/response_tests.rb +0 -197
- data/tests/servers/bad.rb +0 -20
- data/tests/servers/eof.rb +0 -17
- data/tests/servers/error.rb +0 -20
- data/tests/servers/good.rb +0 -350
- data/tests/test_helper.rb +0 -306
- data/tests/thread_safety_tests.rb +0 -39
- data/tests/timeout_tests.rb +0 -12
- data/tests/utils_tests.rb +0 -81
data/lib/excon/pretty_printer.rb
CHANGED
@@ -9,14 +9,7 @@ module Excon
|
|
9
9
|
datum.delete(:connection)
|
10
10
|
datum.delete(:stack)
|
11
11
|
|
12
|
-
|
13
|
-
datum[:headers] = datum[:headers].dup
|
14
|
-
datum[:headers]['Authorization'] = REDACTED
|
15
|
-
end
|
16
|
-
|
17
|
-
if datum.has_key?(:password)
|
18
|
-
datum[:password] = REDACTED
|
19
|
-
end
|
12
|
+
datum = Utils.redact(datum)
|
20
13
|
end
|
21
14
|
|
22
15
|
indent += 2
|
data/lib/excon/response.rb
CHANGED
@@ -59,10 +59,13 @@ module Excon
|
|
59
59
|
|
60
60
|
def self.parse(socket, datum)
|
61
61
|
# this will discard any trailing lines from the previous response if any.
|
62
|
-
|
62
|
+
line = nil
|
63
|
+
loop do
|
63
64
|
line = socket.readline
|
64
|
-
|
65
|
+
break if line[9,3].to_i != 0
|
66
|
+
end
|
65
67
|
|
68
|
+
status = line[9, 3].to_i
|
66
69
|
reason_phrase = line[13..-3] # -3 strips the trailing "\r\n"
|
67
70
|
|
68
71
|
datum[:response] = {
|
@@ -90,7 +93,7 @@ module Excon
|
|
90
93
|
|
91
94
|
unless (['HEAD', 'CONNECT'].include?(datum[:method].to_s.upcase)) || NO_ENTITY.include?(datum[:response][:status])
|
92
95
|
|
93
|
-
if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Transfer-Encoding') == 0 }
|
96
|
+
if (key = datum[:response][:headers].keys.detect {|k| k.casecmp('Transfer-Encoding') == 0 })
|
94
97
|
encodings = Utils.split_header_value(datum[:response][:headers][key])
|
95
98
|
if (encoding = encodings.last) && encoding.casecmp('chunked') == 0
|
96
99
|
transfer_encoding_chunked = true
|
@@ -103,7 +106,7 @@ module Excon
|
|
103
106
|
end
|
104
107
|
|
105
108
|
# use :response_block unless :expects would fail
|
106
|
-
if response_block = datum[:response_block]
|
109
|
+
if (response_block = datum[:response_block])
|
107
110
|
if datum[:middlewares].include?(Excon::Middleware::Expects) && datum[:expects] &&
|
108
111
|
!Array(datum[:expects]).include?(datum[:response][:status])
|
109
112
|
response_block = nil
|
@@ -140,11 +143,11 @@ module Excon
|
|
140
143
|
end
|
141
144
|
parse_headers(socket, datum) # merge trailers into headers
|
142
145
|
else
|
143
|
-
if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Content-Length') == 0 }
|
146
|
+
if (key = datum[:response][:headers].keys.detect {|k| k.casecmp('Content-Length') == 0 })
|
144
147
|
content_length = datum[:response][:headers][key].to_i
|
145
148
|
end
|
146
149
|
|
147
|
-
if remaining = content_length
|
150
|
+
if (remaining = content_length)
|
148
151
|
if response_block
|
149
152
|
while remaining > 0
|
150
153
|
chunk = socket.read([datum[:chunk_size], remaining].min) || raise(EOFError)
|
@@ -160,11 +163,11 @@ module Excon
|
|
160
163
|
end
|
161
164
|
else
|
162
165
|
if response_block
|
163
|
-
while chunk = socket.read(datum[:chunk_size])
|
166
|
+
while (chunk = socket.read(datum[:chunk_size]))
|
164
167
|
response_block.call(chunk, nil, nil)
|
165
168
|
end
|
166
169
|
else
|
167
|
-
while chunk = socket.read(datum[:chunk_size])
|
170
|
+
while (chunk = socket.read(datum[:chunk_size]))
|
168
171
|
datum[:response][:body] << chunk
|
169
172
|
end
|
170
173
|
end
|
@@ -222,7 +225,7 @@ module Excon
|
|
222
225
|
end
|
223
226
|
|
224
227
|
# Retrieve a specific header value. Header names are treated case-insensitively.
|
225
|
-
#
|
228
|
+
# @param [String] name Header name
|
226
229
|
def get_header(name)
|
227
230
|
headers[name]
|
228
231
|
end
|
data/lib/excon/socket.rb
CHANGED
@@ -7,6 +7,23 @@ module Excon
|
|
7
7
|
|
8
8
|
attr_accessor :data
|
9
9
|
|
10
|
+
# read/write drawn from https://github.com/ruby-amqp/bunny/commit/75d9dd79551b31a5dd3d1254c537bad471f108cf
|
11
|
+
CONNECT_RETRY_EXCEPTION_CLASSES = if defined?(IO::EINPROGRESSWaitWritable) # Ruby >= 2.1
|
12
|
+
[Errno::EINPROGRESS, IO::EINPROGRESSWaitWritable]
|
13
|
+
else # Ruby <= 2.0
|
14
|
+
[Errno::EINPROGRESS]
|
15
|
+
end
|
16
|
+
READ_RETRY_EXCEPTION_CLASSES = if defined?(IO::EAGAINWaitReadable) # Ruby >= 2.1
|
17
|
+
[Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable, IO::EAGAINWaitReadable, IO::EWOULDBLOCKWaitReadable]
|
18
|
+
else # Ruby <= 2.0
|
19
|
+
[Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable]
|
20
|
+
end
|
21
|
+
WRITE_RETRY_EXCEPTION_CLASSES = if defined?(IO::EAGAINWaitWritable) # Ruby >= 2.1
|
22
|
+
[Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitWritable, IO::EAGAINWaitWritable, IO::EWOULDBLOCKWaitWritable]
|
23
|
+
else # Ruby <= 2.0
|
24
|
+
[Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitWritable]
|
25
|
+
end
|
26
|
+
|
10
27
|
def params
|
11
28
|
Excon.display_warning('Excon::Socket#params is deprecated use Excon::Socket#data instead.')
|
12
29
|
@data
|
@@ -43,18 +60,8 @@ module Excon
|
|
43
60
|
def readline
|
44
61
|
return legacy_readline if RUBY_VERSION.to_f <= 1.8_7
|
45
62
|
buffer = String.new
|
46
|
-
|
47
|
-
|
48
|
-
buffer
|
49
|
-
rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
|
50
|
-
select_with_timeout(@socket, :read) && retry
|
51
|
-
rescue OpenSSL::SSL::SSLError => error
|
52
|
-
if error.message == 'read would block'
|
53
|
-
select_with_timeout(@socket, :read) && retry
|
54
|
-
else
|
55
|
-
raise(error)
|
56
|
-
end
|
57
|
-
end
|
63
|
+
buffer << read_nonblock(1) while buffer[-1] != "\n"
|
64
|
+
buffer
|
58
65
|
end
|
59
66
|
|
60
67
|
def legacy_readline
|
@@ -106,8 +113,9 @@ module Excon
|
|
106
113
|
if @socket
|
107
114
|
break
|
108
115
|
end
|
109
|
-
|
116
|
+
|
110
117
|
@remote_ip = ip
|
118
|
+
@data[:remote_ip] = ip
|
111
119
|
|
112
120
|
# nonblocking connect
|
113
121
|
begin
|
@@ -128,7 +136,7 @@ module Excon
|
|
128
136
|
socket.connect(sockaddr)
|
129
137
|
end
|
130
138
|
@socket = socket
|
131
|
-
rescue
|
139
|
+
rescue *CONNECT_RETRY_EXCEPTION_CLASSES
|
132
140
|
select_with_timeout(socket, :connect_write)
|
133
141
|
begin
|
134
142
|
socket.connect_nonblock(sockaddr)
|
@@ -151,6 +159,17 @@ module Excon
|
|
151
159
|
::Socket::TCP_NODELAY,
|
152
160
|
true)
|
153
161
|
end
|
162
|
+
|
163
|
+
if @data[:keepalive]
|
164
|
+
if [:SOL_SOCKET, :SO_KEEPALIVE, :SOL_TCP, :TCP_KEEPIDLE, :TCP_KEEPINTVL, :TCP_KEEPCNT].all?{|c| ::Socket.const_defined? c}
|
165
|
+
@socket.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_KEEPALIVE, true)
|
166
|
+
@socket.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPIDLE, @data[:keepalive][:time])
|
167
|
+
@socket.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPINTVL, @data[:keepalive][:intvl])
|
168
|
+
@socket.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPCNT, @data[:keepalive][:probes])
|
169
|
+
else
|
170
|
+
Excon.display_warning('Excon::Socket keepalive was set, but is not supported by Ruby version.')
|
171
|
+
end
|
172
|
+
end
|
154
173
|
end
|
155
174
|
|
156
175
|
def read_nonblock(max_length)
|
@@ -170,7 +189,7 @@ module Excon
|
|
170
189
|
else
|
171
190
|
raise(error)
|
172
191
|
end
|
173
|
-
rescue
|
192
|
+
rescue *READ_RETRY_EXCEPTION_CLASSES
|
174
193
|
if @read_buffer.empty?
|
175
194
|
# if we didn't read anything, try again...
|
176
195
|
select_with_timeout(@socket, :read) && retry
|
@@ -199,7 +218,7 @@ module Excon
|
|
199
218
|
else
|
200
219
|
raise(error)
|
201
220
|
end
|
202
|
-
rescue
|
221
|
+
rescue *READ_RETRY_EXCEPTION_CLASSES
|
203
222
|
if @read_buffer.empty?
|
204
223
|
select_with_timeout(@socket, :read) && retry
|
205
224
|
end
|
@@ -208,9 +227,7 @@ module Excon
|
|
208
227
|
end
|
209
228
|
|
210
229
|
def write_nonblock(data)
|
211
|
-
|
212
|
-
data.force_encoding('BINARY')
|
213
|
-
end
|
230
|
+
data = binary_encode(data)
|
214
231
|
loop do
|
215
232
|
written = nil
|
216
233
|
begin
|
@@ -225,7 +242,7 @@ module Excon
|
|
225
242
|
else
|
226
243
|
raise error
|
227
244
|
end
|
228
|
-
rescue OpenSSL::SSL::SSLError,
|
245
|
+
rescue OpenSSL::SSL::SSLError, *WRITE_RETRY_EXCEPTION_CLASSES => error
|
229
246
|
if error.is_a?(OpenSSL::SSL::SSLError) && error.message != 'write would block'
|
230
247
|
raise error
|
231
248
|
else
|
@@ -246,7 +263,7 @@ module Excon
|
|
246
263
|
|
247
264
|
def write_block(data)
|
248
265
|
@socket.write(data)
|
249
|
-
rescue OpenSSL::SSL::SSLError,
|
266
|
+
rescue OpenSSL::SSL::SSLError, *WRITE_RETRY_EXCEPTION_CLASSES => error
|
250
267
|
if error.is_a?(OpenSSL::SSL::SSLError) && error.message != 'write would block'
|
251
268
|
raise error
|
252
269
|
else
|
data/lib/excon/ssl_socket.rb
CHANGED
@@ -27,18 +27,25 @@ module Excon
|
|
27
27
|
if @data[:ssl_version]
|
28
28
|
ssl_context.ssl_version = @data[:ssl_version]
|
29
29
|
end
|
30
|
+
if @data[:ssl_min_version]
|
31
|
+
ssl_context.min_version = @data[:ssl_min_version]
|
32
|
+
end
|
33
|
+
if @data[:ssl_max_version]
|
34
|
+
ssl_context.max_version = @data[:ssl_max_version]
|
35
|
+
end
|
36
|
+
|
30
37
|
|
31
38
|
if @data[:ssl_verify_peer]
|
32
39
|
# turn verification on
|
33
40
|
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
34
41
|
|
35
|
-
if ca_file = @data[:ssl_ca_file] || ENV['SSL_CERT_FILE']
|
42
|
+
if (ca_file = @data[:ssl_ca_file] || ENV['SSL_CERT_FILE'])
|
36
43
|
ssl_context.ca_file = ca_file
|
37
44
|
end
|
38
|
-
if ca_path = @data[:ssl_ca_path] || ENV['SSL_CERT_DIR']
|
45
|
+
if (ca_path = @data[:ssl_ca_path] || ENV['SSL_CERT_DIR'])
|
39
46
|
ssl_context.ca_path = ca_path
|
40
47
|
end
|
41
|
-
if cert_store = @data[:ssl_cert_store]
|
48
|
+
if (cert_store = @data[:ssl_cert_store])
|
42
49
|
ssl_context.cert_store = cert_store
|
43
50
|
end
|
44
51
|
|
@@ -58,7 +65,7 @@ module Excon
|
|
58
65
|
end
|
59
66
|
end
|
60
67
|
|
61
|
-
if verify_callback = @data[:ssl_verify_callback]
|
68
|
+
if (verify_callback = @data[:ssl_verify_callback])
|
62
69
|
ssl_context.verify_callback = verify_callback
|
63
70
|
end
|
64
71
|
else
|
@@ -66,6 +73,9 @@ module Excon
|
|
66
73
|
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
67
74
|
end
|
68
75
|
|
76
|
+
# Verify certificate hostname if supported (ruby >= 2.4.0)
|
77
|
+
ssl_context.verify_hostname = @data[:ssl_verify_hostname] if ssl_context.respond_to?(:verify_hostname=)
|
78
|
+
|
69
79
|
if client_cert_data && client_key_data
|
70
80
|
ssl_context.cert = OpenSSL::X509::Certificate.new client_cert_data
|
71
81
|
if OpenSSL::PKey.respond_to? :read
|
@@ -100,7 +110,10 @@ module Excon
|
|
100
110
|
@socket.write(request)
|
101
111
|
|
102
112
|
# eat the proxy's connection response
|
103
|
-
Excon::Response.parse(self, :expects => 200, :method => 'CONNECT')
|
113
|
+
response = Excon::Response.parse(self, :expects => 200, :method => 'CONNECT')
|
114
|
+
if response[:response][:status] != 200
|
115
|
+
raise(Excon::Errors::ProxyConnectionError.new("proxy connection could not be established", request, response))
|
116
|
+
end
|
104
117
|
end
|
105
118
|
|
106
119
|
# convert Socket to OpenSSL::SSL::SSLSocket
|
@@ -132,18 +145,16 @@ module Excon
|
|
132
145
|
if @data[:ssl_verify_peer]
|
133
146
|
@socket.post_connection_check(@data[:ssl_verify_peer_host] || @data[:host])
|
134
147
|
end
|
135
|
-
|
136
|
-
@socket
|
137
148
|
end
|
138
149
|
|
139
150
|
private
|
140
151
|
|
141
152
|
def client_cert_data
|
142
|
-
@client_cert_data ||= if ccd = @data[:client_cert_data]
|
153
|
+
@client_cert_data ||= if (ccd = @data[:client_cert_data])
|
143
154
|
ccd
|
144
|
-
elsif path = @data[:client_cert]
|
155
|
+
elsif (path = @data[:client_cert])
|
145
156
|
File.read path
|
146
|
-
elsif path = @data[:certificate_path]
|
157
|
+
elsif (path = @data[:certificate_path])
|
147
158
|
warn ":certificate_path is no longer supported and will be deprecated. Please use :client_cert or :client_cert_data"
|
148
159
|
File.read path
|
149
160
|
end
|
@@ -156,11 +167,11 @@ module Excon
|
|
156
167
|
end
|
157
168
|
|
158
169
|
def client_key_data
|
159
|
-
@client_key_data ||= if ckd = @data[:client_key_data]
|
170
|
+
@client_key_data ||= if (ckd = @data[:client_key_data])
|
160
171
|
ckd
|
161
|
-
elsif path = @data[:client_key]
|
172
|
+
elsif (path = @data[:client_key])
|
162
173
|
File.read path
|
163
|
-
elsif path = @data[:private_key_path]
|
174
|
+
elsif (path = @data[:private_key_path])
|
164
175
|
warn ":private_key_path is no longer supported and will be deprecated. Please use :client_key or :client_key_data"
|
165
176
|
File.read path
|
166
177
|
end
|
@@ -5,12 +5,12 @@ module Excon
|
|
5
5
|
module Exec
|
6
6
|
def start(app_str = app)
|
7
7
|
line = ''
|
8
|
-
open_process(
|
8
|
+
open_process(app_str)
|
9
9
|
until line =~ /\Aready\Z/
|
10
10
|
line = error.gets
|
11
11
|
fatal_time = elapsed_time > timeout
|
12
12
|
if fatal_time
|
13
|
-
msg = "executable #{
|
13
|
+
msg = "executable #{app_str} has taken too long to start"
|
14
14
|
raise msg
|
15
15
|
end
|
16
16
|
end
|
data/lib/excon/test/server.rb
CHANGED
data/lib/excon/unix_socket.rb
CHANGED
data/lib/excon/utils.rb
CHANGED
@@ -10,6 +10,18 @@ module Excon
|
|
10
10
|
UNESCAPED = /([#{ Regexp.escape(CONTROL + ' ' + DELIMS + UNWISE + NONASCII) }])/
|
11
11
|
ESCAPED = /%([0-9a-fA-F]{2})/
|
12
12
|
|
13
|
+
def binary_encode(string)
|
14
|
+
if FORCE_ENC && string.encoding != Encoding::ASCII_8BIT
|
15
|
+
if string.frozen?
|
16
|
+
string.dup.force_encoding('BINARY')
|
17
|
+
else
|
18
|
+
string.force_encoding('BINARY')
|
19
|
+
end
|
20
|
+
else
|
21
|
+
string
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
13
25
|
def connection_uri(datum = @data)
|
14
26
|
unless datum
|
15
27
|
raise ArgumentError, '`datum` must be given unless called on a Connection'
|
@@ -21,6 +33,30 @@ module Excon
|
|
21
33
|
end
|
22
34
|
end
|
23
35
|
|
36
|
+
# Redact sensitive info from provided data
|
37
|
+
def redact(datum)
|
38
|
+
datum = datum.dup
|
39
|
+
if datum.has_key?(:headers)
|
40
|
+
if datum[:headers].has_key?('Authorization') || datum[:headers].has_key?('Proxy-Authorization')
|
41
|
+
datum[:headers] = datum[:headers].dup
|
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
|
52
|
+
end
|
53
|
+
if datum.has_key?(:proxy) && datum[:proxy].has_key?(:password)
|
54
|
+
datum[:proxy] = datum[:proxy].dup
|
55
|
+
datum[:proxy][:password] = REDACTED
|
56
|
+
end
|
57
|
+
datum
|
58
|
+
end
|
59
|
+
|
24
60
|
def request_uri(datum)
|
25
61
|
connection_uri(datum) + datum[:path] + query_string(datum)
|
26
62
|
end
|
@@ -59,29 +95,29 @@ module Excon
|
|
59
95
|
def split_header_value(str)
|
60
96
|
return [] if str.nil?
|
61
97
|
str = str.dup.strip
|
62
|
-
str
|
63
|
-
str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]
|
98
|
+
str = binary_encode(str)
|
99
|
+
str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",])+)
|
64
100
|
(?:,\s*|\Z)'xn).flatten
|
65
101
|
end
|
66
102
|
|
67
103
|
# Escapes HTTP reserved and unwise characters in +str+
|
68
104
|
def escape_uri(str)
|
69
105
|
str = str.dup
|
70
|
-
str
|
106
|
+
str = binary_encode(str)
|
71
107
|
str.gsub(UNESCAPED) { "%%%02X" % $1[0].ord }
|
72
108
|
end
|
73
109
|
|
74
110
|
# Unescapes HTTP reserved and unwise characters in +str+
|
75
111
|
def unescape_uri(str)
|
76
112
|
str = str.dup
|
77
|
-
str
|
113
|
+
str = binary_encode(str)
|
78
114
|
str.gsub(ESCAPED) { $1.hex.chr }
|
79
115
|
end
|
80
116
|
|
81
117
|
# Unescape form encoded values in +str+
|
82
118
|
def unescape_form(str)
|
83
119
|
str = str.dup
|
84
|
-
str
|
120
|
+
str = binary_encode(str)
|
85
121
|
str.gsub!(/\+/, ' ')
|
86
122
|
str.gsub(ESCAPED) { $1.hex.chr }
|
87
123
|
end
|
data/lib/excon/version.rb
CHANGED
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: 0.79.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: 2021-02-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -180,6 +180,20 @@ dependencies:
|
|
180
180
|
- - ">="
|
181
181
|
- !ruby/object:Gem::Version
|
182
182
|
version: '0'
|
183
|
+
- !ruby/object:Gem::Dependency
|
184
|
+
name: webrick
|
185
|
+
requirement: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - ">="
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
190
|
+
type: :development
|
191
|
+
prerelease: false
|
192
|
+
version_requirements: !ruby/object:Gem::Requirement
|
193
|
+
requirements:
|
194
|
+
- - ">="
|
195
|
+
- !ruby/object:Gem::Version
|
196
|
+
version: '0'
|
183
197
|
description: EXtended http(s) CONnections
|
184
198
|
email: geemus@gmail.com
|
185
199
|
executables: []
|
@@ -189,35 +203,10 @@ extra_rdoc_files:
|
|
189
203
|
- CONTRIBUTORS.md
|
190
204
|
- CONTRIBUTING.md
|
191
205
|
files:
|
192
|
-
- ".document"
|
193
|
-
- ".gitignore"
|
194
|
-
- ".rspec"
|
195
|
-
- ".travis.yml"
|
196
206
|
- CONTRIBUTING.md
|
197
207
|
- CONTRIBUTORS.md
|
198
|
-
- Gemfile
|
199
208
|
- LICENSE.md
|
200
209
|
- README.md
|
201
|
-
- Rakefile
|
202
|
-
- benchmarks/class_vs_lambda.rb
|
203
|
-
- benchmarks/concat_vs_insert.rb
|
204
|
-
- benchmarks/concat_vs_interpolate.rb
|
205
|
-
- benchmarks/cr_lf.rb
|
206
|
-
- benchmarks/downcase-eq-eq_vs_casecmp.rb
|
207
|
-
- benchmarks/excon.rb
|
208
|
-
- benchmarks/excon_vs.rb
|
209
|
-
- benchmarks/for_vs_array_each.rb
|
210
|
-
- benchmarks/for_vs_hash_each.rb
|
211
|
-
- benchmarks/has_key-vs-lookup.rb
|
212
|
-
- benchmarks/headers_case_sensitivity.rb
|
213
|
-
- benchmarks/headers_split_vs_match.rb
|
214
|
-
- benchmarks/implicit_block-vs-explicit_block.rb
|
215
|
-
- benchmarks/merging.rb
|
216
|
-
- benchmarks/single_vs_double_quotes.rb
|
217
|
-
- benchmarks/string_ranged_index.rb
|
218
|
-
- benchmarks/strip_newline.rb
|
219
|
-
- benchmarks/vs_stdlib.rb
|
220
|
-
- changelog.txt
|
221
210
|
- data/cacert.pem
|
222
211
|
- excon.gemspec
|
223
212
|
- lib/excon.rb
|
@@ -250,76 +239,17 @@ files:
|
|
250
239
|
- lib/excon/unix_socket.rb
|
251
240
|
- lib/excon/utils.rb
|
252
241
|
- lib/excon/version.rb
|
253
|
-
- spec/excon/error_spec.rb
|
254
|
-
- spec/excon/test/server_spec.rb
|
255
|
-
- spec/excon_spec.rb
|
256
|
-
- spec/helpers/file_path_helpers.rb
|
257
|
-
- spec/requests/basic_spec.rb
|
258
|
-
- spec/requests/eof_requests_spec.rb
|
259
|
-
- spec/requests/unix_socket_spec.rb
|
260
|
-
- spec/spec_helper.rb
|
261
|
-
- spec/support/shared_contexts/test_server_context.rb
|
262
|
-
- spec/support/shared_examples/shared_example_for_clients.rb
|
263
|
-
- spec/support/shared_examples/shared_example_for_streaming_clients.rb
|
264
|
-
- spec/support/shared_examples/shared_example_for_test_servers.rb
|
265
|
-
- tests/authorization_header_tests.rb
|
266
|
-
- tests/bad_tests.rb
|
267
|
-
- tests/basic_tests.rb
|
268
|
-
- tests/batch_requests.rb
|
269
|
-
- tests/complete_responses.rb
|
270
|
-
- tests/data/127.0.0.1.cert.crt
|
271
|
-
- tests/data/127.0.0.1.cert.key
|
272
|
-
- tests/data/excon.cert.crt
|
273
|
-
- tests/data/excon.cert.key
|
274
|
-
- tests/data/xs
|
275
|
-
- tests/error_tests.rb
|
276
|
-
- tests/header_tests.rb
|
277
|
-
- tests/middlewares/canned_response_tests.rb
|
278
|
-
- tests/middlewares/capture_cookies_tests.rb
|
279
|
-
- tests/middlewares/decompress_tests.rb
|
280
|
-
- tests/middlewares/escape_path_tests.rb
|
281
|
-
- tests/middlewares/idempotent_tests.rb
|
282
|
-
- tests/middlewares/instrumentation_tests.rb
|
283
|
-
- tests/middlewares/mock_tests.rb
|
284
|
-
- tests/middlewares/redirect_follower_tests.rb
|
285
|
-
- tests/pipeline_tests.rb
|
286
|
-
- tests/proxy_tests.rb
|
287
|
-
- tests/query_string_tests.rb
|
288
|
-
- tests/rackups/basic.rb
|
289
|
-
- tests/rackups/basic.ru
|
290
|
-
- tests/rackups/basic_auth.ru
|
291
|
-
- tests/rackups/deflater.ru
|
292
|
-
- tests/rackups/proxy.ru
|
293
|
-
- tests/rackups/query_string.ru
|
294
|
-
- tests/rackups/redirecting.ru
|
295
|
-
- tests/rackups/redirecting_with_cookie.ru
|
296
|
-
- tests/rackups/request_headers.ru
|
297
|
-
- tests/rackups/request_methods.ru
|
298
|
-
- tests/rackups/response_header.ru
|
299
|
-
- tests/rackups/ssl.ru
|
300
|
-
- tests/rackups/ssl_mismatched_cn.ru
|
301
|
-
- tests/rackups/ssl_verify_peer.ru
|
302
|
-
- tests/rackups/streaming.ru
|
303
|
-
- tests/rackups/thread_safety.ru
|
304
|
-
- tests/rackups/timeout.ru
|
305
|
-
- tests/rackups/webrick_patch.rb
|
306
|
-
- tests/request_headers_tests.rb
|
307
|
-
- tests/request_method_tests.rb
|
308
|
-
- tests/request_tests.rb
|
309
|
-
- tests/response_tests.rb
|
310
|
-
- tests/servers/bad.rb
|
311
|
-
- tests/servers/eof.rb
|
312
|
-
- tests/servers/error.rb
|
313
|
-
- tests/servers/good.rb
|
314
|
-
- tests/test_helper.rb
|
315
|
-
- tests/thread_safety_tests.rb
|
316
|
-
- tests/timeout_tests.rb
|
317
|
-
- tests/utils_tests.rb
|
318
242
|
homepage: https://github.com/excon/excon
|
319
243
|
licenses:
|
320
244
|
- MIT
|
321
|
-
metadata:
|
322
|
-
|
245
|
+
metadata:
|
246
|
+
homepage_uri: https://github.com/excon/excon
|
247
|
+
bug_tracker_uri: https://github.com/excon/excon/issues
|
248
|
+
changelog_uri: https://github.com/excon/excon/blob/master/changelog.txt
|
249
|
+
documentation_uri: https://github.com/excon/excon/blob/master/README.md
|
250
|
+
source_code_uri: https://github.com/excon/excon
|
251
|
+
wiki_uri: https://github.com/excon/excon/wiki
|
252
|
+
post_install_message:
|
323
253
|
rdoc_options:
|
324
254
|
- "--charset=UTF-8"
|
325
255
|
require_paths:
|
@@ -335,9 +265,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
335
265
|
- !ruby/object:Gem::Version
|
336
266
|
version: '0'
|
337
267
|
requirements: []
|
338
|
-
|
339
|
-
|
340
|
-
signing_key:
|
268
|
+
rubygems_version: 3.1.2
|
269
|
+
signing_key:
|
341
270
|
specification_version: 4
|
342
271
|
summary: speed, persistence, http(s)
|
343
272
|
test_files: []
|