Align Content-Type headers with Spring Framework policies for HttpClient 5.

Some tools expect a non-blank Content-Type header from HttpEntity during execution.

Resolves #1368.
This commit is contained in:
Mikhail Putilov
2023-07-19 17:49:03 +02:00
committed by Greg L. Turnquist
parent 3ec8af7682
commit 3aaa77e08c
2 changed files with 27 additions and 16 deletions

View File

@@ -27,10 +27,7 @@ import java.util.Iterator;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.HttpResponse;
import org.apache.hc.core5.http.NameValuePair;
import org.apache.hc.core5.http.*;
import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.protocol.HttpContext;
@@ -119,8 +116,8 @@ public class HttpComponents5Connection extends AbstractHttpSenderConnection {
@Override
protected void onSendAfterWrite(WebServiceMessage message) throws IOException {
httpPost.setEntity(new ByteArrayEntity(requestBuffer.toByteArray(), null));
var contentType = ContentType.parse(httpPost.getFirstHeader(HttpHeaders.CONTENT_TYPE).getValue());
httpPost.setEntity(new ByteArrayEntity(requestBuffer.toByteArray(), contentType));
requestBuffer = null;
if (httpContext != null) {

View File

@@ -16,21 +16,14 @@
package org.springframework.ws.transport.http;
import static org.assertj.core.api.AssertionsForClassTypes.*;
import static org.springframework.ws.transport.http.HttpComponents5ClientFactory.*;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.xml.soap.MessageFactory;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import org.apache.hc.client5.http.HttpRoute;
import org.apache.hc.client5.http.classic.ExecChainHandler;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.http.HttpHost;
import org.eclipse.jetty.server.Connector;
@@ -45,12 +38,33 @@ import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
import org.springframework.ws.transport.WebServiceConnection;
import org.springframework.ws.transport.support.FreePortScanner;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.springframework.ws.transport.http.HttpComponents5ClientFactory.getPort;
class HttpComponents5MessageSenderIntegrationTest
extends AbstractHttpWebServiceMessageSenderIntegrationTestCase<HttpComponents5MessageSender> {
private static CloseableHttpClient createHttpClientWithAssertion() {
ExecChainHandler handler = (request, scope, chain) -> {
assertThat(request.getEntity().getContentType())
.describedAs("Exec interceptors are supposed to receive content type. Verify that HttpEntity class is instantiated correctly")
.isNotBlank();
return chain.proceed(request, scope);
};
return HttpClientBuilder.create()
.addRequestInterceptorFirst(new HttpComponents5MessageSender.RemoveSoapHeadersInterceptor())
.addExecInterceptorFirst("logbook-alike exec interceptor", handler)
.build();
}
@Override
protected HttpComponents5MessageSender createMessageSender() {
return new HttpComponents5MessageSender();
return new HttpComponents5MessageSender(createHttpClientWithAssertion());
}
@Test // GH-1164