Last active
April 26, 2021 01:36
-
-
Save sandipchitale/a447ac82235e86e8e690f0e7fa208561 to your computer and use it in GitHub Desktop.
SocketTimeoutHeaderRouteFilter #zuul
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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: "*" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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