From 1c73664c4019eb11855ca92faa13cc71632950a0 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 1 Jul 2016 14:11:26 +0200 Subject: [PATCH] Defensively access deprecated AbstractHttpClient class from Apache HttpComponents Issue: SPR-14422 --- ...ttpComponentsClientHttpRequestFactory.java | 21 +++++++++++++++--- ...pComponentsHttpInvokerRequestExecutor.java | 22 ++++++++++++++++--- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java b/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java index 53f6faf0bf..d61231d9d0 100644 --- a/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java +++ b/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -39,6 +39,7 @@ import org.apache.http.protocol.HttpContext; import org.springframework.beans.factory.DisposableBean; import org.springframework.http.HttpMethod; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; /** * {@link org.springframework.http.client.ClientHttpRequestFactory} implementation that @@ -58,6 +59,20 @@ import org.springframework.util.Assert; */ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequestFactory, DisposableBean { + private static Class abstractHttpClientClass; + + static { + try { + // Looking for AbstractHttpClient class (deprecated as of HttpComponents 4.3) + abstractHttpClientClass = ClassUtils.forName("org.apache.http.impl.client.AbstractHttpClient", + HttpComponentsClientHttpRequestFactory.class.getClassLoader()); + } + catch (ClassNotFoundException ex) { + // Probably removed from HttpComponents in the meantime... + } + } + + private HttpClient httpClient; private RequestConfig requestConfig; @@ -130,7 +145,7 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest */ @SuppressWarnings("deprecation") private void setLegacyConnectionTimeout(HttpClient client, int timeout) { - if (org.apache.http.impl.client.AbstractHttpClient.class.isInstance(client)) { + if (abstractHttpClientClass != null && abstractHttpClientClass.isInstance(client)) { client.getParams().setIntParameter(org.apache.http.params.CoreConnectionPNames.CONNECTION_TIMEOUT, timeout); } } @@ -171,7 +186,7 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest */ @SuppressWarnings("deprecation") private void setLegacySocketTimeout(HttpClient client, int timeout) { - if (org.apache.http.impl.client.AbstractHttpClient.class.isInstance(client)) { + if (abstractHttpClientClass != null && abstractHttpClientClass.isInstance(client)) { client.getParams().setIntParameter(org.apache.http.params.CoreConnectionPNames.SO_TIMEOUT, timeout); } } diff --git a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java index 7b0924bacc..7f78a8227b 100644 --- a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java +++ b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -43,6 +43,7 @@ import org.springframework.context.i18n.LocaleContext; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.remoting.support.RemoteInvocationResult; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; /** @@ -69,6 +70,21 @@ public class HttpComponentsHttpInvokerRequestExecutor extends AbstractHttpInvoke private static final int DEFAULT_READ_TIMEOUT_MILLISECONDS = (60 * 1000); + + private static Class abstractHttpClientClass; + + static { + try { + // Looking for AbstractHttpClient class (deprecated as of HttpComponents 4.3) + abstractHttpClientClass = ClassUtils.forName("org.apache.http.impl.client.AbstractHttpClient", + HttpComponentsHttpInvokerRequestExecutor.class.getClassLoader()); + } + catch (ClassNotFoundException ex) { + // Probably removed from HttpComponents in the meantime... + } + } + + private HttpClient httpClient; private RequestConfig requestConfig; @@ -156,7 +172,7 @@ public class HttpComponentsHttpInvokerRequestExecutor extends AbstractHttpInvoke */ @SuppressWarnings("deprecation") private void setLegacyConnectionTimeout(HttpClient client, int timeout) { - if (org.apache.http.impl.client.AbstractHttpClient.class.isInstance(client)) { + if (abstractHttpClientClass != null && abstractHttpClientClass.isInstance(client)) { client.getParams().setIntParameter(org.apache.http.params.CoreConnectionPNames.CONNECTION_TIMEOUT, timeout); } } @@ -198,7 +214,7 @@ public class HttpComponentsHttpInvokerRequestExecutor extends AbstractHttpInvoke */ @SuppressWarnings("deprecation") private void setLegacySocketTimeout(HttpClient client, int timeout) { - if (org.apache.http.impl.client.AbstractHttpClient.class.isInstance(client)) { + if (abstractHttpClientClass != null && abstractHttpClientClass.isInstance(client)) { client.getParams().setIntParameter(org.apache.http.params.CoreConnectionPNames.SO_TIMEOUT, timeout); } }