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