Go HTTP кардарына өзүнчө прокси коюу
Goнун демейки transportун клондоп, тандалган прокси IP үчүн ProxyURL коюңуз жана башка кардарлардын ишин өзгөртпөңүз.
Go HTTP кардарында проксини transport тандайт. Демейки кардардын башка колдонуучулары учурдагы жолдорун сакташы үчүн стандарттуу 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)
}
}
Дарек — документтик мисал. Аны HTTP прокси тизмесинен тандалган талапкер сыяктуу чыныгы HTTP прокси IPси жана порту менен алмаштырыңыз. Мисал Goнун стандарттуу китепканасын гана колдонот; бул HTTP прокси суроосу үчүн SOCKS пакети же бүт процесске таасир эткен чөйрө өзгөрмөсү керек эмес.
Эмне үчүн DefaultTransportту түз өзгөртпөө керек?
Демейки transport жалпы колдонулат. Аны өзгөртүү проксиңизди сурабаган кодго таасир этиши мүмкүн; суроолор аны колдонуп жатканда өзгөртүү алдын алууга боло турган бир убакта иштөө көйгөйлөрүн жаратат. Өзүнчө transport жолду ушул кардардын жөндөөсүнүн бөлүгү кылат.
http.ProxyURL дайыма берилген URLди тандаган тандагычты кайтарат. Бул прокси өзгөрмөлөрүн жана айланып өтүү эрежелерин эске алган демейки чөйрө тандагычынан айырмаланат. Эгер HTTP тизмесиндеги бир так жазууну текшергиңиз келсе, ачык көрсөтүлгөн тандагыч ошол бүдөмүктүктү жок кылат.
Жоопту жаап, кардарды кайра колдонуңуз
Мисал жооптун денесин аягына чейин окуп жабат. Толук окуу transportко мүмкүн болгондо байланышты кайра колдонууга жардам берет. Бир прокси аркылуу бир нече суроо жиберген программада ар бир суроого жаңы жуп түзбөй, кардар менен transportту сактаңыз.
Кардардын убакыт чеги сокетти ачууну гана эмес, жооптун денесин окууну камтыган суроонун жашоо циклин да чектейт. Get кайткандан кийин да окуу каталарын иштетүү керек. 403 сыяктуу абал Go transport катасы эмес, ошондуктан StatusCode менен errту өзүнчө текшериңиз.