Badilisha njia za proksi za HTTP za Go bila kubadilisha Client.Transport
Tumia kifuniko cha RoundTripper kilichosawazishwa kuchapisha usafirishaji mpya wa proksi uliosanidiwa bila kubadilisha sehemu hai ya http.Client.
Ikiwa http.Client tayari inashirikiwa na maombi ya wakati mmoja, weka sehemu yake ya Transport thabiti. Kifuniko kinaweza kusawazisha ni usafirishaji upi uliosanidiwa kikamilifu unaopokea kila safari inayofuata:
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()
}Kwa net/http na sync, ianzishe kabla ya kuchapisha mteja:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport na nextTransport lazima ziwe non-nil, zilizosanidiwa kikamilifu na salama kwa usawa. Jenga kila usafirishaji wa proksi kabla ya kuuchapisha, na uache usanidi wake usibadilike wakati maombi yanautumia.
Kufuli hulinda picha ya kielekezi pekee, kwa hivyo ombi la polepole halishiki kufuli la uelekezaji katika kubadilishana kwake kote kwa mtandao. Ombi ambalo tayari linatumia picha ya awali linaendelea kwenye usafirishaji huo; ubadilishaji hauulizii tena wala hauhamishi muunganisho wake.
Hifadhi na ustaafishe usafirishaji wa zamani kupitia mzunguko mdogo wa maisha wa programu, ukiruhusu kazi inayoendelea kukamilika na kufunga mabwawa yaliyotulia inapofaa. Uelekezaji upya unaweza kusababisha RoundTrip nyingine baada ya ubadilishaji. Ikiwa mtiririko mzima wa kazi unahitaji njia moja, ipe njia hiyo kwenye mpaka wa mtiririko wa kazi badala ya kubadilisha kichaguzi hiki kinachoshirikiwa katikati.