From 9ffb1bbc10d964a83e9baa02c8a15ae5d7a2e74f Mon Sep 17 00:00:00 2001 From: Halo Dev Bot <87291978+halo-dev-bot@users.noreply.github.com> Date: Tue, 10 Sep 2024 17:40:10 +0800 Subject: [PATCH] [release-2.19] refactor: optimize request headers when generating thumbnails from URI (#6633) This is an automated cherry-pick of #6628 /assign JohnNiang ```release-note None ``` --- .../halo/app/core/attachment/ThumbnailGenerator.java | 7 ++++++- .../attachment/reconciler/AttachmentReconciler.java | 2 +- .../reconciler/LocalThumbnailsReconciler.java | 4 ++++ .../app/core/attachment/ThumbnailGeneratorTest.java | 11 ++++++++--- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/run/halo/app/core/attachment/ThumbnailGenerator.java b/application/src/main/java/run/halo/app/core/attachment/ThumbnailGenerator.java index 59f543e759..ad822f05cb 100644 --- a/application/src/main/java/run/halo/app/core/attachment/ThumbnailGenerator.java +++ b/application/src/main/java/run/halo/app/core/attachment/ThumbnailGenerator.java @@ -6,6 +6,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; @@ -172,7 +173,11 @@ Path downloadFileInternal(URL url) throws IOException { File tempFile = File.createTempFile("halo-image-thumb-", ".tmp"); long totalBytesDownloaded = 0; var tempFilePath = tempFile.toPath(); - try (InputStream inputStream = url.openStream(); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestProperty("User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)" + + " Chrome/92.0.4515.131 Safari/537.36"); + try (InputStream inputStream = connection.getInputStream(); FileOutputStream outputStream = new FileOutputStream(tempFile)) { byte[] buffer = new byte[4096]; diff --git a/application/src/main/java/run/halo/app/core/attachment/reconciler/AttachmentReconciler.java b/application/src/main/java/run/halo/app/core/attachment/reconciler/AttachmentReconciler.java index 0441390cc5..fa5b722ba4 100644 --- a/application/src/main/java/run/halo/app/core/attachment/reconciler/AttachmentReconciler.java +++ b/application/src/main/java/run/halo/app/core/attachment/reconciler/AttachmentReconciler.java @@ -58,7 +58,7 @@ public Result reconcile(Request request) { var annotations = attachment.getMetadata().getAnnotations(); if (annotations != null) { attachmentService.getPermalink(attachment) - .map(URI::toString) + .map(URI::toASCIIString) .switchIfEmpty(Mono.fromSupplier(() -> { // Only for back-compatibility return annotations.get(Constant.EXTERNAL_LINK_ANNO_KEY); diff --git a/application/src/main/java/run/halo/app/core/attachment/reconciler/LocalThumbnailsReconciler.java b/application/src/main/java/run/halo/app/core/attachment/reconciler/LocalThumbnailsReconciler.java index 1f1eb7b38f..ce2d90f82f 100644 --- a/application/src/main/java/run/halo/app/core/attachment/reconciler/LocalThumbnailsReconciler.java +++ b/application/src/main/java/run/halo/app/core/attachment/reconciler/LocalThumbnailsReconciler.java @@ -27,6 +27,7 @@ import run.halo.app.core.extension.attachment.Constant; import run.halo.app.core.extension.attachment.LocalThumbnail; import run.halo.app.extension.ExtensionClient; +import run.halo.app.extension.ExtensionUtil; import run.halo.app.extension.ListOptions; import run.halo.app.extension.PageRequestImpl; import run.halo.app.extension.controller.Controller; @@ -47,6 +48,9 @@ public class LocalThumbnailsReconciler implements Reconciler public Result reconcile(Request request) { client.fetch(LocalThumbnail.class, request.name()) .ifPresent(thumbnail -> { + if (ExtensionUtil.isDeleted(thumbnail)) { + return; + } if (shouldGenerate(thumbnail)) { requestGenerateThumbnail(thumbnail); nullSafeAnnotations(thumbnail).remove(REQUEST_TO_GENERATE_ANNO); diff --git a/application/src/test/java/run/halo/app/core/attachment/ThumbnailGeneratorTest.java b/application/src/test/java/run/halo/app/core/attachment/ThumbnailGeneratorTest.java index e50da39ba9..a87dca8867 100644 --- a/application/src/test/java/run/halo/app/core/attachment/ThumbnailGeneratorTest.java +++ b/application/src/test/java/run/halo/app/core/attachment/ThumbnailGeneratorTest.java @@ -4,11 +4,13 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.HttpURLConnection; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; @@ -57,7 +59,9 @@ void testDownloadImage_Success() throws Exception { String mockImageData = "fakeImageData"; InputStream mockInputStream = new ByteArrayInputStream(mockImageData.getBytes()); - doAnswer(invocation -> mockInputStream).when(spyImageUrl).openStream(); + var urlConnection = mock(HttpURLConnection.class); + doAnswer(invocation -> urlConnection).when(spyImageUrl).openConnection(); + doReturn(mockInputStream).when(urlConnection).getInputStream(); var path = imageDownloader.downloadFileInternal(spyImageUrl); assertThat(path).isNotNull(); @@ -81,8 +85,9 @@ void downloadImage_FileSizeLimitExceeded() throws Exception { var fileSizeByte = ThumbnailGenerator.MAX_FILE_SIZE + 10; byte[] largeImageData = new byte[fileSizeByte]; InputStream mockInputStream = new ByteArrayInputStream(largeImageData); - - doReturn(mockInputStream).when(spyImageUrl).openStream(); + var urlConnection = mock(HttpURLConnection.class); + doAnswer(invocation -> urlConnection).when(spyImageUrl).openConnection(); + doReturn(mockInputStream).when(urlConnection).getInputStream(); assertThatThrownBy(() -> imageDownloader.downloadFileInternal(spyImageUrl)) .isInstanceOf(IOException.class) .hasMessageContaining("File size exceeds the limit");