Propra prokurilo por HTTP-kliento en Go
Klonu la defaŭltan transporton de Go, agordu ProxyURL por la elektita prokurila IP kaj ne ŝanĝu la konduton de aliaj klientoj.
La transporto de HTTP-kliento en Go elektas la prokurilon. Klonu la norman transporton antaŭ ol ŝanĝi ĝin, por ke aliaj uzantoj de la defaŭlta kliento konservu siajn ekzistantajn vojojn.
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)
}
}
La adreso estas dokumenta lokokupilo. Anstataŭigu ĝin per vera IP kaj pordo de HTTP-prokurilo, ekzemple kandidato elektita el la listo de HTTP-prokuriloj. La ekzemplo uzas nur la norman bibliotekon de Go; ĉi tiu HTTP-prokurila peto bezonas nek SOCKS-pakon nek mediovariablon por la tuta procezo.
Kial ne rekte ŝanĝi DefaultTransport?
La defaŭlta transporto estas komuna. Ŝanĝi ĝin povas influi kodon kiu neniam petis uzi vian prokurilon, kaj ŝanĝi transporton dum petoj uzas ĝin enkondukas evitindajn samtempajn problemojn. Dediĉita transporto faras la vojon parto de la agordo de ĉi tiu kliento.
http.ProxyURL liveras elektilon kiu ĉiam elektas la donitan URL-on. Tio malsamas al la defaŭlta media elektilo, kiu konsideras prokurilajn variablojn kaj preterirajn regulojn. Se vi volas testi unu specifan eron de la HTTP-listo, la eksplicita elektilo forigas tiun fonton de ambigueco.
Fermu la respondon kaj reuzu la klienton
La ekzemplo legas la tutan respondkorpon kaj fermas ĝin. Legi ĝis la fino helpas la transporton reuzi konekton kiam eblas. En programo kiu faras plurajn petojn tra la sama prokurilo, konservu la klienton kaj transporton anstataŭ krei novan paron por ĉiu peto.
La tempolimo de la kliento kovras pli ol malfermon de la ingo; ĝi ankaŭ limigas la vivociklon de la peto, inkluzive legadon de la respondkorpo. Legeraroj ankoraŭ bezonas traktadon post la reveno de Get. Stato kiel 403 ne estas transporta eraro de Go, do kontrolu StatusCode aparte de err.