github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/worker/transport/garden_round_tripper.go (about) 1 package transport 2 3 import "net/http" 4 5 type gardenRoundTripper struct { 6 db TransportDB 7 workerName string 8 innerRoundTripper http.RoundTripper 9 cachedHost *string 10 } 11 12 func NewGardenRoundTripper(workerName string, workerHost *string, db TransportDB, innerRoundTripper http.RoundTripper) http.RoundTripper { 13 return &gardenRoundTripper{ 14 innerRoundTripper: innerRoundTripper, 15 workerName: workerName, 16 db: db, 17 cachedHost: workerHost, 18 } 19 } 20 21 func (c *gardenRoundTripper) RoundTrip(request *http.Request) (*http.Response, error) { 22 if c.cachedHost == nil { 23 savedWorker, found, err := c.db.GetWorker(c.workerName) 24 if err != nil { 25 return nil, err 26 } 27 28 if !found { 29 return nil, WorkerMissingError{WorkerName: c.workerName} 30 } 31 32 if savedWorker.GardenAddr() == nil { 33 return nil, WorkerUnreachableError{ 34 WorkerName: c.workerName, 35 WorkerState: string(savedWorker.State()), 36 } 37 } 38 39 c.cachedHost = savedWorker.GardenAddr() 40 } 41 42 updatedURL := *request.URL 43 updatedURL.Host = *c.cachedHost 44 45 updatedRequest := *request 46 updatedRequest.URL = &updatedURL 47 48 response, err := c.innerRoundTripper.RoundTrip(&updatedRequest) 49 if err != nil { 50 c.cachedHost = nil 51 } 52 53 return response, err 54 }