request.go raw
1 package xmlrpc
2
3 import (
4 "bytes"
5 "fmt"
6 "net/http"
7 )
8
9 func NewRequest(url string, method string, args interface{}) (*http.Request, error) {
10 var t []interface{}
11 var ok bool
12 if t, ok = args.([]interface{}); !ok {
13 if args != nil {
14 t = []interface{}{args}
15 }
16 }
17
18 body, err := EncodeMethodCall(method, t...)
19 if err != nil {
20 return nil, err
21 }
22
23 request, err := http.NewRequest("POST", url, bytes.NewReader(body))
24 if err != nil {
25 return nil, err
26 }
27
28 request.Header.Set("Content-Type", "text/xml")
29 request.Header.Set("Content-Length", fmt.Sprintf("%d", len(body)))
30
31 return request, nil
32 }
33
34 func EncodeMethodCall(method string, args ...interface{}) ([]byte, error) {
35 var b bytes.Buffer
36 b.WriteString(`<?xml version="1.0" encoding="UTF-8"?>`)
37 b.WriteString(fmt.Sprintf("<methodCall><methodName>%s</methodName>", method))
38
39 if args != nil {
40 b.WriteString("<params>")
41
42 for _, arg := range args {
43 p, err := marshal(arg)
44 if err != nil {
45 return nil, err
46 }
47
48 b.WriteString(fmt.Sprintf("<param>%s</param>", string(p)))
49 }
50
51 b.WriteString("</params>")
52 }
53
54 b.WriteString("</methodCall>")
55
56 return b.Bytes(), nil
57 }
58