@@ -354,12 +354,7 @@ func (c *Client) SetContentLength(l bool) *Client {
354354// resty.SetError(Error{})
355355//
356356func (c * Client ) SetError (err interface {}) * Client {
357- t := reflect .TypeOf (err )
358- if t .Kind () == reflect .Ptr {
359- c .Error = t .Elem ()
360- } else {
361- c .Error = t
362- }
357+ c .Error = getType (err )
363358 return c
364359}
365360
@@ -463,7 +458,7 @@ func (c *Client) SetTimeout(timeout time.Duration) *Client {
463458 c .transport .Dial = func (network , addr string ) (net.Conn , error ) {
464459 conn , err := net .DialTimeout (network , addr , timeout )
465460 if err != nil {
466- c .Log .Printf ("Error: %v " , err )
461+ c .Log .Printf ("ERROR [%v] " , err )
467462 return nil , err
468463 }
469464 conn .SetDeadline (time .Now ().Add (timeout ))
@@ -484,7 +479,7 @@ func (c *Client) SetProxy(proxyURL string) *Client {
484479 if pURL , err := url .Parse (proxyURL ); err == nil {
485480 c .transport .Proxy = http .ProxyURL (pURL )
486481 } else {
487- c .Log .Printf ("ERROR: %v " , err )
482+ c .Log .Printf ("ERROR [%v] " , err )
488483 }
489484
490485 return c
@@ -643,6 +638,24 @@ func (r *Request) SetQueryParams(params map[string]string) *Request {
643638 return r
644639}
645640
641+ // SetQueryString method provides ability to use string as an input to set URL query string for the request.
642+ //
643+ // Using String as an input
644+ // resty.R().
645+ // SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more")
646+ //
647+ func (r * Request ) SetQueryString (query string ) * Request {
648+ values , err := url .ParseQuery (strings .TrimSpace (query ))
649+ if err == nil {
650+ for p , _ := range values {
651+ r .QueryParam .Add (p , values .Get (p ))
652+ }
653+ } else {
654+ r .client .Log .Printf ("ERROR [%v]" , err )
655+ }
656+ return r
657+ }
658+
646659// SetFormData method sets Form parameters and its values in the current request.
647660// It's applicable only HTTP method `POST` and `PUT` and requets content type would be set as
648661// `application/x-www-form-urlencoded`.
@@ -934,12 +947,7 @@ func IsStringEmpty(str string) bool {
934947// DetectContentType method is used to figure out `Request.Body` content type for request header
935948func DetectContentType (body interface {}) string {
936949 contentType := plainTextType
937- kind := reflect .ValueOf (body ).Kind ()
938- if kind == reflect .Ptr {
939- kind = reflect .TypeOf (body ).Elem ().Kind ()
940- }
941-
942- switch kind {
950+ switch getBaseKind (body ) {
943951 case reflect .Struct , reflect .Map :
944952 contentType = jsonContentType
945953 case reflect .String :
@@ -973,14 +981,7 @@ func Unmarshal(ct string, b []byte, d interface{}) (err error) {
973981}
974982
975983func getLogger (w io.Writer ) * log.Logger {
976- var l * log.Logger
977- if w == nil {
978- l = log .New (os .Stderr , "RESTY " , log .LstdFlags )
979- } else {
980- l = log .New (w , "RESTY " , log .LstdFlags )
981- }
982-
983- return l
984+ return log .New (w , "RESTY " , log .LstdFlags )
984985}
985986
986987func addFile (w * multipart.Writer , fieldName , path string ) error {
@@ -1064,14 +1065,25 @@ func getResponseBodyString(res *Response) string {
10641065}
10651066
10661067func getPointer (v interface {}) interface {} {
1067- rv := reflect .TypeOf (v )
1068- if rv .Kind () ! = reflect .Ptr {
1069- return reflect . New ( rv ). Interface ()
1068+ vv := reflect .ValueOf (v )
1069+ if vv .Kind () = = reflect .Ptr {
1070+ return v
10701071 }
1071-
1072- return v
1072+ return reflect .New (vv .Type ()).Interface ()
10731073}
10741074
10751075func isPayloadSupported (m string ) bool {
10761076 return (m == POST || m == PUT || m == DELETE || m == PATCH )
10771077}
1078+
1079+ func getBaseKind (v interface {}) reflect.Kind {
1080+ return getType (v ).Kind ()
1081+ }
1082+
1083+ func getType (v interface {}) reflect.Type {
1084+ vv := reflect .ValueOf (v )
1085+ if vv .Kind () == reflect .Ptr {
1086+ return vv .Elem ().Type ()
1087+ }
1088+ return vv .Type ()
1089+ }
0 commit comments