Proxy-сервер на Go (с использованием готовой библиотеки)
Требуется написать MITM-прокси на Go с использованием библиотеки https://github.com/elazarl/goproxy
Требования:
- Сервер должен уметь работать с HTTP и HTTPS запросами
- Все запросы проксируются на вышестоящие прокси
- Для HTTPS сервер должен использовать свой ключ подписи запросов (Man in the middle) и внутренности всех запросов
- Сервер должен вытаскивать из запроса все заголовки начинающиеся на "fc-"
- В fc-заголовках указано название родительского прокси. Соответствия название – конфиг (детали ниже) хранится прямо в коде сервера
- В fc-заголовках указан id сессии, если эта сессия недавно встречалась – используем тот же ip,порт родительского сервиса
- Есть блэклист – спискок вхождений в URL запроса, на которые мы всегда просто отвечаем одним и тем же ответом с ошибкой (не проксируем выше)
- Часть ответов (в зависимости от content-type ответа) должна складываться в кеш (в памяти, рекомендуется использовать библиотеку вроде github.com/bluele/gcache ) и отдаваться оттуда для следующих запросов
- В консоль выводится статус ответа, время, название родительского сервера и url
- В случае неудачного ответа родительского прокси, повторяем запрос
Конфиг родительского прокси:
- Название (ключ)
- Набор ip-порт (может быть много, выбирается для запроса рандомно)
- Авторизация если требуется
В примерах goproxy есть примеры почти для всех используемых кейсов.