Proxy wybiera transport klienta HTTP w Go. Sklonuj standardowy transport przed zmianą, aby inni użytkownicy domyślnego klienta zachowali dotychczasowe trasy.

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)
    }
}

Adres jest przykładem dokumentacyjnym. Zastąp go rzeczywistym adresem IP i portem proxy HTTP, na przykład kandydatem z listy proxy HTTP. Przykład korzysta wyłącznie z biblioteki standardowej Go; to żądanie przez proxy HTTP nie wymaga pakietu SOCKS ani zmiennej środowiskowej dla całego procesu.

Dlaczego nie zmieniać bezpośrednio DefaultTransport?

Domyślny transport jest współdzielony. Jego zmiana może wpłynąć na kod, który nigdy nie miał używać twojego proxy, a modyfikacje w trakcie obsługi żądań wprowadzają zbędne problemy współbieżności. Osobny transport czyni trasę częścią konfiguracji tego klienta.

http.ProxyURL zwraca selektor, który zawsze wybiera podany URL. To inne zachowanie niż domyślny selektor środowiska, uwzględniający zmienne proxy i reguły omijania. Jeśli chcesz przetestować jeden konkretny wpis z listy HTTP, jawny selektor usuwa to źródło niejednoznaczności.

Zamknij odpowiedź i używaj klienta ponownie

Przykład odczytuje całą treść odpowiedzi i ją zamyka. Odczyt do końca pomaga transportowi ponownie użyć połączenia, gdy jest to możliwe. Jeśli program wysyła wiele żądań przez to samo proxy, zachowaj klienta i transport zamiast tworzyć nową parę dla każdego żądania.

Limit czasu klienta obejmuje nie tylko otwieranie gniazda, lecz także cykl żądania, w tym odczyt treści odpowiedzi. Błędy odczytu nadal wymagają obsługi po powrocie Get. Status taki jak 403 nie jest błędem transportu Go, więc sprawdzaj StatusCode osobno od err.

Powiązane artykuły