Yí ipa ọ̀nà proxy HTTP Go láìyí Client.Transport
Lo àwra RoundTripper tí a múṣọra láti ṣe àtẹ̀jáde transport proxy tuntun tí a ti ṣètò láìyí pápá http.Client tí ń ṣiṣẹ́.
Tí a bá ti ń pín http.Client láàárín àwọn ìbéèrè àkókò kan náà, jẹ́ kí pápá Transport rẹ̀ dúró ṣinṣin. Àwra náà lè múṣọra irú transport tí a ṣètò ní kíkún tí ìrìn kọ̀ọ̀kan tó ń bọ̀ yóò gbà:
type routeSlot struct {
mu sync.RWMutex
current http.RoundTripper
}
func (s *routeSlot) RoundTrip(r *http.Request) (*http.Response, error) {
s.mu.RLock()
current := s.current
s.mu.RUnlock()
return current.RoundTrip(r)
}
func (s *routeSlot) Set(next http.RoundTripper) {
s.mu.Lock()
s.current = next
s.mu.Unlock()
}Pẹ̀lú net/http àti sync, dá a sílẹ̀ kí o tó ṣe àtẹ̀jáde ẹ̀rọ náà:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport àti nextTransport gbọ́dọ̀ jẹ́ aláì-nil, tí a ṣètò ní kíkún àti ààbò sí ìṣeọ̀pọ̀. Kọ́ transport proxy kọ̀ọ̀kan kí o tó ṣe àtẹ̀jáde rẹ̀, kí o má sì yí ètò rẹ̀ padà nígbà tí àwọn ìbéèrè ń lò ó.
Ìtìsọ̀ náà ń dáàbò bo àwòrán atọ́ka nìkan, nítorí náà ìbéèrè tí ó lọra kò di ìtìsọ̀nà ipa mú fún gbogbo ìpààrọ̀ nẹ́tíwọ́kì rẹ̀. Ìbéèrè tí ó ti ń lo àwòrán tẹ́lẹ̀ ń tẹ̀síwájú lórí transport yẹn; ìyípadà kò tún ṣe é tàbí kò gbé àkópọ̀ rẹ̀ kúrò.
Pa àwọn transport àtijọ́ mọ́ kí o sì mú wọn jáde nípasẹ̀ ìgbésí-ayé tí ó ní ìlà ti app náà, jẹ́ kí iṣẹ́ tí ń lọ parí kí o sì ti àwọn adágún tí ó dùbúlẹ̀ mọ́ nígbà tí ó bá yẹ. Ìtúnjú sílẹ̀ lè fa RoundTrip mìíràn lẹ́yìn ìyípadà. Tí gbogbo ìṣàn iṣẹ́ bá nílò ipa kan, yàn ipa yẹn ní ààlà ìṣàn iṣẹ́ dípò yíyí olùyàn tí a pín yìí padà ní àárín.