File size: 2,576 Bytes
8d4d3e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from http.server import BaseHTTPRequestHandler, HTTPServer
import http.client
import socket

# Configuraci贸n del servidor backend
BACKEND_HOST = "localhost"
BACKEND_PORT = 8080

class TransparentProxy(BaseHTTPRequestHandler):
    def do_GET(self):
        self.proxy_request()

    def do_POST(self):
        self.proxy_request()

    def proxy_request(self):
        # Modifica la ruta para a帽adir /v1
        modified_path = f"/v1{self.path}"
        print(f"Redirigiendo la solicitud {self.command} a: {modified_path}")

        # Establece una conexi贸n al backend con un timeout extendido
        conn = http.client.HTTPConnection(BACKEND_HOST, BACKEND_PORT, timeout=300)  # Timeout de 5 minutos

        try:
            # Leer datos del cuerpo si existen
            content_length = self.headers.get('Content-Length')
            if content_length:
                post_data = self.rfile.read(int(content_length))
                conn.request(self.command, modified_path, body=post_data, headers=self.headers)
            else:
                conn.request(self.command, modified_path, headers=self.headers)

            # Obtener la respuesta del backend
            backend_response = conn.getresponse()

            # Enviar la respuesta al cliente
            self.send_response(backend_response.status, backend_response.reason)

            # Reenviar todos los encabezados del backend al cliente
            for key, value in backend_response.getheaders():
                self.send_header(key, value)
            self.end_headers()

            # Reenviar el cuerpo de la respuesta en modo streaming
            while True:
                chunk = backend_response.read(1024)
                if not chunk:
                    break
                self.wfile.write(chunk)
                self.wfile.flush()  # Asegura que cada fragmento se env铆a inmediatamente al cliente

        except socket.timeout:
            self.send_error(504, "Gateway Timeout: El backend no respondi贸 en el tiempo esperado.")
            print("Error: Tiempo de espera agotado en la solicitud al backend.")

        except Exception as e:
            self.send_error(500, f"Error en el proxy: {e}")
            print(f"Error al manejar la solicitud: {e}")

        finally:
            conn.close()

def run(server_class=HTTPServer, handler_class=TransparentProxy, port=7860):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Proxy corriendo en el puerto {port}")
    httpd.serve_forever()

if __name__ == "__main__":
    run()