images: remove body copies
This commit is contained in:
parent
5ee6116420
commit
56e87cecb1
1 changed files with 2 additions and 35 deletions
|
@ -1222,15 +1222,6 @@ func uploadBlobChunked(ctx context.Context, mp ModelPath, url string, layer *Lay
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeRequest(ctx context.Context, method, url string, headers map[string]string, body io.Reader, regOpts *RegistryOptions) (*http.Response, error) {
|
func makeRequest(ctx context.Context, method, url string, headers map[string]string, body io.Reader, regOpts *RegistryOptions) (*http.Response, error) {
|
||||||
retryCtx := ctx.Value("retries")
|
|
||||||
var retries int
|
|
||||||
var ok bool
|
|
||||||
if retries, ok = retryCtx.(int); ok {
|
|
||||||
if retries > MaxRetries {
|
|
||||||
return nil, fmt.Errorf("maximum retries hit; are you sure you have access to this resource?")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !strings.HasPrefix(url, "http") {
|
if !strings.HasPrefix(url, "http") {
|
||||||
if regOpts.Insecure {
|
if regOpts.Insecure {
|
||||||
url = "http://" + url
|
url = "http://" + url
|
||||||
|
@ -1239,18 +1230,7 @@ func makeRequest(ctx context.Context, method, url string, headers map[string]str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// make a copy of the body in case we need to try the call to makeRequest again
|
req, err := http.NewRequestWithContext(ctx, method, url, body)
|
||||||
var buf bytes.Buffer
|
|
||||||
if body != nil {
|
|
||||||
_, err := io.Copy(&buf, body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bodyCopy := bytes.NewReader(buf.Bytes())
|
|
||||||
|
|
||||||
req, err := http.NewRequest(method, url, bodyCopy)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1274,25 +1254,12 @@ func makeRequest(ctx context.Context, method, url string, headers map[string]str
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the request is unauthenticated, try to authenticate and make the request again
|
|
||||||
if resp.StatusCode == http.StatusUnauthorized {
|
|
||||||
auth := resp.Header.Get("Www-Authenticate")
|
|
||||||
authRedir := ParseAuthRedirectString(string(auth))
|
|
||||||
token, err := getAuthToken(ctx, authRedir, regOpts)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
regOpts.Token = token
|
|
||||||
bodyCopy = bytes.NewReader(buf.Bytes())
|
|
||||||
ctx = context.WithValue(ctx, "retries", retries+1)
|
|
||||||
return makeRequest(ctx, method, url, headers, bodyCopy, regOpts)
|
|
||||||
}
|
|
||||||
|
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue