From cb0bb8a38e84ef096411a15eb643674eb17579aa Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:51:57 +0800 Subject: [PATCH] refactor request host --- app/modules/emby/emby.py | 10 ++------ app/modules/jellyfin/jellyfin.py | 10 ++------ app/modules/plex/plex.py | 11 +++------ app/utils/http.py | 40 ++++++++++++++++++++++++++++---- 4 files changed, 42 insertions(+), 29 deletions(-) diff --git a/app/modules/emby/emby.py b/app/modules/emby/emby.py index 6a8fd330..18886e4e 100644 --- a/app/modules/emby/emby.py +++ b/app/modules/emby/emby.py @@ -18,16 +18,10 @@ class Emby: def __init__(self): self._host = settings.EMBY_HOST if self._host: - if not self._host.endswith("/"): - self._host += "/" - if not self._host.startswith("http"): - self._host = "http://" + self._host + self._host = RequestUtils.standardize_base_url(self._host) self._playhost = settings.EMBY_PLAY_HOST if self._playhost: - if not self._playhost.endswith("/"): - self._playhost += "/" - if not self._playhost.startswith("http"): - self._playhost = "http://" + self._playhost + self._playhost = RequestUtils.standardize_base_url(self._playhost) self._apikey = settings.EMBY_API_KEY self.user = self.get_user(settings.SUPERUSER) self.folders = self.get_emby_folders() diff --git a/app/modules/jellyfin/jellyfin.py b/app/modules/jellyfin/jellyfin.py index deadfd86..1a4bb279 100644 --- a/app/modules/jellyfin/jellyfin.py +++ b/app/modules/jellyfin/jellyfin.py @@ -15,16 +15,10 @@ class Jellyfin: def __init__(self): self._host = settings.JELLYFIN_HOST if self._host: - if not self._host.endswith("/"): - self._host += "/" - if not self._host.startswith("http"): - self._host = "http://" + self._host + self._host = RequestUtils.standardize_base_url(self._host) self._playhost = settings.JELLYFIN_PLAY_HOST if self._playhost: - if not self._playhost.endswith("/"): - self._playhost += "/" - if not self._playhost.startswith("http"): - self._playhost = "http://" + self._playhost + self._playhost = RequestUtils.standardize_base_url(self._playhost) self._apikey = settings.JELLYFIN_API_KEY self.user = self.get_user(settings.SUPERUSER) self.serverid = self.get_server_id() diff --git a/app/modules/plex/plex.py b/app/modules/plex/plex.py index fd882cf3..edd5b22b 100644 --- a/app/modules/plex/plex.py +++ b/app/modules/plex/plex.py @@ -11,6 +11,7 @@ from app import schemas from app.core.config import settings from app.log import logger from app.schemas import MediaType +from app.utils.http import RequestUtils class Plex: @@ -19,16 +20,10 @@ class Plex: def __init__(self): self._host = settings.PLEX_HOST if self._host: - if not self._host.endswith("/"): - self._host += "/" - if not self._host.startswith("http"): - self._host = "http://" + self._host + self._host = RequestUtils.standardize_base_url(self._host) self._playhost = settings.PLEX_PLAY_HOST if self._playhost: - if not self._playhost.endswith("/"): - self._playhost += "/" - if not self._playhost.startswith("http"): - self._playhost = "http://" + self._playhost + self._playhost = RequestUtils.standardize_base_url(self._playhost) self._token = settings.PLEX_TOKEN if self._host and self._token: try: diff --git a/app/utils/http.py b/app/utils/http.py index 270fbf19..fa92f337 100644 --- a/app/utils/http.py +++ b/app/utils/http.py @@ -1,4 +1,5 @@ from typing import Union, Any, Optional +from urllib.parse import urljoin import requests import urllib3 @@ -90,7 +91,7 @@ class RequestUtils: """ 发送POST请求 :param url: 请求的URL - :param data: 请求的数据,表单格式 + :param data: 请求的数据 :param json: 请求的JSON数据 :param kwargs: 其他请求参数,如headers, cookies, proxies等 :return: HTTP响应对象,若发生RequestException则返回None @@ -103,7 +104,7 @@ class RequestUtils: """ 发送PUT请求 :param url: 请求的URL - :param data: 请求的数据,表单格式 + :param data: 请求的数据 :param kwargs: 其他请求参数,如headers, cookies, proxies等 :return: HTTP响应对象,若发生RequestException则返回None """ @@ -121,7 +122,7 @@ class RequestUtils: 发送GET请求并返回响应对象 :param url: 请求的URL :param params: 请求的参数 - :param data: 请求的数据,表单格式 + :param data: 请求的数据 :param json: 请求的JSON数据 :param allow_redirects: 是否允许重定向 :param raise_exception: 是否在发生异常时抛出异常,否则默认拦截异常返回None @@ -150,7 +151,7 @@ class RequestUtils: """ 发送POST请求并返回响应对象 :param url: 请求的URL - :param data: 请求的数据,表单格式 + :param data: 请求的数据 :param params: 请求的参数 :param allow_redirects: 是否允许重定向 :param files: 请求的文件 @@ -182,7 +183,7 @@ class RequestUtils: """ 发送PUT请求并返回响应对象 :param url: 请求的URL - :param data: 请求的数据,表单格式 + :param data: 请求的数据 :param params: 请求的参数 :param allow_redirects: 是否允许重定向 :param files: 请求的文件 @@ -222,3 +223,32 @@ class RequestUtils: return [{"name": k, "value": v} for k, v in cookie_dict.items()] return cookie_dict + @staticmethod + def standardize_base_url(host: str) -> str: + """ + 标准化提供的主机地址,确保它以http://或https://开头,并且以斜杠(/)结尾 + :param host: 提供的主机地址字符串 + :return: 标准化后的主机地址字符串 + """ + if not host: + return host + if not host.endswith("/"): + host += "/" + if not host.startswith("http://") and not host.startswith("https://"): + host = "http://" + host + return host + + @staticmethod + def adapt_request_url(host: str, endpoint: str) -> Optional[str]: + """ + 基于传入的host,适配请求的URL,确保每个请求的URL是完整的,用于在发送请求前自动处理和修正请求的URL。 + :param host: 主机头 + :param endpoint: 端点 + :return: 完整的请求URL字符串 + """ + if not host and not endpoint: + return None + if endpoint.startswith(("http://", "https://")): + return endpoint + host = RequestUtils.standardize_base_url(host) + return urljoin(host, endpoint) if host else endpoint