From d32345104cab1f91681c4e5a97e980d0ee57f336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Budai?= Date: Fri, 2 Oct 2020 11:28:43 +0200 Subject: [PATCH] upload/koji: extract processXMLRPCResponse method Fedora 33 ships kolo/xmlrpc with a different API. This commit extracts the affected code so we can use build flags in the future allowing us to use both API versions. --- internal/upload/koji/koji.go | 9 ++---- .../upload/koji/xmlrpc-response-oldapi.go | 31 +++++++++++++++++++ internal/upload/koji/xmlrpc-response.go | 0 3 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 internal/upload/koji/xmlrpc-response-oldapi.go create mode 100644 internal/upload/koji/xmlrpc-response.go diff --git a/internal/upload/koji/koji.go b/internal/upload/koji/koji.go index b114695d4..fb207d816 100644 --- a/internal/upload/koji/koji.go +++ b/internal/upload/koji/koji.go @@ -315,19 +315,14 @@ func (k *Koji) uploadChunk(chunk []byte, filepath, filename string, offset uint6 return err } - resp := xmlrpc.NewResponse(body) - if resp.Failed() { - return resp.Err() - } - var reply struct { Size int `xmlrpc:"size"` HexDigest string `xmlrpc:"hexdigest"` } - err = resp.Unmarshal(&reply) + err = processXMLRPCResponse(body, &reply) if err != nil { - return fmt.Errorf("cannot unmarshal the xmlrpc response: %v", err) + return err } if reply.Size != len(chunk) { diff --git a/internal/upload/koji/xmlrpc-response-oldapi.go b/internal/upload/koji/xmlrpc-response-oldapi.go new file mode 100644 index 000000000..24b4bc732 --- /dev/null +++ b/internal/upload/koji/xmlrpc-response-oldapi.go @@ -0,0 +1,31 @@ +// This files provides a wrapper around kolo/xmlrpc response handling. +// +// Commit e3ad6d89 of the xmlrpc library changed the API of response handling. +// This means that different APIs are available in Fedora 32 and 33 (it does +// not matter for RHEL as uses vendored libraries). +// This wrapper allows us to use both xmlrpc's APIs using buildflags. +// +// This file is a wrapper for xmlrpc older than e3ad6d89. + +package koji + +import ( + "fmt" + + "github.com/kolo/xmlrpc" +) + +// processXMLRPCResponse is a wrapper around kolo/xmlrpc +func processXMLRPCResponse(body []byte, reply interface{}) error { + resp := xmlrpc.NewResponse(body) + if resp.Failed() { + return fmt.Errorf("xmlrpc server returned an error: %v", resp.Err()) + } + + err := resp.Unmarshal(reply) + if err != nil { + return fmt.Errorf("cannot unmarshal the xmlrpc response: %v", err) + } + + return nil +} diff --git a/internal/upload/koji/xmlrpc-response.go b/internal/upload/koji/xmlrpc-response.go new file mode 100644 index 000000000..e69de29bb