// Copyright (c) 2015-2017 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. // resty source code and usage is governed by a MIT style // license that can be found in the LICENSE file. package resty import ( "crypto/tls" "encoding/json" "io" "net/http" "net/http/cookiejar" "net/url" "os" "time" "golang.org/x/net/publicsuffix" ) // DefaultClient of resty var DefaultClient *Client // New method creates a new go-resty client func New() *Client { cookieJar, _ := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List}) c := &Client{ HostURL: "", QueryParam: url.Values{}, FormData: url.Values{}, Header: http.Header{}, UserInfo: nil, Token: "", Cookies: make([]*http.Cookie, 0), Debug: false, Log: getLogger(os.Stderr), RetryCount: 0, RetryWaitTime: defaultWaitTime, RetryMaxWaitTime: defaultMaxWaitTime, JSONMarshal: json.Marshal, JSONUnmarshal: json.Unmarshal, httpClient: &http.Client{Jar: cookieJar}, } // Default transport c.SetTransport(&http.Transport{}) // Default redirect policy c.SetRedirectPolicy(NoRedirectPolicy()) // default before request middlewares c.beforeRequest = []func(*Client, *Request) error{ parseRequestURL, parseRequestHeader, parseRequestBody, createHTTPRequest, addCredentials, requestLogger, } // user defined request middlewares c.udBeforeRequest = []func(*Client, *Request) error{} // default after response middlewares c.afterResponse = []func(*Client, *Response) error{ responseLogger, parseResponseBody, saveResponseIntoFile, } return c } // R creates a new resty request object, it is used form a HTTP/RESTful request // such as GET, POST, PUT, DELETE, HEAD, PATCH and OPTIONS. func R() *Request { return DefaultClient.R() } // NewRequest is an alias for R(). Creates a new resty request object, it is used form a HTTP/RESTful request // such as GET, POST, PUT, DELETE, HEAD, PATCH and OPTIONS. func NewRequest() *Request { return R() } // SetHostURL sets Host URL. See `Client.SetHostURL for more information. func SetHostURL(url string) *Client { return DefaultClient.SetHostURL(url) } // SetHeader sets single header. See `Client.SetHeader` for more information. func SetHeader(header, value string) *Client { return DefaultClient.SetHeader(header, value) } // SetHeaders sets multiple headers. See `Client.SetHeaders` for more information. func SetHeaders(headers map[string]string) *Client { return DefaultClient.SetHeaders(headers) } // SetCookieJar sets custom http.CookieJar. See `Client.SetCookieJar` for more information. func SetCookieJar(jar http.CookieJar) *Client { return DefaultClient.SetCookieJar(jar) } // SetCookie sets single cookie object. See `Client.SetCookie` for more information. func SetCookie(hc *http.Cookie) *Client { return DefaultClient.SetCookie(hc) } // SetCookies sets multiple cookie object. See `Client.SetCookies` for more information. func SetCookies(cs []*http.Cookie) *Client { return DefaultClient.SetCookies(cs) } // SetQueryParam method sets single parameter and its value. See `Client.SetQueryParam` for more information. func SetQueryParam(param, value string) *Client { return DefaultClient.SetQueryParam(param, value) } // SetQueryParams method sets multiple parameters and its value. See `Client.SetQueryParams` for more information. func SetQueryParams(params map[string]string) *Client { return DefaultClient.SetQueryParams(params) } // SetFormData method sets Form parameters and its values. See `Client.SetFormData` for more information. func SetFormData(data map[string]string) *Client { return DefaultClient.SetFormData(data) } // SetBasicAuth method sets the basic authentication header. See `Client.SetBasicAuth` for more information. func SetBasicAuth(username, password string) *Client { return DefaultClient.SetBasicAuth(username, password) } // SetAuthToken method sets bearer auth token header. See `Client.SetAuthToken` for more information. func SetAuthToken(token string) *Client { return DefaultClient.SetAuthToken(token) } // OnBeforeRequest method sets request middleware. See `Client.OnBeforeRequest` for more information. func OnBeforeRequest(m func(*Client, *Request) error) *Client { return DefaultClient.OnBeforeRequest(m) } // OnAfterResponse method sets response middleware. See `Client.OnAfterResponse` for more information. func OnAfterResponse(m func(*Client, *Response) error) *Client { return DefaultClient.OnAfterResponse(m) } // SetPreRequestHook method sets the pre-request hook. See `Client.SetPreRequestHook` for more information. func SetPreRequestHook(h func(*Client, *Request) error) *Client { return DefaultClient.SetPreRequestHook(h) } // SetDebug method enables the debug mode. See `Client.SetDebug` for more information. func SetDebug(d bool) *Client { return DefaultClient.SetDebug(d) } // SetAllowGetMethodPayload method allows the GET method with payload. See `Client.SetAllowGetMethodPayload` for more information. func SetAllowGetMethodPayload(a bool) *Client { return DefaultClient.SetAllowGetMethodPayload(a) } // SetRetryCount method sets the retry count. See `Client.SetRetryCount` for more information. func SetRetryCount(count int) *Client { return DefaultClient.SetRetryCount(count) } // SetRetryWaitTime method sets the retry wait time. See `Client.SetRetryWaitTime` for more information. func SetRetryWaitTime(waitTime time.Duration) *Client { return DefaultClient.SetRetryWaitTime(waitTime) } // SetRetryMaxWaitTime method sets the retry max wait time. See `Client.SetRetryMaxWaitTime` for more information. func SetRetryMaxWaitTime(maxWaitTime time.Duration) *Client { return DefaultClient.SetRetryMaxWaitTime(maxWaitTime) } // AddRetryCondition method appends check function for retry. See `Client.AddRetryCondition` for more information. func AddRetryCondition(condition RetryConditionFunc) *Client { return DefaultClient.AddRetryCondition(condition) } // SetDisableWarn method disables warning comes from `go-resty` client. See `Client.SetDisableWarn` for more information. func SetDisableWarn(d bool) *Client { return DefaultClient.SetDisableWarn(d) } // SetLogger method sets given writer for logging. See `Client.SetLogger` for more information. func SetLogger(w io.Writer) *Client { return DefaultClient.SetLogger(w) } // SetContentLength method enables `Content-Length` value. See `Client.SetContentLength` for more information. func SetContentLength(l bool) *Client { return DefaultClient.SetContentLength(l) } // SetError method is to register the global or client common `Error` object. See `Client.SetError` for more information. func SetError(err interface{}) *Client { return DefaultClient.SetError(err) } // SetRedirectPolicy method sets the client redirect poilicy. See `Client.SetRedirectPolicy` for more information. func SetRedirectPolicy(policies ...interface{}) *Client { return DefaultClient.SetRedirectPolicy(policies...) } // SetHTTPMode method sets go-resty mode into HTTP. See `Client.SetMode` for more information. func SetHTTPMode() *Client { return DefaultClient.SetHTTPMode() } // SetRESTMode method sets go-resty mode into RESTful. See `Client.SetMode` for more information. func SetRESTMode() *Client { return DefaultClient.SetRESTMode() } // Mode method returns the current client mode. See `Client.Mode` for more information. func Mode() string { return DefaultClient.Mode() } // SetTLSClientConfig method sets TLSClientConfig for underling client Transport. See `Client.SetTLSClientConfig` for more information. func SetTLSClientConfig(config *tls.Config) *Client { return DefaultClient.SetTLSClientConfig(config) } // SetTimeout method sets timeout for request. See `Client.SetTimeout` for more information. func SetTimeout(timeout time.Duration) *Client { return DefaultClient.SetTimeout(timeout) } // SetProxy method sets Proxy for request. See `Client.SetProxy` for more information. func SetProxy(proxyURL string) *Client { return DefaultClient.SetProxy(proxyURL) } // RemoveProxy method removes the proxy configuration. See `Client.RemoveProxy` for more information. func RemoveProxy() *Client { return DefaultClient.RemoveProxy() } // SetCertificates method helps to set client certificates into resty conveniently. // See `Client.SetCertificates` for more information and example. func SetCertificates(certs ...tls.Certificate) *Client { return DefaultClient.SetCertificates(certs...) } // SetRootCertificate method helps to add one or more root certificates into resty client. // See `Client.SetRootCertificate` for more information. func SetRootCertificate(pemFilePath string) *Client { return DefaultClient.SetRootCertificate(pemFilePath) } // SetOutputDirectory method sets output directory. See `Client.SetOutputDirectory` for more information. func SetOutputDirectory(dirPath string) *Client { return DefaultClient.SetOutputDirectory(dirPath) } // SetTransport method sets custom `*http.Transport` or any `http.RoundTripper` // compatible interface implementation in the resty client. // See `Client.SetTransport` for more information. func SetTransport(transport http.RoundTripper) *Client { return DefaultClient.SetTransport(transport) } // SetScheme method sets custom scheme in the resty client. // See `Client.SetScheme` for more information. func SetScheme(scheme string) *Client { return DefaultClient.SetScheme(scheme) } // SetCloseConnection method sets close connection value in the resty client. // See `Client.SetCloseConnection` for more information. func SetCloseConnection(close bool) *Client { return DefaultClient.SetCloseConnection(close) } // SetDoNotParseResponse method instructs `Resty` not to parse the response body automatically. // See `Client.SetDoNotParseResponse` for more information. func SetDoNotParseResponse(parse bool) *Client { return DefaultClient.SetDoNotParseResponse(parse) } // IsProxySet method returns the true if proxy is set on client otherwise false. // See `Client.IsProxySet` for more information. func IsProxySet() bool { return DefaultClient.IsProxySet() } func init() { DefaultClient = New() }