org.springframework.http.client.support.InterceptingHttpAccessor Maven / Gradle / Ivy
/*
* Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.http.client.support;
import java.util.ArrayList;
import java.util.List;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.InterceptingClientHttpRequestFactory;
import org.springframework.lang.Nullable;
import org.springframework.util.CollectionUtils;
/**
* Base class for {@link org.springframework.web.client.RestTemplate}
* and other HTTP accessing gateway helpers, adding interceptor-related
* properties to {@link HttpAccessor}'s common properties.
*
* Not intended to be used directly.
* See {@link org.springframework.web.client.RestTemplate} for an entry point.
*
* @author Arjen Poutsma
* @author Juergen Hoeller
* @since 3.0
* @see ClientHttpRequestInterceptor
* @see InterceptingClientHttpRequestFactory
* @see org.springframework.web.client.RestTemplate
*/
public abstract class InterceptingHttpAccessor extends HttpAccessor {
private final List interceptors = new ArrayList<>();
@Nullable
private volatile ClientHttpRequestFactory interceptingRequestFactory;
/**
* Set the request interceptors that this accessor should use.
* The interceptors will get sorted according to their order
* once the {@link ClientHttpRequestFactory} will be built.
* @see #getRequestFactory()
* @see AnnotationAwareOrderComparator
*/
public void setInterceptors(List interceptors) {
// Take getInterceptors() List as-is when passed in here
if (this.interceptors != interceptors) {
this.interceptors.clear();
this.interceptors.addAll(interceptors);
AnnotationAwareOrderComparator.sort(this.interceptors);
}
}
/**
* Return the request interceptors that this accessor uses.
* The returned {@link List} is active and may get appended to.
*/
public List getInterceptors() {
return this.interceptors;
}
/**
* {@inheritDoc}
*/
@Override
public void setRequestFactory(ClientHttpRequestFactory requestFactory) {
super.setRequestFactory(requestFactory);
this.interceptingRequestFactory = null;
}
/**
* Overridden to expose an {@link InterceptingClientHttpRequestFactory}
* if necessary.
* @see #getInterceptors()
*/
@Override
public ClientHttpRequestFactory getRequestFactory() {
List interceptors = getInterceptors();
if (!CollectionUtils.isEmpty(interceptors)) {
ClientHttpRequestFactory factory = this.interceptingRequestFactory;
if (factory == null) {
factory = new InterceptingClientHttpRequestFactory(super.getRequestFactory(), interceptors);
this.interceptingRequestFactory = factory;
}
return factory;
}
else {
return super.getRequestFactory();
}
}
}