-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproxy-server.js
More file actions
141 lines (118 loc) · 3.97 KB
/
proxy-server.js
File metadata and controls
141 lines (118 loc) · 3.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
const express = require('express');
const http = require('http');
const https = require('https');
const url = require('url');
const { networkInterfaces } = require('os');
// Crear servidor Express
const app = express();
// Configuración CORS
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
// Manejar preflight requests
if (req.method === 'OPTIONS') {
return res.status(200).end();
}
next();
});
// Middleware para registrar solicitudes
app.use((req, res, next) => {
console.log(`Proxy: ${req.method} ${req.url}`);
next();
});
// Ruta base para el proxy
app.use('/proxy', (req, res) => {
// Extraer la URL objetivo del parámetro de consulta 'url'
const targetUrl = req.query.url;
if (!targetUrl) {
return res.status(400).send('Parámetro URL requerido');
}
try {
// Crear una nueva URL para validar y extraer el origen
const parsedUrl = new URL(targetUrl);
const options = {
hostname: parsedUrl.hostname,
port: parsedUrl.port || (parsedUrl.protocol === 'https:' ? 443 : 80),
path: parsedUrl.pathname + parsedUrl.search,
method: req.method,
headers: {
...req.headers,
host: parsedUrl.host,
origin: parsedUrl.origin,
},
};
// Eliminar headers problemáticos
delete options.headers['host'];
delete options.headers['connection'];
// Elegir el protocolo adecuado
const httpClient = parsedUrl.protocol === 'https:' ? https : http;
// Hacer la petición al servidor de destino
const proxyReq = httpClient.request(options, proxyRes => {
res.writeHead(proxyRes.statusCode, proxyRes.headers);
// Pasar la respuesta directamente
proxyRes.pipe(res);
});
// Manejar errores en la petición
proxyReq.on('error', error => {
console.error('Error en la petición proxy:', error);
if (!res.headersSent) {
res.status(500).send(`Error en la conexión: ${error.message}`);
}
});
// Si hay body en la petición original, enviarlo
if (['POST', 'PUT', 'PATCH'].includes(req.method)) {
req.pipe(proxyReq);
} else {
proxyReq.end();
}
} catch (error) {
console.error('URL inválida:', error);
res.status(400).send(`URL inválida: ${error.message}`);
}
});
// Manejo de errores global
app.use((err, req, res, next) => {
console.error('Error en el servidor proxy:', err);
res.status(500).send('Error interno del servidor proxy');
});
// Obtener direcciones IP disponibles
function getIpAddresses() {
const interfaces = networkInterfaces();
const addresses = [];
for (const name of Object.keys(interfaces)) {
for (const iface of interfaces[name]) {
// Omitir direcciones internas de loopback e IPv6
if (iface.family === 'IPv4' && !iface.internal) {
addresses.push(iface.address);
}
}
}
return addresses;
}
// Función para iniciar el servidor
function startProxyServer(port = 9000) {
return new Promise((resolve, reject) => {
const server = app.listen(port, () => {
const ipAddresses = getIpAddresses();
console.log(`Servidor proxy CORS iniciado en puerto ${port}`);
console.log(`Accesible localmente en: http://localhost:${port}`);
// Mostrar todas las direcciones IP disponibles
ipAddresses.forEach(ip => {
console.log(`Accesible en la red en: http://${ip}:${port}`);
});
resolve({ server, port, addresses: ['localhost', ...ipAddresses] });
});
server.on('error', error => {
if (error.code === 'EADDRINUSE') {
console.log(`Puerto ${port} en uso, intentando con el siguiente puerto...`);
startProxyServer(port + 1)
.then(resolve)
.catch(reject);
} else {
reject(error);
}
});
});
}
module.exports = { startProxyServer };