
Настраиваемая библиотека HTTP/HTTPS-прокси для Go, поддерживающая обычное проксирование, CONNECT-туннелирование, MITM-перехват TLS и программную модификацию запросов/ответов.
GoProxy — это библиотека для создания настраиваемого HTTP/HTTPS прокси-сервера на Go (также известном как Golang) с несколькими доступными параметрами конфигурации.
Цель этого проекта — предложить оптимизированный прокси-сервер, способный работать с разумным объёмом трафика, но при этом настраиваемый и программируемый.
Сам прокси — это просто обработчик net/http, поэтому поверх него можно добавить несколько промежуточных обработчиков (panic recover, логирование, сжатие и т. д.). Его можно легко интегрировать с любой другой сетевой HTTP-библиотекой.
Чтобы использовать goproxy, нужно настроить браузер (или любой другой клиент) на использование goproxy в качестве HTTP-прокси.
Вот как это сделать в Chrome
и в Firefox.
Если вы решите начать с примера base, используйте в качестве адреса прокси localhost:8080 — это значение по умолчанию в нашем примере.
Вам также нужно довериться сертификату прокси-ЦС (CA), чтобы у клиентов не возникало проблем с сертификатами.
конкретных хостов — с помощью простого сравнения на равенство или регулярного выражениязапросы и ответы перед отправкой в браузерсобственный http.Transport для выполнения запросов к целевому серверукэш сертификатов MITM, чтобы переиспользовать их позже для других запросов к тому же хосту и тем самым экономить CPU. По умолчанию не включён, но в production его стоит использовать!специальный обработчик, когда целевой URL является относительным путём (например, /ping)Loggerотключить канонизацию заголовков HTTP-запросов, установив PreventCanonicalization в trueВаша компания использует GoProxy? Помогите нам поддерживать проект в рабочем состоянии! Поддержка GoProxy позволяет нам уделять больше времени исправлению ошибок и новым функциям. Взамен, если вы выберете план Gold Supporter или Enterprise, мы с гордостью разместим логотип вашей компании здесь.
Если вам нужно интегрировать GoProxy в свой проект или вы хотите поддерживать какие-то собственные доработки в своём форке, вы можете связаться с Эриком (текущим мейнтейнером) по электронной почте и обсудить, как он может помочь вам в качестве платного независимого консультанта.
Если у вас возникли проблемы, есть предложения или вы нашли ошибку, смело обращайтесь, создав issue на GitHub.
Это open source-проект, которым управляют волонтёры, и мы рады обсудить всё, что может его улучшить.
Обязательно объясните всё, включая причину обращения и то, что вы хотите изменить, чтобы проблему было легче понять.
Если изменение кода небольшое, вы можете сразу открыть Pull Request, но в описании нужно объяснить всё.
Если вы откроете pull request с названием refactoring и 5,000 изменённых строк, мы не сможем его слить... :D
Код этого проекта распространяется под лицензией BSD 3-Clause, что делает его пригодным и для коммерческого использования.
Итак, вы внедрили и интегрировали GoProxy в один из своих личных проектов или в проект внутри компании, где работаете.
Мы будем рады узнать о новых креативных решениях, созданных с помощью этой библиотеки, поэтому не стесняйтесь связаться с указанным выше мейнтейнером по электронной почте и объяснить, почему этот проект оказался полезным для ваших задач.
Если вы подписали с компанией соглашение о неразглашении (NDA), вы можете предложить им написать пост в блоге на их официальном сайте на эту тему; тогда эта информация станет публичной по их решению, и вы сможете поделиться ссылкой на этот пост с нами :)
Цель таких примеров — поделиться с сообществом, как все участники этого проекта с помощью своего вклада улучшают мир, и что люди создают, используя его.
В кодовой базе используется автоматическая проверка линтером кода вашего Pull Request. Перед открытием запроса стоит запустить линтер локально и убедиться, что ваши изменения ему соответствуют, чтобы не было сюрпризов.
Чтобы установить линтер:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
Это создаст исполняемый файл в папке $GOPATH/bin ($GOPATH — переменная окружения, обычно её значение эквивалентно ~/go; проверьте её значение на своей машине, если не уверены).
Убедитесь, что папка bin добавлена в путь вашей оболочки, чтобы можно было напрямую использовать команду golangci-lint run.
Чтобы получить представление о goproxy, вот базовый HTTP/HTTPS-прокси, который просто пересылает данные получателю:
package main
import (
"log"
"net/http"
"github.com/elazarl/goproxy"
)
func main() {
proxy := goproxy.NewProxyHttpServer()
proxy.Verbose = true
log.Fatal(http.ListenAndServe(":8080", proxy))
}
Эта строка добавит заголовок X-GoProxy: yxorPoG-X ко всем запросам, отправляемым через прокси, перед их передачей получателю:
proxy.OnRequest().DoFunc(
func(r *http.Request,ctx *goproxy.ProxyCtx)(*http.Request,*http.Response) {
r.Header.Set("X-GoProxy","yxorPoG-X")
return r,nil
})
Когда входные параметры OnRequest() пусты, функция, указанная в DoFunc, обработает все входящие запросы к прокси. В данном случае она добавит заголовок к запросу и вернёт его вызывающему коду.
Прокси отправит изменённый запрос получателю.
Вы также можете использовать Do вместо DoFunc, если реализуете указанный интерфейс в своём типе.
⚠️ Обратите внимание: мы вернули nil в качестве ответа. Если возвращённый ответ не равен nil, goproxy отбросит запрос и отправит клиенту указанный ответ.
Отклонять соединения с www.reddit.com в период с 8 до 17 по местному времени сервера: