response.go raw
1 package xmlrpc
2
3 import (
4 "regexp"
5 )
6
7 var (
8 faultRx = regexp.MustCompile(`<fault>(\s|\S)+</fault>`)
9 )
10
11
12 type failedResponse struct {
13 Code interface{} `xmlrpc:"faultCode"`
14 Error string `xmlrpc:"faultString"`
15 HttpStatusCode int
16 }
17
18 func (r *failedResponse) err() error {
19 return &XmlRpcError{
20 Code: r.Code,
21 Err: r.Error,
22 HttpStatusCode: r.HttpStatusCode,
23 }
24 }
25
26 type Response struct {
27 data []byte
28 httpStatusCode int
29 }
30
31 func NewResponse(data []byte, httpStatusCode int) *Response {
32 return &Response{
33 data: data,
34 httpStatusCode: httpStatusCode,
35
36 }
37 }
38
39 func (r *Response) Failed() bool {
40 return faultRx.Match(r.data)
41 }
42
43 func (r *Response) Err() error {
44 failedResp := new(failedResponse)
45 if err := unmarshal(r.data, failedResp); err != nil {
46 return err
47 }
48 failedResp.HttpStatusCode = r.httpStatusCode
49
50 return failedResp.err()
51 }
52
53 func (r *Response) Unmarshal(v interface{}) error {
54 if err := unmarshal(r.data, v); err != nil {
55 return err
56 }
57
58 return nil
59 }
60
61