Skip to content

Instantly share code, notes, and snippets.

@sandipchitale
Last active April 26, 2021 01:36
Show Gist options
  • Save sandipchitale/a447ac82235e86e8e690f0e7fa208561 to your computer and use it in GitHub Desktop.
Save sandipchitale/a447ac82235e86e8e690f0e7fa208561 to your computer and use it in GitHub Desktop.
SocketTimeoutHeaderRouteFilter #zuul
zuul:
host:
socket-timeout-millis: 60000
ignored-headers:
- X-Infoarchive-Timeout-Millis
routes:
example:
path: /get
url: https://httpbin.org
# logging:
# level:
# org:
# springframework:
# cloud:
# netflix:
# zuul: TRACE
management:
endpoints:
web:
exposure:
include: "*"
import javax.servlet.http.HttpServletRequest;
import org.apache.http.HttpRequest;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.InputStreamEntity;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.commons.httpclient.ApacheHttpClientConnectionManagerFactory;
import org.springframework.cloud.commons.httpclient.ApacheHttpClientFactory;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.Host;
import org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
public static class SocketTimeoutHeaderRouteFilter extends SimpleHostRoutingFilter {
private ZuulProperties properties;
private Host hostProperties;
private ProxyRequestHelper helper;
public SocketTimeoutHeaderRouteFilter(ProxyRequestHelper helper, ZuulProperties properties,
ApacheHttpClientConnectionManagerFactory connectionManagerFactory, ApacheHttpClientFactory httpClientFactory) {
super(helper, properties, connectionManagerFactory, httpClientFactory);
this.helper = helper;
this.properties = properties;
this.hostProperties = properties.getHost();
}
@Override
protected HttpRequest buildHttpRequest(String verb, String uri, InputStreamEntity entity,
MultiValueMap<String, String> headers, MultiValueMap<String, String> params, HttpServletRequest request) {
HttpRequest httpRequest = super.buildHttpRequest(verb, uri, entity, headers, params, request);
httpRequest = configureHttpRequest(verb, uri, entity, headers, params, request, httpRequest);
return httpRequest;
}
protected HttpRequest configureHttpRequest(String verb, String uri, InputStreamEntity entity,
MultiValueMap<String, String> headers, MultiValueMap<String, String> params, HttpServletRequest request,
HttpRequest httpRequest) {
String socketTimeoutMillisString = request.getHeader("X-INFOARCHIVE-TIMEOUT-MILLIS");
if (socketTimeoutMillisString != null) {
if (!(httpRequest instanceof HttpRequestBase)) {
boolean forceOriginalQueryStringEncoding = properties.isForceOriginalQueryStringEncoding();;
String uriWithQueryString = uri + (forceOriginalQueryStringEncoding ? getEncodedQueryString(request) : this.helper.getQueryString(params));
switch (verb.toUpperCase()) {
case "GET":
HttpGet httpGet = new HttpGet(uriWithQueryString);
httpGet.setHeaders(httpRequest.getAllHeaders());
httpRequest = httpGet;
break;
}
}
try {
int socketTimeoutMillis = Integer.parseInt(socketTimeoutMillisString);
final RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(this.hostProperties.getConnectionRequestTimeoutMillis())
.setSocketTimeout(socketTimeoutMillis).setConnectTimeout(this.hostProperties.getConnectTimeoutMillis())
.setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
((HttpRequestBase) httpRequest).setConfig(requestConfig);
} catch (NumberFormatException nfe) {
}
}
return httpRequest;
}
private String getEncodedQueryString(HttpServletRequest request) {
String query = request.getQueryString();
return (query != null) ? "?" + query : "";
}
}
@Bean
public SocketTimeoutHeaderRouteFilter simpleHostRoutingFilter(ProxyRequestHelper helper,
ZuulProperties zuulProperties,
ApacheHttpClientConnectionManagerFactory connectionManagerFactory,
ApacheHttpClientFactory httpClientFactory) {
return new SocketTimeoutHeaderRouteFilter(helper, zuulProperties, connectionManagerFactory, httpClientFactory);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment