feat: init commit
This commit is contained in:
62
proxy.js
Normal file
62
proxy.js
Normal file
@@ -0,0 +1,62 @@
|
||||
import express from 'express';
|
||||
import fetch from 'node-fetch';
|
||||
import { URL } from 'url';
|
||||
|
||||
const app = express();
|
||||
const port = 3000;
|
||||
|
||||
// 允许跨域请求
|
||||
app.use((req, res, next) => {
|
||||
res.header('Access-Control-Allow-Origin', '*');
|
||||
next();
|
||||
});
|
||||
|
||||
// 通用代理路由
|
||||
app.get('/proxy', async (req, res) => {
|
||||
console.log('Received Range header:', req.headers.range);
|
||||
// 获取目标 URL
|
||||
const targetUrl = req.query.url;
|
||||
console.log('Fetching data from:', targetUrl);
|
||||
if (!targetUrl) {
|
||||
return res.status(400).send('URL parameter is required');
|
||||
}
|
||||
|
||||
try {
|
||||
// 设置请求头
|
||||
const headers = {};
|
||||
if (req.headers.range) {
|
||||
headers['Range'] = req.headers.range; // 转发 Range 请求头
|
||||
}
|
||||
|
||||
// 向目标 URL 发起请求
|
||||
const response = await fetch(targetUrl, { headers });
|
||||
|
||||
// 设置响应头
|
||||
response.headers.forEach((value, key) => {
|
||||
if (key !== 'content-encoding') { // 避免某些头信息导致问题
|
||||
res.setHeader(key, value);
|
||||
}
|
||||
});
|
||||
|
||||
// 特殊处理 Transfer-Encoding 和 Content-Length
|
||||
if (response.headers.get('transfer-encoding') === 'chunked') {
|
||||
res.removeHeader('Content-Length');
|
||||
}
|
||||
|
||||
// 将响应体直接流式传输给客户端
|
||||
response.body.pipe(res, { end: true });
|
||||
|
||||
// 错误处理
|
||||
response.body.on('error', (err) => {
|
||||
console.error('Error during data transfer:', err);
|
||||
res.status(500).send('Error during data transfer');
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error fetching data:', error);
|
||||
res.status(500).send('Error fetching data');
|
||||
}
|
||||
});
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`Proxy server running at http://localhost:${port}`);
|
||||
});
|
||||
Reference in New Issue
Block a user