Proxy server on Golang

Proxy server on Golang

@webware

t.me/webware


Всем доброго времени суток.


Решил попробовать написать небольшую статейку о том , как реализовать прокси сервер на хипстерском языке - Golang 


В моих планах есть идея, написать несколько ознакомительных статей про Go. Поэтому попробуем с малого)


Итак, для начала постаим задачу: Реализовать прокси сервер с перехватом полного запроса. 

Первый этап:

Для начала давайте определимся с архитектурой приложения. 

Golang - достаточно специфиччный в этом плане.


Для нашего проекта она будет выглядить следующим образом:

|--MitmProxy/

|----src/

|------github.com/

|--------mitmproxy/

|----------main/

В нашей задаче будут использованы , только стандартные пакеты, что приятно )


Второй этап:


Теперь мы должны разобраться , какие пакеты нам понадобяться для реализации наешего кода.

import (
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
    "fmt"
)


  • log - понадобиться для логирования
  • net/http - базовый пакет для работы c HTTP протоколом
  • net/http/httputil - пакет, который имеет расширеный функционал для работы с HTTP
  • net/url - пакет для анализа URL
  • fmt - пакет для работы с вводом и выводом

Третий этап:

Приступим к написанию кода x) 

Для начала мы должны решить , какой таргет у нас будет.

таргет - конечный ресурс , куда пойдет запрос

в моем случае это будет localhost:8000

target := &url.URL{Scheme: "http", Host: "localhost:8000"}


затем создадим нашу reverse proxy

np := httputil.NewSingleHostReverseProxy(target)


Ну и наконец-то запустим наш сервер, я буду поднимать его на 8088 порту

log.Fatal(http.ListenAndServe(":8088", nil))


И самый финальный штрих - получения всех запросов

Опишем функцию , которая будет перехватывать наши запросы и выводить в стандартный output

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
 dReq, err := httputil.DumpRequest(r, true)
 if err != nil {
  log.Println(err)
 }
 fmt.Println(string(dReq))
 np.ServeHTTP(w, r)
})

А теперь разберемся в мелочашь и что тут происходит:


  • http.HandleFunc - обработчик запросов по "/"
  • httputil.DumpRequest - функция , которая возвращает запрос в представлениее проводника HTTP


Четвертый этап:

Теперь давайте посмотри на результат нашей прокси) 


Запускаем наш сервер с проксей

go run main.go

Запускаем наш сервер на 8000

python -m SimpleHTTPServer

и делаем проверку:

curl http://localhost:8088 


Тепрь мы можем видеть:

Ура. Наша прокся работает 


Заключение​


В принципе писать софт подобного рода достаточно просто. Просто нужно явно понимать , что мы хотим увидеть в результате. Я рассмотрел вариант только с http. Скелет прокси - элементарный. Расти можно куда угодно имея хотя бы небольшое представление о программировании.


Всем хороших выходных 


P.S Замечания приветствуются, жду фидбека :3

P.P.S. Исходник - https://pastebin.com/TPL0k9PS

Источник codeby.net

Report Page