Browse Source

Add headers in InterceptingClientHttpRequest

This commit *adds* the "intercepted" headers to the ClientHttpRequest,
as opposed to replacing them, which is what happened before this commit.

Issue: SPR-15166
pull/1316/head
Juergen Hoeller 9 years ago
parent
commit
e3be94c961
  1. 10
      spring-web/src/main/java/org/springframework/http/client/InterceptingClientHttpRequest.java
  2. 56
      spring-web/src/test/java/org/springframework/http/client/InterceptingClientHttpRequestFactoryTests.java

10
spring-web/src/main/java/org/springframework/http/client/InterceptingClientHttpRequest.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2015 the original author or authors.
* 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.
@ -20,6 +20,7 @@ import java.io.IOException; @@ -20,6 +20,7 @@ import java.io.IOException;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
@ -86,7 +87,12 @@ class InterceptingClientHttpRequest extends AbstractBufferingClientHttpRequest { @@ -86,7 +87,12 @@ class InterceptingClientHttpRequest extends AbstractBufferingClientHttpRequest {
}
else {
ClientHttpRequest delegate = requestFactory.createRequest(request.getURI(), request.getMethod());
delegate.getHeaders().putAll(request.getHeaders());
for (Map.Entry<String, List<String>> entry : request.getHeaders().entrySet()) {
List<String> values = entry.getValue();
for (String value : values) {
delegate.getHeaders().add(entry.getKey(), value);
}
}
if (body.length > 0) {
StreamUtils.copy(body, delegate.getBody());
}

56
spring-web/src/test/java/org/springframework/http/client/InterceptingClientHttpRequestFactoryTests.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2012 the original author or authors.
* 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.
@ -26,7 +26,6 @@ import java.util.Arrays; @@ -26,7 +26,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.springframework.http.HttpHeaders;
@ -37,25 +36,20 @@ import org.springframework.http.client.support.HttpRequestWrapper; @@ -37,25 +36,20 @@ import org.springframework.http.client.support.HttpRequestWrapper;
import static org.junit.Assert.*;
/** @author Arjen Poutsma */
/**
* @author Arjen Poutsma
* @author Juergen Hoeller
*/
public class InterceptingClientHttpRequestFactoryTests {
private InterceptingClientHttpRequestFactory requestFactory;
private RequestFactoryMock requestFactoryMock;
private RequestFactoryMock requestFactoryMock = new RequestFactoryMock();
private RequestMock requestMock;
private RequestMock requestMock = new RequestMock();
private ResponseMock responseMock;
private ResponseMock responseMock = new ResponseMock();
@Before
public void setUp() throws Exception {
requestFactoryMock = new RequestFactoryMock();
requestMock = new RequestMock();
responseMock = new ResponseMock();
private InterceptingClientHttpRequestFactory requestFactory;
}
@Test
public void basic() throws Exception {
@ -78,6 +72,7 @@ public class InterceptingClientHttpRequestFactoryTests { @@ -78,6 +72,7 @@ public class InterceptingClientHttpRequestFactoryTests {
@Test
public void noExecution() throws Exception {
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
interceptors.add(new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
@ -101,29 +96,29 @@ public class InterceptingClientHttpRequestFactoryTests { @@ -101,29 +96,29 @@ public class InterceptingClientHttpRequestFactoryTests {
public void changeHeaders() throws Exception {
final String headerName = "Foo";
final String headerValue = "Bar";
final String otherValue = "Baz";
ClientHttpRequestInterceptor interceptor = new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
return execution.execute(new HttpRequestWrapper(request) {
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.set(headerName, headerValue);
return headers;
}
}, body);
HttpRequestWrapper wrapper = new HttpRequestWrapper(request);
wrapper.getHeaders().add(headerName, otherValue);
return execution.execute(wrapper, body);
}
};
requestMock = new RequestMock() {
@Override
public ClientHttpResponse execute() throws IOException {
assertEquals(headerValue, getHeaders().getFirst(headerName));
List<String> headerValues = getHeaders().get(headerName);
assertEquals(2, headerValues.size());
assertEquals(headerValue, headerValues.get(0));
assertEquals(otherValue, headerValues.get(1));
return super.execute();
}
};
requestMock.getHeaders().add(headerName, headerValue);
requestFactory =
new InterceptingClientHttpRequestFactory(requestFactoryMock, Collections.singletonList(interceptor));
@ -135,11 +130,11 @@ public class InterceptingClientHttpRequestFactoryTests { @@ -135,11 +130,11 @@ public class InterceptingClientHttpRequestFactoryTests {
@Test
public void changeURI() throws Exception {
final URI changedUri = new URI("http://example.com/2");
ClientHttpRequestInterceptor interceptor = new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
return execution.execute(new HttpRequestWrapper(request) {
@Override
public URI getURI() {
@ -168,11 +163,11 @@ public class InterceptingClientHttpRequestFactoryTests { @@ -168,11 +163,11 @@ public class InterceptingClientHttpRequestFactoryTests {
@Test
public void changeMethod() throws Exception {
final HttpMethod changedMethod = HttpMethod.POST;
ClientHttpRequestInterceptor interceptor = new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
return execution.execute(new HttpRequestWrapper(request) {
@Override
public HttpMethod getMethod() {
@ -201,11 +196,11 @@ public class InterceptingClientHttpRequestFactoryTests { @@ -201,11 +196,11 @@ public class InterceptingClientHttpRequestFactoryTests {
@Test
public void changeBody() throws Exception {
final byte[] changedBody = "Foo".getBytes();
ClientHttpRequestInterceptor interceptor = new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
return execution.execute(request, changedBody);
}
};
@ -218,6 +213,7 @@ public class InterceptingClientHttpRequestFactoryTests { @@ -218,6 +213,7 @@ public class InterceptingClientHttpRequestFactoryTests {
assertTrue(Arrays.equals(changedBody, requestMock.body.toByteArray()));
}
private static class NoOpInterceptor implements ClientHttpRequestInterceptor {
private boolean invoked = false;
@ -230,6 +226,7 @@ public class InterceptingClientHttpRequestFactoryTests { @@ -230,6 +226,7 @@ public class InterceptingClientHttpRequestFactoryTests {
}
}
private class RequestFactoryMock implements ClientHttpRequestFactory {
@Override
@ -241,6 +238,7 @@ public class InterceptingClientHttpRequestFactoryTests { @@ -241,6 +238,7 @@ public class InterceptingClientHttpRequestFactoryTests {
}
private class RequestMock implements ClientHttpRequest {
private URI uri;
@ -291,6 +289,7 @@ public class InterceptingClientHttpRequestFactoryTests { @@ -291,6 +289,7 @@ public class InterceptingClientHttpRequestFactoryTests {
}
}
private static class ResponseMock implements ClientHttpResponse {
private HttpStatus statusCode = HttpStatus.OK;
@ -328,4 +327,5 @@ public class InterceptingClientHttpRequestFactoryTests { @@ -328,4 +327,5 @@ public class InterceptingClientHttpRequestFactoryTests {
public void close() {
}
}
}

Loading…
Cancel
Save