Unverified Commit 56d22baa authored by mvdbeek's avatar mvdbeek
Browse files

Use get_file_obj to render compressed data in mako

We were mostly doing this already. Also raises an exception in
`text_data` if content is not decodable.

Fixes
https://sentry.galaxyproject.org/share/issue/b826c0be95a4424e8b1d63983255f23d/:
```
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
  File "galaxy/web/framework/middleware/error.py", line 167, in __call__
    app_iter = self.application(environ, sr_checker)
  File "galaxy/web/framework/middleware/statsd.py", line 29, in __call__
    req = self.application(environ, start_response)
  File "/cvmfs/main.galaxyproject.org/venv/lib/python3.11/site-packages/paste/httpexceptions.py", line 635, in __call__
    return self.application(environ, start_response)
  File "galaxy/web/framework/base.py", line 174, in __call__
    return self.handle_request(request_id, path_info, environ, start_response)
  File "galaxy/web/framework/base.py", line 263, in handle_request
    body = method(trans, **kwargs)
  File "galaxy/webapps/galaxy/controllers/dataset.py", line 152, in display
    display_data, headers = data.datatype.display_data(
  File "galaxy/datatypes/tabular.py", line 199, in display_data
    truncated_data=open(dataset.get_file_name()).read(max_peek_size),
  File "<frozen codecs>", line 322, in decode
```
parent 18157159
Loading
Loading
Loading
Loading
+22 −20
Original line number Diff line number Diff line
@@ -484,11 +484,12 @@ class Data(metaclass=DataMeta):

    def _serve_binary_file_contents_as_text(self, trans, data, headers, file_size, max_peek_size):
        headers["content-type"] = "text/html"
        with open(data.get_file_name(), "rb") as fh:
            return (
                trans.fill_template_mako(
                    "/dataset/binary_file.mako",
                    data=data,
                file_contents=open(data.get_file_name(), "rb").read(max_peek_size),
                    file_contents=fh.read(max_peek_size),
                    file_size=util.nice_size(file_size),
                    truncated=file_size > max_peek_size,
                ),
@@ -502,12 +503,13 @@ class Data(metaclass=DataMeta):
        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

        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=open(data.get_file_name(), "rb").read(max_peek_size),
                    truncated_data=fh.read(max_peek_size),
                    data=data,
                ),
                headers,
+9 −8
Original line number Diff line number Diff line
@@ -193,10 +193,11 @@ class TabularData(Text):
                return open(dataset.get_file_name(), mode="rb"), headers
            else:
                headers["content-type"] = "text/html"
                with compression_utils.get_fileobj(dataset.get_file_name(), "rb") as fh:
                    return (
                        trans.fill_template_mako(
                            "/dataset/large_file.mako",
                        truncated_data=open(dataset.get_file_name()).read(max_peek_size),
                            truncated_data=fh.read(max_peek_size),
                            data=dataset,
                        ),
                        headers,
+4 −1
Original line number Diff line number Diff line
@@ -311,7 +311,10 @@ class HDAManager(

        truncated = preview and os.stat(file_path).st_size > MAX_PEEK_SIZE
        with get_fileobj(file_path) as fh:
            try:
                hda_data = fh.read(MAX_PEEK_SIZE)
            except UnicodeDecodeError:
                raise exceptions.RequestParameterInvalidException("Cannot generate text preview for dataset.")
        return truncated, hda_data

    # .... annotatable