Сопствени прокси за HTTP клијент у Go-у
Клонирајте подразумевани транспорт Go-а, поставите ProxyURL за изабрани IP и не мењајте понашање других клијената.
Прокси бира транспорт 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.