lundi 12 juin 2017

Testing RestTemplate with Custom HttpClient

I am developing a Spring Boot Application which calls a REST-API which frequently performs a 303 See Other redirect to the proper location.

For a given resource I start with a random initial URL, intercept the redirect to store the proper location for the next request and at last perform the redirect.

import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.ProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultRedirectStrategy;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.protocol.HttpContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

    @Configuration
    class RestTemplateFactory {
        private static final Logger LOG = LoggerFactory.getLogger(RestTemplateFactory.class);

        @Autowired
        KeyMap keyMap;

        @Bean
        public RestTemplate restTemplate(RestTemplateBuilder builder) {
            HttpClient httpClient = HttpClientBuilder
                    .create()
                    .setRedirectStrategy(new DefaultRedirectStrategy() {
                        @Override
                        public boolean isRedirected(HttpRequest request, HttpResponse response,
                                HttpContext context) throws ProtocolException {

                            if (super.isRedirected(request, response, context)) {
                                String redirectURL = response.getFirstHeader("Location").getValue();
                                LOG.debug("Intercepted redirect: original={}, redirect={}", request.getRequestLine(),
                                        redirectURL);
                                keyMap.put(redirectURL);
                                return true;
                            }
                            return false;
                        }
                    })
                    .build();

            ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
            return builder
                    .requestFactory(requestFactory)
                    .build();
    }
}

(The class KeyMap is used to store the location for some domain key, which is stored in a ThreadLocal before the RestTemplate is invoked.)

Question: How can I test this special RestTemplate?

Aucun commentaire:

Enregistrer un commentaire