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)
- [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)
- [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.SocketException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
@ -129,8 +131,11 @@ public class ProviderController {
responseBody = "mock 5xx return.";
break;
default:
LOG.info("provider-demo -- request param: [" + param + "]");
responseBody = String.format("from host-ip: %s, request param: %s, response from %s",
getInet4Address(), param, providerNameConfig.getName());
LOG.info("provider-demo -- provider config name: [" + providerNameConfig.getName() + ']');
LOG.info("provider-demo -- response info: [" + responseBody + "]");
status = HttpServletResponse.SC_OK;
break;
}
@ -193,4 +198,23 @@ public class ProviderController {
LOG.info(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.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.client.ClientHttpResponse;
/**
@ -67,10 +66,15 @@ public class PolarisFaultInjectionHttpResponse implements ClientHttpResponse {
@NotNull
@Override
public HttpStatusCode getStatusCode() {
public HttpStatus getStatusCode() {
return HttpStatus.valueOf(fallbackInfo.getCode());
}
@Override
public int getRawStatusCode() throws IOException {
return fallbackInfo.getCode();
}
@NotNull
@Override
public final String getStatusText() {

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

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

Loading…
Cancel
Save