Spaces:
Running
Running
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);
|
|
|
|
|
|
|
|