Source code for pysparkling.fileio.fs.http

from __future__ import absolute_import

import logging
from io import BytesIO, StringIO

from .file_system import FileSystem
from ...exceptions import ConnectionException, FileSystemNotSupported

log = logging.getLogger(__name__)

try:
    import requests
except ImportError:
    requests = None


[docs]class Http(FileSystem): """:class:`.FileSystem` implementation for HTTP.""" def __init__(self, file_name): if requests is None: raise FileSystemNotSupported( 'http not supported. Install "requests".' ) super(Http, self).__init__(file_name) self.headers = None @staticmethod def resolve_filenames(expr): if Http(expr).exists(): return [expr] return [] def exists(self): r = requests.head(self.file_name, allow_redirects=True) return r.status_code == 200 def load(self): log.debug('Http GET request for {0}.'.format(self.file_name)) r = requests.get(self.file_name, headers=self.headers) if r.status_code != 200: raise ConnectionException() return BytesIO(r.content) def load_text(self, encoding='utf8', encoding_errors='ignore'): # warning: encoding and encoding_errors are ignored log.debug('Http GET request for {0}.'.format(self.file_name)) r = requests.get(self.file_name, headers=self.headers) if r.status_code != 200: raise ConnectionException() return StringIO(r.text) def dump(self, stream): log.debug('Dump to {0} with http PUT.'.format(self.file_name)) requests.put(self.file_name, data=b''.join(stream)) return self