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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f544e4ada780c8d862ffb1a1801df2d0fed5f14c258afbd42b5da2c1fc8a824c
4
- data.tar.gz: 7cb809bb8db7676b90e1eedd10a9a74f7b9961ad60be7879dfbd28f6e52869d7
3
+ metadata.gz: e0829b011c12032763ab3958668882f930250e9544fca526f4e09ebfe79ce1bf
4
+ data.tar.gz: 246229f30d08a81e9a8ecbb5195952a289e11f577ba055f1da163eada743e690
5
5
  SHA512:
6
- metadata.gz: b6fe99cf66b166e4d331bd99dde897e026a87c8369ad6303bdb9fe15a60aa7e6ad636f2fdc447c1564eba55f8913d8bdb109636ca44f7a1d9733a2d9321b22ef
7
- data.tar.gz: 24a9927d282a35921db9815cfaf60960c55d6cfedcd96b590c0e9d7bc6dffa1ad7630e7d122a95f73ecc0bad882da6cc4629a3f948ecae8ddcbc86feb9a3d74b
6
+ metadata.gz: da31402d280f02562ee5ba62fa287f812fa4e40b1a03d968c9f6adff7fd499a0816ff6c32508b3451d433a8ed294bb45747bc0e45af30ab0914b346fa3479d8f
7
+ data.tar.gz: 6d792084962623065d48609dffbe0499ae6289d24bdf95f3535ff9530626349ac121b996bc4800723666a9c59dc5bf8e9b4dde59224d89166fc7fa0e3da01687
@@ -1,7 +1,7 @@
1
1
  ##
2
2
  ## Bundle of CA Root Certificates
3
3
  ##
4
- ## Certificate data from Mozilla as of: Wed Nov 27 04:12:10 2019 GMT
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: 607309057d0ec70f8e4e97b03906bafb2fcebb24cd37b5e8293e681ae26ceae0
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-----
@@ -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
- unless @data[:scheme] == UNIX
492
- if no_proxy_env = ENV["no_proxy"] || ENV["NO_PROXY"]
493
- no_proxy_list = no_proxy_env.scan(/\*?\.?([^\s,:]+)(?::(\d+))?/i).map { |s| [s[0], s[1]] }
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
- unless no_proxy_env && no_proxy_list.index { |h| /(^|\.)#{h[0]}$/.match(@data[:host]) && (h[1].nil? || h[1].to_i == @data[:port]) }
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
- case @data[:proxy]
505
- when nil
506
- @data.delete(:proxy)
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
- raise Excon::Errors::ProxyParse, "Proxy is invalid"
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
- if @data.has_key?(:proxy) && @data[:scheme] == 'http'
542
- @data[:headers]['Proxy-Connection'] ||= 'Keep-Alive'
543
- # https credentials happen in handshake
544
- if @data[:proxy].has_key?(:user) || @data[:proxy].has_key?(:password)
545
- user, pass = Utils.unescape_form(@data[:proxy][:user].to_s), Utils.unescape_form(@data[:proxy][:password].to_s)
546
- auth = ["#{user}:#{pass}"].pack('m').delete(Excon::CR_NL)
547
- @data[:headers]['Proxy-Authorization'] = 'Basic ' + auth
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
@@ -50,7 +50,17 @@ or:
50
50
  class InvalidHeaderValue < Error; end
51
51
  class Timeout < Error; end
52
52
  class ResponseParse < Error; end
53
- class ProxyConnectionError < Error; end
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
 
@@ -237,7 +237,7 @@ module Excon
237
237
  end
238
238
 
239
239
  def write_nonblock(data)
240
- binary_encode(data)
240
+ data = binary_encode(data)
241
241
  loop do
242
242
  written = nil
243
243
  begin
@@ -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 is not exstablished"))
112
+ raise(Excon::Errors::ProxyConnectionError.new("proxy connection could not be established", request, response))
113
113
  end
114
114
  end
115
115
 
@@ -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.force_encoding('BINARY')
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
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Excon
3
- VERSION = '0.70.0'
3
+ VERSION = '0.74.0'
4
4
  end
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.70.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: 2019-12-02 00:00:00.000000000 Z
13
+ date: 2020-06-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec