Baseline: pr1 HYC下载站 v2.3 before security/functional fixes
This commit is contained in:
+112
@@ -0,0 +1,112 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""API路由模块"""
|
||||
|
||||
import re
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
|
||||
from .v1 import APIv1
|
||||
from .v2 import APIv2
|
||||
from .admin import AdminAPI
|
||||
from core.api_auth import APIAuthManager
|
||||
|
||||
|
||||
class APIRouter:
|
||||
"""API路由器 - 支持版本化API"""
|
||||
|
||||
def __init__(self, config):
|
||||
self.config = config
|
||||
self.api_versions = {
|
||||
'v1': APIv1(config),
|
||||
'v2': APIv2(config)
|
||||
}
|
||||
self.default_version = config.get('api_version', 'v1')
|
||||
|
||||
# 初始化认证管理器(使用共享实例)
|
||||
if not config.get('_auth_manager'):
|
||||
config['_auth_manager'] = APIAuthManager(config)
|
||||
self.auth_manager = config['_auth_manager']
|
||||
|
||||
# 初始化Admin API
|
||||
self.admin_api = AdminAPI(config)
|
||||
|
||||
def handle_request(self, handler, method, path, query):
|
||||
"""处理API请求"""
|
||||
# 注入认证管理器到handler
|
||||
handler.auth_manager = self.auth_manager
|
||||
|
||||
# 解析路径,提取API版本
|
||||
# 格式: /api/v1/... 或 /api/v2/... 或 /api/...
|
||||
|
||||
# 移除 /api/ 前缀
|
||||
if path.startswith('api/'):
|
||||
api_path = path[4:]
|
||||
else:
|
||||
api_path = path
|
||||
|
||||
# 解析版本号
|
||||
parts = api_path.split('/')
|
||||
if parts[0] in ['v1', 'v2']:
|
||||
api_version = parts[0]
|
||||
api_action = '/'.join(parts[1:]) if len(parts) > 1 else ''
|
||||
else:
|
||||
# 检查是否是直接访问的 admin API (不带版本前缀)
|
||||
if api_path.startswith('admin/'):
|
||||
admin_action = api_path[6:] # 移除 'admin/'
|
||||
try:
|
||||
self.admin_api.handle_request(handler, method, admin_action, {})
|
||||
except Exception as e:
|
||||
handler.send_json_response({
|
||||
"error": f"Admin API处理错误: {str(e)}",
|
||||
"path": admin_action
|
||||
}, 500)
|
||||
return
|
||||
else:
|
||||
handler.send_error(400, "未指定API请求版本/指定版本错误")
|
||||
return
|
||||
|
||||
# 解析查询参数
|
||||
parsed_query = parse_qs(query)
|
||||
|
||||
# 检查是否是 admin API (带版本前缀,如 /api/v2/admin/stats)
|
||||
# 注意:auth/verify 应该交给 APIv2 处理,而不是 admin_api
|
||||
if api_version in ['v1', 'v2'] and api_action.startswith('admin/') and not api_action.startswith('admin/auth'):
|
||||
admin_action = api_action[6:] # 移除 'admin/'
|
||||
try:
|
||||
self.admin_api.handle_request(handler, method, admin_action, parsed_query)
|
||||
except Exception as e:
|
||||
handler.send_json_response({
|
||||
"error": f"Admin API处理错误: {str(e)}",
|
||||
"path": admin_action
|
||||
}, 500)
|
||||
return
|
||||
|
||||
# 获取对应的API处理器
|
||||
api_handler = self.api_versions.get(api_version)
|
||||
if not api_handler:
|
||||
handler.send_json_response({
|
||||
"error": f"不支持的API版本: {api_version}",
|
||||
"supported_versions": list(self.api_versions.keys())
|
||||
}, 400)
|
||||
return
|
||||
|
||||
# 调用对应的API处理器
|
||||
try:
|
||||
# 调试模式输出路由信息 (debug-api)
|
||||
if handler._is_debug_enabled('api'):
|
||||
msg = f"\n=== DEBUG API Router ===\n Version: {api_version}\n Action: {api_action}\n Method: {method}\n Query: {parsed_query}"
|
||||
handler._debug_log('api', msg, '\033[35m')
|
||||
|
||||
api_handler.handle_request(handler, method, api_action, parsed_query)
|
||||
except Exception as e:
|
||||
if handler._is_debug_enabled('error'):
|
||||
import traceback
|
||||
tb_str = traceback.format_exc()
|
||||
msg = f"\n=== DEBUG API ERROR ===\n{tb_str}"
|
||||
handler._debug_log('error', msg, '\033[31m')
|
||||
handler.send_json_response({
|
||||
"error": f"API处理错误: {str(e)}",
|
||||
"version": api_version,
|
||||
"path": api_action
|
||||
}, 500)
|
||||
Reference in New Issue
Block a user