From 9c379b7ea0c989c10a17868b34153d7f15b31746 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Tue, 30 Jan 2024 16:36:21 +0100 Subject: [PATCH] Adapt to upstream FileResponse logic The ``send_header_only`` attribute has been removed in starlette (https://github.com/encode/starlette/pull/2366), and replaced with `scope["method"].upper() == "HEAD"` --- lib/galaxy/webapps/base/api.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/galaxy/webapps/base/api.py b/lib/galaxy/webapps/base/api.py index c41637f48b8f..61669defb88d 100644 --- a/lib/galaxy/webapps/base/api.py +++ b/lib/galaxy/webapps/base/api.py @@ -77,15 +77,11 @@ def __init__( path, status_code, headers, media_type, background, filename, stat_result, method, content_disposition_type ) self.headers["accept-ranges"] = "bytes" - send_header_only = self.nginx_x_accel_redirect_base or self.apache_xsendfile + self.send_header_only = self.nginx_x_accel_redirect_base or self.apache_xsendfile if self.nginx_x_accel_redirect_base: self.headers["x-accel-redirect"] = self.nginx_x_accel_redirect_base + os.path.abspath(path) elif self.apache_xsendfile: self.headers["x-sendfile"] = os.path.abspath(path) - if not self.send_header_only and send_header_only: - # Not a head request, but nginx_x_accel_redirect_base / send_header_only, we don't send a body - self.send_header_only = True - self.headers["content-length"] = "0" async def __call__(self, scope: "Scope", receive: "Receive", send: "Send") -> None: if self.stat_result is None: @@ -100,9 +96,14 @@ async def __call__(self, scope: "Scope", receive: "Receive", send: "Send") -> No raise RuntimeError(f"File at path {self.path} is not a file.") # This is where we diverge from the superclass, this adds support for byte range requests + if not scope["method"].upper() == "HEAD" and self.send_header_only: + # Not a head request, but nginx_x_accel_redirect_base / send_header_only, we don't send a body + self.send_header_only = True + self.headers["content-length"] = "0" + start = 0 end = stat_result.st_size - 1 - if not self.send_header_only: + if not scope["method"].upper() == "HEAD": http_range = "" for key, value in scope["headers"]: if key == b"range":