From 9a8c69a19c5140234d1e53ac81682e0ee6c90daa Mon Sep 17 00:00:00 2001 From: Valentin Delaye Date: Sat, 7 Feb 2026 08:10:14 +0100 Subject: [PATCH] Avoid log binary response Signed-off-by: Valentin Delaye --- src/main/java/land/oras/Registry.java | 6 +++- src/main/java/land/oras/auth/HttpClient.java | 4 +-- .../java/land/oras/PublicAzureCRITCase.java | 17 +++++++++++ src/test/java/land/oras/QuayIoITCase.java | 28 ++++++++++++++++++- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/main/java/land/oras/Registry.java b/src/main/java/land/oras/Registry.java index 3b9d4dd..f362152 100644 --- a/src/main/java/land/oras/Registry.java +++ b/src/main/java/land/oras/Registry.java @@ -734,9 +734,13 @@ private void handleError(HttpClient.ResponseWrapper responseWrapper) { private void logResponse(HttpClient.ResponseWrapper response) { LOG.debug("Status Code: {}", response.statusCode()); LOG.debug("Headers: {}", response.headers()); + String contentType = response.headers().get(Const.CONTENT_TYPE_HEADER.toLowerCase()); + boolean isBinaryResponse = contentType != null && contentType.contains("octet-stream"); // Only log non-binary responses - if (response.response() instanceof String) { + if (response.response() instanceof String && !isBinaryResponse) { LOG.debug("Response: {}", response.response()); + } else { + LOG.debug("Not logging binary response of content type: {}", contentType); } } diff --git a/src/main/java/land/oras/auth/HttpClient.java b/src/main/java/land/oras/auth/HttpClient.java index 6e3c68c..17cd172 100644 --- a/src/main/java/land/oras/auth/HttpClient.java +++ b/src/main/java/land/oras/auth/HttpClient.java @@ -391,9 +391,9 @@ public TokenResponse refreshToken( "Response: {}", responseWrapper .response() - .replaceAll("\"token\"\\s*:\\s*\"([A-Za-z0-9\\-_\\.]+)\"", "\"token\":\"\"") + .replaceAll("\"token\"\\s*:\\s*\"([A-Za-z0-9\\-_\\.=]+)\"", "\"token\":\"\"") .replaceAll( - "\"access_token\"\\s*:\\s*\"([A-Za-z0-9\\-_\\.]+)\"", + "\"access_token\"\\s*:\\s*\"([A-Za-z0-9\\-_\\.=]+)\"", "\"access_token\":\"\"")); LOG.debug( "Headers: {}", diff --git a/src/test/java/land/oras/PublicAzureCRITCase.java b/src/test/java/land/oras/PublicAzureCRITCase.java index 6b563c2..4b9be7b 100644 --- a/src/test/java/land/oras/PublicAzureCRITCase.java +++ b/src/test/java/land/oras/PublicAzureCRITCase.java @@ -22,13 +22,19 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; +import java.io.IOException; +import java.nio.file.Path; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; @Execution(ExecutionMode.CONCURRENT) class PublicAzureCRITCase { + @TempDir + private Path tempDir; + @Test void shouldPullAnonymousIndex() { @@ -57,4 +63,15 @@ void shouldPullAnonymousManifest() { Manifest manifest1 = registry.getManifest(containerRef1); assertNotNull(manifest1); } + + @Test + void shouldPullOneBlob() throws IOException { + Registry registry = Registry.builder().build(); + ContainerRef containerRef1 = ContainerRef.parse( + "mcr.microsoft.com/azurelinux/busybox@sha256:ec5adfc87f57633da1feedb2361c06374020ab9c99d4a14b19319e57284b6656"); + Manifest manifest = registry.getManifest(containerRef1); + Layer oneLayer = manifest.getLayers().get(0); + registry.fetchBlob(containerRef1.withDigest(oneLayer.getDigest()), tempDir.resolve("my-blob")); + assertNotNull(tempDir.resolve("my-blob")); + } } diff --git a/src/test/java/land/oras/QuayIoITCase.java b/src/test/java/land/oras/QuayIoITCase.java index 4f34d5c..1102e92 100644 --- a/src/test/java/land/oras/QuayIoITCase.java +++ b/src/test/java/land/oras/QuayIoITCase.java @@ -22,15 +22,41 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; +import java.io.IOException; +import java.nio.file.Path; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; class QuayIoITCase { + @TempDir + private Path tempDir; + @Test - void shouldPull() { + void shouldPullIndex() { Registry registry = Registry.builder().build(); ContainerRef containerRef1 = ContainerRef.parse("quay.io/openshift/origin-cli:latest"); Index index = registry.getIndex(containerRef1); assertNotNull(index); } + + @Test + void shouldPullManifest() { + Registry registry = Registry.builder().build(); + ContainerRef containerRef1 = ContainerRef.parse( + "quay.io/openshift/origin-cli@sha256:58b3680e6f8141829412f3010477ed84ebc73da65665dcde988e0b2a1276ae1f"); + Manifest manifest = registry.getManifest(containerRef1); + assertNotNull(manifest); + } + + @Test + void shouldPullOneBlob() throws IOException { + Registry registry = Registry.builder().build(); + ContainerRef containerRef1 = ContainerRef.parse( + "quay.io/openshift/origin-cli@sha256:58b3680e6f8141829412f3010477ed84ebc73da65665dcde988e0b2a1276ae1f"); + Manifest manifest = registry.getManifest(containerRef1); + Layer oneLayer = manifest.getLayers().get(0); + registry.fetchBlob(containerRef1.withDigest(oneLayer.getDigest()), tempDir.resolve("my-blob")); + assertNotNull(tempDir.resolve("my-blob")); + } }