|
@@ -43,6 +43,11 @@ from ..web import NO_CACHE_HEADERS, cache_forever_headers
|
|
|
|
|
|
|
|
logger = log_utils.getLogger(__name__)
|
|
logger = log_utils.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
+# Application keys for type-safe access to app state
|
|
|
|
|
+REPO_KEY = web.AppKey("repo", Repo)
|
|
|
|
|
+HANDLERS_KEY = web.AppKey("handlers", dict)
|
|
|
|
|
+DUMB_KEY = web.AppKey("dumb", bool)
|
|
|
|
|
+
|
|
|
|
|
|
|
|
async def send_file(
|
|
async def send_file(
|
|
|
req: web.Request, f: BinaryIO | None, headers: dict[str, str]
|
|
req: web.Request, f: BinaryIO | None, headers: dict[str, str]
|
|
@@ -82,7 +87,7 @@ async def get_loose_object(request: web.Request) -> web.Response:
|
|
|
"""
|
|
"""
|
|
|
sha = (request.match_info["dir"] + request.match_info["file"]).encode("ascii")
|
|
sha = (request.match_info["dir"] + request.match_info["file"]).encode("ascii")
|
|
|
logger.info("Sending loose object %s", sha)
|
|
logger.info("Sending loose object %s", sha)
|
|
|
- object_store = request.app["repo"].object_store
|
|
|
|
|
|
|
+ object_store = request.app[REPO_KEY].object_store
|
|
|
if not object_store.contains_loose(sha):
|
|
if not object_store.contains_loose(sha):
|
|
|
raise web.HTTPNotFound(text="Object not found")
|
|
raise web.HTTPNotFound(text="Object not found")
|
|
|
try:
|
|
try:
|
|
@@ -105,7 +110,7 @@ async def get_text_file(request: web.Request) -> web.StreamResponse:
|
|
|
headers.update(NO_CACHE_HEADERS)
|
|
headers.update(NO_CACHE_HEADERS)
|
|
|
path = request.match_info["file"]
|
|
path = request.match_info["file"]
|
|
|
logger.info("Sending plain text file %s", path)
|
|
logger.info("Sending plain text file %s", path)
|
|
|
- repo = request.app["repo"]
|
|
|
|
|
|
|
+ repo = request.app[REPO_KEY]
|
|
|
return await send_file(request, repo.get_named_file(path), headers)
|
|
return await send_file(request, repo.get_named_file(path), headers)
|
|
|
|
|
|
|
|
|
|
|
|
@@ -169,8 +174,8 @@ async def get_info_refs(request: web.Request) -> web.StreamResponse | web.Respon
|
|
|
request: aiohttp request object
|
|
request: aiohttp request object
|
|
|
Returns: Response with refs information
|
|
Returns: Response with refs information
|
|
|
"""
|
|
"""
|
|
|
- repo = request.app["repo"]
|
|
|
|
|
- return await refs_request(repo, request, request.app["handlers"])
|
|
|
|
|
|
|
+ repo = request.app[REPO_KEY]
|
|
|
|
|
+ return await refs_request(repo, request, request.app[HANDLERS_KEY])
|
|
|
|
|
|
|
|
|
|
|
|
|
async def get_info_packs(request: web.Request) -> web.Response:
|
|
async def get_info_packs(request: web.Request) -> web.Response:
|
|
@@ -184,7 +189,8 @@ async def get_info_packs(request: web.Request) -> web.Response:
|
|
|
headers.update(NO_CACHE_HEADERS)
|
|
headers.update(NO_CACHE_HEADERS)
|
|
|
logger.info("Emulating dumb info/packs")
|
|
logger.info("Emulating dumb info/packs")
|
|
|
return web.Response(
|
|
return web.Response(
|
|
|
- body=b"".join(generate_objects_info_packs(request.app["repo"])), headers=headers
|
|
|
|
|
|
|
+ body=b"".join(generate_objects_info_packs(request.app[REPO_KEY])),
|
|
|
|
|
+ headers=headers,
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@@ -202,7 +208,7 @@ async def get_pack_file(request: web.Request) -> web.StreamResponse:
|
|
|
logger.info("Sending pack file %s", path)
|
|
logger.info("Sending pack file %s", path)
|
|
|
return await send_file(
|
|
return await send_file(
|
|
|
request,
|
|
request,
|
|
|
- request.app["repo"].get_named_file(path),
|
|
|
|
|
|
|
+ request.app[REPO_KEY].get_named_file(path),
|
|
|
headers=headers,
|
|
headers=headers,
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -281,9 +287,9 @@ async def handle_service_request(request: web.Request) -> web.StreamResponse:
|
|
|
request: aiohttp request object
|
|
request: aiohttp request object
|
|
|
Returns: Response with service result
|
|
Returns: Response with service result
|
|
|
"""
|
|
"""
|
|
|
- repo = request.app["repo"]
|
|
|
|
|
|
|
+ repo = request.app[REPO_KEY]
|
|
|
|
|
|
|
|
- return await service_request(repo, request, request.app["handlers"])
|
|
|
|
|
|
|
+ return await service_request(repo, request, request.app[HANDLERS_KEY])
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_repo_app(
|
|
def create_repo_app(
|
|
@@ -298,11 +304,11 @@ def create_repo_app(
|
|
|
Returns: Configured aiohttp Application
|
|
Returns: Configured aiohttp Application
|
|
|
"""
|
|
"""
|
|
|
app = web.Application()
|
|
app = web.Application()
|
|
|
- app["repo"] = repo
|
|
|
|
|
|
|
+ app[REPO_KEY] = repo
|
|
|
if handlers is None:
|
|
if handlers is None:
|
|
|
handlers = dict(DEFAULT_HANDLERS)
|
|
handlers = dict(DEFAULT_HANDLERS)
|
|
|
- app["handlers"] = handlers
|
|
|
|
|
- app["dumb"] = dumb
|
|
|
|
|
|
|
+ app[HANDLERS_KEY] = handlers
|
|
|
|
|
+ app[DUMB_KEY] = dumb
|
|
|
app.router.add_get("/info/refs", get_info_refs)
|
|
app.router.add_get("/info/refs", get_info_refs)
|
|
|
app.router.add_post(
|
|
app.router.add_post(
|
|
|
"/{service:git-upload-pack|git-receive-pack}", handle_service_request
|
|
"/{service:git-upload-pack|git-receive-pack}", handle_service_request
|