excon 0.90.0 → 0.99.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTORS.md +182 -140
- data/README.md +84 -53
- data/data/cacert.pem +479 -339
- data/excon.gemspec +0 -1
- data/lib/excon/connection.rb +16 -1
- data/lib/excon/constants.rb +2 -0
- data/lib/excon/response.rb +13 -0
- data/lib/excon/socket.rb +41 -20
- data/lib/excon/ssl_socket.rb +17 -1
- data/lib/excon/version.rb +1 -1
- data/lib/excon.rb +14 -4
- metadata +6 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4de69b0df9a1fc68f382e6d007845ddd9dac6ec8e6f0150b0988caafc604fc66
|
4
|
+
data.tar.gz: 3735d61f7219a99bfcfd8f953c7dd16f66b0232a794c602042f30a7eda7c9334
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 366bb5af60bbd24b607bb9306a5f1581e0daeb95881e33376e85a9a7892935758fb06c09d656f27ffd3f791fbcc372e9703bf738f08a10c5d46f06558a34e19e
|
7
|
+
data.tar.gz: a38b16b4e9fe30c66d75e96e39330f6661a3c4a906801e7eaade9c3efd4af8d86a804b224d264f777f8d13026c0c1dc18581120ce179c5bfd6cf8ae3e427cd10
|
data/CONTRIBUTORS.md
CHANGED
@@ -1,140 +1,182 @@
|
|
1
|
-
* Aaron Stone
|
2
|
-
* Adam
|
3
|
-
*
|
4
|
-
*
|
5
|
-
*
|
6
|
-
*
|
7
|
-
*
|
8
|
-
*
|
9
|
-
*
|
10
|
-
*
|
11
|
-
*
|
12
|
-
*
|
13
|
-
*
|
14
|
-
*
|
15
|
-
*
|
16
|
-
*
|
17
|
-
*
|
18
|
-
*
|
19
|
-
*
|
20
|
-
*
|
21
|
-
*
|
22
|
-
*
|
23
|
-
*
|
24
|
-
*
|
25
|
-
*
|
26
|
-
*
|
27
|
-
*
|
28
|
-
*
|
29
|
-
*
|
30
|
-
*
|
31
|
-
*
|
32
|
-
*
|
33
|
-
*
|
34
|
-
*
|
35
|
-
*
|
36
|
-
*
|
37
|
-
*
|
38
|
-
*
|
39
|
-
*
|
40
|
-
*
|
41
|
-
*
|
42
|
-
*
|
43
|
-
*
|
44
|
-
*
|
45
|
-
*
|
46
|
-
*
|
47
|
-
*
|
48
|
-
*
|
49
|
-
*
|
50
|
-
*
|
51
|
-
*
|
52
|
-
*
|
53
|
-
*
|
54
|
-
*
|
55
|
-
*
|
56
|
-
*
|
57
|
-
*
|
58
|
-
*
|
59
|
-
*
|
60
|
-
*
|
61
|
-
*
|
62
|
-
*
|
63
|
-
*
|
64
|
-
*
|
65
|
-
*
|
66
|
-
*
|
67
|
-
*
|
68
|
-
*
|
69
|
-
*
|
70
|
-
*
|
71
|
-
*
|
72
|
-
*
|
73
|
-
*
|
74
|
-
*
|
75
|
-
*
|
76
|
-
*
|
77
|
-
*
|
78
|
-
*
|
79
|
-
*
|
80
|
-
*
|
81
|
-
*
|
82
|
-
*
|
83
|
-
*
|
84
|
-
*
|
85
|
-
*
|
86
|
-
*
|
87
|
-
*
|
88
|
-
*
|
89
|
-
*
|
90
|
-
*
|
91
|
-
*
|
92
|
-
*
|
93
|
-
*
|
94
|
-
*
|
95
|
-
*
|
96
|
-
*
|
97
|
-
*
|
98
|
-
*
|
99
|
-
*
|
100
|
-
*
|
101
|
-
*
|
102
|
-
*
|
103
|
-
*
|
104
|
-
*
|
105
|
-
*
|
106
|
-
*
|
107
|
-
*
|
108
|
-
*
|
109
|
-
*
|
110
|
-
*
|
111
|
-
*
|
112
|
-
*
|
113
|
-
*
|
114
|
-
*
|
115
|
-
*
|
116
|
-
*
|
117
|
-
*
|
118
|
-
*
|
119
|
-
*
|
120
|
-
*
|
121
|
-
*
|
122
|
-
*
|
123
|
-
*
|
124
|
-
*
|
125
|
-
*
|
126
|
-
*
|
127
|
-
*
|
128
|
-
*
|
129
|
-
*
|
130
|
-
*
|
131
|
-
*
|
132
|
-
*
|
133
|
-
*
|
134
|
-
*
|
135
|
-
*
|
136
|
-
*
|
137
|
-
*
|
138
|
-
*
|
139
|
-
*
|
140
|
-
*
|
1
|
+
* Aaron Stone
|
2
|
+
* Adam Avilla
|
3
|
+
* Adam Esterline
|
4
|
+
* Alexander Sandström
|
5
|
+
* Alexandr Burov
|
6
|
+
* Andrew Katz
|
7
|
+
* Andrew Metcalf
|
8
|
+
* Andrew Sullivan Cant
|
9
|
+
* André Diego Piske
|
10
|
+
* Andy Delcambre
|
11
|
+
* Anshul Khandelwal
|
12
|
+
* Anton Chuchkalov
|
13
|
+
* Antonio Terceiro
|
14
|
+
* Ash Wilson
|
15
|
+
* Atul Bhosale
|
16
|
+
* Bart de Water
|
17
|
+
* Ben Burkert
|
18
|
+
* Benedikt Böhm
|
19
|
+
* Bill Mill
|
20
|
+
* Bo Jeanes
|
21
|
+
* Brandur
|
22
|
+
* Brian D. Burns
|
23
|
+
* Brian Hartsock
|
24
|
+
* Bryan Paxton
|
25
|
+
* Caio Chassot
|
26
|
+
* Caius Durling
|
27
|
+
* Carl Hörberg
|
28
|
+
* Carl Hörberg
|
29
|
+
* Carlos Sanchez
|
30
|
+
* Casper Thomsen
|
31
|
+
* Chris Hanks
|
32
|
+
* Christoph Rieß
|
33
|
+
* Christophe Taton
|
34
|
+
* Claudio Poli
|
35
|
+
* Craig Shannon
|
36
|
+
* Damien Mathieu
|
37
|
+
* Dan Hensgen
|
38
|
+
* Dan Peterson
|
39
|
+
* Dan Prince
|
40
|
+
* Dane Harrigan
|
41
|
+
* Daniel Berger
|
42
|
+
* Dave Myron
|
43
|
+
* Dave Newton
|
44
|
+
* Dave Vasilevsky
|
45
|
+
* David Biehl
|
46
|
+
* David Taylor
|
47
|
+
* Dimitrij Denissenko
|
48
|
+
* Dominik Richter
|
49
|
+
* Doug McInnes
|
50
|
+
* Esteban Pastorino
|
51
|
+
* Eugene Howe
|
52
|
+
* Evan Phoenix
|
53
|
+
* Fabian Wiesel
|
54
|
+
* Federico Ravasio
|
55
|
+
* Felix Wolfsteller
|
56
|
+
* Glenn Pratt
|
57
|
+
* Graeme Nelson
|
58
|
+
* Grey Baker
|
59
|
+
* Guillaume Balaine
|
60
|
+
* Hakan Ensari
|
61
|
+
* Hiroshi Hatake
|
62
|
+
* Ian Neubert
|
63
|
+
* Igor Fedoronchuk
|
64
|
+
* Jacob Atzen
|
65
|
+
* James Cox
|
66
|
+
* James Watling
|
67
|
+
* Jean Mertz
|
68
|
+
* Jeremy Hinegardner
|
69
|
+
* Jesse Kempf
|
70
|
+
* Jessica Jiang
|
71
|
+
* Joe Rafaniello
|
72
|
+
* John Keiser
|
73
|
+
* John Leach
|
74
|
+
* Jonas Pfenniger
|
75
|
+
* Jonathan Dance
|
76
|
+
* Jonathan Roes
|
77
|
+
* Joshua B. Smith
|
78
|
+
* Joshua Gross
|
79
|
+
* Joshua Mckinney
|
80
|
+
* Joshua Napoli
|
81
|
+
* Kelly Mahan
|
82
|
+
* Kensuke Nagae
|
83
|
+
* Kimmo Lehto
|
84
|
+
* Koen Rouwhorst
|
85
|
+
* Konstantin Shabanov
|
86
|
+
* Kyle Purkiss
|
87
|
+
* Kyle Rames
|
88
|
+
* Lewis Marshall
|
89
|
+
* Lincoln Stoll
|
90
|
+
* Louis Sobel
|
91
|
+
* Mahemoff
|
92
|
+
* Marco Costa
|
93
|
+
* Markus Bucher
|
94
|
+
* Mathias Meyer
|
95
|
+
* Matt Gauger
|
96
|
+
* Matt Palmer
|
97
|
+
* Matt Sanders
|
98
|
+
* Matt Snyder
|
99
|
+
* Matt Todd
|
100
|
+
* Maurice Schreiber
|
101
|
+
* Max Lincoln
|
102
|
+
* Michael Brodhead
|
103
|
+
* Michael Hale
|
104
|
+
* Michael Rowe
|
105
|
+
* Michael Rykov
|
106
|
+
* Mike Heffner
|
107
|
+
* Milovan Zogovic
|
108
|
+
* Myron Marston
|
109
|
+
* Nathan Long
|
110
|
+
* Nathan Sutton
|
111
|
+
* Nick Osborn
|
112
|
+
* Nicolas Leger
|
113
|
+
* Nicolas Sanguinetti
|
114
|
+
* Paul Gideon Dann
|
115
|
+
* Pavel
|
116
|
+
* Pavel Valena
|
117
|
+
* Peter Meier
|
118
|
+
* Peter Weldon
|
119
|
+
* Phil Ross
|
120
|
+
* Raul Murciano
|
121
|
+
* Richard Godbee
|
122
|
+
* Richard Ramsden
|
123
|
+
* Rohan Mendon
|
124
|
+
* Ruslan Korolev
|
125
|
+
* Ruslan Kyrychuk
|
126
|
+
* Ryan Bigg
|
127
|
+
* Ryan Mohr
|
128
|
+
* Ryan Schlesinger
|
129
|
+
* Ryoji Yoshioka
|
130
|
+
* Sam
|
131
|
+
* Sam Lehman
|
132
|
+
* Sam Withrow
|
133
|
+
* Scott Gonyea
|
134
|
+
* Scott Walkinshaw
|
135
|
+
* Sean Cribbs
|
136
|
+
* Sergio Rubio
|
137
|
+
* Shai Rosenfeld
|
138
|
+
* Stan Hu
|
139
|
+
* Stefan Merettig
|
140
|
+
* Stephen Chu
|
141
|
+
* Swanand Pagnis
|
142
|
+
* Terry Howe
|
143
|
+
* Thom Mahoney & Josh Lane
|
144
|
+
* Thom May
|
145
|
+
* Tim Carey-Smith
|
146
|
+
* Timothée Peignier
|
147
|
+
* Tobias Schmidt
|
148
|
+
* Todd Lunter
|
149
|
+
* Tom Maher
|
150
|
+
* Trym Skaar
|
151
|
+
* Tuomas Silen
|
152
|
+
* Victor Costan
|
153
|
+
* Viven
|
154
|
+
* Vít Ondruch
|
155
|
+
* Wesley Beary
|
156
|
+
* Yusuke Nakamura
|
157
|
+
* Zach Anker
|
158
|
+
* chrisrhoden
|
159
|
+
* dependabot[bot]
|
160
|
+
* dickeyxxx
|
161
|
+
* geemus
|
162
|
+
* geemus (Wesley Beary)
|
163
|
+
* ggoodale
|
164
|
+
* ivan.filenko
|
165
|
+
* jasquat
|
166
|
+
* karimb
|
167
|
+
* marios
|
168
|
+
* mkb
|
169
|
+
* nathannaveen
|
170
|
+
* ojab
|
171
|
+
* patrick brisbin
|
172
|
+
* pavel
|
173
|
+
* phiggins
|
174
|
+
* rin_ne
|
175
|
+
* rinrinne
|
176
|
+
* rkyrychuk
|
177
|
+
* shale
|
178
|
+
* sshaw
|
179
|
+
* starbelly
|
180
|
+
* twrodriguez
|
181
|
+
* wsnarski
|
182
|
+
* zimbatm
|
data/README.md
CHANGED
@@ -7,22 +7,22 @@ Excon was designed to be simple, fast and performant. It works great as a genera
|
|
7
7
|
[![Build Status](https://github.com/excon/excon/actions/workflows/ruby.yml/badge.svg)](https://github.com/excon/excon/actions/workflows/ruby.yml)
|
8
8
|
[![Gem Version](https://badge.fury.io/rb/excon.svg)](https://badge.fury.io/rb/excon)
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
10
|
+
- [Getting Started](#getting-started)
|
11
|
+
- [Options](#options)
|
12
|
+
- [Chunked Requests](#chunked-requests)
|
13
|
+
- [Pipelining Requests](#pipelining-requests)
|
14
|
+
- [Streaming Responses](#streaming-responses)
|
15
|
+
- [Proxy Support](#proxy-support)
|
16
|
+
- [Reusable ports](#reusable-ports)
|
17
|
+
- [Unix Socket Support](#unix-socket-support)
|
18
|
+
- [Stubs](#stubs)
|
19
|
+
- [Instrumentation](#instrumentation)
|
20
|
+
- [HTTPS client certificate](#https-client-certificate)
|
21
|
+
- [HTTPS/SSL Issues](#httpsssl-issues)
|
22
|
+
- [Getting Help](#getting-help)
|
23
|
+
- [Contributing](#contributing)
|
24
|
+
- [Plugins and Middlewares](#plugins-and-middlewares)
|
25
|
+
- [License](#license)
|
26
26
|
|
27
27
|
## Getting Started
|
28
28
|
|
@@ -92,7 +92,6 @@ connection.get # socket reused
|
|
92
92
|
Note that sending a request with `:persistent => false` to close the socket will also send `Connection: close` to inform
|
93
93
|
the server the connection is no longer needed. `Connection#reset` will simply close our end of the socket.
|
94
94
|
|
95
|
-
|
96
95
|
## Options
|
97
96
|
|
98
97
|
Both one-off and persistent connections support many other options. The final options for a request are built up by starting with `Excon.defaults`, then merging in options from the connection and finally merging in any request options. In this way you have plenty of options on where and how to set options and can easily setup connections or defaults to match common options for a particular endpoint.
|
@@ -101,7 +100,7 @@ Here are a few common examples:
|
|
101
100
|
|
102
101
|
```ruby
|
103
102
|
# Output debug info, similar to ENV['EXCON_DEBUG']
|
104
|
-
connection = Excon.new('http://geemus.com/', :
|
103
|
+
connection = Excon.new('http://geemus.com/', :debug => true)
|
105
104
|
|
106
105
|
# Custom headers
|
107
106
|
Excon.get('http://geemus.com', :headers => {'Authorization' => 'Basic 0123456789ABCDEF'})
|
@@ -128,6 +127,38 @@ connection.request(:method => 'GET')
|
|
128
127
|
# expect one or more status codes, or raise an error
|
129
128
|
connection.request(:expects => [200, 201], :method => :get)
|
130
129
|
|
130
|
+
# use basic authentication by supplying credentials in the URL or as parameters
|
131
|
+
connection = Excon.new('http://username:password@secure.geemus.com')
|
132
|
+
# Note: username & password is unescaped for request, so you should provide escaped values here
|
133
|
+
# i. e. instead of `password: 'pa%%word'` you should use `password: Excon::Utils.escape_uri('pa%%word')`,
|
134
|
+
# which return `pa%25%25word`
|
135
|
+
connection = Excon.new('http://secure.geemus.com',
|
136
|
+
:user => 'username', :password => 'password')
|
137
|
+
|
138
|
+
# use custom uri parser
|
139
|
+
require 'addressable/uri'
|
140
|
+
connection = Excon.new('http://geemus.com/', uri_parser: Addressable::URI)
|
141
|
+
```
|
142
|
+
|
143
|
+
Compared to web browsers and other http client libraries, e.g. curl, Excon is a bit more low-level and doesn't assume much by default. If you are seeing different results compared to other clients, the following options might help:
|
144
|
+
|
145
|
+
```ruby
|
146
|
+
# opt-in to omitting port from http:80 and https:443
|
147
|
+
connection = Excon.new('http://geemus.com/', :omit_default_port => true)
|
148
|
+
|
149
|
+
# accept gzip encoding
|
150
|
+
connection = Excon.new('http://geemus.com/', :headers => { "Accept-Encoding" => "gzip" })
|
151
|
+
|
152
|
+
# turn off peer verification (less secure)
|
153
|
+
Excon.defaults[:ssl_verify_peer] = false
|
154
|
+
connection = Excon.new('https://...')
|
155
|
+
```
|
156
|
+
|
157
|
+
## Timeouts and Retries
|
158
|
+
|
159
|
+
You can modify timeouts and define whether and how many (blocking) retries Excon should attempt if errors occur.
|
160
|
+
|
161
|
+
```ruby
|
131
162
|
# this request can be repeated safely, so retry on errors up to 4 times
|
132
163
|
connection.request(:idempotent => true)
|
133
164
|
|
@@ -138,6 +169,10 @@ connection.request(:idempotent => true, :retry_limit => 6)
|
|
138
169
|
# in between each retry
|
139
170
|
connection.request(:idempotent => true, :retry_limit => 6, :retry_interval => 5)
|
140
171
|
|
172
|
+
# specify the errors on which to retry (default Timeout, Socket, HTTPStatus)
|
173
|
+
# only retry on timeouts
|
174
|
+
connection.request(:idempotent => true, :retry_limit => 6, :retry_interval => 5, :retry_errors => [Excon::Error::Timeout] )
|
175
|
+
|
141
176
|
# set longer read_timeout (default is 60 seconds)
|
142
177
|
connection.request(:read_timeout => 360)
|
143
178
|
|
@@ -156,32 +191,6 @@ connection = Excon.new('http://geemus.com/', :connect_timeout => 360)
|
|
156
191
|
|
157
192
|
# opt-out of nonblocking operations for performance and/or as a workaround
|
158
193
|
connection = Excon.new('http://geemus.com/', :nonblock => false)
|
159
|
-
|
160
|
-
# use basic authentication by supplying credentials in the URL or as parameters
|
161
|
-
connection = Excon.new('http://username:password@secure.geemus.com')
|
162
|
-
# Note: username & password is unescaped for request, so you should provide escaped values here
|
163
|
-
# i. e. instead of `password: 'pa%%word'` you should use `password: Excon::Utils.escape_uri('pa%%word')`,
|
164
|
-
# which return `pa%25%25word`
|
165
|
-
connection = Excon.new('http://secure.geemus.com',
|
166
|
-
:user => 'username', :password => 'password')
|
167
|
-
|
168
|
-
# use custom uri parser
|
169
|
-
require 'addressable/uri'
|
170
|
-
connection = Excon.new('http://geemus.com/', uri_parser: Addressable::URI)
|
171
|
-
```
|
172
|
-
|
173
|
-
Compared to web browsers and other http client libraries, e.g. curl, Excon is a bit more low-level and doesn't assume much by default. If you are seeing different results compared to other clients, the following options might help:
|
174
|
-
|
175
|
-
```ruby
|
176
|
-
# opt-in to omitting port from http:80 and https:443
|
177
|
-
connection = Excon.new('http://geemus.com/', :omit_default_port => true)
|
178
|
-
|
179
|
-
# accept gzip encoding
|
180
|
-
connection = Excon.new('http://geemus.com/', :headers => { "Accept-Encoding" => "gzip" })
|
181
|
-
|
182
|
-
# turn off peer verification (less secure)
|
183
|
-
Excon.defaults[:ssl_verify_peer] = false
|
184
|
-
connection = Excon.new('https://...')
|
185
194
|
```
|
186
195
|
|
187
196
|
## Chunked Requests
|
@@ -277,7 +286,7 @@ s.close
|
|
277
286
|
|
278
287
|
## Unix Socket Support
|
279
288
|
|
280
|
-
The Unix socket will work for one-off requests and multiuse connections.
|
289
|
+
The Unix socket will work for one-off requests and multiuse connections. A Unix socket path must be provided separate from the resource path.
|
281
290
|
|
282
291
|
```ruby
|
283
292
|
connection = Excon.new('unix:///', :socket => '/tmp/unicorn.sock')
|
@@ -309,7 +318,19 @@ Excon.stub({}, {:body => 'body', :status => 200})
|
|
309
318
|
Excon.stub({}, lambda {|request_params| {:body => request_params[:body], :status => 200}})
|
310
319
|
```
|
311
320
|
|
312
|
-
Omitted attributes are assumed to match, so this stub will match
|
321
|
+
Omitted attributes are assumed to match, so this stub will match _any_ request and return an Excon::Response with a body of 'body' and status of 200.
|
322
|
+
|
323
|
+
```ruby
|
324
|
+
Excon.stub({ :scheme => 'https', :host => 'example.com', :path => /\/examples\/\d+/, :port => 443 }, { body: 'body', status: 200 })
|
325
|
+
```
|
326
|
+
|
327
|
+
The above code will stub this:
|
328
|
+
|
329
|
+
```ruby
|
330
|
+
Excon.get('https://example.com/examples/123', mock: true)
|
331
|
+
```
|
332
|
+
|
333
|
+
You can add whatever stubs you might like this way and they will be checked against in the order they were added, if none of them match then excon will raise an `Excon::Errors::StubNotFound` error to let you know.
|
313
334
|
|
314
335
|
If you want to allow unstubbed requests without raising `StubNotFound`, set the `allow_unstubbed_requests` option either globally or per request.
|
315
336
|
|
@@ -356,7 +377,7 @@ connection = Excon.new(
|
|
356
377
|
)
|
357
378
|
```
|
358
379
|
|
359
|
-
Excon will then instrument each request, retry, and error.
|
380
|
+
Excon will then instrument each request, retry, and error. The corresponding events are named `excon.request`, `excon.retry`, and `excon.error` respectively.
|
360
381
|
|
361
382
|
```ruby
|
362
383
|
ActiveSupport::Notifications.subscribe(/excon/) do |*args|
|
@@ -410,7 +431,7 @@ The #instrument method will be called for each HTTP request, response, retry, an
|
|
410
431
|
|
411
432
|
For debugging purposes you can also use `Excon::StandardInstrumentor` to output all events to stderr. This can also be specified by setting the `EXCON_DEBUG` ENV var.
|
412
433
|
|
413
|
-
See [the documentation for ActiveSupport::Notifications](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html) for more detail on using the subscription interface.
|
434
|
+
See [the documentation for ActiveSupport::Notifications](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html) for more detail on using the subscription interface. See excon's [instrumentation_test.rb](https://github.com/excon/excon/blob/master/tests/middlewares/instrumentation_tests.rb) for more examples of instrumenting excon.
|
414
435
|
|
415
436
|
## HTTPS client certificate
|
416
437
|
|
@@ -425,7 +446,16 @@ connection = Excon.new('https://example.com',
|
|
425
446
|
|
426
447
|
`client_key_pass` is optional.
|
427
448
|
|
428
|
-
|
449
|
+
Optionally, you can also pass the whole chain by passing the extra certificates through `client_chain`:
|
450
|
+
|
451
|
+
```ruby
|
452
|
+
connection = Excon.new('https://example.com',
|
453
|
+
client_cert: 'mycert.pem',
|
454
|
+
client_chain: 'mychain.pem',
|
455
|
+
client_key: 'mycert.key')
|
456
|
+
```
|
457
|
+
|
458
|
+
If you already have loaded the certificate, key and chain into memory, then pass it through like:
|
429
459
|
|
430
460
|
```ruby
|
431
461
|
client_cert_data = File.load 'mycert.pem'
|
@@ -433,6 +463,7 @@ client_key_data = File.load 'mycert.key'
|
|
433
463
|
|
434
464
|
connection = Excon.new('https://example.com',
|
435
465
|
client_cert_data: client_cert_data,
|
466
|
+
client_chain_data: client_chain_data,
|
436
467
|
client_key_data: client_key_data)
|
437
468
|
```
|
438
469
|
|
@@ -459,8 +490,8 @@ Either of these should allow you to work around the socket error and continue wi
|
|
459
490
|
|
460
491
|
## Getting Help
|
461
492
|
|
462
|
-
|
463
|
-
|
493
|
+
- Ask specific questions on [Stack Overflow](http://stackoverflow.com/questions/tagged/excon).
|
494
|
+
- Report bugs and discuss potential features in [Github issues](https://github.com/excon/excon/issues).
|
464
495
|
|
465
496
|
## Contributing
|
466
497
|
|
@@ -472,12 +503,12 @@ Using Excon's [Middleware system][middleware], you can easily extend Excon's
|
|
472
503
|
functionality with your own. The following plugins extend Excon in their own
|
473
504
|
way:
|
474
505
|
|
475
|
-
|
506
|
+
- [excon-addressable](https://github.com/JeanMertz/excon-addressable)
|
476
507
|
|
477
508
|
Set [addressable](https://github.com/sporkmonger/addressable) as the default
|
478
509
|
URI parser, and add support for [URI templating][templating].
|
479
510
|
|
480
|
-
|
511
|
+
- [excon-hypermedia](https://github.com/JeanMertz/excon-hypermedia)
|
481
512
|
|
482
513
|
Teaches Excon to talk with [HyperMedia APIs][hypermedia]. Allowing you to use
|
483
514
|
all of Excon's functionality, while traversing APIs in an easy and
|