修复限流器问题

This commit is contained in:
2026-04-01 16:05:57 +08:00
parent 4e99ca2b21
commit 23319d8e10
8 changed files with 129 additions and 95 deletions

View File

@@ -16,7 +16,7 @@ from io import BytesIO
import base64 as b64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from fastapi import APIRouter, HTTPException
from fastapi import APIRouter, HTTPException, Request, Query
from ...schemas import (
HashRequest, Base64Request, URLRequest, AESRequest,
JSONValidateRequest, JSONValidateResponse
@@ -29,12 +29,13 @@ router = APIRouter(prefix="/api/v1", tags=["tools"])
@router.get("/password/generate")
@rate_limit(requests=50, period=60)
async def generate_password(
length: int = 12,
upper: bool = True,
lower: bool = True,
digits: bool = True,
symbols: bool = True,
count: int = 1
request: Request, # 添加 request 参数
length: int = Query(12, ge=4, le=64),
upper: bool = Query(True),
lower: bool = Query(True),
digits: bool = Query(True),
symbols: bool = Query(True),
count: int = Query(1, ge=1, le=10)
):
import random
import string
@@ -58,7 +59,11 @@ async def generate_password(
# ========== 二维码 ==========
@router.post("/qrcode/generate")
@rate_limit(requests=30, period=60)
async def generate_qrcode(content: str, size: int = 10):
async def generate_qrcode(
request: Request, # 添加 request 参数
content: str,
size: int = 10
):
if not content:
raise HTTPException(status_code=400, detail="内容不能为空")
@@ -76,9 +81,12 @@ async def generate_qrcode(content: str, size: int = 10):
# ========== 哈希 ==========
@router.post("/crypto/hash")
@rate_limit(requests=100, period=60)
async def compute_hash(request: HashRequest):
text = request.text.encode('utf-8')
algo = request.algorithm.lower()
async def compute_hash(
request: Request, # 添加 request 参数
req: HashRequest
):
text = req.text.encode('utf-8')
algo = req.algorithm.lower()
if algo == "md5":
result = hashlib.md5(text).hexdigest()
@@ -96,61 +104,69 @@ async def compute_hash(request: HashRequest):
# ========== Base64 ==========
@router.post("/crypto/base64")
@rate_limit(requests=100, period=60)
async def base64_process(request: Base64Request):
if request.action == "encode":
result = base64.b64encode(request.text.encode('utf-8')).decode('utf-8')
elif request.action == "decode":
async def base64_process(
request: Request, # 添加 request 参数
req: Base64Request
):
if req.action == "encode":
result = base64.b64encode(req.text.encode('utf-8')).decode('utf-8')
elif req.action == "decode":
try:
result = base64.b64decode(request.text).decode('utf-8')
result = base64.b64decode(req.text).decode('utf-8')
except Exception:
raise HTTPException(status_code=400, detail="Base64 解码失败")
else:
raise HTTPException(status_code=400, detail="无效的 action")
return {"action": request.action, "result": result}
return {"action": req.action, "result": result}
# ========== URL 编解码 ==========
@router.post("/crypto/url")
@rate_limit(requests=100, period=60)
async def url_process(request: URLRequest):
if request.action == "encode":
result = urllib.parse.quote(request.text, safe='')
elif request.action == "decode":
result = urllib.parse.unquote(request.text)
async def url_process(
request: Request, # 添加 request 参数
req: URLRequest
):
if req.action == "encode":
result = urllib.parse.quote(req.text, safe='')
elif req.action == "decode":
result = urllib.parse.unquote(req.text)
else:
raise HTTPException(status_code=400, detail="无效的 action")
return {"action": request.action, "result": result}
return {"action": req.action, "result": result}
# ========== AES 加解密 ==========
@router.post("/crypto/aes")
@rate_limit(requests=50, period=60)
async def aes_process(request: AESRequest):
async def aes_process(
request: Request, # 添加 request 参数
req: AESRequest
):
try:
key = request.key.encode('utf-8')
key = req.key.encode('utf-8')
mode_map = {"ECB": AES.MODE_ECB, "CBC": AES.MODE_CBC, "GCM": AES.MODE_GCM}
mode = mode_map.get(request.mode)
mode = mode_map.get(req.mode)
if not mode:
raise HTTPException(status_code=400, detail="不支持的 AES 模式")
# 密钥长度处理
if len(key) not in [16, 24, 32]:
raise HTTPException(status_code=400, detail="密钥长度必须为 16/24/32 字节")
if request.action == "encrypt":
cipher = AES.new(key, mode, iv=request.iv.encode('utf-8') if request.iv else None)
if request.mode == "GCM":
ciphertext = cipher.encrypt(request.text.encode('utf-8'))
if req.action == "encrypt":
cipher = AES.new(key, mode, iv=req.iv.encode('utf-8') if req.iv else None)
if req.mode == "GCM":
ciphertext = cipher.encrypt(req.text.encode('utf-8'))
result = b64.b64encode(ciphertext).decode('utf-8')
else:
padded = pad(request.text.encode('utf-8'), AES.block_size)
padded = pad(req.text.encode('utf-8'), AES.block_size)
ciphertext = cipher.encrypt(padded)
result = b64.b64encode(ciphertext).decode('utf-8')
elif request.action == "decrypt":
ciphertext = b64.b64decode(request.text)
cipher = AES.new(key, mode, iv=request.iv.encode('utf-8') if request.iv else None)
if request.mode == "GCM":
elif req.action == "decrypt":
ciphertext = b64.b64decode(req.text)
cipher = AES.new(key, mode, iv=req.iv.encode('utf-8') if req.iv else None)
if req.mode == "GCM":
plaintext = cipher.decrypt(ciphertext).decode('utf-8')
result = plaintext
else:
@@ -159,7 +175,7 @@ async def aes_process(request: AESRequest):
else:
raise HTTPException(status_code=400, detail="无效的 action")
return {"mode": request.mode, "action": request.action, "result": result}
return {"mode": req.mode, "action": req.action, "result": result}
except Exception as e:
raise HTTPException(status_code=400, detail=f"AES 操作失败: {str(e)}")
@@ -167,9 +183,12 @@ async def aes_process(request: AESRequest):
# ========== JSON 校验 ==========
@router.post("/json/validate", response_model=JSONValidateResponse)
@rate_limit(requests=100, period=60)
async def validate_json(request: JSONValidateRequest):
async def validate_json(
request: Request, # 添加 request 参数
req: JSONValidateRequest
):
try:
parsed = json.loads(request.json_string)
parsed = json.loads(req.json_string)
formatted = json.dumps(parsed, indent=2, ensure_ascii=False)
return JSONValidateResponse(valid=True, formatted=formatted)
except json.JSONDecodeError as e: