From 80740583481df5524748f00ac96ec45777db1b8e Mon Sep 17 00:00:00 2001 From: Chris Salvo Date: Fri, 14 Jan 2022 09:17:41 -0800 Subject: [PATCH] added client and header timeout. --- pkg/client/client.go | 71 ++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/pkg/client/client.go b/pkg/client/client.go index 82f5631..8c1bb93 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -119,12 +119,14 @@ func NewInsAPICliShowASCIIRequest(s string) *InsAPIRequest { // Client is an instance of Cisco NX-OS API client. type Client struct { - host string - port int - protocol string - username string - password string - secure bool + host string + port int + protocol string + username string + password string + secure bool + headerTimeout time.Duration + clientTimeout time.Duration } // NewClient returns an instance of Client. @@ -153,6 +155,18 @@ func (cli *Client) SetPort(p int) error { return nil } +// SetHeaderTimeout sets the response header timeout for the http transport. +func (cli *Client) SetHeaderTimeout(r time.Duration) error { + cli.headerTimeout = r + return nil +} + +// SetClientTimeout sets the http client timeout. +func (cli *Client) SetClientTimeout(c time.Duration) error { + cli.clientTimeout = c + return nil +} + // SetUsername sets the username for the API calls. func (cli *Client) SetUsername(s string) error { if s == "" { @@ -191,21 +205,28 @@ func (cli *Client) SetSecure() error { return nil } -func callAPI(contentType string, url string, payload []byte, username, password string, secure bool) ([]byte, error) { +func (cli *Client) callAPI(contentType string, url string, payload []byte) ([]byte, error) { tr := &http.Transport{ Dial: (&net.Dialer{ Timeout: 10 * time.Second, }).Dial, TLSHandshakeTimeout: 10 * time.Second, } - if !secure { + if cli.headerTimeout > 0 { + tr.ResponseHeaderTimeout = cli.headerTimeout * time.Second + } + if !cli.secure { tr.TLSClientConfig = &tls.Config{ InsecureSkipVerify: true, } } - cli := &http.Client{ + client := &http.Client{ Transport: tr, - Timeout: time.Second * 30, + } + if cli.clientTimeout > 0 { + client.Timeout = cli.clientTimeout * time.Second + } else { + client.Timeout = 30 * time.Second } var reqContentType string switch contentType { @@ -222,9 +243,9 @@ func callAPI(contentType string, url string, payload []byte, username, password } req.Header.Add("Content-Type", reqContentType) req.Header.Add("Cache-Control", "no-cache") - req.SetBasicAuth(username, password) + req.SetBasicAuth(cli.username, cli.password) - res, err := cli.Do(req) + res, err := client.Do(req) if err != nil { if !strings.HasSuffix(err.Error(), "EOF") { return nil, err @@ -262,7 +283,7 @@ func (cli *Client) GetSystemInfo() (*SysInfo, error) { if err != nil { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err } @@ -277,7 +298,7 @@ func (cli *Client) GetVlans() ([]*Vlan, error) { if err != nil { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err } @@ -292,7 +313,7 @@ func (cli *Client) GetInterfaces() ([]*Interface, error) { if err != nil { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err } @@ -307,7 +328,7 @@ func (cli *Client) GetInterface(name string) (*Interface, error) { if err != nil { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err } @@ -325,7 +346,7 @@ func (cli *Client) GetSystemResources() (*SystemResources, error) { if err != nil { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err } @@ -340,7 +361,7 @@ func (cli *Client) GetSystemEnvironment() (*SystemEnvironment, error) { if err != nil { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err } @@ -355,7 +376,7 @@ func (cli *Client) GetGeneric(s string) ([]byte, error) { if err != nil { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err } @@ -370,7 +391,7 @@ func (cli *Client) GetBgpSummary() (*BgpSummary, error) { if err != nil { return nil, err } - resp, err := callAPI("json", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("json", url, payload) if err != nil { return nil, err } @@ -403,7 +424,7 @@ func (cli *Client) getConfiguration(s string) (*Configuration, error) { if err != nil { return nil, err } - resp, err := callAPI("json", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("json", url, payload) if err != nil { return nil, err } @@ -419,7 +440,7 @@ func (cli *Client) GetTransceivers() ([]*Transceiver, error) { if err != nil { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err } @@ -440,7 +461,7 @@ func (cli *Client) GetMacAddressTable(intf string) (*MacAddressTable, error) { if err != nil { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err } @@ -456,7 +477,7 @@ func (cli *Client) GetCDPNeighbors() (*CDPNeighborTable, error) { if err != nil { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err } @@ -477,7 +498,7 @@ func (cli *Client) Configure(cmds []string) ([]JSONRPCResponse, error) { return nil, err } - resp, err := callAPI("jsonrpc", url, payload, cli.username, cli.password, cli.secure) + resp, err := cli.callAPI("jsonrpc", url, payload) if err != nil { return nil, err }