Skip to content

Commit 04feb3b

Browse files
committed
added client and header timeout.
1 parent 5f2eafe commit 04feb3b

File tree

1 file changed

+42
-21
lines changed

1 file changed

+42
-21
lines changed

pkg/client/client.go

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,14 @@ func NewInsAPICliShowASCIIRequest(s string) *InsAPIRequest {
119119

120120
// Client is an instance of Cisco NX-OS API client.
121121
type Client struct {
122-
host string
123-
port int
124-
protocol string
125-
username string
126-
password string
127-
secure bool
122+
host string
123+
port int
124+
protocol string
125+
username string
126+
password string
127+
secure bool
128+
headerTimeout time.Duration
129+
clientTimeout time.Duration
128130
}
129131

130132
// NewClient returns an instance of Client.
@@ -153,6 +155,18 @@ func (cli *Client) SetPort(p int) error {
153155
return nil
154156
}
155157

158+
// SetHeaderTimeout sets the response header timeout for the http transport.
159+
func (cli *Client) SetHeaderTimeout(r time.Duration) error {
160+
cli.headerTimeout = r
161+
return nil
162+
}
163+
164+
// SetClientTimeout sets the http client timeout.
165+
func (cli *Client) SetClientTimeout(c time.Duration) error {
166+
cli.clientTimeout = c
167+
return nil
168+
}
169+
156170
// SetUsername sets the username for the API calls.
157171
func (cli *Client) SetUsername(s string) error {
158172
if s == "" {
@@ -191,21 +205,28 @@ func (cli *Client) SetSecure() error {
191205
return nil
192206
}
193207

194-
func callAPI(contentType string, url string, payload []byte, username, password string, secure bool) ([]byte, error) {
208+
func callAPI(contentType string, url string, payload []byte, username, password string, secure bool, headerTimeout time.Duration, clientTimeout time.Duration) ([]byte, error) {
195209
tr := &http.Transport{
196210
Dial: (&net.Dialer{
197211
Timeout: 10 * time.Second,
198212
}).Dial,
199213
TLSHandshakeTimeout: 10 * time.Second,
200214
}
215+
if headerTimeout > 0 {
216+
tr.ResponseHeaderTimeout = headerTimeout * time.Second
217+
}
201218
if !secure {
202219
tr.TLSClientConfig = &tls.Config{
203220
InsecureSkipVerify: true,
204221
}
205222
}
206223
cli := &http.Client{
207224
Transport: tr,
208-
Timeout: time.Second * 30,
225+
}
226+
if clientTimeout > 0 {
227+
cli.Timeout = clientTimeout * time.Second
228+
} else {
229+
cli.Timeout = 30 * time.Second
209230
}
210231
var reqContentType string
211232
switch contentType {
@@ -262,7 +283,7 @@ func (cli *Client) GetSystemInfo() (*SysInfo, error) {
262283
if err != nil {
263284
return nil, err
264285
}
265-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
286+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
266287
if err != nil {
267288
return nil, err
268289
}
@@ -277,7 +298,7 @@ func (cli *Client) GetVlans() ([]*Vlan, error) {
277298
if err != nil {
278299
return nil, err
279300
}
280-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
301+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
281302
if err != nil {
282303
return nil, err
283304
}
@@ -292,7 +313,7 @@ func (cli *Client) GetInterfaces() ([]*Interface, error) {
292313
if err != nil {
293314
return nil, err
294315
}
295-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
316+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
296317
if err != nil {
297318
return nil, err
298319
}
@@ -307,7 +328,7 @@ func (cli *Client) GetInterface(name string) (*Interface, error) {
307328
if err != nil {
308329
return nil, err
309330
}
310-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
331+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
311332
if err != nil {
312333
return nil, err
313334
}
@@ -325,7 +346,7 @@ func (cli *Client) GetSystemResources() (*SystemResources, error) {
325346
if err != nil {
326347
return nil, err
327348
}
328-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
349+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
329350
if err != nil {
330351
return nil, err
331352
}
@@ -340,7 +361,7 @@ func (cli *Client) GetSystemEnvironment() (*SystemEnvironment, error) {
340361
if err != nil {
341362
return nil, err
342363
}
343-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
364+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
344365
if err != nil {
345366
return nil, err
346367
}
@@ -355,7 +376,7 @@ func (cli *Client) GetGeneric(s string) ([]byte, error) {
355376
if err != nil {
356377
return nil, err
357378
}
358-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
379+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
359380
if err != nil {
360381
return nil, err
361382
}
@@ -370,7 +391,7 @@ func (cli *Client) GetBgpSummary() (*BgpSummary, error) {
370391
if err != nil {
371392
return nil, err
372393
}
373-
resp, err := callAPI("json", url, payload, cli.username, cli.password, cli.secure)
394+
resp, err := callAPI("json", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
374395
if err != nil {
375396
return nil, err
376397
}
@@ -403,7 +424,7 @@ func (cli *Client) getConfiguration(s string) (*Configuration, error) {
403424
if err != nil {
404425
return nil, err
405426
}
406-
resp, err := callAPI("json", url, payload, cli.username, cli.password, cli.secure)
427+
resp, err := callAPI("json", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
407428
if err != nil {
408429
return nil, err
409430
}
@@ -419,7 +440,7 @@ func (cli *Client) GetTransceivers() ([]*Transceiver, error) {
419440
if err != nil {
420441
return nil, err
421442
}
422-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
443+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
423444
if err != nil {
424445
return nil, err
425446
}
@@ -440,7 +461,7 @@ func (cli *Client) GetMacAddressTable(intf string) (*MacAddressTable, error) {
440461
if err != nil {
441462
return nil, err
442463
}
443-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
464+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
444465
if err != nil {
445466
return nil, err
446467
}
@@ -456,7 +477,7 @@ func (cli *Client) GetCDPNeighbors() (*CDPNeighborTable, error) {
456477
if err != nil {
457478
return nil, err
458479
}
459-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
480+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
460481
if err != nil {
461482
return nil, err
462483
}
@@ -477,7 +498,7 @@ func (cli *Client) Configure(cmds []string) ([]JSONRPCResponse, error) {
477498
return nil, err
478499
}
479500

480-
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure)
501+
resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure, cli.headerTimeout, cli.clientTimeout)
481502
if err != nil {
482503
return nil, err
483504
}

0 commit comments

Comments
 (0)