From d954b1ed76f7396b575f846d7ff3e6b811aa9bd9 Mon Sep 17 00:00:00 2001 From: Brett Date: Wed, 13 Dec 2023 14:51:15 -0500 Subject: [PATCH] remove unused RangeHTTPServer --- asdf/_extern/RangeHTTPServer.py | 209 -------------------------------- asdf/_tests/conftest.py | 18 +-- asdf/_tests/httpserver.py | 8 +- 3 files changed, 2 insertions(+), 233 deletions(-) delete mode 100755 asdf/_extern/RangeHTTPServer.py diff --git a/asdf/_extern/RangeHTTPServer.py b/asdf/_extern/RangeHTTPServer.py deleted file mode 100755 index 29aaf793f..000000000 --- a/asdf/_extern/RangeHTTPServer.py +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/env python - -#Portions Copyright (C) 2009,2010 Xyne -#Portions Copyright (C) 2011 Sean Goller -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# (version 2) as published by the Free Software Foundation. -# -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -"""Range HTTP Server. - -This module builds on BaseHTTPServer by implementing the standard GET -and HEAD requests in a fairly straightforward manner, and includes support -for the Range header. - -""" - - -__version__ = "0.1" - -__all__ = ["RangeHTTPRequestHandler"] - -import os -import shutil -import posixpath -import http.server -import urllib.parse - - -class RangeHTTPRequestHandler(http.server.BaseHTTPRequestHandler): # pragma: no cover - - """Simple HTTP request handler with GET and HEAD commands. - - This serves files from the current directory and any of its - subdirectories. The MIME type for files is determined by - calling the .guess_type() method. - - The GET and HEAD requests are identical except that the HEAD - request omits the actual contents of the file. - - """ - - server_version = "RangeHTTP/" + __version__ - - def do_GET(self): - """Serve a GET request.""" - f, start_range, end_range = self.send_head() - if f: - f.seek(start_range, 0) - chunk = 0x1000 - total = 0 - while chunk > 0: - if start_range + chunk > end_range: - chunk = end_range - start_range - try: - self.wfile.write(f.read(chunk)) - except: - break - total += chunk - start_range += chunk - f.close() - - def do_HEAD(self): - """Serve a HEAD request.""" - f, start_range, end_range = self.send_head() - if f: - f.close() - - def send_head(self): - """Common code for GET and HEAD commands. - - This sends the response code and MIME headers. - - Return value is either a file object (which has to be copied - to the outputfile by the caller unless the command was HEAD, - and must be closed by the caller under all circumstances), or - None, in which case the caller has nothing further to do. - - """ - path = self.translate_path(self.path) - f = None - if os.path.isdir(path): - if not self.path.endswith('/'): - # redirect browser - doing basically what apache does - self.send_response(301) - self.send_header("Location", self.path + "/") - self.end_headers() - return (None, 0, 0) - for index in "index.html", "index.htm": - index = os.path.join(path, index) - if os.path.exists(index): - path = index - break - else: - return self.list_directory(path) - ctype = self.guess_type(path) - try: - # Always read in binary mode. Opening files in text mode may cause - # newline translations, making the actual size of the content - # transmitted *less* than the content-length! - f = open(path, 'rb') - except IOError: - self.send_error(404, "File not found") - return (None, 0, 0) - if "Range" in self.headers: - self.send_response(206) - else: - self.send_response(200) - self.send_header("Content-type", ctype) - fs = os.fstat(f.fileno()) - size = int(fs[6]) - start_range = 0 - end_range = size - self.send_header("Accept-Ranges", "bytes") - if "Range" in self.headers: - s, e = self.headers['range'][6:].split('-', 1) - sl = len(s) - el = len(e) - if sl > 0: - start_range = int(s) - if el > 0: - end_range = int(e) + 1 - elif el > 0: - ei = int(e) - if ei < size: - start_range = size - ei - self.send_header( - "Content-Range", - 'bytes ' + str(start_range) + '-' + str(end_range - 1) + '/' + str(size)) - self.send_header("Content-Length", end_range - start_range) - self.send_header("Last-Modified", self.date_time_string(fs.st_mtime)) - self.end_headers() - return (f, start_range, end_range) - - def translate_path(self, path): - """Translate a /-separated PATH to the local filename syntax. - - Components that mean special things to the local file system - (e.g. drive or directory names) are ignored. (XXX They should - probably be diagnosed.) - - """ - # abandon query parameters - path = path.split('?', 1)[0] - path = path.split('#', 1)[0] - path = posixpath.normpath(urllib.parse.unquote(path)) - words = path.split('/') - words = filter(None, words) - path = os.getcwd() - for word in words: - drive, word = os.path.splitdrive(word) - head, word = os.path.split(word) - if word in (os.curdir, os.pardir): - continue - path = os.path.join(path, word) - return path - - def copyfile(self, source, outputfile): - """Copy all data between two file objects. - - The SOURCE argument is a file object open for reading - (or anything with a read() method) and the DESTINATION - argument is a file object open for writing (or - anything with a write() method). - - The only reason for overriding this would be to change - the block size or perhaps to replace newlines by CRLF - -- note however that this the default server uses this - to copy binary data as well. - - """ - shutil.copyfileobj(source, outputfile) - - def guess_type(self, path): - """Guess the type of a file. - - Argument is a PATH (a filename). - - Return value is a string of the form type/subtype, - usable for a MIME Content-type header. - - The default implementation looks the file's extension - up in the table self.extensions_map, using application/octet-stream - as a default; however it would be permissible (if - slow) to look inside the data to make a better guess. - - """ - - base, ext = posixpath.splitext(path) - if ext in self.extensions_map: - return self.extensions_map[ext] - ext = ext.lower() - if ext in self.extensions_map: - return self.extensions_map[ext] - else: - return self.extensions_map[''] - - extensions_map = {'': 'unknown'} diff --git a/asdf/_tests/conftest.py b/asdf/_tests/conftest.py index 853035e01..31353ff24 100644 --- a/asdf/_tests/conftest.py +++ b/asdf/_tests/conftest.py @@ -5,7 +5,7 @@ from asdf import config, schema from . import create_large_tree, create_small_tree -from .httpserver import HTTPServer, RangeHTTPServer +from .httpserver import HTTPServer @pytest.fixture() @@ -52,22 +52,6 @@ def httpserver(request): server.finalize() -@pytest.fixture() -def rhttpserver(request): - """ - The returned ``httpserver`` provides a threaded HTTP server - instance. It serves content from a temporary directory (available - as the attribute tmpdir) at randomly assigned URL (available as - the attribute url). The server supports HTTP Range headers. - - * ``tmpdir`` - path to the tmpdir that it's serving from (str) - * ``url`` - the base url for the server - """ - server = RangeHTTPServer() - yield server - server.finalize() - - @pytest.fixture() def test_data_path(): return importlib.resources.files("asdf") / "_tests" / "data" diff --git a/asdf/_tests/httpserver.py b/asdf/_tests/httpserver.py index 3de3f62d2..661e8bba6 100644 --- a/asdf/_tests/httpserver.py +++ b/asdf/_tests/httpserver.py @@ -6,9 +6,7 @@ import tempfile import threading -from asdf._extern.RangeHTTPServer import RangeHTTPRequestHandler - -__all__ = ["HTTPServer", "RangeHTTPServer"] +__all__ = ["HTTPServer"] def run_server(tmp_path, handler_class, stop_event, queue): # pragma: no cover @@ -62,7 +60,3 @@ def finalize(self): self.stop_event.set() self.thread.join() shutil.rmtree(self.tmpdir) - - -class RangeHTTPServer(HTTPServer): - handler_class = RangeHTTPRequestHandler