From 9fc62ec0187e65f105963f266b0c547894e31a40 Mon Sep 17 00:00:00 2001 From: Ryan Abernathey Date: Fri, 28 Dec 2018 16:24:19 +0100 Subject: [PATCH] basic HTTPStore class --- zarr/storage.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/zarr/storage.py b/zarr/storage.py index e7d70ea7bc..4e80a02fa5 100644 --- a/zarr/storage.py +++ b/zarr/storage.py @@ -62,6 +62,11 @@ # POSIX rename() is always atomic from os import rename as replace +# Import the proper urljoin function +if sys.version_info.major == 3: + from urllib.parse import urljoin +else: + from urlparse import urljoin def _path_to_prefix(path): # assume path already normalized @@ -1954,3 +1959,37 @@ def getsize(self, path): def listdir(self, path): return listdir(self.meta_store, path) + + +class HTTPStore(MutableMapping): + + def __init__(self, url_base): + import requests + self.url_base = url_base + self.session = requests.Session() + + def __getitem__(self, key): + r = self.session.get(urljoin(self.url_base, key)) + r.raise_for_status() + # is it correct to always return bytes? + return r.content + + def __contains__(self, key): + h = self.session.head(urljoin(self.url_base, key)) + return h.status_code == 200 + + def _not_implemented_error(self): + raise NotImplementedError('HTTPStore is designed to be used only with ' + 'consolidated metadata') + + def __setitem__(self, key, value): + self._not_implemented_error() + + def __delitem__(self, key): + self._not_implemented_error() + + def __iter__(self): + self._not_implemented_error() + + def __len__(self): + self._not_implemented_error()