diff --git a/go.mod b/go.mod index 7664f0e10..048ee6931 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/google/uuid v1.1.1 github.com/gophercloud/gophercloud v0.11.0 github.com/julienschmidt/httprouter v1.2.0 - github.com/kolo/xmlrpc v0.0.0-20190909154602-56d5ec7c422e + github.com/kolo/xmlrpc v0.0.0-20190417161013-de6d879202d7 github.com/labstack/echo/v4 v4.1.11 github.com/pkg/errors v0.9.1 // indirect github.com/stretchr/testify v1.5.1 diff --git a/go.sum b/go.sum index 5a1d4ef85..b85d434ac 100644 --- a/go.sum +++ b/go.sum @@ -75,8 +75,8 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5i github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kolo/xmlrpc v0.0.0-20190909154602-56d5ec7c422e h1:JZPIpxHmcXiQn101f6P9wkfRZs2A9268tHHnanj+esA= -github.com/kolo/xmlrpc v0.0.0-20190909154602-56d5ec7c422e/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= +github.com/kolo/xmlrpc v0.0.0-20190417161013-de6d879202d7 h1:kL2yi3DjwkRWFgKwD5COyl4XMLKhfOvqck4xyis7EIw= +github.com/kolo/xmlrpc v0.0.0-20190417161013-de6d879202d7/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= diff --git a/internal/upload/koji/koji.go b/internal/upload/koji/koji.go index 9b83113f0..8dfc07a2a 100644 --- a/internal/upload/koji/koji.go +++ b/internal/upload/koji/koji.go @@ -305,20 +305,20 @@ func (k *Koji) uploadChunk(chunk []byte, filepath, filename string, offset uint6 u.RawQuery = q.Encode() client := http.Client{Transport: k.transport} - resp, err := client.Post(u.String(), "application/octet-stream", bytes.NewBuffer(chunk)) + respData, err := client.Post(u.String(), "application/octet-stream", bytes.NewBuffer(chunk)) if err != nil { return err } - defer resp.Body.Close() + defer respData.Body.Close() - body, err := ioutil.ReadAll(resp.Body) + body, err := ioutil.ReadAll(respData.Body) if err != nil { return err } - err = xmlrpc.Response.Err(body) - if err != nil { - return err + resp := xmlrpc.NewResponse(body) + if resp.Failed() { + return resp.Err() } var reply struct { @@ -326,7 +326,7 @@ func (k *Koji) uploadChunk(chunk []byte, filepath, filename string, offset uint6 HexDigest string `xmlrpc:"hexdigest"` } - err = xmlrpc.Response.Unmarshal(body, &reply) + err = resp.Unmarshal(&reply) if err != nil { return fmt.Errorf("cannot unmarshal the xmlrpc response: %v", err) } diff --git a/vendor/github.com/kolo/xmlrpc/client.go b/vendor/github.com/kolo/xmlrpc/client.go index 643dc1c10..3aa86ce2c 100644 --- a/vendor/github.com/kolo/xmlrpc/client.go +++ b/vendor/github.com/kolo/xmlrpc/client.go @@ -31,7 +31,7 @@ type clientCodec struct { responses map[uint64]*http.Response mutex sync.Mutex - response Response + response *Response // ready presents channel, that is used to link request and it`s response. ready chan uint64 @@ -43,16 +43,16 @@ type clientCodec struct { func (codec *clientCodec) WriteRequest(request *rpc.Request, args interface{}) (err error) { httpRequest, err := NewRequest(codec.url.String(), request.ServiceMethod, args) - if err != nil { - return err - } - if codec.cookies != nil { for _, cookie := range codec.cookies.Cookies(codec.url) { httpRequest.AddCookie(cookie) } } + if err != nil { + return err + } + var httpResponse *http.Response httpResponse, err = codec.httpClient.Do(httpRequest) @@ -75,39 +75,43 @@ func (codec *clientCodec) WriteRequest(request *rpc.Request, args interface{}) ( func (codec *clientCodec) ReadResponseHeader(response *rpc.Response) (err error) { var seq uint64 + select { case seq = <-codec.ready: case <-codec.close: return errors.New("codec is closed") } - response.Seq = seq codec.mutex.Lock() httpResponse := codec.responses[seq] - delete(codec.responses, seq) codec.mutex.Unlock() - defer httpResponse.Body.Close() - if httpResponse.StatusCode < 200 || httpResponse.StatusCode >= 300 { - response.Error = fmt.Sprintf("request error: bad status code - %d", httpResponse.StatusCode) - return nil + return fmt.Errorf("request error: bad status code - %d", httpResponse.StatusCode) } - body, err := ioutil.ReadAll(httpResponse.Body) + respData, err := ioutil.ReadAll(httpResponse.Body) + if err != nil { - response.Error = err.Error() - return nil + return err } - resp := Response(body) - if err := resp.Err(); err != nil { - response.Error = err.Error() - return nil + httpResponse.Body.Close() + + resp := NewResponse(respData) + + if resp.Failed() { + response.Error = fmt.Sprintf("%v", resp.Err()) } codec.response = resp + response.Seq = seq + + codec.mutex.Lock() + delete(codec.responses, seq) + codec.mutex.Unlock() + return nil } @@ -115,7 +119,12 @@ func (codec *clientCodec) ReadResponseBody(v interface{}) (err error) { if v == nil { return nil } - return codec.response.Unmarshal(v) + + if err = codec.response.Unmarshal(v); err != nil { + return err + } + + return nil } func (codec *clientCodec) Close() error { diff --git a/vendor/github.com/kolo/xmlrpc/decoder.go b/vendor/github.com/kolo/xmlrpc/decoder.go index d4dcb19ad..61712d8aa 100644 --- a/vendor/github.com/kolo/xmlrpc/decoder.go +++ b/vendor/github.com/kolo/xmlrpc/decoder.go @@ -130,9 +130,8 @@ func (dec *decoder) decodeValue(val reflect.Value) error { ismap = true } else if checkType(val, reflect.Interface) == nil && val.IsNil() { var dummy map[string]interface{} - valType = reflect.TypeOf(dummy) - pmap = reflect.New(valType).Elem() - val.Set(pmap) + pmap = reflect.New(reflect.TypeOf(dummy)).Elem() + valType = pmap.Type() ismap = true } else { return err diff --git a/vendor/github.com/kolo/xmlrpc/encoder.go b/vendor/github.com/kolo/xmlrpc/encoder.go index 22b9683fb..d585a7d3f 100644 --- a/vendor/github.com/kolo/xmlrpc/encoder.go +++ b/vendor/github.com/kolo/xmlrpc/encoder.go @@ -10,9 +10,6 @@ import ( "time" ) -// Base64 represents value in base64 encoding -type Base64 string - type encodeFunc func(reflect.Value) ([]byte, error) func marshal(v interface{}) ([]byte, error) { diff --git a/vendor/github.com/kolo/xmlrpc/response.go b/vendor/github.com/kolo/xmlrpc/response.go index 18e6d366c..6742a1c74 100644 --- a/vendor/github.com/kolo/xmlrpc/response.go +++ b/vendor/github.com/kolo/xmlrpc/response.go @@ -1,7 +1,6 @@ package xmlrpc import ( - "fmt" "regexp" ) @@ -9,32 +8,43 @@ var ( faultRx = regexp.MustCompile(`(\s|\S)+`) ) -// FaultError is returned from the server when an invalid call is made -type FaultError struct { - Code int `xmlrpc:"faultCode"` - String string `xmlrpc:"faultString"` +type failedResponse struct { + Code int `xmlrpc:"faultCode"` + Error string `xmlrpc:"faultString"` } -// Error implements the error interface -func (e FaultError) Error() string { - return fmt.Sprintf("Fault(%d): %s", e.Code, e.String) -} - -type Response []byte - -func (r Response) Err() error { - if !faultRx.Match(r) { - return nil +func (r *failedResponse) err() error { + return &xmlrpcError{ + code: r.Code, + err: r.Error, } - var fault FaultError - if err := unmarshal(r, &fault); err != nil { +} + +type Response struct { + data []byte +} + +func NewResponse(data []byte) *Response { + return &Response{ + data: data, + } +} + +func (r *Response) Failed() bool { + return faultRx.Match(r.data) +} + +func (r *Response) Err() error { + failedResp := new(failedResponse) + if err := unmarshal(r.data, failedResp); err != nil { return err } - return fault + + return failedResp.err() } -func (r Response) Unmarshal(v interface{}) error { - if err := unmarshal(r, v); err != nil { +func (r *Response) Unmarshal(v interface{}) error { + if err := unmarshal(r.data, v); err != nil { return err } diff --git a/vendor/github.com/kolo/xmlrpc/test_server.rb b/vendor/github.com/kolo/xmlrpc/test_server.rb index 1ccfc9ac4..1b1ff8760 100644 --- a/vendor/github.com/kolo/xmlrpc/test_server.rb +++ b/vendor/github.com/kolo/xmlrpc/test_server.rb @@ -15,9 +15,9 @@ class Service x + y end - def error - raise XMLRPC::FaultException.new(500, "Server error") - end + def error + raise XMLRPC::FaultException.new(500, "Server error") + end end server = XMLRPC::Server.new 5001, 'localhost' diff --git a/vendor/github.com/kolo/xmlrpc/xmlrpc.go b/vendor/github.com/kolo/xmlrpc/xmlrpc.go new file mode 100644 index 000000000..8766403af --- /dev/null +++ b/vendor/github.com/kolo/xmlrpc/xmlrpc.go @@ -0,0 +1,19 @@ +package xmlrpc + +import ( + "fmt" +) + +// xmlrpcError represents errors returned on xmlrpc request. +type xmlrpcError struct { + code int + err string +} + +// Error() method implements Error interface +func (e *xmlrpcError) Error() string { + return fmt.Sprintf("error: \"%s\" code: %d", e.err, e.code) +} + +// Base64 represents value in base64 encoding +type Base64 string diff --git a/vendor/modules.txt b/vendor/modules.txt index d165dca3b..1be02fce6 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -119,7 +119,7 @@ github.com/gophercloud/gophercloud/pagination github.com/jmespath/go-jmespath # github.com/julienschmidt/httprouter v1.2.0 github.com/julienschmidt/httprouter -# github.com/kolo/xmlrpc v0.0.0-20190909154602-56d5ec7c422e +# github.com/kolo/xmlrpc v0.0.0-20190417161013-de6d879202d7 github.com/kolo/xmlrpc # github.com/kr/pretty v0.1.0 github.com/kr/pretty