fix:replace HttpClient with HttpURLConnection for JDK 8 compatibility. (#1709)

pull/1712/head
Haotian Zhang 3 weeks ago committed by GitHub
parent 3edb3cca2a
commit c96d1165b7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -17,3 +17,4 @@
- [fix: fix lb configuration on bootstrap step.](https://github.com/Tencent/spring-cloud-tencent/issues/1706) - [fix: fix lb configuration on bootstrap step.](https://github.com/Tencent/spring-cloud-tencent/issues/1706)
- [feat:support fault injection.](https://github.com/Tencent/spring-cloud-tencent/pull/1707) - [feat:support fault injection.](https://github.com/Tencent/spring-cloud-tencent/pull/1707)
- [feat: support config event and monitor address list.](https://github.com/Tencent/spring-cloud-tencent/pull/1708) - [feat: support config event and monitor address list.](https://github.com/Tencent/spring-cloud-tencent/pull/1708)
- [fix:replace HttpClient with HttpURLConnection for JDK 8 compatibility.](https://github.com/Tencent/spring-cloud-tencent/pull/1709)

@ -21,6 +21,8 @@ import java.net.InetAddress;
import java.net.NetworkInterface; import java.net.NetworkInterface;
import java.net.SocketException; import java.net.SocketException;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -129,8 +131,11 @@ public class ProviderController {
responseBody = "mock 5xx return."; responseBody = "mock 5xx return.";
break; break;
default: default:
LOG.info("provider-demo -- request param: [" + param + "]");
responseBody = String.format("from host-ip: %s, request param: %s, response from %s", responseBody = String.format("from host-ip: %s, request param: %s, response from %s",
getInet4Address(), param, providerNameConfig.getName()); getInet4Address(), param, providerNameConfig.getName());
LOG.info("provider-demo -- provider config name: [" + providerNameConfig.getName() + ']');
LOG.info("provider-demo -- response info: [" + responseBody + "]");
status = HttpServletResponse.SC_OK; status = HttpServletResponse.SC_OK;
break; break;
} }
@ -193,4 +198,23 @@ public class ProviderController {
LOG.info(response); LOG.info(response);
return response; return response;
} }
/**
*
* token = provider-demo
*
* @param token
* @return
*/
@RequestMapping(value = "/checkToken", method = RequestMethod.GET)
public Map<String, Object> checkToken(@RequestParam String token) {
LOG.info("provider-demo -- request param: [" + token + "]");
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("result", "provider-demo".equalsIgnoreCase(token));
resultMap.put("payload", "this is payload");
LOG.info("provider-demo -- response info: [" + resultMap + "]");
return resultMap;
}
} }

@ -27,7 +27,6 @@ import org.jetbrains.annotations.NotNull;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.ClientHttpResponse;
/** /**
@ -67,10 +66,15 @@ public class PolarisFaultInjectionHttpResponse implements ClientHttpResponse {
@NotNull @NotNull
@Override @Override
public HttpStatusCode getStatusCode() { public HttpStatus getStatusCode() {
return HttpStatus.valueOf(fallbackInfo.getCode()); return HttpStatus.valueOf(fallbackInfo.getCode());
} }
@Override
public int getRawStatusCode() throws IOException {
return fallbackInfo.getCode();
}
@NotNull @NotNull
@Override @Override
public final String getStatusText() { public final String getStatusText() {

@ -17,10 +17,10 @@
package com.tencent.cloud.plugin.trafficmirroring; package com.tencent.cloud.plugin.trafficmirroring;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URI; import java.net.URI;
import java.net.http.HttpClient; import java.net.URL;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
@ -61,8 +61,6 @@ public class TrafficMirroringPostPlugin implements EnhancedPlugin {
private ThreadPoolExecutor threadPoolExecutor; private ThreadPoolExecutor threadPoolExecutor;
private HttpClient httpClient;
public TrafficMirroringPostPlugin(TrafficMirroringProperties trafficMirroringProperties) { public TrafficMirroringPostPlugin(TrafficMirroringProperties trafficMirroringProperties) {
this.trafficMirroringProperties = trafficMirroringProperties; this.trafficMirroringProperties = trafficMirroringProperties;
} }
@ -137,23 +135,16 @@ public class TrafficMirroringPostPlugin implements EnhancedPlugin {
60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("polaris-traffic-mirroring")); 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("polaris-traffic-mirroring"));
} }
if (httpClient == null) {
// create JDK HttpClient instance.
this.httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofMillis(trafficMirroringProperties.getRequestConnectionTimeout()))
.executor(threadPoolExecutor)
.build();
}
} }
private void setHeaders(java.net.http.HttpRequest.Builder requestBuilder, Object originalRequest) { private void setHeaders(HttpURLConnection connection, Object originalRequest) {
if (ClassUtils.isClassPresent("org.springframework.http.HttpRequest") if (ClassUtils.isClassPresent("org.springframework.http.HttpRequest")
&& originalRequest instanceof HttpRequest) { && originalRequest instanceof HttpRequest) {
HttpHeaders httpHeaders = ((HttpRequest) originalRequest).getHeaders(); HttpHeaders httpHeaders = ((HttpRequest) originalRequest).getHeaders();
httpHeaders.forEach((headerName, headerValues) -> { httpHeaders.forEach((headerName, headerValues) -> {
if (shouldKeepHeader(headerName)) { if (shouldKeepHeader(headerName)) {
headerValues.forEach(headerValue -> headerValues.forEach(headerValue ->
requestBuilder.header(headerName, headerValue)); connection.setRequestProperty(headerName, headerValue));
} }
}); });
} }
@ -163,7 +154,7 @@ public class TrafficMirroringPostPlugin implements EnhancedPlugin {
request.headers().forEach((headerName, headerValues) -> { request.headers().forEach((headerName, headerValues) -> {
if (shouldKeepHeader(headerName)) { if (shouldKeepHeader(headerName)) {
headerValues.forEach(headerValue -> headerValues.forEach(headerValue ->
requestBuilder.header(headerName, headerValue)); connection.setRequestProperty(headerName, headerValue));
} }
}); });
} }
@ -185,32 +176,39 @@ public class TrafficMirroringPostPlugin implements EnhancedPlugin {
originalBody = new byte[0]; originalBody = new byte[0];
} }
// create JDK HttpRequest builder. byte[] finalOriginalBody = originalBody;
java.net.http.HttpRequest.Builder requestBuilder = java.net.http.HttpRequest.newBuilder() threadPoolExecutor.execute(() -> {
.uri(URI.create(mirroringUrl)) try {
.method(method, URL url = new URL(mirroringUrl);
java.net.http.HttpRequest.BodyPublishers.ofByteArray(originalBody)); HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(method);
// copy request headers (except some special headers). connection.setConnectTimeout((int) trafficMirroringProperties.getRequestConnectionTimeout());
setHeaders(requestBuilder, originalRequest); connection.setReadTimeout((int) trafficMirroringProperties.getRequestConnectionTimeout());
// build request. // copy request headers (except some special headers).
java.net.http.HttpRequest mirrorRequest = requestBuilder.build(); setHeaders(connection, originalRequest);
// send async request (ignore response). // set request body.
httpClient.sendAsync(mirrorRequest, HttpResponse.BodyHandlers.discarding()) if (finalOriginalBody.length > 0) {
.thenAccept(response -> { connection.setDoOutput(true);
if (response.statusCode() >= 400) { try (OutputStream os = connection.getOutputStream()) {
LOG.warn("Traffic mirroring async request return: {}", response.statusCode()); os.write(finalOriginalBody);
}
else {
LOG.debug("Traffic mirroring async request return: {}", response.statusCode());
} }
}) }
.exceptionally(ex -> {
LOG.warn("Traffic mirroring async request failed", ex); // send request (ignore response).
return null; int responseCode = connection.getResponseCode();
}); if (responseCode >= 400) {
LOG.warn("Traffic mirroring request return: {}", responseCode);
}
else {
LOG.debug("Traffic mirroring request return: {}", responseCode);
}
}
catch (Exception e) {
LOG.warn("Traffic mirroring request failed", e);
}
});
} }
/** /**

@ -40,7 +40,7 @@ public class TrafficMirroringProperties {
/** /**
* Traffic mirroring request connection timeout in millisecond. Default is 5000. * Traffic mirroring request connection timeout in millisecond. Default is 5000.
*/ */
private long requestConnectionTimeout = 5000; private int requestConnectionTimeout = 5000;
public boolean isEnabled() { public boolean isEnabled() {
return enabled; return enabled;
@ -62,7 +62,7 @@ public class TrafficMirroringProperties {
return requestConnectionTimeout; return requestConnectionTimeout;
} }
public void setRequestConnectionTimeout(long requestConnectionTimeout) { public void setRequestConnectionTimeout(int requestConnectionTimeout) {
this.requestConnectionTimeout = requestConnectionTimeout; this.requestConnectionTimeout = requestConnectionTimeout;
} }

@ -69,7 +69,7 @@ public class TrafficMirroringPropertiesTest {
void testRequestConnectionTimeoutProperty() { void testRequestConnectionTimeoutProperty() {
TrafficMirroringProperties properties = new TrafficMirroringProperties(); TrafficMirroringProperties properties = new TrafficMirroringProperties();
properties.setRequestConnectionTimeout(3000L); properties.setRequestConnectionTimeout(3000);
assertThat(properties.getRequestConnectionTimeout()).isEqualTo(3000L); assertThat(properties.getRequestConnectionTimeout()).isEqualTo(3000L);
} }
@ -78,10 +78,10 @@ public class TrafficMirroringPropertiesTest {
void testRequestConnectionTimeoutBoundaryValues() { void testRequestConnectionTimeoutBoundaryValues() {
TrafficMirroringProperties properties = new TrafficMirroringProperties(); TrafficMirroringProperties properties = new TrafficMirroringProperties();
properties.setRequestConnectionTimeout(0L); properties.setRequestConnectionTimeout(0);
assertThat(properties.getRequestConnectionTimeout()).isZero(); assertThat(properties.getRequestConnectionTimeout()).isZero();
properties.setRequestConnectionTimeout(-1000L); properties.setRequestConnectionTimeout(-1000);
assertThat(properties.getRequestConnectionTimeout()).isNegative(); assertThat(properties.getRequestConnectionTimeout()).isNegative();
} }
@ -90,7 +90,7 @@ public class TrafficMirroringPropertiesTest {
TrafficMirroringProperties properties = new TrafficMirroringProperties(); TrafficMirroringProperties properties = new TrafficMirroringProperties();
properties.setEnabled(false); properties.setEnabled(false);
properties.setRequestPoolSize(8); properties.setRequestPoolSize(8);
properties.setRequestConnectionTimeout(2000L); properties.setRequestConnectionTimeout(2000);
String result = properties.toString(); String result = properties.toString();

Loading…
Cancel
Save