Повторное использование tranport с пользовательским прокси-функционалом возвращает противоречивые результаты - PullRequest
0 голосов
/ 13 октября 2019

Я создал замыкание, которое фиксирует адрес прокси-сервера обратного соединения с% d, чтобы можно было вращать прокси с помощью rand, например. прокси-функция записывает эту строку "https://[redacted] -session-% d: [отредактировано] @ [отредактировано] ". Функция работает правильно, имея возможность подключиться к прокси-серверу и вернуть запрошенные данные. Но при тестировании на сервисах, которые возвращают ваш IP-адрес, я получал противоречивые результаты. https://canihazip.com/s возвращает один и тот же адрес для каждого запроса на один прогон;Под этим я подразумеваю, что при запуске программы я делаю 3 GET для сайта, и один и тот же IP-адрес будет возвращаться для каждого запроса, но при повторном запуске программы я получу другой IP-адрес при первом запуске, но все IP-адреса будутбыть таким же. Теперь при тестировании на https://httpbin.org/get я получу уникальный IP-адрес для каждого запроса.

Я неправильно использую транспорт? Должен ли я не доверять результатам canihazip? Есть ли какая-то другая часть транспорта, которую я должен использовать?

Так я создаю функцию прокси для транспорта

func rotatingProxy(options *Options) func(r *http.Request) (url *url.URL, err error) {
    rotatingAddress := options.BuildRotatingAddress()

    return func(*http.Request) (*url.URL, error) {
        randomInt := prng.Int31n(math.MaxInt32)
        sessionId := int(randomInt)

        address := fmt.Sprintf(rotatingAddress, sessionId)

        addressUrl, err := url.Parse(address)

        return addressUrl, err
    }
}

Тестовый код (ошибки для краткости игнорируются)

req1, _ := http.NewRequest("GET", "https://canihazip.com/s", nil)
req2, _ := http.NewRequest("GET", "https://httpbin.org/get", nil)

client := &http.Client{
    Transport:&http.Transport{
        Proxy:rotatingProxy(opts),
    },
}

for i := 0; i < 3; i++ {
    go func(iter int) {
        res, _ := client.Do(req1)
        body1, _ := ReadAll(res.Body)

        fmt.Println(iter)
        fmt.Println(string(body1))

        res, _ = client.Do(req2)

        body2, _ := ReadAll(res.Body)

        fmt.Println(iter)
        fmt.Println(string(body2))
    }(i)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...