Skip to content

Instantly share code, notes, and snippets.

@rcastill
Created January 16, 2025 19:59
Show Gist options
  • Save rcastill/49d6c85e2b247e7273766e11b446beff to your computer and use it in GitHub Desktop.
Save rcastill/49d6c85e2b247e7273766e11b446beff to your computer and use it in GitHub Desktop.
Serve single jpg image in http server regardless of GET /path
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