diff --git a/lib/galaxy/datatypes/data.py b/lib/galaxy/datatypes/data.py index 308e691a02cc..05f5adbad6bf 100644 --- a/lib/galaxy/datatypes/data.py +++ b/lib/galaxy/datatypes/data.py @@ -484,16 +484,17 @@ def _serve_file_download(self, headers, data, trans, to_ext, file_size, **kwd): def _serve_binary_file_contents_as_text(self, trans, data, headers, file_size, max_peek_size): headers["content-type"] = "text/html" - return ( - trans.fill_template_mako( - "/dataset/binary_file.mako", - data=data, - file_contents=open(data.get_file_name(), "rb").read(max_peek_size), - file_size=util.nice_size(file_size), - truncated=file_size > max_peek_size, - ), - headers, - ) + with open(data.get_file_name(), "rb") as fh: + return ( + trans.fill_template_mako( + "/dataset/binary_file.mako", + data=data, + file_contents=fh.read(max_peek_size), + file_size=util.nice_size(file_size), + truncated=file_size > max_peek_size, + ), + headers, + ) def _serve_file_contents(self, trans, data, headers, preview, file_size, max_peek_size): from galaxy.datatypes import images @@ -502,16 +503,17 @@ def _serve_file_contents(self, trans, data, headers, preview, file_size, max_pee if not preview or isinstance(data.datatype, images.Image) or file_size < max_peek_size: return self._yield_user_file_content(trans, data, data.get_file_name(), headers), headers - # preview large text file - headers["content-type"] = "text/html" - return ( - trans.fill_template_mako( - "/dataset/large_file.mako", - truncated_data=open(data.get_file_name(), "rb").read(max_peek_size), - data=data, - ), - headers, - ) + with compression_utils.get_fileobj(data.get_file_name(), "rb") as fh: + # preview large text file + headers["content-type"] = "text/html" + return ( + trans.fill_template_mako( + "/dataset/large_file.mako", + truncated_data=fh.read(max_peek_size), + data=data, + ), + headers, + ) def display_data( self, diff --git a/lib/galaxy/datatypes/tabular.py b/lib/galaxy/datatypes/tabular.py index 5b4e1d523e12..8bfde1202c31 100644 --- a/lib/galaxy/datatypes/tabular.py +++ b/lib/galaxy/datatypes/tabular.py @@ -193,14 +193,15 @@ def display_data( return open(dataset.get_file_name(), mode="rb"), headers else: headers["content-type"] = "text/html" - return ( - trans.fill_template_mako( - "/dataset/large_file.mako", - truncated_data=open(dataset.get_file_name()).read(max_peek_size), - data=dataset, - ), - headers, - ) + with compression_utils.get_fileobj(dataset.get_file_name(), "rb") as fh: + return ( + trans.fill_template_mako( + "/dataset/large_file.mako", + truncated_data=fh.read(max_peek_size), + data=dataset, + ), + headers, + ) else: column_names = "null" if dataset.metadata.column_names: diff --git a/lib/galaxy/managers/hdas.py b/lib/galaxy/managers/hdas.py index 8eefb8434753..f69a20c6cc4c 100644 --- a/lib/galaxy/managers/hdas.py +++ b/lib/galaxy/managers/hdas.py @@ -311,7 +311,10 @@ def text_data(self, hda, preview=True): truncated = preview and os.stat(file_path).st_size > MAX_PEEK_SIZE with get_fileobj(file_path) as fh: - hda_data = fh.read(MAX_PEEK_SIZE) + try: + hda_data = fh.read(MAX_PEEK_SIZE) + except UnicodeDecodeError: + raise exceptions.RequestParameterInvalidException("Cannot generate text preview for dataset.") return truncated, hda_data # .... annotatable diff --git a/lib/galaxy/tools/parameters/basic.py b/lib/galaxy/tools/parameters/basic.py index ebdad3e37aed..8d243cb88014 100644 --- a/lib/galaxy/tools/parameters/basic.py +++ b/lib/galaxy/tools/parameters/basic.py @@ -2053,7 +2053,8 @@ def src_id_to_item( item = sa_session.get(src_to_class[value["src"]], decoded_id) except KeyError: raise ValueError(f"Unknown input source {value['src']} passed to job submission API.") - assert item + if not item: + raise ValueError("Invalid input id passed to job submission API.") item.extra_params = {k: v for k, v in value.items() if k not in ("src", "id")} return item diff --git a/lib/galaxy/web/framework/middleware/statsd.py b/lib/galaxy/web/framework/middleware/statsd.py index 1b017f715651..d817569f3d8e 100644 --- a/lib/galaxy/web/framework/middleware/statsd.py +++ b/lib/galaxy/web/framework/middleware/statsd.py @@ -28,8 +28,13 @@ def __call__(self, environ, start_response): start_time = time.time() req = self.application(environ, start_response) dt = int((time.time() - start_time) * 1000) - page = environ.get("controller_action_key", None) or environ.get("PATH_INFO", "NOPATH").strip("/").replace( - "/", "." + page = ( + environ.get("controller_action_key", None) + or environ.get("PATH_INFO", "NOPATH") + .strip("/") + .replace("/", ".") + .encode("ascii", errors="replace") + .decode() ) self.galaxy_stasd_client.timing(page, dt) try: diff --git a/lib/galaxy/workflow/modules.py b/lib/galaxy/workflow/modules.py index 0ad9f46d5c16..d0eb5025d5c4 100644 --- a/lib/galaxy/workflow/modules.py +++ b/lib/galaxy/workflow/modules.py @@ -746,7 +746,8 @@ def get_all_outputs(self, data_only=False): # This can happen when importing workflows with missing tools. # We can't raise an exception here, as that would prevent loading # the workflow. - log.error( + # This is also listed when opening such a workflow in the workflow editor. + log.warning( f"Workflow output '{workflow_output['output_name']}' defined, but not listed among data outputs" ) continue