import argparse
import json
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--port", type=int, required=True)
ap.add_argument("--advertise-base", required=True, help="e.g. http://127.0.0.1:<shim-port>")
ap.add_argument("--object-file", required=True)
args = ap.parse_args()
with open(args.object_file, "rb") as f:
blob = f.read()
class Handler(BaseHTTPRequestHandler):
def log_message(self, *_): pass
def do_POST(self):
if not self.path.endswith("/info/lfs/objects/batch"):
self.send_error(404)
return
n = int(self.headers.get("Content-Length", 0))
req = json.loads(self.rfile.read(n) or b"{}")
objects = [
{
"oid": o["oid"],
"size": o["size"],
"actions": {"download": {"href": f"{args.advertise_base}/lfs/{o['oid']}"}},
}
for o in req.get("objects", [])
]
body = json.dumps({"transfer": "basic", "objects": objects}).encode()
self.send_response(200)
self.send_header("Content-Type", "application/vnd.git-lfs+json")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
def do_GET(self):
if "/lfs/" not in self.path:
self.send_error(404)
return
self.send_response(200)
self.send_header("Content-Type", "application/octet-stream")
self.send_header("Content-Length", str(len(blob)))
self.end_headers()
self.wfile.write(blob)
ThreadingHTTPServer(("127.0.0.1", args.port), Handler).serve_forever()
if __name__ == "__main__":
main()