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 @@
/* /*
* 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -20,6 +20,7 @@ import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
@ -86,7 +87,12 @@ class InterceptingClientHttpRequest extends AbstractBufferingClientHttpRequest {
} }
else { else {
ClientHttpRequest delegate = requestFactory.createRequest(request.getURI(), request.getMethod()); 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) { if (body.length > 0) {
StreamUtils.copy(body, delegate.getBody()); StreamUtils.copy(body, delegate.getBody());
} }

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

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

Loading…
Cancel
Save