55import aiohttp
66import asyncio
77import bcrypt
8- from fastapi import FastAPI , Request , Form
9- from fastapi .responses import RedirectResponse , HTMLResponse
8+ from fastapi import FastAPI , Request , Form , Query
9+ from fastapi .responses import RedirectResponse , HTMLResponse , StreamingResponse
1010from fastapi .staticfiles import StaticFiles
1111from markupsafe import Markup
1212from pydantic import BaseModel
@@ -206,6 +206,7 @@ async def create_redirect(request: Request, code: str = Form(...), password: str
206206
207207import traceback
208208
209+ @app .head ("/redirect/{key}" , response_class = HTMLResponse )
209210@app .get ("/redirect/{key}" , response_class = HTMLResponse )
210211async def dynamic_redirect (request : Request , key : str ):
211212 """Dynamically handle redirects based on MongoDB data."""
@@ -232,8 +233,9 @@ async def dynamic_redirect(request: Request, key: str):
232233 return "The 'code' field is empty." , 400 # Bad request error for empty 'code'
233234 return "Handler function not found." , 404 # Not found error if document doesn't exist.
234235
235- @app .head ("/redirect/{key}" , response_class = HTMLResponse )
236- async def dynamic_redirect (request : Request , key : str ):
236+ @app .head ("/download/{key}" , response_class = HTMLResponse )
237+ @app .get ("/download/{key}" , response_class = HTMLResponse )
238+ async def dynamic_download (request : Request , key : str , file_name : str = Query (..., description = "The desired filename for the downloaded file" )):
237239 """Dynamically handle redirects based on MongoDB data."""
238240 collection = db .route_handlers
239241 document = await collection .find_one ({"key" : key })
@@ -243,7 +245,17 @@ async def dynamic_redirect(request: Request, key: str):
243245 if code :
244246 try :
245247 result = await execute_async_code (code )
246- return RedirectResponse (url = result )
248+
249+ async with aiohttp .ClientSession () as session :
250+ async with session .get (result ) as response :
251+ response .raise_for_status ()
252+ content = await response .read ()
253+
254+ return StreamingResponse (
255+ iter ([content ]),
256+ media_type = response .headers .get ('Content-Type' , 'application/octet-stream' ),
257+ headers = {'Content-Disposition' : f'attachment; filename="{ file_name } "' }
258+ )
247259 except Exception as e :
248260 # Extract the traceback from the exception
249261 tb_str = '' .join (traceback .format_exception (None , e , e .__traceback__ ))
@@ -259,7 +271,6 @@ async def dynamic_redirect(request: Request, key: str):
259271 return "Handler function not found." , 404 # Not found error if document doesn't exist.
260272
261273
262-
263274# Run FastAPI with Uvicorn
264275if __name__ == "__main__" :
265276 import uvicorn
0 commit comments