diff options
| author | Shulhan <ms@kilabit.info> | 2021-05-25 13:29:11 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2021-05-25 13:29:11 +0700 |
| commit | 7f8acf1566e8d2558d0e75a7ba3ba5e25b5b1df9 (patch) | |
| tree | 4f4e5a8fbba63463adf087289ba3b31cb3650fd1 | |
| parent | 111a2b0408e523fb9c2a23bd60fd590c6cf88149 (diff) | |
| download | pakakeh.go-7f8acf1566e8d2558d0e75a7ba3ba5e25b5b1df9.tar.xz | |
xmlrpc: change the Response to embed the errors.E
The errors.E contains code and message that also implement wrapping and
unwrapping error, so we can use the Response as error just like in
http.EndpointResponse.
| -rw-r--r-- | lib/xmlrpc/client.go | 7 | ||||
| -rw-r--r-- | lib/xmlrpc/response.go | 27 | ||||
| -rw-r--r-- | lib/xmlrpc/response_test.go | 15 | ||||
| -rw-r--r-- | lib/xmlrpc/value.go | 6 |
4 files changed, 29 insertions, 26 deletions
diff --git a/lib/xmlrpc/client.go b/lib/xmlrpc/client.go index b38889fd..db850e04 100644 --- a/lib/xmlrpc/client.go +++ b/lib/xmlrpc/client.go @@ -124,7 +124,7 @@ func (cl *Client) Send(req Request) (resp Response, err error) { fmt.Printf(">>> Send: response:\n%s\n", xmlbin) } - httpRes, resBody, err := libhttp.ParseResponseHeader(xmlbin) + _, resBody, err := libhttp.ParseResponseHeader(xmlbin) if err != nil { return resp, fmt.Errorf("Send: %w", err) } @@ -135,11 +135,6 @@ func (cl *Client) Send(req Request) (resp Response, err error) { return resp, err } } - if !resp.IsFault { - if httpRes.StatusCode >= 400 { - resp.IsFault = true - } - } return resp, nil } diff --git a/lib/xmlrpc/response.go b/lib/xmlrpc/response.go index 53d35a1f..f91c6a6e 100644 --- a/lib/xmlrpc/response.go +++ b/lib/xmlrpc/response.go @@ -8,13 +8,13 @@ import ( "bytes" "encoding/xml" "fmt" + + liberrors "github.com/shuLhan/share/lib/errors" ) type Response struct { - Param *Value - FaultMessage string - FaultCode int32 - IsFault bool + liberrors.E + Param *Value } // @@ -26,15 +26,15 @@ func (resp *Response) MarshalText() (out []byte, err error) { buf.WriteString(xml.Header) buf.WriteString("<methodResponse>") - if !resp.IsFault { + if resp.Code <= 200 { fmt.Fprintf(&buf, "<params><param>%s</param></params>", resp.Param) } else { buf.WriteString("<fault><value><struct>") fmt.Fprintf(&buf, "<member><name>faultCode</name><value><int>%d</int></value></member>", - resp.FaultCode) + resp.Code) fmt.Fprintf(&buf, "<member><name>faultString</name><value><string>%s</string></value></member>", - resp.FaultMessage) + resp.Message) buf.WriteString("</struct></value></fault>") } @@ -104,18 +104,23 @@ func (resp *Response) UnmarshalText(text []byte) (err error) { } // +// Unwrap return the error as instance of *liberror.E. +// +func (resp *Response) Unwrap() (err error) { + return &resp.E +} + +// // unmarshalFault parse the XML fault error code and message. // func (resp *Response) unmarshalFault(dec *xml.Decoder) (err error) { - resp.IsFault = true - v, err := xmlParseValue(dec, elNameFault) if err != nil { return fmt.Errorf("unmarshalFault: %w", err) } - resp.FaultCode = v.GetFieldAsInteger(memberNameFaultCode) - resp.FaultMessage = v.GetFieldAsString(memberNameFaultString) + resp.Code = v.GetFieldAsInteger(memberNameFaultCode) + resp.Message = v.GetFieldAsString(memberNameFaultString) return nil } diff --git a/lib/xmlrpc/response_test.go b/lib/xmlrpc/response_test.go index 23c61312..774783a8 100644 --- a/lib/xmlrpc/response_test.go +++ b/lib/xmlrpc/response_test.go @@ -8,6 +8,7 @@ import ( "encoding/xml" "testing" + liberrors "github.com/shuLhan/share/lib/errors" "github.com/shuLhan/share/lib/test" ) @@ -28,9 +29,10 @@ func TestResponse_MarshalText(t *testing.T) { }, { desc: "With fault", resp: &Response{ - FaultCode: 404, - FaultMessage: "Not found", - IsFault: true, + E: liberrors.E{ + Code: 404, + Message: "Not found", + }, }, exp: xml.Header + `<methodResponse>` + `<fault><value><struct>` + @@ -99,9 +101,10 @@ func TestResponse_UnmarshalText(t *testing.T) { </fault> </methodResponse>`, exp: Response{ - FaultCode: 4, - FaultMessage: "Too many parameters.", - IsFault: true, + E: liberrors.E{ + Code: 4, + Message: "Too many parameters.", + }, }, }, { desc: "Response with array", diff --git a/lib/xmlrpc/value.go b/lib/xmlrpc/value.go index 85d1e1f3..604b2648 100644 --- a/lib/xmlrpc/value.go +++ b/lib/xmlrpc/value.go @@ -131,9 +131,9 @@ func (v *Value) GetFieldAsFloat(key string) float64 { } // -// GetFieldAsInteger get struct's field value by name as int32. +// GetFieldAsInteger get struct's field value by name as int. // -func (v *Value) GetFieldAsInteger(key string) int32 { +func (v *Value) GetFieldAsInteger(key string) int { if v == nil || v.StructMembers == nil { return 0 } @@ -142,7 +142,7 @@ func (v *Value) GetFieldAsInteger(key string) int32 { return 0 } i32, _ := mv.In.(int32) - return i32 + return int(i32) } // |
