Проксі выбірае transport HTTP-кліента Go. Перш чым мяняць стандартны transport, клануйце яго, каб іншыя карыстальнікі стандартнага кліента захавалі свае маршруты.

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 непасрэдна?

Стандартны transport агульны. Яго змена можа паўплываць на код, які не збіраўся карыстацца вашым проксі, а змена падчас запытаў стварае лішнія праблемы адначасовага доступу. Асобны transport робіць маршрут часткай канфігурацыі менавіта гэтага кліента.

http.ProxyURL вяртае селектар, які заўсёды выбірае перададзены URL. Гэта адрозніваецца ад стандартнага селектара асяроддзя, які ўлічвае проксі-зменныя і правілы абыходу. Калі вы хочаце праверыць адзін пэўны запіс HTTP-спіса, відавочны селектар прыбірае гэтую крыніцу неадназначнасці.

Закрыйце адказ і выкарыстоўвайце кліент паўторна

Прыклад дачытвае цела адказу і закрывае яго. Чытанне да канца дапамагае transport паўторна выкарыстоўваць злучэнне, калі гэта магчыма. Калі праграма робіць некалькі запытаў праз адзін проксі, захоўвайце кліент і transport замест стварэння новай пары для кожнага запыту.

Тайм-аўт кліента абмяжоўвае не толькі адкрыццё сокета, але і жыццёвы цыкл запыту, уключаючы чытанне цела адказу. Памылкі чытання трэба апрацоўваць і пасля вяртання Get. Статус кшталту 403 — не памылка transport Go, таму правярайце StatusCode асобна ад err.

Падобныя артыкулы