HTTPCLIENT-999: tests to guarantee transparency of caching module on end-to-end headers
Contributed by Jonathan Moore <jonathan_moore at comcast.com> git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1000028 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6d41d97eb9
commit
9ced45d7e6
|
@ -34,12 +34,14 @@ import java.util.Date;
|
||||||
|
|
||||||
import org.apache.http.Header;
|
import org.apache.http.Header;
|
||||||
import org.apache.http.HeaderElement;
|
import org.apache.http.HeaderElement;
|
||||||
|
import org.apache.http.HttpEntityEnclosingRequest;
|
||||||
import org.apache.http.HttpHost;
|
import org.apache.http.HttpHost;
|
||||||
import org.apache.http.HttpRequest;
|
import org.apache.http.HttpRequest;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
import org.apache.http.HttpStatus;
|
import org.apache.http.HttpStatus;
|
||||||
import org.apache.http.HttpVersion;
|
import org.apache.http.HttpVersion;
|
||||||
import org.apache.http.impl.cookie.DateUtils;
|
import org.apache.http.impl.cookie.DateUtils;
|
||||||
|
import org.apache.http.message.BasicHttpEntityEnclosingRequest;
|
||||||
import org.apache.http.message.BasicHttpRequest;
|
import org.apache.http.message.BasicHttpRequest;
|
||||||
import org.apache.http.message.BasicHttpResponse;
|
import org.apache.http.message.BasicHttpResponse;
|
||||||
import org.apache.http.protocol.HttpContext;
|
import org.apache.http.protocol.HttpContext;
|
||||||
|
@ -306,6 +308,284 @@ public class TestProtocolRecommendations extends AbstractProtocolTest {
|
||||||
assertEquals(warning, result.getFirstHeader("Warning").getValue());
|
assertEquals(warning, result.getFirstHeader("Warning").getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "A transparent proxy SHOULD NOT modify an end-to-end header unless
|
||||||
|
* the definition of that header requires or specifically allows that."
|
||||||
|
*
|
||||||
|
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.5.2
|
||||||
|
*/
|
||||||
|
private void testDoesNotModifyHeaderOnResponses(final String headerName)
|
||||||
|
throws Exception {
|
||||||
|
final String headerValue = HttpTestUtils
|
||||||
|
.getCanonicalHeaderValue(originResponse, headerName);
|
||||||
|
backendExpectsAnyRequest().andReturn(originResponse);
|
||||||
|
replayMocks();
|
||||||
|
HttpResponse result = impl.execute(host, request);
|
||||||
|
verifyMocks();
|
||||||
|
assertEquals(headerValue,
|
||||||
|
result.getFirstHeader(headerName).getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testDoesNotModifyHeaderOnRequests(final String headerName)
|
||||||
|
throws Exception {
|
||||||
|
final String headerValue = HttpTestUtils.getCanonicalHeaderValue(request, headerName);
|
||||||
|
Capture<HttpRequest> cap = new Capture<HttpRequest>();
|
||||||
|
EasyMock.expect(mockBackend.execute(EasyMock.isA(HttpHost.class),
|
||||||
|
EasyMock.capture(cap), (HttpContext)EasyMock.isNull()))
|
||||||
|
.andReturn(originResponse);
|
||||||
|
replayMocks();
|
||||||
|
impl.execute(host, request);
|
||||||
|
verifyMocks();
|
||||||
|
assertEquals(headerValue,
|
||||||
|
HttpTestUtils.getCanonicalHeaderValue(cap.getValue(),
|
||||||
|
headerName));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyAcceptRangesOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
final String headerName = "Accept-Ranges";
|
||||||
|
originResponse.setHeader(headerName,"bytes");
|
||||||
|
testDoesNotModifyHeaderOnResponses(headerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyAuthorizationOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("Authorization", "Basic dXNlcjpwYXNzd2Q=");
|
||||||
|
testDoesNotModifyHeaderOnRequests("Authorization");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyContentLengthOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
HttpEntityEnclosingRequest post =
|
||||||
|
new BasicHttpEntityEnclosingRequest("POST", "/", HttpVersion.HTTP_1_1);
|
||||||
|
post.setEntity(HttpTestUtils.makeBody(128));
|
||||||
|
post.setHeader("Content-Length","128");
|
||||||
|
request = post;
|
||||||
|
testDoesNotModifyHeaderOnRequests("Content-Length");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyContentLengthOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setEntity(HttpTestUtils.makeBody(128));
|
||||||
|
originResponse.setHeader("Content-Length","128");
|
||||||
|
testDoesNotModifyHeaderOnResponses("Content-Length");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyContentMD5OnRequests()
|
||||||
|
throws Exception {
|
||||||
|
HttpEntityEnclosingRequest post =
|
||||||
|
new BasicHttpEntityEnclosingRequest("POST", "/", HttpVersion.HTTP_1_1);
|
||||||
|
post.setEntity(HttpTestUtils.makeBody(128));
|
||||||
|
post.setHeader("Content-Length","128");
|
||||||
|
post.setHeader("Content-MD5","Q2hlY2sgSW50ZWdyaXR5IQ==");
|
||||||
|
request = post;
|
||||||
|
testDoesNotModifyHeaderOnRequests("Content-MD5");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyContentMD5OnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setEntity(HttpTestUtils.makeBody(128));
|
||||||
|
originResponse.setHeader("Content-MD5","Q2hlY2sgSW50ZWdyaXR5IQ==");
|
||||||
|
testDoesNotModifyHeaderOnResponses("Content-MD5");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyContentRangeOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
HttpEntityEnclosingRequest put =
|
||||||
|
new BasicHttpEntityEnclosingRequest("PUT", "/", HttpVersion.HTTP_1_1);
|
||||||
|
put.setEntity(HttpTestUtils.makeBody(128));
|
||||||
|
put.setHeader("Content-Length","128");
|
||||||
|
put.setHeader("Content-Range","bytes 0-127/256");
|
||||||
|
request = put;
|
||||||
|
testDoesNotModifyHeaderOnRequests("Content-Range");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyContentRangeOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("Range","bytes=0-128");
|
||||||
|
originResponse.setStatusCode(HttpStatus.SC_PARTIAL_CONTENT);
|
||||||
|
originResponse.setReasonPhrase("Partial Content");
|
||||||
|
originResponse.setEntity(HttpTestUtils.makeBody(128));
|
||||||
|
originResponse.setHeader("Content-Range","bytes 0-127/256");
|
||||||
|
testDoesNotModifyHeaderOnResponses("Content-Range");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyContentTypeOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
HttpEntityEnclosingRequest post =
|
||||||
|
new BasicHttpEntityEnclosingRequest("POST", "/", HttpVersion.HTTP_1_1);
|
||||||
|
post.setEntity(HttpTestUtils.makeBody(128));
|
||||||
|
post.setHeader("Content-Length","128");
|
||||||
|
post.setHeader("Content-Type","application/octet-stream");
|
||||||
|
request = post;
|
||||||
|
testDoesNotModifyHeaderOnRequests("Content-Type");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyContentTypeOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setHeader("Content-Type","application/octet-stream");
|
||||||
|
testDoesNotModifyHeaderOnResponses("Content-Type");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyDateOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("Date", DateUtils.formatDate(new Date()));
|
||||||
|
testDoesNotModifyHeaderOnRequests("Date");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyDateOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setHeader("Date", DateUtils.formatDate(new Date()));
|
||||||
|
testDoesNotModifyHeaderOnResponses("Date");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyETagOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setHeader("ETag", "\"random-etag\"");
|
||||||
|
testDoesNotModifyHeaderOnResponses("ETag");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyExpiresOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setHeader("Expires", DateUtils.formatDate(new Date()));
|
||||||
|
testDoesNotModifyHeaderOnResponses("Expires");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyFromOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("From", "foo@example.com");
|
||||||
|
testDoesNotModifyHeaderOnRequests("From");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyIfMatchOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request = new BasicHttpRequest("DELETE", "/", HttpVersion.HTTP_1_1);
|
||||||
|
request.setHeader("If-Match", "\"etag\"");
|
||||||
|
testDoesNotModifyHeaderOnRequests("If-Match");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyIfModifiedSinceOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("If-Modified-Since", DateUtils.formatDate(new Date()));
|
||||||
|
testDoesNotModifyHeaderOnRequests("If-Modified-Since");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyIfNoneMatchOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("If-None-Match", "\"etag\"");
|
||||||
|
testDoesNotModifyHeaderOnRequests("If-None-Match");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyIfRangeOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("Range","bytes=0-128");
|
||||||
|
request.setHeader("If-Range", "\"etag\"");
|
||||||
|
testDoesNotModifyHeaderOnRequests("If-Range");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyIfUnmodifiedSinceOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request = new BasicHttpRequest("DELETE", "/", HttpVersion.HTTP_1_1);
|
||||||
|
request.setHeader("If-Unmodified-Since", DateUtils.formatDate(new Date()));
|
||||||
|
testDoesNotModifyHeaderOnRequests("If-Unmodified-Since");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyLastModifiedOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setHeader("Last-Modified", DateUtils.formatDate(new Date()));
|
||||||
|
testDoesNotModifyHeaderOnResponses("Last-Modified");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyLocationOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setStatusCode(HttpStatus.SC_TEMPORARY_REDIRECT);
|
||||||
|
originResponse.setReasonPhrase("Temporary Redirect");
|
||||||
|
originResponse.setHeader("Location", "http://foo.example.com/bar");
|
||||||
|
testDoesNotModifyHeaderOnResponses("Location");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyRangeOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("Range", "bytes=0-128");
|
||||||
|
testDoesNotModifyHeaderOnRequests("Range");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyRefererOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("Referer", "http://foo.example.com/bar");
|
||||||
|
testDoesNotModifyHeaderOnRequests("Referer");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyRetryAfterOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setStatusCode(HttpStatus.SC_SERVICE_UNAVAILABLE);
|
||||||
|
originResponse.setReasonPhrase("Service Unavailable");
|
||||||
|
originResponse.setHeader("Retry-After", "120");
|
||||||
|
testDoesNotModifyHeaderOnResponses("Retry-After");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyServerOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setHeader("Server", "SomeServer/1.0");
|
||||||
|
testDoesNotModifyHeaderOnResponses("Server");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyUserAgentOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("User-Agent", "MyClient/1.0");
|
||||||
|
testDoesNotModifyHeaderOnRequests("User-Agent");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyVaryOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("Accept-Encoding","identity");
|
||||||
|
originResponse.setHeader("Vary", "Accept-Encoding");
|
||||||
|
testDoesNotModifyHeaderOnResponses("Vary");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyExtensionHeaderOnRequests()
|
||||||
|
throws Exception {
|
||||||
|
request.setHeader("X-Extension","x-value");
|
||||||
|
testDoesNotModifyHeaderOnRequests("X-Extension");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotModifyExtensionHeaderOnResponses()
|
||||||
|
throws Exception {
|
||||||
|
originResponse.setHeader("X-Extension", "x-value");
|
||||||
|
testDoesNotModifyHeaderOnResponses("X-Extension");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "[HTTP/1.1 clients], If only a Last-Modified value has been provided
|
* "[HTTP/1.1 clients], If only a Last-Modified value has been provided
|
||||||
* by the origin server, SHOULD use that value in non-subrange cache-
|
* by the origin server, SHOULD use that value in non-subrange cache-
|
||||||
|
|
Loading…
Reference in New Issue