Транспортот на HTTP клиентот во Go го избира проксито. Клонирајте го стандардниот транспорт пред промена за другите корисници на стандардниот клиент да ги задржат постојните патеки.

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "net/url"
    "time"
)

func main() {
    proxyURL, err := url.Parse("http://203.0.113.10:8080")
    if err != nil {
        log.Fatal(err)
    }

    transport := http.DefaultTransport.(*http.Transport).Clone()
    transport.Proxy = http.ProxyURL(proxyURL)
    defer transport.CloseIdleConnections()

    client := &http.Client{
        Transport: transport,
        Timeout:   15 * time.Second,
    }

    response, err := client.Get("https://example.com/")
    if err != nil {
        log.Fatal(err)
    }
    defer response.Body.Close()

    fmt.Println(response.StatusCode)
    if _, err := io.Copy(io.Discard, response.Body); err != nil {
        log.Fatal(err)
    }
}

Адресата е документациски пример. Заменете ја со вистинска IP адреса и порта на HTTP прокси, на пример кандидат од листата со HTTP прокси-сервери. Примерот ја користи само стандардната библиотека на Go; ова барање преку HTTP прокси не бара пакет SOCKS или променлива на околината за целиот процес.

Зошто да не го менувате DefaultTransport директно?

Стандардниот транспорт е споделен. Неговото менување може да влијае врз код што никогаш не побарал ваше прокси, а менувањето додека барања го користат создава непотребни проблеми со истовременоста. Посебен транспорт ја прави патеката дел од конфигурацијата на овој клиент.

http.ProxyURL враќа селектор што секогаш ја избира дадената URL адреса. Тоа се разликува од стандардниот селектор на околината, кој ги зема предвид прокси променливите и правилата за заобиколување. Ако сакате да тестирате еден конкретен запис од HTTP листата, експлицитниот селектор го отстранува овој извор на нејаснотија.

Затворете го одговорот и користете го клиентот повторно

Примерот го чита целото тело на одговорот и го затвора. Читањето до крај му помага на транспортот повторно да ја користи врската кога може. Во програма со повеќе барања низ истото прокси задржете ги клиентот и транспортот наместо да создавате нов пар за секое барање.

Временското ограничување на клиентот не го опфаќа само отворањето на сокетот, туку и животниот циклус на барањето, вклучувајќи читање на телото на одговорот. Грешките при читање сè уште мора да се обработат по враќањето на Get. Статус како 403 не е транспортна грешка на Go, затоа проверувајте StatusCode одделно од err.

Поврзани статии