@@ -119,12 +119,14 @@ func NewInsAPICliShowASCIIRequest(s string) *InsAPIRequest {
119
119
120
120
// Client is an instance of Cisco NX-OS API client.
121
121
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
128
130
}
129
131
130
132
// NewClient returns an instance of Client.
@@ -153,6 +155,18 @@ func (cli *Client) SetPort(p int) error {
153
155
return nil
154
156
}
155
157
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
+
156
170
// SetUsername sets the username for the API calls.
157
171
func (cli * Client ) SetUsername (s string ) error {
158
172
if s == "" {
@@ -191,21 +205,28 @@ func (cli *Client) SetSecure() error {
191
205
return nil
192
206
}
193
207
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 ) {
195
209
tr := & http.Transport {
196
210
Dial : (& net.Dialer {
197
211
Timeout : 10 * time .Second ,
198
212
}).Dial ,
199
213
TLSHandshakeTimeout : 10 * time .Second ,
200
214
}
215
+ if headerTimeout > 0 {
216
+ tr .ResponseHeaderTimeout = headerTimeout * time .Second
217
+ }
201
218
if ! secure {
202
219
tr .TLSClientConfig = & tls.Config {
203
220
InsecureSkipVerify : true ,
204
221
}
205
222
}
206
223
cli := & http.Client {
207
224
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
209
230
}
210
231
var reqContentType string
211
232
switch contentType {
@@ -262,7 +283,7 @@ func (cli *Client) GetSystemInfo() (*SysInfo, error) {
262
283
if err != nil {
263
284
return nil , err
264
285
}
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 )
266
287
if err != nil {
267
288
return nil , err
268
289
}
@@ -277,7 +298,7 @@ func (cli *Client) GetVlans() ([]*Vlan, error) {
277
298
if err != nil {
278
299
return nil , err
279
300
}
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 )
281
302
if err != nil {
282
303
return nil , err
283
304
}
@@ -292,7 +313,7 @@ func (cli *Client) GetInterfaces() ([]*Interface, error) {
292
313
if err != nil {
293
314
return nil , err
294
315
}
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 )
296
317
if err != nil {
297
318
return nil , err
298
319
}
@@ -307,7 +328,7 @@ func (cli *Client) GetInterface(name string) (*Interface, error) {
307
328
if err != nil {
308
329
return nil , err
309
330
}
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 )
311
332
if err != nil {
312
333
return nil , err
313
334
}
@@ -325,7 +346,7 @@ func (cli *Client) GetSystemResources() (*SystemResources, error) {
325
346
if err != nil {
326
347
return nil , err
327
348
}
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 )
329
350
if err != nil {
330
351
return nil , err
331
352
}
@@ -340,7 +361,7 @@ func (cli *Client) GetSystemEnvironment() (*SystemEnvironment, error) {
340
361
if err != nil {
341
362
return nil , err
342
363
}
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 )
344
365
if err != nil {
345
366
return nil , err
346
367
}
@@ -355,7 +376,7 @@ func (cli *Client) GetGeneric(s string) ([]byte, error) {
355
376
if err != nil {
356
377
return nil , err
357
378
}
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 )
359
380
if err != nil {
360
381
return nil , err
361
382
}
@@ -370,7 +391,7 @@ func (cli *Client) GetBgpSummary() (*BgpSummary, error) {
370
391
if err != nil {
371
392
return nil , err
372
393
}
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 )
374
395
if err != nil {
375
396
return nil , err
376
397
}
@@ -403,7 +424,7 @@ func (cli *Client) getConfiguration(s string) (*Configuration, error) {
403
424
if err != nil {
404
425
return nil , err
405
426
}
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 )
407
428
if err != nil {
408
429
return nil , err
409
430
}
@@ -419,7 +440,7 @@ func (cli *Client) GetTransceivers() ([]*Transceiver, error) {
419
440
if err != nil {
420
441
return nil , err
421
442
}
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 )
423
444
if err != nil {
424
445
return nil , err
425
446
}
@@ -440,7 +461,7 @@ func (cli *Client) GetMacAddressTable(intf string) (*MacAddressTable, error) {
440
461
if err != nil {
441
462
return nil , err
442
463
}
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 )
444
465
if err != nil {
445
466
return nil , err
446
467
}
@@ -456,7 +477,7 @@ func (cli *Client) GetCDPNeighbors() (*CDPNeighborTable, error) {
456
477
if err != nil {
457
478
return nil , err
458
479
}
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 )
460
481
if err != nil {
461
482
return nil , err
462
483
}
@@ -477,7 +498,7 @@ func (cli *Client) Configure(cmds []string) ([]JSONRPCResponse, error) {
477
498
return nil , err
478
499
}
479
500
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 )
481
502
if err != nil {
482
503
return nil , err
483
504
}
0 commit comments