fix(registry): address PR review feedback
- Guard against empty PATCH chunks producing invalid Range header (0--1) - Rename test to accurately reflect it checks Range response formatting, not Content-Range validation
- commit
- fcdce6b5b28932fd25ba218925af2c3331444645
- author
- brice · · 2026-02-06 13:09 UTC
- parent
- 887cae1
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
2 files · +4 -4
M internal/adapters/in/http/registry/handler.go +3 -1
| @@ -442,7 +442,9 @@ func (h *Handler) handleBlobUpload(w http.ResponseWriter, r *http.Request) { | |||
| 442 | 442 | ||
| 443 | 443 | // For PATCH requests, respond with 202 Accepted | |
| 444 | 444 | w.Header().Set("Location", fmt.Sprintf("/v2/%s/blobs/uploads/%s", name, uuid)) | |
| 445 | - | w.Header().Set("Range", fmt.Sprintf("0-%d", length-1)) | |
| 445 | + | if length > 0 { | |
| 446 | + | w.Header().Set("Range", fmt.Sprintf("0-%d", length-1)) | |
| 447 | + | } | |
| 446 | 448 | w.Header().Set("Docker-Upload-UUID", uuid) | |
| 447 | 449 | w.WriteHeader(http.StatusAccepted) | |
| 448 | 450 | } | |
| @@ -442,7 +442,9 @@ func (h *Handler) handleBlobUpload(w http.ResponseWriter, r *http.Request) { | |||||
| 442 | 442 | ||||
| 443 | // For PATCH requests, respond with 202 Accepted | 443 | // For PATCH requests, respond with 202 Accepted | ||
| 444 | w.Header().Set("Location", fmt.Sprintf("/v2/%s/blobs/uploads/%s", name, uuid)) | 444 | w.Header().Set("Location", fmt.Sprintf("/v2/%s/blobs/uploads/%s", name, uuid)) | ||
| 445 | - | w.Header().Set("Range", fmt.Sprintf("0-%d", length-1)) | 445 | + | if length > 0 { |
| 446 | + | w.Header().Set("Range", fmt.Sprintf("0-%d", length-1)) | |||
| 447 | + | } | |||
| 446 | w.Header().Set("Docker-Upload-UUID", uuid) | 448 | w.Header().Set("Docker-Upload-UUID", uuid) | ||
| 447 | w.WriteHeader(http.StatusAccepted) | 449 | w.WriteHeader(http.StatusAccepted) | ||
| 448 | } | 450 | } | ||
M internal/adapters/in/http/registry/handler_test.go +1 -3
| @@ -447,7 +447,7 @@ func TestMaxBlobChunkSize_Under100MB(t *testing.T) { | |||
| 447 | 447 | assert.Greater(t, int64(MaxBlobChunkSize), int64(90*1024*1024)) | |
| 448 | 448 | } | |
| 449 | 449 | ||
| 450 | - | func TestHandler_BlobUpload_PATCH_ReturnsContentRange(t *testing.T) { | |
| 450 | + | func TestHandler_BlobUpload_PATCH_ReturnsRangeHeader(t *testing.T) { | |
| 451 | 451 | registrySvc := inmocks.NewMockRegistryService(t) | |
| 452 | 452 | handler := NewHandler(registrySvc, testLogger()) | |
| 453 | 453 | ||
| @@ -455,8 +455,6 @@ func TestHandler_BlobUpload_PATCH_ReturnsContentRange(t *testing.T) { | |||
| 455 | 455 | registrySvc.EXPECT().AppendBlobChunk(mock.Anything, "myapp", "550e8400-e29b-41d4-a716-446655440000", chunkData).Return(int64(len(chunkData)), nil) | |
| 456 | 456 | ||
| 457 | 457 | req := httptest.NewRequest("PATCH", "/v2/myapp/blobs/uploads/550e8400-e29b-41d4-a716-446655440000", bytes.NewReader(chunkData)) | |
| 458 | - | req.Header.Set("Content-Range", "0-12") | |
| 459 | - | req.Header.Set("Content-Length", "13") | |
| 460 | 458 | rec := httptest.NewRecorder() | |
| 461 | 459 | ||
| 462 | 460 | handler.ServeHTTP(rec, req) | |
| @@ -447,7 +447,7 @@ func TestMaxBlobChunkSize_Under100MB(t *testing.T) { | |||||
| 447 | assert.Greater(t, int64(MaxBlobChunkSize), int64(90*1024*1024)) | 447 | assert.Greater(t, int64(MaxBlobChunkSize), int64(90*1024*1024)) | ||
| 448 | } | 448 | } | ||
| 449 | 449 | ||||
| 450 | - | func TestHandler_BlobUpload_PATCH_ReturnsContentRange(t *testing.T) { | 450 | + | func TestHandler_BlobUpload_PATCH_ReturnsRangeHeader(t *testing.T) { |
| 451 | registrySvc := inmocks.NewMockRegistryService(t) | 451 | registrySvc := inmocks.NewMockRegistryService(t) | ||
| 452 | handler := NewHandler(registrySvc, testLogger()) | 452 | handler := NewHandler(registrySvc, testLogger()) | ||
| 453 | 453 | ||||
| @@ -455,8 +455,6 @@ func TestHandler_BlobUpload_PATCH_ReturnsContentRange(t *testing.T) { | |||||
| 455 | registrySvc.EXPECT().AppendBlobChunk(mock.Anything, "myapp", "550e8400-e29b-41d4-a716-446655440000", chunkData).Return(int64(len(chunkData)), nil) | 455 | registrySvc.EXPECT().AppendBlobChunk(mock.Anything, "myapp", "550e8400-e29b-41d4-a716-446655440000", chunkData).Return(int64(len(chunkData)), nil) | ||
| 456 | 456 | ||||
| 457 | req := httptest.NewRequest("PATCH", "/v2/myapp/blobs/uploads/550e8400-e29b-41d4-a716-446655440000", bytes.NewReader(chunkData)) | 457 | req := httptest.NewRequest("PATCH", "/v2/myapp/blobs/uploads/550e8400-e29b-41d4-a716-446655440000", bytes.NewReader(chunkData)) | ||
| 458 | - | req.Header.Set("Content-Range", "0-12") | |||
| 459 | - | req.Header.Set("Content-Length", "13") | |||
| 460 | rec := httptest.NewRecorder() | 458 | rec := httptest.NewRecorder() | ||
| 461 | 459 | ||||
| 462 | handler.ServeHTTP(rec, req) | 460 | handler.ServeHTTP(rec, req) | ||