upload/koji/uploadChunk: fix compilation errors

The API of kolo/xmlrpc changed after the commit that is shipped in
Fedora. Pin the vendored version to that and adjust the API usage.

This should make the RPM compile in both RHEL and Fedora.

Signed-off-by: Tom Gundersen <teg@jklm.no>
This commit is contained in:
Tom Gundersen 2020-09-07 17:45:52 +01:00
parent 3457038688
commit b6f06da1a7
10 changed files with 93 additions and 59 deletions

2
go.mod
View file

@ -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

4
go.sum
View file

@ -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=

View file

@ -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)
}

View file

@ -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 {

View file

@ -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

View file

@ -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) {

View file

@ -1,7 +1,6 @@
package xmlrpc
import (
"fmt"
"regexp"
)
@ -9,32 +8,43 @@ var (
faultRx = regexp.MustCompile(`<fault>(\s|\S)+</fault>`)
)
// 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
}

View file

@ -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'

19
vendor/github.com/kolo/xmlrpc/xmlrpc.go generated vendored Normal file
View file

@ -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

2
vendor/modules.txt vendored
View file

@ -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