Eu baixei o Privoxy há algumas semanas e, por diversão, fiquei curioso para saber como uma versão simples dele pode ser feita.
Entendo que preciso configurar o navegador (cliente) para enviar a solicitação ao proxy. O proxy envia a solicitação para a web (digamos que seja um proxy http). O proxy receberá a resposta ... mas como o proxy pode enviar de volta a solicitação ao navegador (cliente)?
Eu pesquisei na Web por proxy C # e http, mas não encontrei algo que me permita entender como funciona corretamente nos bastidores. (Acredito que não quero um proxy reverso, mas não tenho certeza).
Algum de vocês tem alguma explicação ou alguma informação que me permita continuar este pequeno projeto?
Atualizar
É isso que eu entendo (veja o gráfico abaixo).
Etapa 1 Eu configuro o cliente (navegador) para que toda solicitação seja enviada para 127.0.0.1 na porta que o Proxy escuta. Dessa forma, a solicitação não será enviada diretamente à Internet, mas será processada pelo proxy.
Etapa 2 O proxy vê uma nova conexão, lê o cabeçalho HTTP e vê a solicitação que ele deve executar. Ele executa a solicitação.
Etapa 3 O proxy recebe uma resposta da solicitação. Agora ele deve enviar a resposta da web para o cliente, mas como ???
Link útil
Mentalis Proxy : Encontrei este projeto que é um proxy (mas mais do que gostaria). Posso verificar a fonte, mas realmente queria algo básico para entender mais o conceito.
Proxy ASP : Talvez eu também consiga obter algumas informações por aqui.
Solicitar refletor : Este é um exemplo simples.
Aqui está um repositório do Git Hub com um proxy HTTP simples .
Respostas:
Você pode criar um com a
HttpListener
classe para escutar solicitações recebidas e aHttpWebRequest
classe para retransmitir as solicitações.fonte
Eu não usaria o HttpListener ou algo assim, dessa maneira você encontrará tantos problemas.
Mais importante ainda, será uma grande dor apoiar:
O que você precisa fazer é:
Escrevi 2 proxies HTTP diferentes no .NET com requisitos diferentes e posso dizer que essa é a melhor maneira de fazer isso.
Mentalis fazendo isso, mas o código deles é "delegar espaguete", pior que o GoTo :)
fonte
Eu escrevi recentemente um proxy leve em c # .net usando TcpListener e TcpClient .
https://github.com/titanium007/Titanium-Web-Proxy
Ele suporta HTTP seguro da maneira correta, a máquina cliente precisa confiar no certificado raiz usado pelo proxy. Também suporta retransmissão WebSockets. Todos os recursos do HTTP 1.1 são suportados, exceto o pipelining. O pipelining não é usado pela maioria dos navegadores modernos. Também suporta autenticação do Windows (simples, resumo).
Você pode conectar seu aplicativo fazendo referência ao projeto e, em seguida, ver e modificar todo o tráfego. (Pedido e resposta).
Quanto ao desempenho, testei-o na minha máquina e funciona sem nenhum atraso perceptível.
fonte
O proxy pode funcionar da seguinte maneira.
Etapa 1, configure o cliente para usar proxyHost: proxyPort.
Proxy é um servidor TCP que está ouvindo no proxyHost: proxyPort. O navegador abre a conexão com o Proxy e envia a solicitação HTTP. O proxy analisa essa solicitação e tenta detectar o cabeçalho "Host". Este cabeçalho dirá ao Proxy onde abrir a conexão.
Etapa 2: o proxy abre a conexão com o endereço especificado no cabeçalho "Host". Em seguida, ele envia a solicitação HTTP para esse servidor remoto. Lê a resposta.
Etapa 3: Após a resposta da leitura do servidor HTTP remoto, o Proxy envia a resposta por meio de uma conexão TCP aberta anteriormente com o navegador.
Esquematicamente, será assim:
fonte
Se você apenas deseja interceptar o tráfego, pode usar o núcleo do violinista para criar um proxy ...
http://fiddler.wikidot.com/fiddlercore
execute o violinista primeiro com a interface do usuário para ver o que faz, é um proxy que permite depurar o tráfego http / https. Está escrito em c # e possui um núcleo que você pode criar em seus próprios aplicativos.
Lembre-se de que o FiddlerCore não é gratuito para aplicativos comerciais.
fonte
Concorde com o dr evil se você usar o HTTPListener, terá muitos problemas, terá que analisar solicitações e estará envolvido em cabeçalhos e ...
você perceber que não precisa nem saber o que está na solicitação do navegador e analisá-lo, apenas obtenha o endereço do site de destino na primeira linha. A primeira linha geralmente gosta desse GET http://google.com HTTP1.1 ou CONNECT facebook.com: 443 (isto é para solicitações de SSL)
fonte
As coisas se tornaram muito fáceis com OWIN e WebAPI. Na minha pesquisa por um servidor proxy C #, também deparei com este post http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Este será o caminho que estou tomando.
fonte
O Socks4 é um protocolo muito simples de implementar. Você ouve a conexão inicial, conecta-se ao host / porta solicitada pelo cliente, envia o código de sucesso ao cliente e encaminha os fluxos de saída e entrada pelos soquetes.
Se você optar pelo HTTP, terá que ler e possivelmente definir / remover alguns cabeçalhos HTTP, para que isso funcione um pouco mais.
Se bem me lembro, o SSL funcionará nos proxies HTTP e Socks. Para um proxy HTTP, você implementa o verbo CONNECT, que funciona como o socks4, conforme descrito acima, e o cliente abre a conexão SSL no fluxo tcp proxy.
fonte
O navegador está conectado ao proxy, para que os dados que o proxy obtém do servidor da Web sejam enviados apenas pela mesma conexão que o navegador iniciou no proxy.
fonte
Para o que vale a pena, aqui está uma implementação assíncrona de exemplo de C # baseada em HttpListener e HttpClient (eu uso para conectar o Chrome em dispositivos Android ao IIS Express, foi a única maneira que encontrei ...).
E se você precisar de suporte HTTPS, não deverá exigir mais código, apenas a configuração do certificado: Httplistener with HTTPS support
fonte