Переход туда и обратно / Адрес транспортного прокси-сервера

#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», или просто по хосту, записывающему адрес подключения. Если вы все еще обеспокоены, используйте непрозрачный идентификатор, который не соотносится ни с чем за пределами выполнения вашей программы.