From f89794ce072d11f36359595ec94c74a17739813b Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Tue, 1 Mar 2022 17:57:07 -0500 Subject: [PATCH] also raise 400 errors when we can't read the client upload stream --- hub/kojihub.py | 13 ++++++++++++- hub/kojixmlrpc.py | 10 +--------- koji/server.py | 8 ++++++++ 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/hub/kojihub.py b/hub/kojihub.py index f0e5910a..6a8d6ea4 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -62,6 +62,7 @@ from koji.tasks import parse_task_params import koji.xmlrpcplus from koji.context import context from koji.daemon import SCM +from koji.server import BadRequest, RequestTimeout from koji.util import ( base64encode, decode_bytes, @@ -15361,7 +15362,17 @@ def handle_upload(environ): os.ftruncate(fd, offset) os.lseek(fd, offset, 0) while True: - chunk = inf.read(65536) + try: + chunk = inf.read(65536) + except OSError as e: + str_e = str(e) + logger.error(f"Error reading upload. Offset {offset}+{size}, path {fn}") + if 'timeout' in str_e: + logger.exception("Timed out reading input stream") + raise RequestTimeout(str_e) + else: + logger.exception("Error reading input stream") + raise BadRequest(str_e) if not chunk: break size += len(chunk) diff --git a/hub/kojixmlrpc.py b/hub/kojixmlrpc.py index 07a537a0..f7aaf3d2 100644 --- a/hub/kojixmlrpc.py +++ b/hub/kojixmlrpc.py @@ -38,18 +38,10 @@ import koji.policy import koji.util from koji.context import context # import xmlrpclib functions from koji to use tweaked Marshaller -from koji.server import ServerError +from koji.server import ServerError, BadRequest, RequestTimeout from koji.xmlrpcplus import ExtendedMarshaller, Fault, dumps, getparser -class BadRequest(ServerError): - """Used to trigger an http 400 error""" - - -class RequestTimeout(ServerError): - """Used to trigger an http 408 error""" - - class Marshaller(ExtendedMarshaller): dispatch = ExtendedMarshaller.dispatch.copy() diff --git a/koji/server.py b/koji/server.py index 06291d52..da5b2eea 100644 --- a/koji/server.py +++ b/koji/server.py @@ -26,3 +26,11 @@ class ServerError(Exception): class ServerRedirect(ServerError): """Used to handle redirects""" + + +class BadRequest(ServerError): + """Used to trigger an http 400 error""" + + +class RequestTimeout(ServerError): + """Used to trigger an http 408 error"""