51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
import { Router, Request, Response } from 'express'
|
|
import { sessionAuth } from '../middleware/auth.js'
|
|
|
|
const router = Router()
|
|
|
|
router.all('/*', sessionAuth, async (req: Request, res: Response) => {
|
|
const session = req.session!
|
|
const targetPath = req.originalUrl.replace(/^\/proxy/, '')
|
|
const targetUrl = `${session.site_url}${targetPath}`
|
|
|
|
try {
|
|
const headers: Record<string, string> = {
|
|
'Authorization': session.access_token,
|
|
'New-Api-User': String(session.user_id),
|
|
'Content-Type': req.headers['content-type'] || 'application/json'
|
|
}
|
|
|
|
const fetchOptions: RequestInit = {
|
|
method: req.method,
|
|
headers
|
|
}
|
|
|
|
if (['POST', 'PUT', 'PATCH'].includes(req.method) && req.body) {
|
|
fetchOptions.body = JSON.stringify(req.body)
|
|
}
|
|
|
|
const response = await fetch(targetUrl, fetchOptions)
|
|
const contentType = response.headers.get('content-type') || ''
|
|
|
|
res.status(response.status)
|
|
|
|
const forwardHeaders = ['content-type', 'x-request-id']
|
|
for (const h of forwardHeaders) {
|
|
const val = response.headers.get(h)
|
|
if (val) res.setHeader(h, val)
|
|
}
|
|
|
|
if (contentType.includes('application/json')) {
|
|
const data = await response.json()
|
|
res.json(data)
|
|
} else {
|
|
const buffer = await response.arrayBuffer()
|
|
res.send(Buffer.from(buffer))
|
|
}
|
|
} catch (error: any) {
|
|
res.status(502).json({ success: false, message: `代理请求失败: ${error.message}` })
|
|
}
|
|
})
|
|
|
|
export default router
|