Pergunta

Eu transferi o Privoxy há algumas semanas e para o divertimento eu estava curioso para saber como uma versão simples do que pode ser feito.

Eu entendo que eu preciso configurar o navegador (cliente) para enviar solicitação para o proxy. O proxy enviar a solicitação para a web (vamos dizer que é um proxy HTTP). O proxy receberá a resposta ... mas como pode o envio de proxy volta a solicitação para o navegador (cliente)? ??

Eu tenho pesquisar na web para C # e Proxy HTTP, mas não encontrei algo que me deixe entender como ele funciona por trás da cena corretamente. (Eu acredito que eu não quero um proxy reverso, mas não tenho certeza).

Será que algum de vocês tem alguma explicação ou alguma informação que vai me deixar continuar este pequeno projeto?

Atualização

Isto é o que eu entendo (ver gráfico abaixo).

Passo 1 I configurar o cliente (browser) para todos pedido para ser enviar para 127.0.0.1 no porto do Proxy ouvir. Desta forma, o pedido não será enviado para a Internet diretamente, mas será processada pelo proxy.

Passo 2 O proxy ver uma nova conexão, leia o cabeçalho HTTP e ver o pedido ele deve executa. Ele executa a solicitação.

Passo 3 O proxy recebe uma resposta do pedido. Agora, ele deve enviar a resposta a partir da web para o cliente mas como ???

text alt

link Útil

Mentalis Proxy : Eu encontrei este projeto que é um proxy (mas mais que eu gostaria). I pode verificar a fonte, mas eu realmente queria algo básico para entender mais o conceito.

ASP Proxy : eu poderia ser capaz de obter algumas informações aqui também .

Pedido refletor :. Este é um exemplo simples

Aqui é um repositório Git Hub com um simples Proxy HTTP.

Foi útil?

Solução

Você pode construir um com a HttpListener classe para escutar as solicitações recebidas e a HttpWebRequest classe para retransmitir os pedidos.

Outras dicas

Eu não usaria HttpListener ou algo parecido, dessa forma você vai se deparar com tantos problemas.

O mais importante é que vai ser uma enorme dor de suporte:

  • Proxy Keep-Alives
  • SSL não vai funcionar (de forma correta, você vai ter popups)
  • .NET bibliotecas segue estritamente RFCs que faz com que alguns pedidos a falhar (mesmo que IE, FF e qualquer outro navegador no mundo irá funcionar.)

O que você precisa fazer é:

  • Ouça uma porta TCP
  • analisar o pedido do browser
  • Extract Anfitrião conectar a esse host no nível TCP
  • Encaminhar tudo e para trás, a menos que você deseja adicionar cabeçalhos personalizados etc.

Eu escrevi 2 diferentes proxies HTTP no .NET com necessidades diferentes e posso dizer-lhe que esta é a melhor maneira de fazê-lo.

Mentalis fazer isso, mas o seu código é "spaghetti delegado", pior do que GoTo:)

Eu escrevi recentemente um proxy peso leve em C # .NET usando TcpListener e TcpClient .

https://github.com/titanium007/Titanium-Web-Proxy

Ele suporta HTTP seguro da maneira correta, as necessidades de máquina do cliente para certificado raiz confiança usado pelo proxy. Também suporta WebSockets retransmitir. Todos os recursos de HTTP 1.1 são suportadas exceto pipelining. Pipelining não é usado pela maioria dos navegadores modernos de qualquer maneira. Também suporta a autenticação do Windows (normal, para digerir).

Você pode ligar o seu aplicativo referenciando o projeto e, em seguida, ver e modificar todo o tráfego. (Pedido e resposta).

Tanto quanto o desempenho, eu testei na minha máquina e funciona sem qualquer atraso perceptível.

Proxy pode funcionar da seguinte forma.

Passo 1, o cliente configure usar proxyHost:. ProxyPort

Proxy é um servidor TCP que está escutando na proxyHost: proxyPort. Navegador abre uma conexão com Proxy e envia solicitação HTTP. Proxy analisa esse pedido e tenta detectar cabeçalho "Host". Este cabeçalho irá dizer Proxy onde abrir conexão.

Passo 2: Proxy abre uma conexão para o endereço especificado no cabeçalho "Host". Em seguida, ele envia a solicitação HTTP para o servidor remoto. Lê resposta.

Passo 3:. Após a resposta é lida a partir do servidor HTTP remoto, Proxy envia a resposta através de uma conexão TCP anteriormente aberto com o navegador

Esquematicamente ele será parecido com isto:

Browser                            Proxy                     HTTP server
  Open TCP connection  
  Send HTTP request  ----------->                       
                                 Read HTTP header
                                 detect Host header
                                 Send request to HTTP ----------->
                                 Server
                                                      <-----------
                                 Read response and send
                   <-----------  it back to the browser
Render content

Se você está olhando apenas para interceptar o tráfego, você poderia usar o núcleo violinista para criar um proxy ...

http://fiddler.wikidot.com/fiddlercore

executar violinista primeiro com a interface do usuário para ver o que ele faz, é um proxy que lhe permite depurar o tráfego HTTP / HTTPS. Ele é escrito em C # e tem um núcleo que você pode construir em seus próprios aplicativos.

Tenha em mente FiddlerCore não é livre para aplicações comerciais.

As coisas tornaram-se muito fácil com Owin e WebAPI. Na minha busca por um servidor C # Proxy, eu também me deparei com este post http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Este será o caminho que eu estou tomando.

Concordar com dr mal se você usa HttpListener você terá muitos problemas, você tem que analisar os pedidos e serão contratados para cabeçalhos e ...

  1. Use tcp ouvinte para ouvir solicitações do navegador
  2. parse apenas a primeira linha do pedido e obter o domínio host e porta para conectar
  3. enviar o pedido matéria exata para o anfitrião encontrado na primeira linha de solicitação do navegador
  4. receber os dados do local de destino (Eu tenho problema nesta seção)
  5. enviar os dados exatos recebidas a partir do hospedeiro para o navegador

você vê que você não precisa sequer sabe o que é na solicitação do navegador e analisá-lo, só obter o endereço do site de destino a partir da primeira linha primeira linha geralmente gosta deste GET http://google.com HTTP1.1 ou CONNECT facebook.com:443 (isto é para solicitações SSL)

Socks4 é um protocolo muito simples de implementar. Você escuta para a conexão inicial, se conectar ao host / porta que foi solicitado pelo cliente, enviar o código de sucesso para o cliente em seguida, encaminhar os fluxos de entrada e saída através de sockets.

Se você vai com HTTP que você terá que ler e possivelmente definir / remover alguns cabeçalhos HTTP de modo que é um pouco mais de trabalho.

Se bem me lembro, SSL irá funcionar em HTTP e meias proxies. Para um proxy HTTP que você implementar o CONNECT verbo, que funciona como a socks4 como descrito acima, em seguida, o cliente abre a conexão SSL através do córrego tcp com proxy.

O navegador está conectado ao proxy para que os dados que o proxy recebe a partir do servidor web é apenas enviada via a mesma conexão que o navegador iniciado para o proxy.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top