From 7b62d693c7308d024523f14c1ea82e890f7966c4 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Thu, 27 Jul 2023 10:02:00 -0400 Subject: [PATCH] Handle unseekable data We may be given a file-like that cannot seek. For example, older 'ZipFileExt' did not have tell/seek. For such cases, fallback to memory hungary behavior of using a BytesIO to provide a trackable upload. Change-Id: I401e2fcc7369f31d0d413909854c8d9224b02023 --- pyghmi/util/webclient.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/pyghmi/util/webclient.py b/pyghmi/util/webclient.py index ee27f428..e6a3bb7d 100644 --- a/pyghmi/util/webclient.py +++ b/pyghmi/util/webclient.py @@ -317,11 +317,19 @@ class SecureHTTPConnection(httplib.HTTPConnection, object): ulhdrs['Content-Length'] = len(uploadforms[filename]) self.ulsize = len(uploadforms[filename]) else: - curroff = data.tell() - data.seek(0, 2) - self.ulsize = data.tell() - data.seek(curroff, 0) - self._upbuffer = data + canseek = True + try: + curroff = data.tell() + except io.UnsupportedOperation: + canseek = False + databytes = data.read() + self.ulsize = len(databytes) + self._upbuffer = io.BytesIO(databytes) + if canseek: + data.seek(0, 2) + self.ulsize = data.tell() + data.seek(curroff, 0) + self._upbuffer = data ulhdrs['Content-Type'] = b'application/octet-stream' ulhdrs['Content-Length'] = self.ulsize webclient = self.dupe()