#go #httpserver #http-proxy
#Вперед #httpserver #http-прокси
Вопрос:
Я понимаю, что поле прокси http.Транспорт запрашивает функцию, которая генерирует адреса прокси-сервера. Итак, это мой обходной путь:
roundtripper := amp;http.Transport{
Proxy: proxyrouter.Calculateproxy,
...
}
Итак, тип прокси такой func(*Request) (*url.URL, error)
. Это связывается с сервером и позже вызывается с помощью:
response := roundtripper.RoundTrip(request)
Который возвращает ответ. Теперь есть ли какой-нибудь способ узнать, какой прокси-адрес использовался для получения этого ответа? (поскольку моя функция Calculateproxy принимает только случайные адреса)
Комментарии:
1. Вам нужно будет проверить заголовки. Однако я не уверен, будут ли они присутствовать, поскольку транспортный уровень добавляет их в раздел private extra header . В любом случае сбросьте заголовки req resp? Они могут дать вам подсказку.
Ответ №1:
Попросите функцию прокси добавить заголовок для записи используемого прокси-сервера:
Transport{
Proxy: func(req *Request) (*url.URL, error) {
p, err := proxyrouter.Calculateproxy(req)
if err != nil {
return err
}
req.Header.Set("X-Proxy-Addr", p.String())
return req, nil
},
}
http.Response
Имеет ссылку на исходный запрос
proxy := resp.Request.Header.Get("X-Proxy-Addr")
Комментарии:
1. Да, я думаю, что это единственный способ.. Хотя меня здесь очень беспокоят проблемы безопасности.
2. @PieterjanLambein: На самом деле нет никаких проблем с безопасностью. Прокси-серверы уже известны по их адресу в поле «by» заголовка «Forwarded» или в заголовке «Via», или просто по хосту, записывающему адрес подключения. Если вы все еще обеспокоены, используйте непрозрачный идентификатор, который не соотносится ни с чем за пределами выполнения вашей программы.