
goproxy v1.9.1
Uma biblioteca de proxy HTTP/HTTPS personalizável para Go, com suporte a encaminhamento regular, tunelamento CONNECT, interceptação TLS MITM e modificação programática de requisições/respostas.
GoProxy
GoProxy é uma biblioteca para criar um servidor proxy HTTP/HTTPS personalizado usando
Go (também conhecido como Golang), com várias configurações disponíveis.
O objetivo deste projeto é oferecer um servidor proxy otimizado, utilizável com
uma quantidade razoável de tráfego, mas também personalizável e programável.
O proxy em si é simplesmente um handler net/http, então você pode adicionar vários
middlewares (panic recover, logging, compressão, etc.) sobre ele. Ele pode ser
facilmente integrado com qualquer outra biblioteca de rede HTTP.
Para usar o goproxy, você deve configurar seu navegador (ou qualquer outro cliente)
para usar o goproxy como um proxy HTTP.
Veja como fazer isso no Chrome
e no Firefox.
Se você decidir começar com o exemplo base, a URL que você deve usar como
proxy é localhost:8080, que é a padrão no nosso exemplo.
Você também precisa confiar
no certificado CA do proxy, para evitar qualquer problema de certificado nos clientes.
Funcionalidades
- Executar certas ações apenas em
hosts específicos, com uma única comparação de igualdade ou com avaliação de regex - Manipular
requestseresponsesantes de enviá-los ao navegador - Usar um
http.Transportpersonalizado para realizar requisições ao servidor de destino - Você pode especificar um
cache de certificados MITM, para reutilizá-los posteriormente em outras requisições ao mesmo host, economizando CPU. Não habilitado por padrão, mas você deve usá-lo em produção! - Redirecionar o tráfego HTTP normal para um
handler personalizado, quando o destino for umcaminho relativo(ex.:/ping) - Você pode escolher o logger a ser usado, implementando a interface
Logger - Você pode
desabilitaracanonicalizaçãodos cabeçalhos das requisições HTTP, definindoPreventCanonicalizationcomo true
Modos de proxy
- Proxy HTTP regular
- HTTPS via CONNECT
- Servidor proxy HTTPS MITM ("Man in the Middle"), no qual o servidor gera certificados TLS para analisar os dados de requisição/resposta e executar ações sobre eles
- Conexão de proxy "sequestrada" (hijacked), onde o handler configurado pode acessar os dados brutos de net.Conn
Patrocinadores
Sua empresa usa o GoProxy? Ajude-nos a manter o projeto ativo e saudável! Apoiar o GoProxy nos permite dedicar mais tempo a correções de bugs e novos recursos. Em troca, se você escolher um plano Gold Supporter ou Enterprise, exibiremos orgulhosamente o logotipo da sua empresa aqui.
Mantenedores
- Elazar Leibovich: Criador do projeto, Engenheiro de Software
- Erik Pellizzon: Mantenedor, Freelancer (aberto a colaborações!)
Se você precisar integrar o GoProxy ao seu projeto, ou precisar de alguns recursos personalizados para manter no seu fork, você pode entrar em contato com Erik (o mantenedor atual) por e-mail, e vocês podem discutir juntos como ele pode ajudar você como consultor independente remunerado.
Contribuições
Se você tiver algum problema, sugestão, ou se encontrar um bug, sinta-se à vontade
para entrar em contato abrindo uma issue no GitHub.
Este é um projeto open source gerenciado por voluntários, e ficamos felizes
em discutir qualquer coisa que possa melhorá-lo.
Certifique-se de explicar tudo, incluindo o motivo por trás da issue
e o que você deseja alterar, para tornar o problema mais fácil de entender.
Você também pode abrir diretamente um Pull Request, se for uma pequena alteração de código, mas
você precisa explicar tudo na descrição.
Se você abrir um pull request chamado refactoring com 5.000 linhas alteradas,
não vamos mesclá-lo... :D
O código deste projeto é distribuído sob a licença BSD 3-Clause,
tornando-o útil também para usos comerciais.
Envie seu estudo de caso
Então, você introduziu e integrou o GoProxy em um dos seus projetos pessoais ou em um projeto dentro da empresa em que você trabalha.
Ficamos felizes em conhecer novas soluções criativas feitas com esta biblioteca,
então sinta-se à vontade para entrar em contato com o mantenedor listado acima por e-mail,
explicando por que você achou este projeto útil para suas necessidades.
Se você assinou um Acordo de Confidencialidade (Non Disclosure Agreement) com a empresa, você
pode propor a eles que escrevam um post de blog no site oficial deles sobre
este tópico, assim essa informação será pública por escolha deles, e você pode
compartilhar o link do post do blog conosco :)
O objetivo dos estudos de caso é compartilhar com a comunidade por que todos os
contribuidores deste projeto estão melhorando o mundo com a ajuda deles e
o que as pessoas estão construindo usando-o.
Linter
O codebase usa uma verificação automática de lint no código do seu Pull Request. Antes de abri-lo, você deve verificar se suas alterações o respeitam, executando o linter na sua máquina local, para que você não tenha nenhuma surpresa.
Para instalar o linter:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
Isso criará um executável na sua pasta $GOPATH/bin
($GOPATH é uma variável de ambiente, geralmente
seu valor é equivalente a ~/go, verifique o valor na sua máquina se você
não tiver certeza sobre isso).
Certifique-se de incluir a pasta bin no path do seu shell, para poder
usar diretamente o comando golangci-lint run.
Um gostinho do GoProxy
Para ter um gostinho do goproxy, aqui está um proxy HTTP/HTTPS básico
que apenas encaminha dados para o destino:
package main
import (
"log"
"net/http"
"github.com/elazarl/goproxy"
)
func main() {
proxy := goproxy.NewProxyHttpServer()
proxy.Verbose = true
log.Fatal(http.ListenAndServe(":8080", proxy))
}
Handler de requisições
Esta linha adicionará o cabeçalho X-GoProxy: yxorPoG-X a todas as requisições enviadas através do proxy,
antes de enviá-las ao destino:
proxy.OnRequest().DoFunc(
func(r *http.Request,ctx *goproxy.ProxyCtx)(*http.Request,*http.Response) {
r.Header.Set("X-GoProxy","yxorPoG-X")
return r,nil
})
Quando a entrada de OnRequest() estiver vazia, a função especificada em DoFunc
processará todas as requisições recebidas pelo proxy. Nesse caso, ela adicionará
um cabeçalho à requisição e a retornará ao chamador.
O proxy enviará a requisição modificada ao destino.
Você também pode usar Do em vez de DoFunc, se você implementar a interface
especificada no seu tipo.