summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2021-05-25 13:29:11 +0700
committerShulhan <ms@kilabit.info>2021-05-25 13:29:11 +0700
commit7f8acf1566e8d2558d0e75a7ba3ba5e25b5b1df9 (patch)
tree4f4e5a8fbba63463adf087289ba3b31cb3650fd1
parent111a2b0408e523fb9c2a23bd60fd590c6cf88149 (diff)
downloadpakakeh.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.go7
-rw-r--r--lib/xmlrpc/response.go27
-rw-r--r--lib/xmlrpc/response_test.go15
-rw-r--r--lib/xmlrpc/value.go6
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)
}
//