Hace unas semanas descargué Privoxy y, por diversión, tenía curiosidad por saber cómo se puede hacer una versión simple.
Entiendo que necesito configurar el navegador (cliente) para enviar la solicitud al proxy. El proxy envía la solicitud a la web (digamos que es un proxy http). El proxy recibirá la respuesta ... pero, ¿cómo puede enviar la solicitud al navegador (cliente)?
He buscado en la web C # y proxy HTTP, pero no he encontrado algo que me permita entender cómo funciona correctamente detrás de escena. (Creo que no quiero un proxy inverso pero no estoy seguro).
¿Alguno de ustedes tiene alguna explicación o alguna información que me permita continuar con este pequeño proyecto?
Actualizar
Esto es lo que entiendo (ver gráfico a continuación).
Paso 1 Configuro el cliente (navegador) para que todas las solicitudes se envíen a 127.0.0.1 en el puerto que escucha Proxy. De esta manera, la solicitud no se enviará a Internet directamente, sino que será procesada por el proxy.
Paso 2 El proxy ve una nueva conexión, lee el encabezado HTTP y ve la solicitud que debe ejecutar. Él ejecuta la solicitud.
Paso 3 El proxy recibe una respuesta de la solicitud. Ahora debe enviar la respuesta de la web al cliente, pero ¿cómo?
Enlace útil
Proxy Mentalis : He encontrado este proyecto que es un proxy (pero más de lo que me gustaría). Podría verificar la fuente, pero realmente quería algo básico para entender más el concepto.
Proxy ASP : también podría obtener información aquí.
Solicitar reflector : este es un ejemplo simple.
Aquí hay un repositorio de Git Hub con un proxy HTTP simple .
Respuestas:
Puede crear uno con la
HttpListener
clase para escuchar las solicitudes entrantes y laHttpWebRequest
clase para retransmitir las solicitudes.fuente
No usaría HttpListener o algo así, de esa manera te encontrarás con muchos problemas.
Lo más importante será un gran dolor de apoyo:
Lo que debes hacer es:
Escribí 2 proxies HTTP diferentes en .NET con diferentes requisitos y puedo decirte que esta es la mejor manera de hacerlo.
Mental está haciendo esto, pero su código es "delegar espagueti", peor que GoTo :)
fuente
Recientemente he escrito un proxy ligero en c # .net usando TcpListener y TcpClient .
https://github.com/titanium007/Titanium-Web-Proxy
Es compatible con HTTP seguro de la manera correcta, la máquina del cliente necesita confiar en el certificado raíz utilizado por el proxy. También es compatible con la retransmisión de WebSockets. Todas las características de HTTP 1.1 son compatibles, excepto la canalización. La mayoría de los navegadores modernos no utilizan la canalización de todos modos. También es compatible con la autenticación de Windows (simple, resumen).
Puede conectar su aplicación haciendo referencia al proyecto y luego ver y modificar todo el tráfico. (Solicitud y respuesta).
En cuanto al rendimiento, lo he probado en mi máquina y funciona sin ningún retraso notable.
fuente
Proxy puede funcionar de la siguiente manera.
Paso 1, configure el cliente para usar proxyHost: proxyPort.
Proxy es un servidor TCP que está escuchando en proxyHost: proxyPort. El navegador abre la conexión con Proxy y envía la solicitud Http. Proxy analiza esta solicitud e intenta detectar el encabezado "Host". Este encabezado le indicará a Proxy dónde abrir la conexión.
Paso 2: el proxy abre la conexión a la dirección especificada en el encabezado "Host". Luego envía una solicitud HTTP a ese servidor remoto. Lee la respuesta.
Paso 3: Después de leer la respuesta del servidor HTTP remoto, Proxy envía la respuesta a través de una conexión TCP abierta anterior con el navegador.
Esquemáticamente se verá así:
fuente
Si solo está buscando interceptar el tráfico, puede usar el núcleo de Fiddler para crear un proxy ...
http://fiddler.wikidot.com/fiddlercore
ejecute fiddler primero con la interfaz de usuario para ver qué hace, es un proxy que le permite depurar el tráfico http / https. Está escrito en C # y tiene un núcleo que puede construir en sus propias aplicaciones.
Tenga en cuenta que FiddlerCore no es gratuito para aplicaciones comerciales.
fuente
Acepte dr evil si usa HTTPListener, tendrá muchos problemas, tendrá que analizar las solicitudes y se comprometerá con los encabezados y ...
ves que ni siquiera necesitas saber qué hay en la solicitud del navegador y analizarlo, solo obtén la dirección del sitio de destino de la primera línea, la primera línea generalmente le gusta GET http://google.com HTTP1.1 o CONNECT facebook.com: 443 (esto es para solicitudes SSL)
fuente
Las cosas se han vuelto realmente fáciles con OWIN y WebAPI. En mi búsqueda de un servidor Proxy C #, también me encontré con esta publicación http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Este será el camino que estoy tomando.
fuente
Socks4 es un protocolo muy simple de implementar. Escucha la conexión inicial, se conecta al host / puerto solicitado por el cliente, envía el código de éxito al cliente y luego reenvía las secuencias entrantes y salientes a través de los sockets.
Si utiliza HTTP, tendrá que leer y posiblemente configurar / eliminar algunos encabezados HTTP, por lo que es un poco más de trabajo.
Si no recuerdo mal, SSL funcionará en los servidores proxy HTTP y Socks. Para un proxy HTTP, implementa el verbo CONNECT, que funciona de manera similar a los socks4 como se describió anteriormente, luego el cliente abre la conexión SSL a través del flujo tcp proxy.
fuente
El navegador está conectado al proxy, por lo que los datos que el proxy obtiene del servidor web se envían a través de la misma conexión que el navegador inició con el proxy.
fuente
Para lo que vale, aquí hay una implementación asíncrona de muestra de C # basada en HttpListener y HttpClient (lo uso para poder conectar Chrome en dispositivos Android a IIS Express, esa es la única forma que encontré ...).
Y si necesita soporte HTTPS, no debería requerir más código, solo configuración de certificado: Httplistener con soporte HTTPS
fuente