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 პროქსის IP-ითა და პორტით, მაგალითად HTTP პროქსების სიიდან არჩეული კანდიდატით. მაგალითი მხოლოდ Go-ს სტანდარტულ ბიბლიოთეკას იყენებს; ამ HTTP პროქსის მოთხოვნას SOCKS პაკეტი ან მთელი პროცესის გარემოს ცვლადი არ სჭირდება.

რატომ არ უნდა შეცვალოთ DefaultTransport პირდაპირ?

ნაგულისხმევი transport გაზიარებულია. მისმა შეცვლამ შეიძლება გავლენა მოახდინოს კოდზე, რომელსაც თქვენი პროქსის გამოყენება არ მოუთხოვია. მოთხოვნების მუშაობისას მისი ცვლილება ასარიდებელ კონკურენტულ პრობლემებსაც ქმნის. ცალკე transport მარშრუტს ამ კლიენტის კონფიგურაციის ნაწილად აქცევს.

http.ProxyURL აბრუნებს ამრჩევს, რომელიც ყოველთვის მითითებულ URL-ს ირჩევს. ეს განსხვავდება გარემოს ნაგულისხმევი ამრჩევისგან, რომელიც პროქსის ცვლადებსა და გვერდის ავლის წესებს ითვალისწინებს. თუ გსურთ HTTP სიის ერთი კონკრეტული ჩანაწერის შემოწმება, აშკარა ამრჩევი გაურკვევლობის ამ წყაროს ხსნის.

დახურეთ პასუხი და ხელახლა გამოიყენეთ კლიენტი

მაგალითი პასუხის სხეულს ბოლომდე კითხულობს და ხურავს. ბოლომდე კითხვა transport-ს ეხმარება კავშირი შეძლებისდაგვარად ხელახლა გამოიყენოს. თუ პროგრამა იმავე პროქსით რამდენიმე მოთხოვნას აგზავნის, შეინარჩუნეთ კლიენტი და transport, ნაცვლად ყოველი მოთხოვნისთვის ახალი წყვილის შექმნისა.

კლიენტის დროის ლიმიტი მხოლოდ სოკეტის გახსნას კი არა, მოთხოვნის სასიცოცხლო ციკლსაც მოიცავს, პასუხის სხეულის კითხვის ჩათვლით. კითხვის შეცდომები Get-ის დაბრუნების შემდეგაც დასამუშავებელია. 403-ის მსგავსი სტატუსი Go transport-ის შეცდომა არ არის, ამიტომ StatusCode ცალკე შეამოწმეთ err-ისგან.

დაკავშირებული სტატიები