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 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