42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
"""HTTP 响应和 Cookie 工具。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from http import HTTPStatus
|
|
from http.server import BaseHTTPRequestHandler
|
|
from typing import Any
|
|
|
|
from group_system.config import SESSION_DAYS
|
|
|
|
|
|
def json_response(
|
|
status: int | HTTPStatus,
|
|
payload: Any,
|
|
cookies: list[dict[str, Any]] | None = None,
|
|
):
|
|
"""Return a callable that serializes and sends a JSON response."""
|
|
def send(handler: BaseHTTPRequestHandler):
|
|
body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
|
|
handler.send_response(int(status))
|
|
handler.send_header("Content-Type", "application/json; charset=utf-8")
|
|
handler.send_header("Cache-Control", "no-store")
|
|
handler.send_header("Content-Length", str(len(body)))
|
|
for cookie in cookies or []:
|
|
handler.send_header("Set-Cookie", cookie["value"])
|
|
handler.end_headers()
|
|
handler.wfile.write(body)
|
|
|
|
return send
|
|
|
|
|
|
def make_session_cookie(token: str) -> str:
|
|
return (
|
|
f"GROUP_SESSION={token}; Path=/; HttpOnly; SameSite=Lax; "
|
|
f"Max-Age={SESSION_DAYS * 86400}"
|
|
)
|
|
|
|
|
|
def clear_session_cookie() -> str:
|
|
return "GROUP_SESSION=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0"
|