From bc9adaf0d074e30ca2427747d6c4c2463a03c686 Mon Sep 17 00:00:00 2001 From: Vadzim Hushchanskou Date: Tue, 6 Feb 2024 14:55:30 +0300 Subject: [PATCH] Improve MIME type detection in `ReportPortal.emitLog` and `ReportPortal.emitLaunchLog` methods --- CHANGELOG.md | 2 +- .../reportportal/service/ReportPortal.java | 75 ++++++++----------- 2 files changed, 32 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63d74fc5..950b2a1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## [Unreleased] ### Changed -- Improve MIME type detection in `MimeTypeDetector.detect(java.io.File)` method, by @HardNorth +- Improve MIME type detection in `MimeTypeDetector.detect(java.io.File)`, `ReportPortal.emitLog` and `ReportPortal.emitLaunchLog` methods, by @HardNorth ## [5.2.2] ### Added diff --git a/src/main/java/com/epam/reportportal/service/ReportPortal.java b/src/main/java/com/epam/reportportal/service/ReportPortal.java index 146b18d5..56097801 100644 --- a/src/main/java/com/epam/reportportal/service/ReportPortal.java +++ b/src/main/java/com/epam/reportportal/service/ReportPortal.java @@ -22,6 +22,7 @@ import com.epam.reportportal.service.launch.PrimaryLaunch; import com.epam.reportportal.service.launch.SecondaryLaunch; import com.epam.reportportal.utils.SslUtils; +import com.epam.reportportal.utils.files.Utils; import com.epam.reportportal.utils.http.ClientUtils; import com.epam.reportportal.utils.http.HttpRequestUtils; import com.epam.reportportal.utils.properties.ListenerProperty; @@ -59,9 +60,7 @@ import java.util.function.Function; import static com.epam.reportportal.service.LaunchLoggingContext.DEFAULT_LAUNCH_KEY; -import static com.epam.reportportal.utils.MimeTypeDetector.detect; import static com.epam.reportportal.utils.ObjectUtils.clonePojo; -import static com.epam.reportportal.utils.files.Utils.readFileToBytes; import static java.util.Optional.ofNullable; import static org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace; @@ -84,8 +83,8 @@ public class ReportPortal { * @param rpClient ReportPortal client * @param parameters Listener Parameters */ - ReportPortal(@Nullable ReportPortalClient rpClient, @Nonnull ExecutorService executor, - @Nonnull ListenerParameters parameters, @Nullable LaunchIdLock launchIdLock) { + ReportPortal(@Nullable ReportPortalClient rpClient, @Nonnull ExecutorService executor, @Nonnull ListenerParameters parameters, + @Nullable LaunchIdLock launchIdLock) { this.rpClient = rpClient; this.executor = executor; this.parameters = Objects.requireNonNull(parameters); @@ -144,8 +143,7 @@ public Launch newLaunch(@Nonnull StartLaunchRQ rq) { */ @Nonnull public Launch withLaunch(@Nonnull Maybe launchUuid) { - return ofNullable(rpClient).map(c -> (Launch) new LaunchImpl(c, parameters, launchUuid, executor)) - .orElse(Launch.NOOP_LAUNCH); + return ofNullable(rpClient).map(c -> (Launch) new LaunchImpl(c, parameters, launchUuid, executor)).orElse(Launch.NOOP_LAUNCH); } /** @@ -199,8 +197,8 @@ public static ReportPortal create(ReportPortalClient client, ListenerParameters * @return builder for {@link ReportPortal} */ @Nonnull - public static ReportPortal create(@Nonnull final ReportPortalClient client, - @Nonnull final ListenerParameters params, @Nonnull final ExecutorService executor) { + public static ReportPortal create(@Nonnull final ReportPortalClient client, @Nonnull final ListenerParameters params, + @Nonnull final ExecutorService executor) { return new ReportPortal(client, executor, params, getLaunchLock(params)); } @@ -289,21 +287,21 @@ public static boolean emitLaunchLog(final String message, final String level, fi }); } - private static void fillSaveLogRQ(final SaveLogRQ rq, final String message, final String level, final Date time, - final File file) { + private static void fillSaveLogRQ(final SaveLogRQ rq, final String message, final String level, final Date time, final File file) { rq.setMessage(message); rq.setLevel(level); rq.setLogTime(time); try { SaveLogRQ.File f = new SaveLogRQ.File(); - f.setContentType(detect(file)); - f.setContent(readFileToBytes(file)); + TypeAwareByteSource typedSource = Utils.getFile(file); + f.setContentType(typedSource.getMediaType()); + f.setContent(typedSource.read()); f.setName(UUID.randomUUID().toString()); rq.setFile(f); } catch (IOException e) { - // seems like there is some problem. Do not report an file + // seems like there is some problem. Do not report a file LOGGER.error("Cannot send file to ReportPortal", e); } } @@ -344,8 +342,7 @@ public static boolean emitLaunchLog(final String message, final String level, fi }); } - private static void fillSaveLogRQ(final SaveLogRQ rq, final String level, final Date time, - final ReportPortalMessage message) { + private static void fillSaveLogRQ(final SaveLogRQ rq, final String level, final Date time, final ReportPortalMessage message) { rq.setLevel(level); rq.setLogTime(time); rq.setMessage(message.getMessage()); @@ -427,18 +424,12 @@ public Builder withExecutorService(ExecutorService executor) { } public ReportPortal build() { - ListenerParameters params = ofNullable(this.parameters).orElse(new ListenerParameters( - defaultPropertiesLoader())); + ListenerParameters params = ofNullable(this.parameters).orElse(new ListenerParameters(defaultPropertiesLoader())); ExecutorService executorService = executor == null ? buildExecutorService(params) : executor; Class clientType = params.isAsyncReporting() ? ReportPortalClientV2.class : ReportPortalClient.class; - return new ReportPortal( - buildClient(clientType, params, executorService), - executorService, - params, - buildLaunchLock(params) - ); + return new ReportPortal(buildClient(clientType, params, executorService), executorService, params, buildLaunchLock(params)); } /** @@ -447,8 +438,7 @@ public ReportPortal build() { * @param ReportPortal Client interface class * @return a ReportPortal Client instance */ - public T buildClient(@Nonnull final Class clientType, - @Nonnull final ListenerParameters params) { + public T buildClient(@Nonnull final Class clientType, @Nonnull final ListenerParameters params) { return buildClient(clientType, params, buildExecutorService(params)); } @@ -459,8 +449,8 @@ public T buildClient(@Nonnull final Class clie * @param executor {@link ExecutorService} an Executor which will be used for internal request / response queue processing * @return a ReportPortal Client instance */ - public T buildClient(@Nonnull final Class clientType, - @Nonnull final ListenerParameters params, @Nonnull final ExecutorService executor) { + public T buildClient(@Nonnull final Class clientType, @Nonnull final ListenerParameters params, + @Nonnull final ExecutorService executor) { OkHttpClient client = ofNullable(this.httpClient).map(c -> c.addInterceptor(new BearerAuthInterceptor(params.getApiKey())) .build()).orElseGet(() -> defaultClient(params)); @@ -472,8 +462,7 @@ public T buildClient(@Nonnull final Class clie * @param client {@link OkHttpClient} an HTTP client instance * @return a ReportPortal endpoint description class */ - protected Retrofit buildRestEndpoint(@Nonnull final ListenerParameters parameters, - @Nonnull final OkHttpClient client) { + protected Retrofit buildRestEndpoint(@Nonnull final ListenerParameters parameters, @Nonnull final OkHttpClient client) { return buildRestEndpoint(parameters, client, buildExecutorService(parameters)); } @@ -483,21 +472,19 @@ protected Retrofit buildRestEndpoint(@Nonnull final ListenerParameters parameter * @param executor {@link ExecutorService} an Executor which will be used for internal request / response queue processing * @return a ReportPortal endpoint description class */ - protected Retrofit buildRestEndpoint(@Nonnull final ListenerParameters parameters, - @Nonnull final OkHttpClient client, @Nonnull final ExecutorService executor) { - String baseUrl = - (parameters.getBaseUrl().endsWith("/") ? parameters.getBaseUrl() : parameters.getBaseUrl() + "/") - + API_PATH; + protected Retrofit buildRestEndpoint(@Nonnull final ListenerParameters parameters, @Nonnull final OkHttpClient client, + @Nonnull final ExecutorService executor) { + String baseUrl = (parameters.getBaseUrl().endsWith("/") ? parameters.getBaseUrl() : parameters.getBaseUrl() + "/") + API_PATH; Retrofit.Builder builder = new Retrofit.Builder().client(client); try { builder.baseUrl(baseUrl); } catch (NoSuchMethodError e) { throw new InternalReportPortalClientException( "Unable to initialize OkHttp client. " - + "ReportPortal client supports OkHttp version 3.11.0 as minimum.\n" - + "Please update OkHttp dependency.\n" - + "Besides this usually happens due to old selenium-java version (it overrides our dependency), " - + "please use selenium-java 3.141.0 as minimum.", + + "ReportPortal client supports OkHttp version 3.11.0 as minimum.\n" + + "Please update OkHttp dependency.\n" + + "Besides this usually happens due to old selenium-java version (it overrides our dependency), " + + "please use selenium-java 3.141.0 as minimum.", e ); } @@ -529,9 +516,8 @@ protected OkHttpClient defaultClient(@Nonnull ListenerParameters parameters) { if (HTTPS.equals(baseUrl.getProtocol()) && keyStore != null) { if (null == keyStorePassword) { - String error = - "You should provide keystore password parameter [" + ListenerProperty.KEYSTORE_PASSWORD - + "] if you use HTTPS protocol"; + String error = "You should provide keystore password parameter [" + ListenerProperty.KEYSTORE_PASSWORD + + "] if you use HTTPS protocol"; LOGGER.error(error); throw new InternalReportPortalClientException(error); } @@ -540,13 +526,14 @@ protected OkHttpClient defaultClient(@Nonnull ListenerParameters parameters) { TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(SslUtils.loadKeyStore(keyStore, keyStorePassword)); TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); - X509TrustManager trustManager = (X509TrustManager) ofNullable(trustManagers).flatMap(managers -> Arrays.stream( - managers).filter(m -> m instanceof X509TrustManager).findAny()) + X509TrustManager trustManager = (X509TrustManager) ofNullable(trustManagers).flatMap(managers -> Arrays.stream(managers) + .filter(m -> m instanceof X509TrustManager) + .findAny()) .orElseThrow(() -> new InternalReportPortalClientException( "Unable to find X509 trust manager, managers:" + Arrays.toString(trustManagers))); SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(null, new TrustManager[]{trustManager}, null); + sslContext.init(null, new TrustManager[] { trustManager }, null); SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); builder.sslSocketFactory(sslSocketFactory, trustManager); } catch (KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) {