下面列出了怎么用org.apache.http.HttpRequestInterceptor的API类实例代码及写法,或者点击链接到github查看源代码。
public BmsHttpTransport(HttpRequestInterceptor requestInterceptor) {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(DEFAULT_MAX_CONNECTIONS);
connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE_CONNECTIONS);
RequestConfig requestConfig = RequestConfig.custom().
setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT).
setConnectionRequestTimeout(DEFAULT_CONNECTION_TIMEOUT).
setSocketTimeout(DEFAULT_READ_TIMEOUT).
build();
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().
setConnectionManager(connectionManager).
setDefaultRequestConfig(requestConfig).
useSystemProperties();
if (requestInterceptor != null) {
httpClientBuilder.addInterceptorFirst(requestInterceptor);
}
this.httpClient = httpClientBuilder.build();
}
private void configureHttpProcessorBuilder(final HttpClientBuilder builder, final WebRequest webRequest) {
final HttpProcessorBuilder b = HttpProcessorBuilder.create();
for (final HttpRequestInterceptor i : getHttpRequestInterceptors(webRequest)) {
b.add(i);
}
// These are the headers used in HttpClientBuilder, excluding the already added ones
// (RequestClientConnControl and RequestAddCookies)
b.addAll(new RequestDefaultHeaders(null),
new RequestContent(),
new RequestTargetHost(),
new RequestExpectContinue());
b.add(new RequestAcceptEncoding());
b.add(new RequestAuthCache());
b.add(new ResponseProcessCookies());
builder.setHttpProcessor(b.build());
}
private void configureSolrClientsForKerberos() throws PermanentBackendException {
String kerberosConfig = System.getProperty("java.security.auth.login.config");
if(kerberosConfig == null) {
throw new PermanentBackendException("Unable to configure kerberos for solr client. System property 'java.security.auth.login.config' is not set.");
}
logger.debug("Using kerberos configuration file located at '{}'.", kerberosConfig);
try(Krb5HttpClientBuilder krbBuild = new Krb5HttpClientBuilder()) {
SolrHttpClientBuilder kb = krbBuild.getBuilder();
HttpClientUtil.setHttpClientBuilder(kb);
HttpRequestInterceptor bufferedEntityInterceptor = new HttpRequestInterceptor() {
@Override
public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
if(request instanceof HttpEntityEnclosingRequest) {
HttpEntityEnclosingRequest enclosingRequest = ((HttpEntityEnclosingRequest) request);
HttpEntity requestEntity = enclosingRequest.getEntity();
enclosingRequest.setEntity(new BufferedHttpEntity(requestEntity));
}
}
};
HttpClientUtil.addRequestInterceptor(bufferedEntityInterceptor);
HttpRequestInterceptor preemptiveAuth = new PreemptiveAuth(new KerberosScheme());
HttpClientUtil.addRequestInterceptor(preemptiveAuth);
}
}
@Override
public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
// don't synchronize traversal - can lead to deadlock - CopyOnWriteArrayList is critical
// we also do not want to have to acquire the mutex when the list is empty or put a global
// mutex around the process calls
interceptors.forEach(new Consumer<HttpRequestInterceptor>() {
@Override
public void accept(HttpRequestInterceptor interceptor) {
try {
interceptor.process(request, context);
} catch (Exception e) {
log.error("", e);
}
}
});
}
@Override
public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
String baseUrl = (String) context.getAttribute(BASE_URL);
String layerId = (String) context.getAttribute(LAYER_ID);
try {
if (interceptors != null && baseUrl != null) {
for (Entry<String, List<HttpRequestInterceptor>> entry : interceptors.getMap().entrySet()) {
String key = entry.getKey();
if ("".equals(key) || (layerId != null && layerId.equals(key)) || baseUrl.startsWith(key)) {
for (HttpRequestInterceptor inter : entry.getValue()) {
inter.process(request, context);
}
}
}
}
} catch (Exception e) {
log.warn("Error processing interceptors: " + e.getMessage());
}
}
@Test public void failedInterceptorRemovesScope() {
assertThat(currentTraceContext.get()).isNull();
RuntimeException error = new RuntimeException("Test");
client = TracingHttpAsyncClientBuilder.create(httpTracing)
.addInterceptorLast((HttpRequestInterceptor) (request, context) -> {
throw error;
}).build();
client.start();
assertThatThrownBy(() -> get(client, "/foo"))
.isSameAs(error);
assertThat(currentTraceContext.get()).isNull();
testSpanHandler.takeRemoteSpanWithError(CLIENT, error);
}
public static void resetInterceptors() {
if (!TESTING)
throw new UnsupportedOperationException();
for (HttpRequestInterceptor hri : reqintercepts) {
if (hri instanceof HTTPUtil.InterceptCommon)
((HTTPUtil.InterceptCommon) hri).clear();
}
}
public static HTTPUtil.InterceptRequest debugRequestInterceptor() {
if (!TESTING)
throw new UnsupportedOperationException();
for (HttpRequestInterceptor hri : reqintercepts) {
if (hri instanceof HTTPUtil.InterceptRequest)
return ((HTTPUtil.InterceptRequest) hri);
}
return null;
}
/**
* Injects the client builder with AWS credentials.
* @param credentialsProvider is the AWS credentials provider.
* @return self.
*/
public Builder withCredentials(AWSCredentialsProvider credentialsProvider)
{
/**
* endpoint:
* https://search-movies-ne3fcqzfipy6jcrew2wca6kyqu.us-east-1.es.amazonaws.com
*
* domainSplits:
* [0] = "https://search-movies-ne3fcqzfipy6jcrew2wca6kyqu"
* [1] = "us-east-1"
* [2] = "es"
* [3] = "amazonaws"
* [4] = "com"
*/
List<String> domainSplits = domainSplitter.splitToList(endpoint);
if (domainSplits.size() > 1) {
signer.setRegionName(domainSplits.get(1));
signer.setServiceName("es");
}
HttpRequestInterceptor interceptor =
new AWSRequestSigningApacheInterceptor(signer.getServiceName(), signer, credentialsProvider);
clientBuilder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.addInterceptorLast(interceptor));
return this;
}
@Test
void testGetAndSetLastRequestInterceptor()
{
HttpRequestInterceptor interceptor = mock(HttpRequestInterceptor.class);
config.setLastRequestInterceptor(interceptor);
assertEquals(interceptor, config.getLastRequestInterceptor());
}
private CloseableHttpClient generateClient(Site site) {
HttpClientBuilder httpClientBuilder = HttpClients.custom();
httpClientBuilder.setConnectionManager(connectionManager);
if (site.getUserAgent() != null) {
httpClientBuilder.setUserAgent(site.getUserAgent());
} else {
httpClientBuilder.setUserAgent("");
}
if (site.isUseGzip()) {
httpClientBuilder.addInterceptorFirst(new HttpRequestInterceptor() {
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
if (!request.containsHeader("Accept-Encoding")) {
request.addHeader("Accept-Encoding", "gzip");
}
}
});
}
//解决post/redirect/post 302跳转问题
httpClientBuilder.setRedirectStrategy(new CustomRedirectStrategy());
SocketConfig.Builder socketConfigBuilder = SocketConfig.custom();
socketConfigBuilder.setSoKeepAlive(true).setTcpNoDelay(true);
socketConfigBuilder.setSoTimeout(site.getTimeOut());
SocketConfig socketConfig = socketConfigBuilder.build();
httpClientBuilder.setDefaultSocketConfig(socketConfig);
connectionManager.setDefaultSocketConfig(socketConfig);
httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(site.getRetryTimes(), true));
generateCookie(httpClientBuilder, site);
return httpClientBuilder.build();
}
@Bean
@Primary
public ConsulClient consulClient(ConsulProperties consulProperties,
ConsulConfigProperties consulConfigProperties) {
final int agentPort = consulProperties.getPort();
final String agentHost = !StringUtils.isEmpty(consulProperties.getScheme())
? consulProperties.getScheme() + "://" + consulProperties.getHost()
: consulProperties.getHost();
logger.info("Init consul host: " + agentHost + " port: " + agentPort);
if (consulProperties.getTls() != null) {
ConsulProperties.TLSConfig tls = consulProperties.getTls();
TLSConfig tlsConfig = new TLSConfig(
tls.getKeyStoreInstanceType(),
tls.getCertificatePath(),
tls.getCertificatePassword(),
tls.getKeyStorePath(),
tls.getKeyStorePassword()
);
return new ConsulClient(agentHost, agentPort, tlsConfig);
}
HttpRequestInterceptor httpRequestInterceptor = new BmsCommonInterceptor();
BmsHttpTransport httpTransport = new BmsHttpTransport(httpRequestInterceptor);
ConsulRawClient rawClient = new ConsulRawClient(httpTransport.getHttpClient(),
agentHost, agentPort, consulConfigProperties.getPath());
return new ConsulClient(rawClient);
}
private CloseableHttpClient generateClient(Site site) {
HttpClientBuilder httpClientBuilder = HttpClients.custom();
httpClientBuilder.setConnectionManager(connectionManager);
if (site.getUserAgent() != null) {
httpClientBuilder.setUserAgent(site.getUserAgent());
} else {
httpClientBuilder.setUserAgent("");
}
if (site.isUseGzip()) {
httpClientBuilder.addInterceptorFirst(new HttpRequestInterceptor() {
@Override
public void process(
HttpRequest request,
HttpContext context) throws HttpException, IOException {
if (!request.containsHeader("Accept-Encoding")) {
request.addHeader("Accept-Encoding", "gzip");
}
}
});
}
//解决post/redirect/post 302跳转问题
httpClientBuilder.setRedirectStrategy(new CustomRedirectStrategy());
SocketConfig.Builder socketConfigBuilder = SocketConfig.custom();
socketConfigBuilder.setSoKeepAlive(true).setTcpNoDelay(true);
socketConfigBuilder.setSoTimeout(site.getTimeOut());
SocketConfig socketConfig = socketConfigBuilder.build();
httpClientBuilder.setDefaultSocketConfig(socketConfig);
connectionManager.setDefaultSocketConfig(socketConfig);
httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(site.getRetryTimes(), true));
generateCookie(httpClientBuilder, site);
return httpClientBuilder.build();
}
public static HttpAsyncClientBuilder asyncClientBuilder(HttpAsyncClientBuilder httpAsyncClientBuilder,
String currentApp, String targetApp) {
SofaTracerAsyncHttpInterceptor interceptor = new SofaTracerAsyncHttpInterceptor(
getHttpClientTracer(), currentApp, targetApp);
return httpAsyncClientBuilder.addInterceptorFirst((HttpRequestInterceptor) interceptor)
.addInterceptorFirst((HttpResponseInterceptor) interceptor);
}
CloseableHttpClient signingClientForServiceName(String serviceName) {
AWS4Signer signer = new AWS4Signer();
signer.setServiceName(serviceName);
signer.setRegionName(AWS_REGION);
HttpRequestInterceptor interceptor = new AWSRequestSigningApacheInterceptor(serviceName, signer, credentialsProvider);
return HttpClients.custom()
.addInterceptorLast(interceptor)
.build();
}
@Override
protected StoregateApiClient connect(final Proxy proxy, final HostKeyCallback key, final LoginCallback prompt) {
final HttpClientBuilder configuration = builder.build(proxy, this, prompt);
authorizationService = new OAuth2RequestInterceptor(builder.build(proxy, this, prompt).addInterceptorLast(new HttpRequestInterceptor() {
@Override
public void process(final HttpRequest request, final HttpContext context) {
request.addHeader(HttpHeaders.AUTHORIZATION,
String.format("Basic %s", Base64.encodeToString(String.format("%s:%s", host.getProtocol().getOAuthClientId(), host.getProtocol().getOAuthClientSecret()).getBytes(StandardCharsets.UTF_8), false)));
}
}).build(),
host).withRedirectUri(CYBERDUCK_REDIRECT_URI.equals(host.getProtocol().getOAuthRedirectUrl()) ? host.getProtocol().getOAuthRedirectUrl() :
Scheme.isURL(host.getProtocol().getOAuthRedirectUrl()) ? host.getProtocol().getOAuthRedirectUrl() : new HostUrlProvider().withUsername(false).withPath(true).get(
host.getProtocol().getScheme(), host.getPort(), null, host.getHostname(), host.getProtocol().getOAuthRedirectUrl())
);
// Force login even if browser session already exists
authorizationService.withParameter("prompt", "login");
configuration.setServiceUnavailableRetryStrategy(new OAuth2ErrorResponseInterceptor(host, authorizationService, prompt));
configuration.addInterceptorLast(authorizationService);
final CloseableHttpClient apache = configuration.build();
final StoregateApiClient client = new StoregateApiClient(apache);
final int timeout = PreferencesFactory.get().getInteger("connection.timeout.seconds") * 1000;
client.setConnectTimeout(timeout);
client.setBasePath(new HostUrlProvider().withUsername(false).withPath(true).get(host.getProtocol().getScheme(), host.getPort(),
null, host.getHostname(), host.getProtocol().getContext()));
client.setHttpClient(ClientBuilder.newClient(new ClientConfig()
.register(new InputStreamProvider())
.register(MultiPartFeature.class)
.register(new JSON())
.register(JacksonFeature.class)
.connectorProvider(new HttpComponentsProvider(apache))));
client.setUserAgent(new PreferencesUseragentProvider().get());
return client;
}
private CloseableHttpClient generateClient(Site site) {
HttpClientBuilder httpClientBuilder = HttpClients.custom();
httpClientBuilder.setConnectionManager(connectionManager);
if (site.getUserAgent() != null) {
httpClientBuilder.setUserAgent(site.getUserAgent());
} else {
httpClientBuilder.setUserAgent("");
}
if (site.isUseGzip()) {
httpClientBuilder.addInterceptorFirst(new HttpRequestInterceptor() {
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
if (!request.containsHeader("Accept-Encoding")) {
request.addHeader("Accept-Encoding", "gzip");
}
}
});
}
//解决post/redirect/post 302跳转问题
httpClientBuilder.setRedirectStrategy(new CustomRedirectStrategy());
SocketConfig.Builder socketConfigBuilder = SocketConfig.custom();
socketConfigBuilder.setSoKeepAlive(true).setTcpNoDelay(true);
socketConfigBuilder.setSoTimeout(site.getTimeOut());
SocketConfig socketConfig = socketConfigBuilder.build();
httpClientBuilder.setDefaultSocketConfig(socketConfig);
connectionManager.setDefaultSocketConfig(socketConfig);
httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(site.getRetryTimes(), true));
generateCookie(httpClientBuilder, site);
return httpClientBuilder.build();
}
public HttpRequestInterceptor getHttpInterceptor() {
DefaultAWSCredentialsProviderChain cp = new DefaultAWSCredentialsProviderChain();
AWS4Signer signer = new AWS4Signer();
signer.setServiceName(this.service);
signer.setRegionName(this.region.getName());
return new AWSRequestSigningApacheInterceptor(this.service, signer, cp);
}
@DataProvider(value = {
"true",
"false"
})
@Test
public void addTracingInterceptors_double_arg_works_as_expected(boolean subspanOptionOn) {
// given
HttpClientBuilder builder = HttpClientBuilder.create();
// when
addTracingInterceptors(builder, subspanOptionOn);
// then
HttpClientBuilderInterceptors builderInterceptors = new HttpClientBuilderInterceptors(builder);
assertThat(builderInterceptors.firstRequestInterceptors).hasSize(1);
assertThat(builderInterceptors.lastResponseInterceptors).hasSize(1);
HttpRequestInterceptor requestInterceptor = builderInterceptors.firstRequestInterceptors.get(0);
HttpResponseInterceptor responseInterceptor = builderInterceptors.lastResponseInterceptors.get(0);
assertThat(requestInterceptor).isInstanceOf(WingtipsApacheHttpClientInterceptor.class);
assertThat(responseInterceptor).isInstanceOf(WingtipsApacheHttpClientInterceptor.class);
assertThat(((WingtipsApacheHttpClientInterceptor) requestInterceptor).surroundCallsWithSubspan)
.isEqualTo(subspanOptionOn);
assertThat(((WingtipsApacheHttpClientInterceptor) responseInterceptor).surroundCallsWithSubspan)
.isEqualTo(subspanOptionOn);
assertThat(builderInterceptors.lastRequestInterceptors).isNullOrEmpty();
assertThat(builderInterceptors.firstResponseInterceptors).isNullOrEmpty();
if (subspanOptionOn) {
assertThat(builderInterceptors.firstRequestInterceptors).containsExactly(DEFAULT_REQUEST_IMPL);
assertThat(builderInterceptors.lastResponseInterceptors).containsExactly(DEFAULT_RESPONSE_IMPL);
}
}
public HttpClientBuilderInterceptors(HttpClientBuilder builder) {
this.firstRequestInterceptors =
(List<HttpRequestInterceptor>) Whitebox.getInternalState(builder, "requestFirst");
this.lastRequestInterceptors =
(List<HttpRequestInterceptor>) Whitebox.getInternalState(builder, "requestLast");
this.firstResponseInterceptors =
(List<HttpResponseInterceptor>) Whitebox.getInternalState(builder, "responseFirst");
this.lastResponseInterceptors =
(List<HttpResponseInterceptor>) Whitebox.getInternalState(builder, "responseLast");
}
/**
* Assigns a token provider which will produce HTTP auth tokens to be included in requests.
*
* @return this
*/
public DcosHttpClientBuilder setTokenProvider(TokenProvider provider) {
this.addInterceptorFirst(
(HttpRequestInterceptor) (request, context) ->
request.addHeader(
"Authorization",
String.format("token=%s", provider.getToken().getToken())));
return this;
}
public static CloseableHttpClient createHttpClient(final Client client,
final List<HttpRequestInterceptor> firstRequestInterceptors,
final HttpClientConnectionManager connectionManager,
@Nullable final HttpClientCustomizer customizer,
@Nullable final Object cacheStorage) {
final Caching caching = client.getCaching();
final HttpClientBuilder builder = caching.getEnabled() ?
configureCaching(caching, cacheStorage) :
HttpClientBuilder.create();
final RequestConfig.Builder config = RequestConfig.custom();
firstRequestInterceptors.forEach(builder::addInterceptorFirst);
final Connections connections = client.getConnections();
config.setConnectionRequestTimeout((int) connections.getLeaseRequestTimeout().to(MILLISECONDS));
config.setConnectTimeout((int) connections.getConnectTimeout().to(MILLISECONDS));
config.setSocketTimeout((int) connections.getSocketTimeout().to(MILLISECONDS));
builder.setConnectionManager(connectionManager);
builder.setDefaultRequestConfig(config.build());
builder.disableAutomaticRetries();
Optional.ofNullable(customizer).ifPresent(customize(builder));
return builder.build();
}
private CloseableHttpClient generateClient(Site site) {
HttpClientBuilder httpClientBuilder = HttpClients.custom().setConnectionManager(connectionManager);
if (site != null && site.getUserAgent() != null) {
httpClientBuilder.setUserAgent(site.getUserAgent());
} else {
httpClientBuilder.setUserAgent("");
}
if (site == null || site.isUseGzip()) {
httpClientBuilder.addInterceptorFirst(new HttpRequestInterceptor() {
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
if (!request.containsHeader("Accept-Encoding")) {
request.addHeader("Accept-Encoding", "gzip");
}
}
});
}
SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).build();
httpClientBuilder.setDefaultSocketConfig(socketConfig);
if (site != null) {
httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(site.getRetryTimes(), true));
}
generateCookie(httpClientBuilder, site);
return httpClientBuilder.build();
}
@Test
public void test()
throws IOException
{
DefaultHttpClient client = new DefaultHttpClient();
// Our request method
HttpGet get = new HttpGet( "http://127.0.0.1:" + port + "/" );
HttpResponse response = client.execute( get );
int status = response.getStatusLine().getStatusCode();
assertThat( String.valueOf( status ).substring( 0, 1 ) + "xx", is( "4xx" ) );
EntityUtils.consume( response.getEntity() );
// Simple interceptor set as first interceptor in the protocol chain
HttpRequestInterceptor preemptiveAuth = new BasicAuthRequestInterceptor();
client.addRequestInterceptor( preemptiveAuth, 0 );
// Set credentials
UsernamePasswordCredentials creds = new UsernamePasswordCredentials( "foo", "bar" );
client.getCredentialsProvider().setCredentials( AuthScope.ANY, creds );
response = client.execute( get );
status = response.getStatusLine().getStatusCode();
assertThat( status, is( 200 ) );
String result = new BasicResponseHandler().handleResponse( response ).trim();
assertThat( result, is( "FOO" ) );
}
@Override
protected void accessToken(final DefaultHttpClient client) throws OAuth2Exception {
client.addRequestInterceptor(new HttpRequestInterceptor() {
@Override
public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
request.removeHeaders(HttpHeaders.AUTHORIZATION);
request.addHeader(HttpHeaders.AUTHORIZATION, OAuthClientUtils.createAuthorizationHeader(accessToken));
}
});
}
@Override
protected void accessToken(final DefaultHttpClient client) throws OAuth2Exception {
client.addRequestInterceptor(new HttpRequestInterceptor() {
@Override
public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
request.removeHeaders(HttpHeaders.AUTHORIZATION);
request.addHeader(HttpHeaders.AUTHORIZATION, "Bearer " + token.get("access_token").asText());
}
});
}
private CloseableHttpClient generateClient(Site site) {
HttpClientBuilder httpClientBuilder = HttpClients.custom();
httpClientBuilder.setConnectionManager(connectionManager);
if (site.getUserAgent() != null) {
httpClientBuilder.setUserAgent(site.getUserAgent());
} else {
httpClientBuilder.setUserAgent("");
}
if (site.isUseGzip()) {
httpClientBuilder.addInterceptorFirst(new HttpRequestInterceptor() {
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
if (!request.containsHeader("Accept-Encoding")) {
request.addHeader("Accept-Encoding", "gzip");
}
}
});
}
//解决post/redirect/post 302跳转问题
httpClientBuilder.setRedirectStrategy(new CustomRedirectStrategy());
SocketConfig.Builder socketConfigBuilder = SocketConfig.custom();
socketConfigBuilder.setSoKeepAlive(true).setTcpNoDelay(true);
socketConfigBuilder.setSoTimeout(site.getTimeOut());
SocketConfig socketConfig = socketConfigBuilder.build();
httpClientBuilder.setDefaultSocketConfig(socketConfig);
connectionManager.setDefaultSocketConfig(socketConfig);
httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(site.getRetryTimes(), true));
generateCookie(httpClientBuilder, site);
return httpClientBuilder.build();
}
public HttpRequestInterceptor getLastRequestInterceptor()
{
return lastRequestInterceptor;
}
public void setLastRequestInterceptor(HttpRequestInterceptor lastRequestInterceptor)
{
this.lastRequestInterceptor = lastRequestInterceptor;
}
public HttpClientConfigurer addInterceptor(HttpRequestInterceptor interceptor) {
httpClientBuilder.addInterceptorLast(interceptor);
return this;
}