30 lines
835 B
Python
30 lines
835 B
Python
from __future__ import annotations
|
|
|
|
import re
|
|
from typing import Mapping
|
|
|
|
from app.models import SubscriptionUserInfo
|
|
|
|
_SUBSCRIPTION_FIELDS = re.compile(r"(upload|download|total|expire)=(\d+)")
|
|
|
|
|
|
def get_header_case_insensitive(headers: Mapping[str, str], name: str) -> str | None:
|
|
target = name.lower()
|
|
for key, value in headers.items():
|
|
if key.lower() == target:
|
|
return value
|
|
return None
|
|
|
|
|
|
def parse_subscription_userinfo(headers: Mapping[str, str]) -> SubscriptionUserInfo | None:
|
|
raw = get_header_case_insensitive(headers, "Subscription-Userinfo")
|
|
if not raw:
|
|
return None
|
|
|
|
values: dict[str, int] = {}
|
|
for key, value in _SUBSCRIPTION_FIELDS.findall(raw):
|
|
values[key] = int(value)
|
|
|
|
info = SubscriptionUserInfo(**values)
|
|
return None if info.is_empty() else info
|