
Una biblioteca de proxy HTTP/HTTPS personalizable para Go que admite reenvío regular, túneles CONNECT, intercepción TLS MITM y modificación programática de solicitudes/respuestas.
GoProxy es una librería para crear un servidor proxy HTTP/HTTPS personalizado usando
Go (también conocido como Golang), con varios ajustes configurables disponibles.
El objetivo de este proyecto es ofrecer un servidor proxy optimizado, utilizable con
una cantidad razonable de tráfico, pero personalizable y programable.
El proxy en sí mismo es simplemente un handler de net/http, por lo que puedes añadir múltiples
middlewares (recuperación de pánico, registro de logs, compresión, etc.) sobre él. Puede
integrarse fácilmente con cualquier otra librería de red HTTP.
Para usar goproxy, se debe configurar el navegador (o cualquier otro cliente)
para que use goproxy como proxy HTTP.
Así es como se hace en Chrome
y en Firefox.
Si decides empezar con el ejemplo base, la URL que debes usar como
proxy es localhost:8080, que es la predeterminada en nuestro ejemplo.
También tienes que confiar
en el certificado CA del proxy, para evitar cualquier problema de certificado en los clientes.
hosts específicos, con una única comparación de igualdad o con evaluación de expresiones regularespeticiones y respuestas antes de enviarlas al navegadorhttp.Transport personalizado para realizar peticiones al servidor de destinocaché de certificados MITM, para reutilizarlos más tarde en otras peticiones al mismo host, ahorrando así CPU. No está habilitada por defecto, ¡pero deberías usarla en producción!handler personalizado, cuando el destino es una ruta relativa (p. ej. /ping)Loggerdeshabilitar la canonicalización de las cabeceras HTTP de las peticiones, estableciendo PreventCanonicalization en true¿Tu empresa usa GoProxy? ¡Ayúdanos a mantener el proyecto activo y en buen estado! Apoyar a GoProxy nos permite dedicar más tiempo a corregir errores y añadir nuevas funciones. A cambio, si eliges un plan Gold Supporter o Enterprise, mostraremos con orgullo el logo de tu empresa aquí.
Si necesitas integrar GoProxy en tu proyecto, o necesitas algunas funciones personalizadas que mantener en tu fork, puedes contactar por correo electrónico con Erik (el mantenedor actual) y acordar con él cómo puede ayudarte como consultor independiente de pago.
Si tienes algún problema, sugerencia o encuentras un error, no dudes en
ponerte en contacto abriendo un issue de GitHub.
Este es un proyecto open source gestionado por voluntarios, y estaremos
encantados de discutir cualquier cosa que pueda mejorarlo.
Asegúrate de explicarlo todo, incluyendo el motivo del issue
y lo que quieres cambiar, para que el problema sea más fácil de entender.
También puedes abrir directamente un Pull Request, si es un cambio de código pequeño, pero
debes explicar todo en la descripción.
Si abres un pull request llamado refactoring con 5,000 líneas cambiadas,
no lo fusionaremos... :D
El código de este proyecto se publica bajo la licencia BSD 3-Clause,
lo que lo hace útil también para usos comerciales.
Así que has introducido e integrado GoProxy en uno de tus proyectos personales o en un proyecto de la empresa en la que trabajas.
Estaremos encantados de conocer nuevas soluciones creativas hechas con esta librería,
así que no dudes en contactar por correo electrónico con el mantenedor indicado arriba para explicar
por qué encontraste este proyecto útil para tus necesidades.
Si has firmado un Acuerdo de Confidencialidad (NDA) con la empresa, puedes
proponerles que escriban un post en su sitio web oficial sobre
este tema, de modo que esta información será pública por decisión suya, y podrás
compartir el enlace del post con nosotros :)
El propósito de los casos de estudio es compartir con la comunidad por qué todos los
contribuyentes de este proyecto están mejorando el mundo con su ayuda y
qué está construyendo la gente con él.
El código base utiliza una comprobación automática de lint sobre el código de tu Pull Request. Antes de abrirlo, deberías comprobar si tus cambios lo respetan, ejecutando el linter en tu máquina local, para no llevarte ninguna sorpresa.
Para instalar el linter:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
Esto creará un ejecutable en tu carpeta $GOPATH/bin
($GOPATH es una variable de entorno; normalmente
su valor equivale a ~/go; comprueba su valor en tu máquina si no
estás seguro de ello).
Asegúrate de incluir la carpeta bin en el path de tu shell, para poder
usar directamente el comando golangci-lint run.
Para hacerte una idea de goproxy, aquí tienes un proxy HTTP/HTTPS básico
que simplemente reenvía los datos al 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))
}
Esta línea añadirá la cabecera X-GoProxy: yxorPoG-X a todas las peticiones enviadas a través del proxy,
antes de enviarlas al 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
})
Cuando la entrada de OnRequest() está vacía, la función especificada en DoFunc
procesará todas las peticiones entrantes al proxy. En este caso, añadirá
una cabecera a la petición y la devolverá al llamante.
El proxy enviará la petición modificada al destino.
También puedes usar Do en lugar de DoFunc, si implementas la interfaz
especificada en tu tipo.
⚠️ Nota: devolvimos un valor nil como respuesta. Si la respuesta devuelta no es nil, goproxy descartará la petición y enviará la respuesta especificada al cliente.