Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion routers/api/packages/container/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ func PostBlobsUploads(ctx *context.Context) {

// https://github.com/opencontainers/distribution-spec/blob/main/spec.md#pushing-a-blob-in-chunks
func GetBlobsUpload(ctx *context.Context) {
image := ctx.PathParam("image")
uuid := ctx.PathParam("uuid")

upload, err := packages_model.GetBlobUploadByID(ctx, uuid)
Expand All @@ -334,6 +335,7 @@ func GetBlobsUpload(ctx *context.Context) {

// FIXME: undefined behavior when the uploaded content is empty: https://github.com/opencontainers/distribution-spec/issues/578
respHeaders := &containerHeaders{
Location: fmt.Sprintf("/v2/%s/%s/blobs/uploads/%s", ctx.Package.Owner.LowerName, image, upload.ID),
UploadUUID: upload.ID,
Status: http.StatusNoContent,
}
Expand Down Expand Up @@ -386,7 +388,7 @@ func PatchBlobsUpload(ctx *context.Context) {
UploadUUID: uploader.ID,
Status: http.StatusAccepted,
}
if contentRange != "" {
if uploader.Size() > 0 {
respHeaders.Range = fmt.Sprintf("0-%d", uploader.Size()-1)
}
setResponseHeaders(ctx.Resp, respHeaders)
Expand Down
16 changes: 14 additions & 2 deletions tests/integration/api_packages_container_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,11 +297,22 @@ func TestPackageContainer(t *testing.T) {
SetHeader("Content-Range", "1-10")
MakeRequest(t, req, http.StatusRequestedRangeNotSatisfiable)

contentRange := fmt.Sprintf("0-%d", len(blobContent)-1)
req.SetHeader("Content-Range", contentRange)
// first patch without Content-Range
req = NewRequestWithBody(t, "PATCH", setting.AppURL+uploadURL[1:], bytes.NewReader(blobContent[:1])).
AddTokenAuth(userToken)
resp = MakeRequest(t, req, http.StatusAccepted)
assert.NotEmpty(t, resp.Header().Get("Location"))
assert.Equal(t, "0-0", resp.Header().Get("Range"))

// then send remaining content with Content-Range
req = NewRequestWithBody(t, "PATCH", setting.AppURL+uploadURL[1:], bytes.NewReader(blobContent[1:])).
SetHeader("Content-Range", fmt.Sprintf("1-%d", len(blobContent)-1)).
AddTokenAuth(userToken)
resp = MakeRequest(t, req, http.StatusAccepted)

contentRange := fmt.Sprintf("0-%d", len(blobContent)-1)
assert.Equal(t, uuid, resp.Header().Get("Docker-Upload-Uuid"))
assert.NotEmpty(t, resp.Header().Get("Location"))
assert.Equal(t, contentRange, resp.Header().Get("Range"))

uploadURL = resp.Header().Get("Location")
Expand All @@ -311,6 +322,7 @@ func TestPackageContainer(t *testing.T) {
resp = MakeRequest(t, req, http.StatusNoContent)

assert.Equal(t, uuid, resp.Header().Get("Docker-Upload-Uuid"))
assert.Equal(t, uploadURL, resp.Header().Get("Location"))
assert.Equal(t, contentRange, resp.Header().Get("Range"))

pbu, err = packages_model.GetBlobUploadByID(db.DefaultContext, uuid)
Expand Down