From 879f4ac7a2d6e7dd807112edb0a71cc8001738bf Mon Sep 17 00:00:00 2001 From: mhdzumair Date: Sun, 25 Aug 2024 22:28:42 +0530 Subject: [PATCH] Fix proxy stream request headers not passing for seeking the content --- mediaflow_proxy/routes.py | 14 +------------- mediaflow_proxy/utils/http_utils.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/mediaflow_proxy/routes.py b/mediaflow_proxy/routes.py index 9602280..2e929fb 100644 --- a/mediaflow_proxy/routes.py +++ b/mediaflow_proxy/routes.py @@ -2,23 +2,11 @@ from fastapi import Request, Depends, APIRouter from pydantic import HttpUrl from .handlers import handle_hls_stream_proxy, proxy_stream, get_manifest, get_playlist, get_segment, get_public_ip +from .utils.http_utils import get_proxy_headers proxy_router = APIRouter() -def get_proxy_headers(request: Request) -> dict: - """ - Extracts proxy headers from the request query parameters. - - Args: - request (Request): The incoming HTTP request. - - Returns: - dict: A dictionary of proxy headers. - """ - return {k[2:]: v for k, v in request.query_params.items() if k.startswith("h_")} - - @proxy_router.head("/hls") @proxy_router.get("/hls") async def hls_stream_proxy( diff --git a/mediaflow_proxy/utils/http_utils.py b/mediaflow_proxy/utils/http_utils.py index 89d1fc2..6b7c63d 100644 --- a/mediaflow_proxy/utils/http_utils.py +++ b/mediaflow_proxy/utils/http_utils.py @@ -3,12 +3,24 @@ from urllib import parse import httpx import tenacity +from starlette.requests import Request from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type from mediaflow_proxy.configs import settings logger = logging.getLogger(__name__) +supported_request_headers = [ + "accept", + "accept-encoding", + "accept-language", + "connection", + "transfer-encoding", + "range", + "if-range", + "user-agent", +] + class DownloadError(Exception): def __init__(self, status_code, message): @@ -220,7 +232,7 @@ def encode_mediaflow_proxy_url( return f"{base_url}?{encoded_params}" -def get_original_scheme(request) -> str: +def get_original_scheme(request: Request) -> str: """ Determines the original scheme (http or https) of the request. @@ -249,3 +261,18 @@ def get_original_scheme(request) -> str: # Default to http if no indicators of https are found return "http" + + +def get_proxy_headers(request: Request) -> dict: + """ + Extracts proxy headers from the request query parameters. + + Args: + request (Request): The incoming HTTP request. + + Returns: + dict: A dictionary of proxy headers. + """ + request_headers = {k: v for k, v in request.headers.items() if k in supported_request_headers} + request_headers.update({k[2:].lower(): v for k, v in request.query_params.items() if k.startswith("h_")}) + return request_headers