[XAPID-1070] add auth to requests sent by bundle downloader. Reuse http clients
diff --git a/bundle.go b/bundle.go index b2206ea..622c8ed 100644 --- a/bundle.go +++ b/bundle.go
@@ -48,12 +48,12 @@ apiMan apiManagerInterface concurrentDownloads int markDeploymentFailedAfter time.Duration - bundleDownloadConnTimeout time.Duration bundleRetryDelay time.Duration bundleCleanupDelay time.Duration downloadQueue chan *DownloadRequest isClosed *int32 workers []*BundleDownloader + client *http.Client } type blobServerResponse struct { @@ -103,7 +103,7 @@ blobId: id, backoffFunc: createBackoff(retryIn, maxBackOff), markFailedAt: markFailedAt, - connTimeout: bm.bundleDownloadConnTimeout, + client: bm.client, } } @@ -158,8 +158,8 @@ blobId string backoffFunc func() markFailedAt time.Time - connTimeout time.Duration blobServerURL string + client *http.Client } func (r *DownloadRequest) downloadBundle() error { @@ -172,7 +172,7 @@ } } - downloadedFile, err := downloadFromURI(r.blobServerURL, r.blobId, r.connTimeout) + downloadedFile, err := downloadFromURI(r.client, r.blobServerURL, r.blobId) if err != nil { log.Errorf("Unable to download blob file blobId=%s err:%v", r.blobId, err) @@ -210,7 +210,7 @@ return path.Join(bundlePath, base64.StdEncoding.EncodeToString([]byte(blobId))) } -func getSignedURL(blobServerURL string, blobId string, bundleDownloadConnTimeout time.Duration) (string, error) { +func getSignedURL(client *http.Client, blobServerURL string, blobId string) (string, error) { blobUri, err := url.Parse(blobServerURL) if err != nil { @@ -224,7 +224,7 @@ uri := blobUri.String() - surl, err := getURIReader(uri, bundleDownloadConnTimeout) + surl, err := getUriReaderWithAuth(client, uri) if err != nil { log.Errorf("Unable to get signed URL from BlobServer %s: %v", uri, err) return "", err @@ -248,12 +248,12 @@ // downloadFromURI involves retrieving the signed URL for the blob, and storing the resource locally // after downloading the resource from GCS (via the signed URL) -func downloadFromURI(blobServerURL string, blobId string, bundleDownloadConnTimeout time.Duration) (tempFileName string, err error) { +func downloadFromURI(client *http.Client, blobServerURL string, blobId string) (tempFileName string, err error) { var tempFile *os.File log.Debugf("Downloading bundle: %s", blobId) - uri, err := getSignedURL(blobServerURL, blobId, bundleDownloadConnTimeout) + uri, err := getSignedURL(client, blobServerURL, blobId) if err != nil { log.Errorf("Unable to get signed URL for blobId {%s}, error : {%v}", blobId, err) return @@ -268,7 +268,7 @@ tempFileName = tempFile.Name() var confReader io.ReadCloser - confReader, err = getURIReader(uri, bundleDownloadConnTimeout) + confReader, err = getUriReaderWithAuth(client, uri) if err != nil { log.Errorf("Unable to retrieve bundle %s: %v", uri, err) return @@ -286,12 +286,14 @@ } // retrieveBundle retrieves bundle data from a URI -func getURIReader(uriString string, bundleDownloadConnTimeout time.Duration) (io.ReadCloser, error) { - - client := http.Client{ - Timeout: bundleDownloadConnTimeout, +func getUriReaderWithAuth(client *http.Client, uriString string) (io.ReadCloser, error) { + req, err := http.NewRequest("GET", uriString, nil) + if err != nil { + return nil, err } - res, err := client.Get(uriString) + // add Auth + req.Header.Add("Authorization", getBearerToken()) + res, err := client.Do(req) if err != nil { return nil, err }
diff --git a/bundle_test.go b/bundle_test.go index 0b8b535..30626f9 100644 --- a/bundle_test.go +++ b/bundle_test.go
@@ -72,11 +72,13 @@ apiMan: dummyApiMan, concurrentDownloads: concurrentDownloads, markDeploymentFailedAfter: 5 * time.Second, - bundleDownloadConnTimeout: time.Second, bundleRetryDelay: time.Second, bundleCleanupDelay: 5 * time.Second, downloadQueue: make(chan *DownloadRequest, downloadQueueSize), isClosed: new(int32), + client: &http.Client{ + Timeout: time.Second, + }, } testBundleMan.initializeBundleDownloading() time.Sleep(100 * time.Millisecond) @@ -101,7 +103,7 @@ // setup timeout atomic.StoreInt32(blobServer.signedTimeout, 1) atomic.StoreInt32(blobServer.blobTimeout, 1) - testBundleMan.bundleDownloadConnTimeout = 500 * time.Millisecond + testBundleMan.client.Timeout = 500 * time.Millisecond testBundleMan.bundleRetryDelay = 50 * time.Millisecond // download blobs @@ -116,7 +118,7 @@ // setup timeout atomic.StoreInt32(blobServer.signedTimeout, 1) atomic.StoreInt32(blobServer.blobTimeout, 1) - testBundleMan.bundleDownloadConnTimeout = 100 * time.Millisecond + testBundleMan.client.Timeout = 100 * time.Millisecond testBundleMan.bundleRetryDelay = 100 * time.Millisecond testBundleMan.markDeploymentFailedAfter = 200 * time.Millisecond
diff --git a/init.go b/init.go index d27b566..6384939 100644 --- a/init.go +++ b/init.go
@@ -145,11 +145,13 @@ apiMan: apiMan, concurrentDownloads: concurrentDownloads, markDeploymentFailedAfter: markDeploymentFailedAfter, - bundleDownloadConnTimeout: bundleDownloadConnTimeout, bundleRetryDelay: time.Second, bundleCleanupDelay: bundleCleanupDelay, downloadQueue: make(chan *DownloadRequest, downloadQueueSize), isClosed: new(int32), + client: &http.Client{ + Timeout: bundleDownloadConnTimeout, + }, } bundleMan.initializeBundleDownloading()