Created
January 16, 2025 19:59
-
-
Save rcastill/49d6c85e2b247e7273766e11b446beff to your computer and use it in GitHub Desktop.
Serve single jpg image in http server regardless of GET /path
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from http.server import HTTPServer, BaseHTTPRequestHandler | |
import argparse | |
import logging | |
import sys | |
import os | |
logging.basicConfig(format="%(asctime)s %(levelname)s %(message)s", level=logging.INFO) | |
log = logging.getLogger() | |
def mkhandler(imagep): | |
class Handler(BaseHTTPRequestHandler): | |
# pylint: disable=invalid-name | |
def do_GET(self): | |
try: | |
with open(imagep, "rb") as imagef: | |
file_content = imagef.read() | |
if not file_content: | |
self.send_response(204) | |
self.end_headers() | |
return | |
self.send_response(200) | |
self.send_header("Content-Type", "image/jpeg") | |
self.send_header("Content-Length", len(file_content)) | |
self.end_headers() | |
self.wfile.write(file_content) | |
# pylint: disable=broad-exception-caught | |
except Exception as ex: | |
self.log_error(str(ex)) | |
self.send_response(500, str(ex)) | |
self.end_headers() | |
return Handler | |
def main(): | |
parser = argparse.ArgumentParser(description="Serve single jpg image in http server regardless of GET /path") | |
parser.add_argument("-p", "--port", help="port to bind", type=int, default=3000) | |
parser.add_argument("-i", "--image", help="image to serve", type=str, required=True) | |
# v-- this trick will print full --help if not used correctly | |
args = parser.parse_args(args=None if len(sys.argv) > 1 else ["--help"]) | |
if not os.path.isfile(args.image): | |
log.warning(f"{args.image} is not a file") | |
server_address = ("0.0.0.0", args.port) | |
httpd = HTTPServer(server_address, mkhandler(args.image)) | |
log.info(f"listening at {server_address[0]}:{server_address[1]}") | |
httpd.serve_forever() | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment