Spaces:
Sleeping
Sleeping
Update index.js
Browse files
index.js
CHANGED
|
@@ -8,7 +8,6 @@ app.use(express.raw({
|
|
| 8 |
}));
|
| 9 |
|
| 10 |
app.options('*', (req, res) => {
|
| 11 |
-
console.log(`[OPTIONS] Handling preflight request from: ${req.headers.origin}`);
|
| 12 |
const origin = req.headers.origin;
|
| 13 |
|
| 14 |
if (origin) {
|
|
@@ -22,7 +21,6 @@ app.options('*', (req, res) => {
|
|
| 22 |
|
| 23 |
const requestedHeaders = req.headers['access-control-request-headers'];
|
| 24 |
if (requestedHeaders) {
|
| 25 |
-
console.log(`[OPTIONS] Requested headers: ${requestedHeaders}`);
|
| 26 |
res.setHeader('Access-Control-Allow-Headers', requestedHeaders);
|
| 27 |
} else {
|
| 28 |
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With, X-CSRF-Token, Accept, Origin');
|
|
@@ -34,13 +32,10 @@ app.options('*', (req, res) => {
|
|
| 34 |
res.setHeader('Vary', 'Origin');
|
| 35 |
}
|
| 36 |
|
| 37 |
-
console.log('[OPTIONS] Sending 204 response');
|
| 38 |
res.status(204).end();
|
| 39 |
});
|
| 40 |
|
| 41 |
-
|
| 42 |
app.get('/', (req, res) => {
|
| 43 |
-
console.log(`[GET /] Request from: ${req.headers.origin}`);
|
| 44 |
const origin = req.headers.origin;
|
| 45 |
if (origin) {
|
| 46 |
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
@@ -58,32 +53,20 @@ app.get('/', (req, res) => {
|
|
| 58 |
});
|
| 59 |
|
| 60 |
app.all('*', async (req, res) => {
|
| 61 |
-
console.log(`\n[${req.method}] New request received`);
|
| 62 |
-
console.log(`Original URL: ${req.url}`);
|
| 63 |
-
console.log(`Headers:`, req.headers);
|
| 64 |
-
console.log(`Body length: ${req.body ? req.body.length : 0}`);
|
| 65 |
-
|
| 66 |
if (req.url === '/') {
|
| 67 |
-
console.log('[*] Root path detected, skipping');
|
| 68 |
return;
|
| 69 |
}
|
| 70 |
|
| 71 |
const clientRequestOrigin = req.headers.origin;
|
| 72 |
-
console.log(`Client origin: ${clientRequestOrigin}`);
|
| 73 |
|
| 74 |
try {
|
| 75 |
let targetUrlString = req.url.substring(1);
|
| 76 |
-
console.log(`Raw target URL: ${targetUrlString}`);
|
| 77 |
|
| 78 |
try {
|
| 79 |
targetUrlString = decodeURIComponent(targetUrlString);
|
| 80 |
-
|
| 81 |
-
} catch (e) {
|
| 82 |
-
console.log(`URL decoding failed: ${e.message}`);
|
| 83 |
-
}
|
| 84 |
|
| 85 |
if (!targetUrlString) {
|
| 86 |
-
console.log('[ERROR] No target URL provided');
|
| 87 |
addCorsHeaders(res, clientRequestOrigin);
|
| 88 |
res.status(400).send('Target URL is missing in the path.');
|
| 89 |
return;
|
|
@@ -92,9 +75,7 @@ app.all('*', async (req, res) => {
|
|
| 92 |
let targetUrl;
|
| 93 |
try {
|
| 94 |
targetUrl = new URL(targetUrlString);
|
| 95 |
-
console.log(`Parsed target URL: ${targetUrl.toString()}`);
|
| 96 |
} catch (e) {
|
| 97 |
-
console.log(`[ERROR] URL parsing failed: ${e.message}`);
|
| 98 |
addCorsHeaders(res, clientRequestOrigin);
|
| 99 |
res.status(400).send(`Invalid target URL provided in path: ${targetUrlString}`);
|
| 100 |
return;
|
|
@@ -103,12 +84,7 @@ app.all('*', async (req, res) => {
|
|
| 103 |
const requestHeaders = {...req.headers};
|
| 104 |
delete requestHeaders['host'];
|
| 105 |
delete requestHeaders['content-length'];
|
| 106 |
-
|
| 107 |
-
console.log(`Making request to: ${targetUrl.toString()}`);
|
| 108 |
-
console.log(`Method: ${req.method}`);
|
| 109 |
-
console.log(`Headers:`, requestHeaders);
|
| 110 |
|
| 111 |
-
console.log('Starting fetch request...');
|
| 112 |
const response = await fetch(targetUrl.toString(), {
|
| 113 |
method: req.method,
|
| 114 |
headers: requestHeaders,
|
|
@@ -116,9 +92,6 @@ app.all('*', async (req, res) => {
|
|
| 116 |
redirect: 'manual',
|
| 117 |
compress: false
|
| 118 |
});
|
| 119 |
-
console.log('Fetch request completed');
|
| 120 |
-
console.log(`Response status: ${response.status}`);
|
| 121 |
-
console.log(`Response headers:`, response.headers.raw());
|
| 122 |
|
| 123 |
response.headers.forEach((value, key) => {
|
| 124 |
const lowerKey = key.toLowerCase();
|
|
@@ -135,7 +108,6 @@ app.all('*', async (req, res) => {
|
|
| 135 |
lowerKey !== 'trailers' &&
|
| 136 |
lowerKey !== 'upgrade'
|
| 137 |
) {
|
| 138 |
-
console.log(`Setting response header: ${key} = ${value}`);
|
| 139 |
res.setHeader(key, value);
|
| 140 |
}
|
| 141 |
});
|
|
@@ -145,32 +117,19 @@ app.all('*', async (req, res) => {
|
|
| 145 |
!key.toLowerCase().startsWith('access-control-')
|
| 146 |
).join(', ');
|
| 147 |
if (exposedHeaders) {
|
| 148 |
-
console.log(`Setting exposed headers: ${exposedHeaders}`);
|
| 149 |
res.setHeader('Access-Control-Expose-Headers', exposedHeaders || '*');
|
| 150 |
}
|
| 151 |
|
| 152 |
res.status(response.status);
|
| 153 |
-
console.log(`Set response status to: ${response.status}`);
|
| 154 |
|
| 155 |
if (response.body) {
|
| 156 |
-
console.log('Starting to pipe response body...');
|
| 157 |
-
response.body.on('error', (error) => {
|
| 158 |
-
console.error('Error in response body pipe:', error);
|
| 159 |
-
});
|
| 160 |
-
response.body.on('end', () => {
|
| 161 |
-
console.log('Response body pipe completed');
|
| 162 |
-
});
|
| 163 |
response.body.pipe(res);
|
| 164 |
} else {
|
| 165 |
-
console.log('No response body, ending response');
|
| 166 |
res.end();
|
| 167 |
}
|
| 168 |
|
| 169 |
} catch (error) {
|
| 170 |
-
console.error(`[${new Date().toISOString()}] Detailed proxy error:`, error);
|
| 171 |
-
console.error('Error stack:', error.stack);
|
| 172 |
if (!res.headersSent) {
|
| 173 |
-
console.log('Headers not sent yet, sending error response');
|
| 174 |
addCorsHeaders(res, clientRequestOrigin);
|
| 175 |
let statusCode = 500;
|
| 176 |
let message = 'Proxy error occurred.';
|
|
@@ -188,17 +147,14 @@ app.all('*', async (req, res) => {
|
|
| 188 |
statusCode = 400;
|
| 189 |
message = `Invalid target URL format in path: ${req.url.substring(1)}`;
|
| 190 |
}
|
| 191 |
-
console.log(`Sending error response: ${statusCode} - ${message}`);
|
| 192 |
res.status(statusCode).send(message);
|
| 193 |
} else {
|
| 194 |
-
console.error(`Headers already sent, cannot send error response`);
|
| 195 |
res.end();
|
| 196 |
}
|
| 197 |
}
|
| 198 |
});
|
| 199 |
|
| 200 |
function addCorsHeaders(res, clientRequestOrigin) {
|
| 201 |
-
console.log(`Adding CORS headers for origin: ${clientRequestOrigin}`);
|
| 202 |
if (clientRequestOrigin) {
|
| 203 |
res.setHeader('Access-Control-Allow-Origin', clientRequestOrigin);
|
| 204 |
res.setHeader('Access-Control-Allow-Credentials', 'true');
|
|
@@ -211,8 +167,4 @@ function addCorsHeaders(res, clientRequestOrigin) {
|
|
| 211 |
const PORT = process.env.PORT || 7860;
|
| 212 |
const HOST = '0.0.0.0';
|
| 213 |
|
| 214 |
-
app.listen(PORT, HOST
|
| 215 |
-
console.log(`Server running on http://${HOST}:${PORT} and acting as a CORS proxy.`);
|
| 216 |
-
console.log(`Handles OPTIONS preflight requests.`);
|
| 217 |
-
console.log(`Example: http://${HOST === '0.0.0.0' ? 'localhost' : HOST}:${PORT}/https://www.google.com`);
|
| 218 |
-
});
|
|
|
|
| 8 |
}));
|
| 9 |
|
| 10 |
app.options('*', (req, res) => {
|
|
|
|
| 11 |
const origin = req.headers.origin;
|
| 12 |
|
| 13 |
if (origin) {
|
|
|
|
| 21 |
|
| 22 |
const requestedHeaders = req.headers['access-control-request-headers'];
|
| 23 |
if (requestedHeaders) {
|
|
|
|
| 24 |
res.setHeader('Access-Control-Allow-Headers', requestedHeaders);
|
| 25 |
} else {
|
| 26 |
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With, X-CSRF-Token, Accept, Origin');
|
|
|
|
| 32 |
res.setHeader('Vary', 'Origin');
|
| 33 |
}
|
| 34 |
|
|
|
|
| 35 |
res.status(204).end();
|
| 36 |
});
|
| 37 |
|
|
|
|
| 38 |
app.get('/', (req, res) => {
|
|
|
|
| 39 |
const origin = req.headers.origin;
|
| 40 |
if (origin) {
|
| 41 |
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
|
|
| 53 |
});
|
| 54 |
|
| 55 |
app.all('*', async (req, res) => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
if (req.url === '/') {
|
|
|
|
| 57 |
return;
|
| 58 |
}
|
| 59 |
|
| 60 |
const clientRequestOrigin = req.headers.origin;
|
|
|
|
| 61 |
|
| 62 |
try {
|
| 63 |
let targetUrlString = req.url.substring(1);
|
|
|
|
| 64 |
|
| 65 |
try {
|
| 66 |
targetUrlString = decodeURIComponent(targetUrlString);
|
| 67 |
+
} catch (e) {}
|
|
|
|
|
|
|
|
|
|
| 68 |
|
| 69 |
if (!targetUrlString) {
|
|
|
|
| 70 |
addCorsHeaders(res, clientRequestOrigin);
|
| 71 |
res.status(400).send('Target URL is missing in the path.');
|
| 72 |
return;
|
|
|
|
| 75 |
let targetUrl;
|
| 76 |
try {
|
| 77 |
targetUrl = new URL(targetUrlString);
|
|
|
|
| 78 |
} catch (e) {
|
|
|
|
| 79 |
addCorsHeaders(res, clientRequestOrigin);
|
| 80 |
res.status(400).send(`Invalid target URL provided in path: ${targetUrlString}`);
|
| 81 |
return;
|
|
|
|
| 84 |
const requestHeaders = {...req.headers};
|
| 85 |
delete requestHeaders['host'];
|
| 86 |
delete requestHeaders['content-length'];
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
|
|
|
|
| 88 |
const response = await fetch(targetUrl.toString(), {
|
| 89 |
method: req.method,
|
| 90 |
headers: requestHeaders,
|
|
|
|
| 92 |
redirect: 'manual',
|
| 93 |
compress: false
|
| 94 |
});
|
|
|
|
|
|
|
|
|
|
| 95 |
|
| 96 |
response.headers.forEach((value, key) => {
|
| 97 |
const lowerKey = key.toLowerCase();
|
|
|
|
| 108 |
lowerKey !== 'trailers' &&
|
| 109 |
lowerKey !== 'upgrade'
|
| 110 |
) {
|
|
|
|
| 111 |
res.setHeader(key, value);
|
| 112 |
}
|
| 113 |
});
|
|
|
|
| 117 |
!key.toLowerCase().startsWith('access-control-')
|
| 118 |
).join(', ');
|
| 119 |
if (exposedHeaders) {
|
|
|
|
| 120 |
res.setHeader('Access-Control-Expose-Headers', exposedHeaders || '*');
|
| 121 |
}
|
| 122 |
|
| 123 |
res.status(response.status);
|
|
|
|
| 124 |
|
| 125 |
if (response.body) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
response.body.pipe(res);
|
| 127 |
} else {
|
|
|
|
| 128 |
res.end();
|
| 129 |
}
|
| 130 |
|
| 131 |
} catch (error) {
|
|
|
|
|
|
|
| 132 |
if (!res.headersSent) {
|
|
|
|
| 133 |
addCorsHeaders(res, clientRequestOrigin);
|
| 134 |
let statusCode = 500;
|
| 135 |
let message = 'Proxy error occurred.';
|
|
|
|
| 147 |
statusCode = 400;
|
| 148 |
message = `Invalid target URL format in path: ${req.url.substring(1)}`;
|
| 149 |
}
|
|
|
|
| 150 |
res.status(statusCode).send(message);
|
| 151 |
} else {
|
|
|
|
| 152 |
res.end();
|
| 153 |
}
|
| 154 |
}
|
| 155 |
});
|
| 156 |
|
| 157 |
function addCorsHeaders(res, clientRequestOrigin) {
|
|
|
|
| 158 |
if (clientRequestOrigin) {
|
| 159 |
res.setHeader('Access-Control-Allow-Origin', clientRequestOrigin);
|
| 160 |
res.setHeader('Access-Control-Allow-Credentials', 'true');
|
|
|
|
| 167 |
const PORT = process.env.PORT || 7860;
|
| 168 |
const HOST = '0.0.0.0';
|
| 169 |
|
| 170 |
+
app.listen(PORT, HOST);
|
|
|
|
|
|
|
|
|
|
|
|