Source code for neuroglancer_scripts.http_accessor

# Copyright (c) 2018 Forschungszentrum Juelich GmbH
# Author: Yann Leprince <y.leprince@fz-juelich.de>
#
# This software is made available under the MIT licence, see LICENCE.txt.

"""Access to a Neuroglancer pre-computed dataset over HTTP.

See the :mod:`~neuroglancer_scripts.accessor` module for a description of the
API.
"""

import urllib.parse

import requests

import neuroglancer_scripts.accessor
from neuroglancer_scripts.accessor import _CHUNK_PATTERN_FLAT, DataAccessError

__all__ = [
    "HttpAccessor",
]


[docs] class HttpAccessor(neuroglancer_scripts.accessor.Accessor): """Access a Neuroglancer pre-computed pyramid with HTTP. .. note:: This is a read-only accessor. :param str base_url: the URL containing the pyramid """ can_read = True can_write = False def __init__(self, base_url): self._session = requests.Session() # Fix the base URL to end with a slash, discard query and fragment r = urllib.parse.urlsplit(base_url) self.base_url = urllib.parse.urlunsplit(( r.scheme, r.netloc, r.path if r.path[-1] == "/" else r.path + "/", "", ""))
[docs] def chunk_relative_url(self, key, chunk_coords): xmin, xmax, ymin, ymax, zmin, zmax = chunk_coords url_suffix = _CHUNK_PATTERN_FLAT.format( xmin, xmax, ymin, ymax, zmin, zmax, key=key) return url_suffix
[docs] def fetch_chunk(self, key, chunk_coords): chunk_url = self.chunk_relative_url(key, chunk_coords) return self.fetch_file(chunk_url)
[docs] def file_exists(self, relative_path): file_url = self.base_url + relative_path try: r = self._session.head(file_url) if r.status_code == requests.codes.not_found: return False r.raise_for_status() except requests.exceptions.RequestException as exc: raise DataAccessError("Error probing the existence of " f"{file_url}: {exc}") from exc return True
[docs] def fetch_file(self, relative_path): file_url = self.base_url + relative_path try: r = self._session.get(file_url) r.raise_for_status() except requests.exceptions.RequestException as exc: raise DataAccessError(f"Error reading {file_url}: {exc}") from exc return r.content