diff --git a/xml/server.go b/xml/server.go index ff25100..721ab04 100644 --- a/xml/server.go +++ b/xml/server.go @@ -94,6 +94,9 @@ func (c *CodecRequest) ReadRequest(args interface{}) error { // it gets encoded into the XML-RPC xml string func (c *CodecRequest) WriteResponse(w http.ResponseWriter, response interface{}, methodErr error) error { var xmlstr string + if c.err == nil { + c.err = methodErr + } if c.err != nil { var fault Fault switch c.err.(type) { diff --git a/xml/xml2rpc.go b/xml/xml2rpc.go index f22e90a..4a7dea4 100644 --- a/xml/xml2rpc.go +++ b/xml/xml2rpc.go @@ -63,15 +63,21 @@ func xml2RPC(xmlraw string, rpc interface{}) error { } // Structures should have equal number of fields - if reflect.TypeOf(rpc).Elem().NumField() != len(ret.Params) { - return FaultWrongArgumentsNumber - } + //if reflect.TypeOf(rpc).Elem().NumField() != len(ret.Params) { + // return FaultWrongArgumentsNumber + //} // Now, convert temporal structure into the // passed rpc variable, according to it's structure - for i, param := range ret.Params { + fieldNum := reflect.TypeOf(rpc).Elem().NumField() + //for i, param := range ret.Params { + for i:= 0; i < fieldNum; i += 1 { field := reflect.ValueOf(rpc).Elem().Field(i) - err = value2Field(param.Value, &field) + if len(ret.Params) > i { + err = value2Field(ret.Params[i].Value, &field) + } else if reflect.TypeOf( rpc ).Elem().Field(i).Tag.Get("default") != "" { + err = value2Field( createValue( reflect.TypeOf(rpc).Elem().Field(i).Type.Kind(), reflect.TypeOf( rpc ).Elem().Field(i).Tag.Get("default")), &field) + } if err != nil { return err } @@ -80,6 +86,16 @@ func xml2RPC(xmlraw string, rpc interface{}) error { return nil } +func createValue( kind reflect.Kind, val string ) value { + v := value{} + if kind == reflect.Bool { + v.Boolean = val + } else if kind == reflect.Int { + v.Int = val + } + return v +} + // getFaultResponse converts faultValue to Fault. func getFaultResponse(fault faultValue) Fault { var (