ប្តូរផ្លូវ proxy HTTP របស់ Go ដោយមិនកែប្រែ Client.Transport
ប្រើ wrapper RoundTripper ដែលសមកាលកម្ម ដើម្បីផ្សព្វផ្សាយ transport proxy ដែលបានកំណត់រចនាសម្ព័ន្ធថ្មី ដោយមិនកែប្រែ field http.Client ដែលកំពុងដំណើរការ។
ប្រសិនបើ http.Client ត្រូវបានចែករំលែកដោយសំណើដំណាលគ្នារួចហើយ សូមរក្សា field Transport របស់វាឱ្យនៅថេរ។ Wrapper អាចធ្វើសមកាលកម្ម transport ដែលបានកំណត់ពេញលេញ ដែលការធ្វើដំណើរបន្ទាប់នីមួយៗទទួលបាន:
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()
}ដោយប្រើ net/http និង sync សូមចាប់ផ្តើមវាមុនពេលផ្សព្វផ្សាយ client:
slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}
slot.Set(nextTransport)initialTransport និង nextTransport ត្រូវតែ non-nil កំណត់រចនាសម្ព័ន្ធពេញលេញ និងមានសុវត្ថិភាពចំពោះភាពដំណាលគ្នា។ សាងសង់ transport proxy នីមួយៗមុនពេលផ្សព្វផ្សាយ ហើយទុកការកំណត់រចនាសម្ព័ន្ធរបស់វាមិនផ្លាស់ប្តូរ ខណៈសំណើកំពុងប្រើវា។
សោការពារតែរូបភាព pointer ដូច្នេះសំណើយឺតមិនកាន់សោផ្លូវពេញរយៈពេលផ្លាស់ប្តូរបណ្តាញរបស់វាទេ។ សំណើដែលកំពុងប្រើរូបភាពមុនបន្តលើ transport នោះ; ការប្តូរមិនចាក់ឡើងវិញ ឬផ្លាស់ការតភ្ជាប់របស់វាទេ។
រក្សា និងដក transport ចាស់ចេញតាមវដ្តជីវិតមានកំណត់របស់កម្មវិធី ដោយអនុញ្ញាតឱ្យការងារកំពុងដំណើរការបញ្ចប់ និងបិទអាងទំនេរនៅពេលសមស្រប។ ការប្តូរទិសអាចបង្ក RoundTrip មួយទៀតបន្ទាប់ពីប្តូរ។ ប្រសិនបើ workflow ទាំងមូលត្រូវការផ្លូវតែមួយ សូមកំណត់ផ្លូវនោះនៅ ព្រំដែន workflow ជំនួសឱ្យការប្តូរ selector ដែលចែករំលែកនេះនៅពាក់កណ្តាលផ្លូវ។