From 957b6b2caf5ac6ee6664a4710e1d3f5c20d45d7e Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Wed, 27 Sep 2023 14:01:35 +0100 Subject: [PATCH 1/3] Use URI String as fallback in ReactorClientHttpConnector Closes gh-31033 --- .../reactive/ReactorClientHttpConnector.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpConnector.java b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpConnector.java index 6c523e9fb76..dc2dad00e71 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpConnector.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpConnector.java @@ -108,7 +108,7 @@ public class ReactorClientHttpConnector implements ClientHttpConnector { HttpClient.RequestSender requestSender = this.httpClient .request(io.netty.handler.codec.http.HttpMethod.valueOf(method.name())); - requestSender = (uri.isAbsolute() ? requestSender.uri(uri) : requestSender.uri(uri.toString())); + requestSender = setUri(requestSender, uri); return requestSender .send((request, outbound) -> requestCallback.apply(adaptRequest(method, uri, request, outbound))) @@ -125,6 +125,18 @@ public class ReactorClientHttpConnector implements ClientHttpConnector { }); } + private static HttpClient.RequestSender setUri(HttpClient.RequestSender requestSender, URI uri) { + if (uri.isAbsolute()) { + try { + return requestSender.uri(uri); + } + catch (Exception ex) { + // Fall back on passing it in as a String + } + } + return requestSender.uri(uri.toString()); + } + private ReactorClientHttpRequest adaptRequest(HttpMethod method, URI uri, HttpClientRequest request, NettyOutbound nettyOutbound) { From a2c5fed4941ec58503395f32946d3331d59917b5 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Thu, 28 Sep 2023 16:52:03 +0100 Subject: [PATCH 2/3] Make targetType in UknownContentTypeException transient Closes gh-31283 --- .../web/client/UnknownContentTypeException.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/client/UnknownContentTypeException.java b/spring-web/src/main/java/org/springframework/web/client/UnknownContentTypeException.java index cfbd27d68bd..a6724f9f851 100644 --- a/spring-web/src/main/java/org/springframework/web/client/UnknownContentTypeException.java +++ b/spring-web/src/main/java/org/springframework/web/client/UnknownContentTypeException.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,8 +36,8 @@ public class UnknownContentTypeException extends RestClientException { private static final long serialVersionUID = 2759516676367274084L; - @SuppressWarnings("serial") - private final Type targetType; + + private transient final Type targetType; private final MediaType contentType; From 23162bb3060bc4166bbed8f2452e9abe44a3b3ca Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Fri, 29 Sep 2023 17:15:23 +0100 Subject: [PATCH 3/3] Undo optimization from 12fe2c that can cause regression Closes gh-31327 --- .../http/converter/StringHttpMessageConverter.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java index 5a408d87497..8b8793e277e 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java @@ -93,11 +93,7 @@ public class StringHttpMessageConverter extends AbstractHttpMessageConverter clazz, HttpInputMessage inputMessage) throws IOException { Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType()); - long length = inputMessage.getHeaders().getContentLength(); - byte[] bytes = (length >= 0 && length <= Integer.MAX_VALUE ? - inputMessage.getBody().readNBytes((int) length) : - inputMessage.getBody().readAllBytes()); - return new String(bytes, charset); + return StreamUtils.copyToString(inputMessage.getBody(), charset); } @Override