excon 0.70.0 → 0.74.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/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
|