excon 0.70.0 → 0.74.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/cacert.pem +59 -25
- data/lib/excon/connection.rb +94 -55
- data/lib/excon/error.rb +11 -1
- data/lib/excon/socket.rb +1 -1
- data/lib/excon/ssl_socket.rb +1 -1
- data/lib/excon/utils.rb +11 -5
- data/lib/excon/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0829b011c12032763ab3958668882f930250e9544fca526f4e09ebfe79ce1bf
|
4
|
+
data.tar.gz: 246229f30d08a81e9a8ecbb5195952a289e11f577ba055f1da163eada743e690
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da31402d280f02562ee5ba62fa287f812fa4e40b1a03d968c9f6adff7fd499a0816ff6c32508b3451d433a8ed294bb45747bc0e45af30ab0914b346fa3479d8f
|
7
|
+
data.tar.gz: 6d792084962623065d48609dffbe0499ae6289d24bdf95f3535ff9530626349ac121b996bc4800723666a9c59dc5bf8e9b4dde59224d89166fc7fa0e3da01687
|
data/data/cacert.pem
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
##
|
2
2
|
## Bundle of CA Root Certificates
|
3
3
|
##
|
4
|
-
## Certificate data from Mozilla as of: Wed
|
4
|
+
## Certificate data from Mozilla as of: Wed Jan 1 04:12:10 2020 GMT
|
5
5
|
##
|
6
6
|
## This is a bundle of X.509 certificates of public Certificate Authorities
|
7
7
|
## (CA). These were automatically extracted from Mozilla's root certificates
|
@@ -14,7 +14,7 @@
|
|
14
14
|
## Just configure this file as the SSLCACertificateFile.
|
15
15
|
##
|
16
16
|
## Conversion done with mk-ca-bundle.pl version 1.27.
|
17
|
-
## SHA256:
|
17
|
+
## SHA256: f3bdcd74612952da8476a9d4147f50b29ad0710b7dd95b4c8690500209986d70
|
18
18
|
##
|
19
19
|
|
20
20
|
|
@@ -130,29 +130,29 @@ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
|
|
130
130
|
RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
|
131
131
|
-----END CERTIFICATE-----
|
132
132
|
|
133
|
-
AddTrust External Root
|
134
|
-
======================
|
135
|
-
-----BEGIN CERTIFICATE-----
|
136
|
-
MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
137
|
-
QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
|
138
|
-
VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
|
139
|
-
NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
|
140
|
-
cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
|
141
|
-
Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
|
142
|
-
+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
|
143
|
-
Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
|
144
|
-
aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
|
145
|
-
2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
|
146
|
-
7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
|
147
|
-
BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
|
148
|
-
VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
|
149
|
-
VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
|
150
|
-
IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
|
151
|
-
j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
|
152
|
-
6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
|
153
|
-
e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
|
154
|
-
G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
|
155
|
-
-----END CERTIFICATE-----
|
133
|
+
## AddTrust External Root
|
134
|
+
## ======================
|
135
|
+
## -----BEGIN CERTIFICATE-----
|
136
|
+
## MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
137
|
+
## QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
|
138
|
+
## VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
|
139
|
+
## NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
|
140
|
+
## cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
|
141
|
+
## Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
|
142
|
+
## +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
|
143
|
+
## Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
|
144
|
+
## aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
|
145
|
+
## 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
|
146
|
+
## 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
|
147
|
+
## BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
|
148
|
+
## VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
|
149
|
+
## VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
|
150
|
+
## IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
|
151
|
+
## j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
|
152
|
+
## 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
|
153
|
+
## e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
|
154
|
+
## G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
|
155
|
+
## -----END CERTIFICATE-----
|
156
156
|
|
157
157
|
Entrust Root Certification Authority
|
158
158
|
====================================
|
@@ -3430,3 +3430,37 @@ hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB
|
|
3430
3430
|
60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq
|
3431
3431
|
dBb9HxEGmpv0
|
3432
3432
|
-----END CERTIFICATE-----
|
3433
|
+
|
3434
|
+
Entrust Root Certification Authority - G4
|
3435
|
+
=========================================
|
3436
|
+
-----BEGIN CERTIFICATE-----
|
3437
|
+
MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV
|
3438
|
+
BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu
|
3439
|
+
bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1
|
3440
|
+
dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1
|
3441
|
+
dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT
|
3442
|
+
AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
|
3443
|
+
L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv
|
3444
|
+
cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv
|
3445
|
+
cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D
|
3446
|
+
umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV
|
3447
|
+
3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds
|
3448
|
+
8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ
|
3449
|
+
e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7
|
3450
|
+
ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X
|
3451
|
+
xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV
|
3452
|
+
7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8
|
3453
|
+
dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW
|
3454
|
+
Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T
|
3455
|
+
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n
|
3456
|
+
MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q
|
3457
|
+
jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht
|
3458
|
+
7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK
|
3459
|
+
YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt
|
3460
|
+
jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+
|
3461
|
+
m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW
|
3462
|
+
RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA
|
3463
|
+
JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G
|
3464
|
+
+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT
|
3465
|
+
kcpG2om3PVODLAgfi49T3f+sHw==
|
3466
|
+
-----END CERTIFICATE-----
|
data/lib/excon/connection.rb
CHANGED
@@ -161,7 +161,7 @@ module Excon
|
|
161
161
|
socket.write(request) # write out request + headers
|
162
162
|
while true # write out body with chunked encoding
|
163
163
|
chunk = datum[:request_block].call
|
164
|
-
binary_encode(chunk)
|
164
|
+
chunk = binary_encode(chunk)
|
165
165
|
if chunk.length > 0
|
166
166
|
socket.write(chunk.length.to_s(16) << CR_NL << chunk << CR_NL)
|
167
167
|
else
|
@@ -180,10 +180,10 @@ module Excon
|
|
180
180
|
end
|
181
181
|
|
182
182
|
# if request + headers is less than chunk size, fill with body
|
183
|
-
binary_encode(request)
|
183
|
+
request = binary_encode(request)
|
184
184
|
chunk = body.read([datum[:chunk_size] - request.length, 0].max)
|
185
185
|
if chunk
|
186
|
-
binary_encode(chunk)
|
186
|
+
chunk = binary_encode(chunk)
|
187
187
|
socket.write(request << chunk)
|
188
188
|
else
|
189
189
|
socket.write(request) # write out request + headers
|
@@ -262,6 +262,11 @@ module Excon
|
|
262
262
|
|
263
263
|
datum[:connection] = self
|
264
264
|
|
265
|
+
# cleanup data left behind on persistent connection after interrupt
|
266
|
+
if datum[:persistent] && !@persistent_socket_reusable
|
267
|
+
reset
|
268
|
+
end
|
269
|
+
|
265
270
|
datum[:stack] = datum[:middlewares].map do |middleware|
|
266
271
|
lambda {|stack| middleware.new(stack)}
|
267
272
|
end.reverse.inject(self) do |middlewares, middleware|
|
@@ -270,7 +275,9 @@ module Excon
|
|
270
275
|
datum = datum[:stack].request_call(datum)
|
271
276
|
|
272
277
|
unless datum[:pipeline]
|
278
|
+
@persistent_socket_reusable = false
|
273
279
|
datum = response(datum)
|
280
|
+
@persistent_socket_reusable = true
|
274
281
|
|
275
282
|
if datum[:persistent]
|
276
283
|
if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Connection') == 0 }
|
@@ -344,6 +351,7 @@ module Excon
|
|
344
351
|
if old_socket = sockets.delete(@socket_key)
|
345
352
|
old_socket.close rescue nil
|
346
353
|
end
|
354
|
+
@persistent_socket_reusable = true
|
347
355
|
end
|
348
356
|
|
349
357
|
# Generate HTTP request verb methods
|
@@ -480,6 +488,47 @@ module Excon
|
|
480
488
|
end
|
481
489
|
end
|
482
490
|
|
491
|
+
def proxy_match_host_port(host, port)
|
492
|
+
host_match = if host.is_a? IPAddr
|
493
|
+
begin
|
494
|
+
host.include? @data[:host]
|
495
|
+
rescue IPAddr::Error
|
496
|
+
false
|
497
|
+
end
|
498
|
+
else
|
499
|
+
/(^|\.)#{host}$/.match(@data[:host])
|
500
|
+
end
|
501
|
+
host_match && (port.nil? || port.to_i == @data[:port])
|
502
|
+
end
|
503
|
+
|
504
|
+
def proxy_from_env
|
505
|
+
if (no_proxy_env = ENV['no_proxy'] || ENV['NO_PROXY'])
|
506
|
+
no_proxy_list = no_proxy_env.scan(/\s*(?:\[([\dA-Fa-f:\/]+)\]|\*?\.?([^\s,:]+))(?::(\d+))?\s*/i).map { |e|
|
507
|
+
if e[0]
|
508
|
+
begin
|
509
|
+
[IPAddr.new(e[0]), e[2]]
|
510
|
+
rescue IPAddr::Error
|
511
|
+
nil
|
512
|
+
end
|
513
|
+
else
|
514
|
+
begin
|
515
|
+
[IPAddr.new(e[1]), e[2]]
|
516
|
+
rescue IPAddr::Error
|
517
|
+
[e[1], e[2]]
|
518
|
+
end
|
519
|
+
end
|
520
|
+
}.reject { |e| e.nil? || e[0].nil? }
|
521
|
+
end
|
522
|
+
|
523
|
+
unless no_proxy_env && no_proxy_list.index { |h| proxy_match_host_port(h[0], h[1]) }
|
524
|
+
if @data[:scheme] == HTTPS && (ENV.has_key?('https_proxy') || ENV.has_key?('HTTPS_PROXY'))
|
525
|
+
@data[:proxy] = ENV['https_proxy'] || ENV['HTTPS_PROXY']
|
526
|
+
elsif (ENV.has_key?('http_proxy') || ENV.has_key?('HTTP_PROXY'))
|
527
|
+
@data[:proxy] = ENV['http_proxy'] || ENV['HTTP_PROXY']
|
528
|
+
end
|
529
|
+
end
|
530
|
+
end
|
531
|
+
|
483
532
|
def setup_proxy
|
484
533
|
if @data[:disable_proxy]
|
485
534
|
if @data[:proxy]
|
@@ -488,64 +537,54 @@ module Excon
|
|
488
537
|
return
|
489
538
|
end
|
490
539
|
|
491
|
-
|
492
|
-
|
493
|
-
|
540
|
+
return if @data[:scheme] == UNIX
|
541
|
+
|
542
|
+
proxy_from_env
|
543
|
+
|
544
|
+
case @data[:proxy]
|
545
|
+
when nil
|
546
|
+
@data.delete(:proxy)
|
547
|
+
when ''
|
548
|
+
@data.delete(:proxy)
|
549
|
+
when Hash
|
550
|
+
# no processing needed
|
551
|
+
when String, URI
|
552
|
+
uri = @data[:proxy].is_a?(String) ? URI.parse(@data[:proxy]) : @data[:proxy]
|
553
|
+
@data[:proxy] = {
|
554
|
+
:host => uri.host,
|
555
|
+
:hostname => uri.hostname,
|
556
|
+
# path is only sensible for a Unix socket proxy
|
557
|
+
:path => uri.scheme == UNIX ? uri.path : nil,
|
558
|
+
:port => uri.port,
|
559
|
+
:scheme => uri.scheme,
|
560
|
+
}
|
561
|
+
if uri.password
|
562
|
+
@data[:proxy][:password] = uri.password
|
494
563
|
end
|
495
|
-
|
496
|
-
|
497
|
-
if @data[:scheme] == HTTPS && (ENV.has_key?('https_proxy') || ENV.has_key?('HTTPS_PROXY'))
|
498
|
-
@data[:proxy] = ENV['https_proxy'] || ENV['HTTPS_PROXY']
|
499
|
-
elsif (ENV.has_key?('http_proxy') || ENV.has_key?('HTTP_PROXY'))
|
500
|
-
@data[:proxy] = ENV['http_proxy'] || ENV['HTTP_PROXY']
|
501
|
-
end
|
564
|
+
if uri.user
|
565
|
+
@data[:proxy][:user] = uri.user
|
502
566
|
end
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
when ''
|
508
|
-
@data.delete(:proxy)
|
509
|
-
when Hash
|
510
|
-
# no processing needed
|
511
|
-
when String, URI
|
512
|
-
uri = @data[:proxy].is_a?(String) ? URI.parse(@data[:proxy]) : @data[:proxy]
|
513
|
-
@data[:proxy] = {
|
514
|
-
:host => uri.host,
|
515
|
-
:hostname => uri.hostname,
|
516
|
-
# path is only sensible for a Unix socket proxy
|
517
|
-
:path => uri.scheme == UNIX ? uri.path : nil,
|
518
|
-
:port => uri.port,
|
519
|
-
:scheme => uri.scheme,
|
520
|
-
}
|
521
|
-
if uri.password
|
522
|
-
@data[:proxy][:password] = uri.password
|
523
|
-
end
|
524
|
-
if uri.user
|
525
|
-
@data[:proxy][:user] = uri.user
|
526
|
-
end
|
527
|
-
if @data[:proxy][:scheme] == UNIX
|
528
|
-
if @data[:proxy][:host]
|
529
|
-
raise ArgumentError, "The `:host` parameter should not be set for `unix://` proxies.\n" +
|
530
|
-
"When supplying a `unix://` URI, it should start with `unix:/` or `unix:///`."
|
531
|
-
end
|
532
|
-
else
|
533
|
-
unless uri.host && uri.port && uri.scheme
|
534
|
-
raise Excon::Errors::ProxyParse, "Proxy is invalid"
|
535
|
-
end
|
567
|
+
if @data[:proxy][:scheme] == UNIX
|
568
|
+
if @data[:proxy][:host]
|
569
|
+
raise ArgumentError, "The `:host` parameter should not be set for `unix://` proxies.\n" +
|
570
|
+
"When supplying a `unix://` URI, it should start with `unix:/` or `unix:///`."
|
536
571
|
end
|
537
572
|
else
|
538
|
-
|
573
|
+
unless uri.host && uri.port && uri.scheme
|
574
|
+
raise Excon::Errors::ProxyParse, "Proxy is invalid"
|
575
|
+
end
|
539
576
|
end
|
577
|
+
else
|
578
|
+
raise Excon::Errors::ProxyParse, "Proxy is invalid"
|
579
|
+
end
|
540
580
|
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
end
|
581
|
+
if @data.has_key?(:proxy) && @data[:scheme] == 'http'
|
582
|
+
@data[:headers]['Proxy-Connection'] ||= 'Keep-Alive'
|
583
|
+
# https credentials happen in handshake
|
584
|
+
if @data[:proxy].has_key?(:user) || @data[:proxy].has_key?(:password)
|
585
|
+
user, pass = Utils.unescape_form(@data[:proxy][:user].to_s), Utils.unescape_form(@data[:proxy][:password].to_s)
|
586
|
+
auth = ["#{user}:#{pass}"].pack('m').delete(Excon::CR_NL)
|
587
|
+
@data[:headers]['Proxy-Authorization'] = 'Basic ' + auth
|
549
588
|
end
|
550
589
|
end
|
551
590
|
end
|
data/lib/excon/error.rb
CHANGED
@@ -50,7 +50,17 @@ or:
|
|
50
50
|
class InvalidHeaderValue < Error; end
|
51
51
|
class Timeout < Error; end
|
52
52
|
class ResponseParse < Error; end
|
53
|
-
|
53
|
+
|
54
|
+
class ProxyConnectionError < Error
|
55
|
+
attr_reader :request, :response
|
56
|
+
|
57
|
+
def initialize(msg, request = nil, response = nil)
|
58
|
+
super(msg)
|
59
|
+
@request = request
|
60
|
+
@response = response
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
54
64
|
class ProxyParse < Error; end
|
55
65
|
class TooManyRedirects < Error; end
|
56
66
|
|
data/lib/excon/socket.rb
CHANGED
data/lib/excon/ssl_socket.rb
CHANGED
@@ -109,7 +109,7 @@ module Excon
|
|
109
109
|
# eat the proxy's connection response
|
110
110
|
response = Excon::Response.parse(self, :expects => 200, :method => 'CONNECT')
|
111
111
|
if response[:response][:status] != 200
|
112
|
-
raise(Excon::Errors::ProxyConnectionError.new("proxy connection
|
112
|
+
raise(Excon::Errors::ProxyConnectionError.new("proxy connection could not be established", request, response))
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
data/lib/excon/utils.rb
CHANGED
@@ -12,7 +12,13 @@ module Excon
|
|
12
12
|
|
13
13
|
def binary_encode(string)
|
14
14
|
if FORCE_ENC && string.encoding != Encoding::ASCII_8BIT
|
15
|
-
string.
|
15
|
+
if string.frozen?
|
16
|
+
string.dup.force_encoding('BINARY')
|
17
|
+
else
|
18
|
+
string.force_encoding('BINARY')
|
19
|
+
end
|
20
|
+
else
|
21
|
+
string
|
16
22
|
end
|
17
23
|
end
|
18
24
|
|
@@ -89,7 +95,7 @@ module Excon
|
|
89
95
|
def split_header_value(str)
|
90
96
|
return [] if str.nil?
|
91
97
|
str = str.dup.strip
|
92
|
-
binary_encode(str)
|
98
|
+
str = binary_encode(str)
|
93
99
|
str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]+)+)
|
94
100
|
(?:,\s*|\Z)'xn).flatten
|
95
101
|
end
|
@@ -97,21 +103,21 @@ module Excon
|
|
97
103
|
# Escapes HTTP reserved and unwise characters in +str+
|
98
104
|
def escape_uri(str)
|
99
105
|
str = str.dup
|
100
|
-
binary_encode(str)
|
106
|
+
str = binary_encode(str)
|
101
107
|
str.gsub(UNESCAPED) { "%%%02X" % $1[0].ord }
|
102
108
|
end
|
103
109
|
|
104
110
|
# Unescapes HTTP reserved and unwise characters in +str+
|
105
111
|
def unescape_uri(str)
|
106
112
|
str = str.dup
|
107
|
-
binary_encode(str)
|
113
|
+
str = binary_encode(str)
|
108
114
|
str.gsub(ESCAPED) { $1.hex.chr }
|
109
115
|
end
|
110
116
|
|
111
117
|
# Unescape form encoded values in +str+
|
112
118
|
def unescape_form(str)
|
113
119
|
str = str.dup
|
114
|
-
binary_encode(str)
|
120
|
+
str = binary_encode(str)
|
115
121
|
str.gsub!(/\+/, ' ')
|
116
122
|
str.gsub(ESCAPED) { $1.hex.chr }
|
117
123
|
end
|
data/lib/excon/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: excon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.74.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dpiddy (Dan Peterson)
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2020-06-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|