Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
ollama
Commits
aa45d7c1
Commit
aa45d7c1
authored
Sep 14, 2023
by
Michael Yang
Browse files
draft: explicitly follow upload redirects
parent
e35565c5
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
30 additions
and
9 deletions
+30
-9
server/upload.go
server/upload.go
+30
-9
No files found.
server/upload.go
View file @
aa45d7c1
...
@@ -55,7 +55,7 @@ func uploadBlobChunked(ctx context.Context, requestURL *url.URL, layer *Layer, r
...
@@ -55,7 +55,7 @@ func uploadBlobChunked(ctx context.Context, requestURL *url.URL, layer *Layer, r
}
}
defer
f
.
Close
()
defer
f
.
Close
()
// 95MB chunk size
// 95M
i
B chunk size
chunkSize
:=
95
*
1024
*
1024
chunkSize
:=
95
*
1024
*
1024
pw
:=
ProgressWriter
{
pw
:=
ProgressWriter
{
status
:
fmt
.
Sprintf
(
"uploading %s"
,
layer
.
Digest
),
status
:
fmt
.
Sprintf
(
"uploading %s"
,
layer
.
Digest
),
...
@@ -70,10 +70,10 @@ func uploadBlobChunked(ctx context.Context, requestURL *url.URL, layer *Layer, r
...
@@ -70,10 +70,10 @@ func uploadBlobChunked(ctx context.Context, requestURL *url.URL, layer *Layer, r
chunk
=
int64
(
chunkSize
)
chunk
=
int64
(
chunkSize
)
}
}
resp
,
err
:=
uploadBlobChunk
(
ctx
,
requestURL
,
f
,
offset
,
chunk
,
regOpts
,
&
pw
)
resp
,
err
:=
uploadBlobChunk
(
ctx
,
http
.
MethodPatch
,
requestURL
,
f
,
offset
,
chunk
,
regOpts
,
&
pw
)
if
err
!=
nil
{
if
err
!=
nil
{
fn
(
api
.
ProgressResponse
{
fn
(
api
.
ProgressResponse
{
Status
:
fmt
.
Sprintf
(
"error uploading
limit
: %v"
,
err
),
Status
:
fmt
.
Sprintf
(
"error uploading
chunk
: %v"
,
err
),
Digest
:
layer
.
Digest
,
Digest
:
layer
.
Digest
,
Total
:
layer
.
Size
,
Total
:
layer
.
Size
,
Completed
:
int
(
offset
),
Completed
:
int
(
offset
),
...
@@ -83,12 +83,15 @@ func uploadBlobChunked(ctx context.Context, requestURL *url.URL, layer *Layer, r
...
@@ -83,12 +83,15 @@ func uploadBlobChunked(ctx context.Context, requestURL *url.URL, layer *Layer, r
}
}
offset
+=
chunk
offset
+=
chunk
location
,
err
:=
resp
.
Location
()
location
:=
resp
.
Header
.
Get
(
"Docker-Upload-Location"
)
if
location
==
""
{
location
=
resp
.
Header
.
Get
(
"Location"
)
}
requestURL
,
err
=
url
.
Parse
(
location
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
requestURL
=
location
}
}
values
:=
requestURL
.
Query
()
values
:=
requestURL
.
Query
()
...
@@ -114,22 +117,40 @@ func uploadBlobChunked(ctx context.Context, requestURL *url.URL, layer *Layer, r
...
@@ -114,22 +117,40 @@ func uploadBlobChunked(ctx context.Context, requestURL *url.URL, layer *Layer, r
return
nil
return
nil
}
}
func
uploadBlobChunk
(
ctx
context
.
Context
,
requestURL
*
url
.
URL
,
r
io
.
ReaderAt
,
offset
,
limit
int64
,
opts
*
RegistryOptions
,
pw
*
ProgressWriter
)
(
*
http
.
Response
,
error
)
{
func
uploadBlobChunk
(
ctx
context
.
Context
,
method
string
,
requestURL
*
url
.
URL
,
r
io
.
ReaderAt
,
offset
,
limit
int64
,
opts
*
RegistryOptions
,
pw
*
ProgressWriter
)
(
*
http
.
Response
,
error
)
{
sectionReader
:=
io
.
NewSectionReader
(
r
,
int64
(
offset
),
limit
)
sectionReader
:=
io
.
NewSectionReader
(
r
,
int64
(
offset
),
limit
)
headers
:=
make
(
http
.
Header
)
headers
:=
make
(
http
.
Header
)
headers
.
Set
(
"Content-Type"
,
"application/octet-stream"
)
headers
.
Set
(
"Content-Type"
,
"application/octet-stream"
)
headers
.
Set
(
"Content-Length"
,
strconv
.
Itoa
(
int
(
limit
)))
headers
.
Set
(
"Content-Length"
,
strconv
.
Itoa
(
int
(
limit
)))
headers
.
Set
(
"Content-Range"
,
fmt
.
Sprintf
(
"%d-%d"
,
offset
,
offset
+
sectionReader
.
Size
()
-
1
))
headers
.
Set
(
"X-Redirect-Uploads"
,
"1"
)
if
method
==
http
.
MethodPatch
{
headers
.
Set
(
"Content-Range"
,
fmt
.
Sprintf
(
"%d-%d"
,
offset
,
offset
+
sectionReader
.
Size
()
-
1
))
}
for
try
:=
0
;
try
<
MaxRetries
;
try
++
{
for
try
:=
0
;
try
<
MaxRetries
;
try
++
{
resp
,
err
:=
makeRequest
(
ctx
,
"PATCH"
,
requestURL
,
headers
,
io
.
TeeReader
(
sectionReader
,
pw
),
opts
)
resp
,
err
:=
makeRequest
(
ctx
,
method
,
requestURL
,
headers
,
io
.
TeeReader
(
sectionReader
,
pw
),
opts
)
if
err
!=
nil
&&
!
errors
.
Is
(
err
,
io
.
EOF
)
{
if
err
!=
nil
&&
!
errors
.
Is
(
err
,
io
.
EOF
)
{
return
nil
,
err
return
nil
,
err
}
}
defer
resp
.
Body
.
Close
()
defer
resp
.
Body
.
Close
()
switch
{
switch
{
case
resp
.
StatusCode
==
http
.
StatusTemporaryRedirect
:
location
,
err
:=
resp
.
Location
()
if
err
!=
nil
{
return
nil
,
err
}
pw
.
completed
=
int
(
offset
)
if
_
,
err
:=
uploadBlobChunk
(
ctx
,
http
.
MethodPut
,
location
,
r
,
offset
,
limit
,
nil
,
pw
);
err
!=
nil
{
// retry
log
.
Printf
(
"retrying redirected upload: %v"
,
err
)
continue
}
return
resp
,
nil
case
resp
.
StatusCode
==
http
.
StatusUnauthorized
:
case
resp
.
StatusCode
==
http
.
StatusUnauthorized
:
auth
:=
resp
.
Header
.
Get
(
"www-authenticate"
)
auth
:=
resp
.
Header
.
Get
(
"www-authenticate"
)
authRedir
:=
ParseAuthRedirectString
(
auth
)
authRedir
:=
ParseAuthRedirectString
(
auth
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment