Առանձին պրոքսի 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 պրոքսիի IP-ով և պորտով, օրինակ՝ HTTP պրոքսիների ցանկից ընտրված թեկնածուով։ Օրինակն օգտագործում է միայն Go-ի ստանդարտ գրադարանը․ այս HTTP պրոքսիի հարցման համար պետք չէ SOCKS փաթեթ կամ ամբողջ գործընթացի միջավայրի փոփոխական։
Ինչո՞ւ ուղղակի չփոխել DefaultTransport-ը
Լռելյայն transport-ը ընդհանուր է։ Փոխելը կարող է ազդել կոդի վրա, որը երբեք չի խնդրել օգտագործել ձեր պրոքսին, իսկ հարցումների ընթացքում այն փոխելը ստեղծում է զուգահեռ աշխատանքի խուսափելի խնդիրներ։ Առանձին transport-ը երթուղին դարձնում է այս հաճախորդի կարգավորման մաս։
http.ProxyURL-ը վերադարձնում է ընտրիչ, որը միշտ ընտրում է տրված URL-ը։ Այն տարբերվում է լռելյայն միջավայրային ընտրիչից, որը հաշվի է առնում պրոքսիի փոփոխականներն ու շրջանցման կանոնները։ Եթե ցանկանում եք ստուգել HTTP ցանկի մեկ որոշակի գրառում, բացահայտ ընտրիչը վերացնում է այս անորոշությունը։
Փակեք պատասխանը և կրկին օգտագործեք հաճախորդը
Օրինակը մինչև վերջ կարդում է պատասխանի մարմինն ու փակում այն։ Ամբողջական ընթերցումը օգնում է transport-ին հնարավորության դեպքում կրկին օգտագործել կապը։ Նույն պրոքսիով մի քանի հարցում կատարող ծրագրում պահեք հաճախորդն ու transport-ը՝ ամեն հարցման համար նոր զույգ ստեղծելու փոխարեն։
Հաճախորդի ժամանակային սահմանը միայն սոքեթի բացումը չէ․ այն սահմանափակում է նաև հարցման կյանքի ցիկլը՝ ներառյալ պատասխանի մարմնի ընթերցումը։ Ընթերցման սխալները պետք է մշակել նաև Get-ի վերադարձից հետո։ 403-ի նման կարգավիճակը Go transport-ի սխալ չէ, ուստի StatusCode-ը ստուգեք err-ից առանձին։