rangehttpserver-1.2.0/0000775000175000017500000000000012761111700015151 5ustar dariodario00000000000000rangehttpserver-1.2.0/RangeHTTPServer/0000775000175000017500000000000012761111700020074 5ustar dariodario00000000000000rangehttpserver-1.2.0/RangeHTTPServer/__init__.py0000775000175000017500000000711712761111050022214 0ustar dariodario00000000000000#!/usr/bin/python ''' Use this in the same way as Python's SimpleHTTPServer: python -m RangeHTTPServer [port] The only difference from SimpleHTTPServer is that RangeHTTPServer supports 'Range:' headers to load portions of files. This is helpful for doing local web development with genomic data files, which tend to be to large to load into the browser all at once. ''' import os import re try: # Python3 from http.server import SimpleHTTPRequestHandler except ImportError: # Python 2 from SimpleHTTPServer import SimpleHTTPRequestHandler def copy_byte_range(infile, outfile, start=None, stop=None, bufsize=16*1024): '''Like shutil.copyfileobj, but only copy a range of the streams. Both start and stop are inclusive. ''' if start is not None: infile.seek(start) while 1: to_read = min(bufsize, stop + 1 - infile.tell() if stop else bufsize) buf = infile.read(to_read) if not buf: break outfile.write(buf) BYTE_RANGE_RE = re.compile(r'bytes=(\d+)-(\d+)?$') def parse_byte_range(byte_range): '''Returns the two numbers in 'bytes=123-456' or throws ValueError. The last number or both numbers may be None. ''' if byte_range.strip() == '': return None, None m = BYTE_RANGE_RE.match(byte_range) if not m: raise ValueError('Invalid byte range %s' % byte_range) first, last = [x and int(x) for x in m.groups()] if last and last < first: raise ValueError('Invalid byte range %s' % byte_range) return first, last class RangeRequestHandler(SimpleHTTPRequestHandler): """Adds support for HTTP 'Range' requests to SimpleHTTPRequestHandler The approach is to: - Override send_head to look for 'Range' and respond appropriately. - Override copyfile to only transmit a range when requested. """ def send_head(self): if 'Range' not in self.headers: self.range = None return SimpleHTTPRequestHandler.send_head(self) try: self.range = parse_byte_range(self.headers['Range']) except ValueError as e: self.send_error(400, 'Invalid byte range') return None first, last = self.range # Mirroring SimpleHTTPServer.py here path = self.translate_path(self.path) f = None ctype = self.guess_type(path) try: f = open(path, 'rb') except IOError: self.send_error(404, 'File not found') return None fs = os.fstat(f.fileno()) file_len = fs[6] if first >= file_len: self.send_error(416, 'Requested Range Not Satisfiable') return None self.send_response(206) self.send_header('Content-type', ctype) self.send_header('Accept-Ranges', 'bytes') if last is None or last >= file_len: last = file_len - 1 response_length = last - first + 1 self.send_header('Content-Range', 'bytes %s-%s/%s' % (first, last, file_len)) self.send_header('Content-Length', str(response_length)) self.send_header('Last-Modified', self.date_time_string(fs.st_mtime)) self.end_headers() return f def copyfile(self, source, outputfile): if not self.range: return SimpleHTTPRequestHandler.copyfile(self, source, outputfile) # SimpleHTTPRequestHandler uses shutil.copyfileobj, which doesn't let # you stop the copying before the end of the file. start, stop = self.range # set in send_head() copy_byte_range(source, outputfile, start, stop) rangehttpserver-1.2.0/RangeHTTPServer/__main__.py0000775000175000017500000000112212761111050022163 0ustar dariodario00000000000000#!/usr/bin/python ''' Use this in the same way as Python's SimpleHTTPServer: python -m RangeHTTPServer [port] The only difference from SimpleHTTPServer is that RangeHTTPServer supports 'Range:' headers to load portions of files. This is helpful for doing local web development with genomic data files, which tend to be to large to load into the browser all at once. ''' try: # Python3 import http.server as SimpleHTTPServer except ImportError: # Python 2 import SimpleHTTPServer from . import RangeRequestHandler SimpleHTTPServer.test(HandlerClass=RangeRequestHandler) rangehttpserver-1.2.0/rangehttpserver.egg-info/0000775000175000017500000000000012761111700022066 5ustar dariodario00000000000000rangehttpserver-1.2.0/rangehttpserver.egg-info/PKG-INFO0000664000175000017500000000077312761111700023172 0ustar dariodario00000000000000Metadata-Version: 1.1 Name: rangehttpserver Version: 1.2.0 Summary: SimpleHTTPServer with support for Range requests Home-page: https://github.com/danvk/RangeHTTPServer/ Author: Dan Vanderkam Author-email: danvdk@gmail.com License: UNKNOWN Description: UNKNOWN Platform: UNKNOWN Classifier: Environment :: Console Classifier: Environment :: Web Environment Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Apache Software License rangehttpserver-1.2.0/rangehttpserver.egg-info/SOURCES.txt0000664000175000017500000000035512761111700023755 0ustar dariodario00000000000000README setup.cfg setup.py RangeHTTPServer/__init__.py RangeHTTPServer/__main__.py rangehttpserver.egg-info/PKG-INFO rangehttpserver.egg-info/SOURCES.txt rangehttpserver.egg-info/dependency_links.txt rangehttpserver.egg-info/top_level.txtrangehttpserver-1.2.0/rangehttpserver.egg-info/dependency_links.txt0000664000175000017500000000000112761111700026134 0ustar dariodario00000000000000 rangehttpserver-1.2.0/rangehttpserver.egg-info/top_level.txt0000664000175000017500000000002012761111700024610 0ustar dariodario00000000000000RangeHTTPServer rangehttpserver-1.2.0/README0000664000175000017500000000036312577252154016051 0ustar dariodario00000000000000SimpleHTTPServer with support for Range requests Quickstart: $ pip install rangehttpserver $ python -m RangeHTTPServer Serving HTTP on 0.0.0.0 port 8000 ... See the GitHub repo for more information: https://github.com/danvk/RangeHTTPServer rangehttpserver-1.2.0/setup.py0000664000175000017500000000113212761111173016664 0ustar dariodario00000000000000from setuptools import setup setup(name='rangehttpserver', version='1.2.0', description='SimpleHTTPServer with support for Range requests', author='Dan Vanderkam', author_email='danvdk@gmail.com', url='https://github.com/danvk/RangeHTTPServer/', packages=['RangeHTTPServer'], install_requires=[], classifiers=[ 'Environment :: Console', 'Environment :: Web Environment', 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License' ] ) rangehttpserver-1.2.0/PKG-INFO0000664000175000017500000000077312761111700016255 0ustar dariodario00000000000000Metadata-Version: 1.1 Name: rangehttpserver Version: 1.2.0 Summary: SimpleHTTPServer with support for Range requests Home-page: https://github.com/danvk/RangeHTTPServer/ Author: Dan Vanderkam Author-email: danvdk@gmail.com License: UNKNOWN Description: UNKNOWN Platform: UNKNOWN Classifier: Environment :: Console Classifier: Environment :: Web Environment Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Apache Software License rangehttpserver-1.2.0/setup.cfg0000664000175000017500000000013012761111700016764 0ustar dariodario00000000000000[bdist_wheel] universal = 1 [egg_info] tag_build = tag_svn_revision = 0 tag_date = 0