Cómo implementar un proxy web que pasa solicitudes y datos entre múltiples clientes web y servidores web, al mismo tiempo

Hay dos tipos de proxies: proxy directo e inverso La respuesta de Cameron Hafer a ¿Cuál es la diferencia entre un proxy inverso y un proxy directo?

Según su pregunta, parece que necesitaría un proxy directo. Por lo tanto, escriba un programa que escuche las conexiones TCP en un puerto en particular.

  1. Una vez que un cliente se conecta a este programa en un socket y la lectura está lista, comience a leer los datos hasta el CR LF de la transmisión. Iterar a través de los bytes y construir encabezados HTTP.
  2. Dado que la parte de encabezados de la solicitud está lista, extraiga para encontrar si hay un encabezado de host. En caso afirmativo, realice una conexión con el servidor de destino y manténgala presionada hasta que lea el cuerpo de la solicitud http.
  3. Dado que la parte de encabezados de la solicitud está lista, extraiga para encontrar si hay un encabezado Content-Length. Esto indicará cuántos bytes del cuerpo debe leerse.
  4. Una vez realizada la lectura de los datos, escriba en la conexión del servidor de destino ya establecida. (no necesita analizar el cuerpo de la solicitud http, porque no está examinando / alterando los datos en el servidor proxy)
  5. La conexión del cliente a su programa aún se mantiene porque una vez que el servidor de destino responde, los datos deben volver a escribirse en la conexión del cliente
  6. Por lo tanto, compruebe si hay datos disponibles para leer en la conexión del servidor de destino. En caso afirmativo, léalos y escríbalo en la conexión del cliente.

Esta información es muy abstracta. A propósito no he incluido los escenarios HTTPS para que sea simple.

Para comenzar su tarea, deberá dividir el problema en partes más pequeñas que pueda considerar de forma independiente.

Tendrá que ocuparse de la solicitud HHTP, analizando los encabezados para obtener el encabezado “Host:” para que sepa a qué servidor se conectará el proxy. También deberá separar el método de solicitud (GET, POST, etc.) para que pueda devolver un error si es necesario.

Deberá conectarse al servidor que el cliente intentó contactar. Parte de esto será manejar errores y tiempos de espera, para que pueda devolver un mensaje apropiado al cliente en estas situaciones.

Una vez que se haya conectado al servidor, deberá administrar la lectura de datos del cliente y pasarlos al servidor. Parte de esto será nuevamente manejar errores y tiempos de espera en los sockets cliente / servidor. Esto incluye manejar sockets que están cerrados por el cliente o el servidor.

Puede haber otras partes que sean relevantes para esta tarea, pero pensar en lo anterior debería permitirle comenzar a dividir el problema en partes más pequeñas y manejables.