Skip to content

Commit

Permalink
🐛 fix proxy url handle
Browse files Browse the repository at this point in the history
  • Loading branch information
RF-Tar-Railt committed Sep 9, 2024
1 parent 8c95652 commit a9362f4
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 9 deletions.
14 changes: 14 additions & 0 deletions src/satori/client/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,20 @@ def custom(
def identity(self):
return f"{self.platform}/{self.self_id}"

def ensure_url(self, url: str) -> URL:
"""确定链接形式。
若链接符合以下条件之一,则返回链接的代理形式 ({host}/{path}/{version}/proxy/{url}):
- 链接以 "upload://" 开头
- 链接开头出现在 self_info.proxy_urls 中的某一项
"""
if url.startswith("upload"):
return self.config.api_base / "proxy" / url.lstrip("/")
for proxy_url in self.self_info.proxy_urls:
if url.startswith(proxy_url):
return self.config.api_base / "proxy" / url.lstrip("/")
return URL(url)

def __repr__(self):
return f"<Account {self.self_id} ({self.platform})>"

Expand Down
8 changes: 8 additions & 0 deletions src/satori/client/account.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ class Account(Generic[TP]):
def custom(
self, *, protocol_cls: type[TP1] = ApiProtocol, host: str, port: int, token: str | None = None
) -> Account[TP1]: ...
def ensure_url(self, url: str) -> URL:
"""确定链接形式。
若链接符合以下条件之一,则返回链接的代理形式 ({host}/{path}/{version}/proxy/{url}):
- 链接以 "upload://" 开头
- 链接开头出现在 self_info.proxy_urls 中的某一项
"""

async def send(self, event: Event, message: str | Iterable[str | Element]) -> list[MessageObject]:
"""发送消息。返回一个 `MessageObject` 对象构成的数组。
Expand Down
2 changes: 1 addition & 1 deletion src/satori/client/protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def __init__(self, account: Account):

async def download(self, url: str):
"""访问内部链接。"""
endpoint = self.account.config.api_base / "proxy" / url.lstrip("/")
endpoint = self.account.ensure_url(url)
aio = Launart.current().get_component(AiohttpClientService)
async with aio.session.get(endpoint) as resp:
await validate_response(resp, noreturn=True)
Expand Down
15 changes: 7 additions & 8 deletions src/satori/server/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,10 @@ def apply(self, item: Provider | Router | Adapter):
item.ensure_net(self._url)
self._adapters.append(item)
self.providers.append(item)
for proxy_url_pf in item.proxy_urls():
self.proxy_url_mapping[proxy_url_pf] = item
self.proxy_url_mapping[item.id] = item.proxy_urls()
elif isinstance(item, Provider):
self.providers.append(item)
for proxy_url_pf in item.proxy_urls():
self.proxy_url_mapping[proxy_url_pf] = item
self.proxy_url_mapping[item.id] = item.proxy_urls()
elif isinstance(item, Router):
self.routers.append(item)
else:
Expand Down Expand Up @@ -234,10 +232,11 @@ async def download(self, url: str):
for provider in self.providers:
if provider.ensure(platform, self_id):
return await provider.download_uploaded(platform, self_id, path)
for proxy_url_pf, provider in self.proxy_url_mapping.items():
if url.startswith(proxy_url_pf):
async with self.session.get(url) as resp:
return await resp.read()
for provider in self.providers:
for proxy_url_pf in self.proxy_url_mapping[provider.id]:
if url.startswith(proxy_url_pf):
async with self.session.get(url) as resp:
return await resp.read()
raise ValueError(f"Unknown proxy url: {url}")

def get_local_file(self, url: str):
Expand Down
3 changes: 3 additions & 0 deletions src/satori/server/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ class Request(Generic[TP]):

@runtime_checkable
class Provider(Protocol):
@property
def id(self) -> str: ...

def publisher(self) -> AsyncIterator[Event]: ...

def authenticate(self, token: Optional[str]) -> bool: ...
Expand Down

0 comments on commit a9362f4

Please sign in to comment.