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  }