Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,9 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.http.Header;
import org.apache.http.HttpClientConnection;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
Expand All @@ -55,7 +53,6 @@
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpRequestExecutor;
import org.junit.Assert;
import org.junit.Test;

Expand Down Expand Up @@ -162,25 +159,38 @@ private void execute(ApacheHttpRequest request) throws IOException {

@Test
public void testRequestShouldNotFollowRedirects() throws IOException {
final AtomicInteger requestsAttempted = new AtomicInteger(0);
HttpRequestExecutor requestExecutor =
new HttpRequestExecutor() {
final AtomicInteger requestCount = new AtomicInteger(0);
final AtomicBoolean redirected = new AtomicBoolean(false);
final HttpHandler handler =
new HttpHandler() {
@Override
public HttpResponse execute(
HttpRequest request, HttpClientConnection connection, HttpContext context)
throws IOException, HttpException {
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 302, null);
response.addHeader("location", "https://google.com/path");
requestsAttempted.incrementAndGet();
return response;
public void handle(HttpExchange httpExchange) throws IOException {
requestCount.incrementAndGet();
String path = httpExchange.getRequestURI().getPath();
if ("/redirected".equals(path)) {
redirected.set(true);
httpExchange.sendResponseHeaders(200, -1);
} else {
int port = httpExchange.getLocalAddress().getPort();
httpExchange
.getResponseHeaders()
.add("Location", "http://localhost:" + port + "/redirected");
httpExchange.sendResponseHeaders(302, -1);
}
httpExchange.close();
}
};
HttpClient client = HttpClients.custom().setRequestExecutor(requestExecutor).build();
ApacheHttpTransport transport = new ApacheHttpTransport(client);
ApacheHttpRequest request = transport.buildRequest("GET", "https://google.com");
LowLevelHttpResponse response = request.execute();
assertEquals(1, requestsAttempted.get());
assertEquals(302, response.getStatusCode());

try (FakeServer server = new FakeServer(handler)) {
HttpClient client = HttpClients.custom().build();
ApacheHttpTransport transport = new ApacheHttpTransport(client);
ApacheHttpRequest request =
transport.buildRequest("GET", "http://localhost:" + server.getPort() + "/");
LowLevelHttpResponse response = request.execute();
assertEquals(302, response.getStatusCode());
assertEquals(1, requestCount.get());
assertFalse(redirected.get());
}
}

@Test
Expand All @@ -203,7 +213,7 @@ public void process(HttpRequest request, HttpContext context)
.build();

ApacheHttpTransport transport = new ApacheHttpTransport(client);
ApacheHttpRequest request = transport.buildRequest("GET", "https://google.com");
ApacheHttpRequest request = transport.buildRequest("GET", "http://localhost/");
request.addHeader("foo", "bar");
try {
LowLevelHttpResponse response = request.execute();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,7 @@
import org.apache.hc.core5.http.HttpResponse;
import org.apache.hc.core5.http.HttpStatus;
import org.apache.hc.core5.http.impl.bootstrap.HttpServer;
import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
import org.apache.hc.core5.http.impl.io.HttpService;
import org.apache.hc.core5.http.io.HttpClientConnection;
import org.apache.hc.core5.http.io.HttpRequestHandler;
import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
import org.apache.hc.core5.http.io.support.BasicHttpServerRequestHandler;
Expand Down Expand Up @@ -134,32 +132,40 @@ private void execute(Apache5HttpRequest request) throws IOException {

@Test
public void testRequestShouldNotFollowRedirects() throws IOException {
final AtomicInteger requestsAttempted = new AtomicInteger(0);
HttpRequestExecutor requestExecutor =
new HttpRequestExecutor() {
final AtomicInteger requestCount = new AtomicInteger(0);
final AtomicBoolean redirected = new AtomicBoolean(false);
final HttpRequestHandler handler =
new HttpRequestHandler() {
@Override
public ClassicHttpResponse execute(
ClassicHttpRequest request, HttpClientConnection connection, HttpContext context)
throws IOException, HttpException {
ClassicHttpResponse response = new MockClassicHttpResponse();
response.setCode(302);
response.setReasonPhrase(null);
response.addHeader("location", "https://google.com/path");
response.addHeader(HttpHeaders.SET_COOKIE, "");
requestsAttempted.incrementAndGet();
return response;
public void handle(
ClassicHttpRequest request, ClassicHttpResponse response, HttpContext context)
throws HttpException, IOException {
requestCount.incrementAndGet();
String path = request.getRequestUri();
if ("/redirected".equals(path)) {
redirected.set(true);
response.setCode(200);
} else {
response.setCode(302);
response.setHeader(HttpHeaders.LOCATION, "/redirected");
}
}
};
HttpClient client = HttpClients.custom().setRequestExecutor(requestExecutor).build();
Apache5HttpTransport transport = new Apache5HttpTransport(client);
Apache5HttpRequest request = transport.buildRequest("GET", "https://google.com");
LowLevelHttpResponse response = request.execute();
assertEquals(1, requestsAttempted.get());
assertEquals(302, response.getStatusCode());

try (FakeServer server = new FakeServer(handler)) {
HttpClient client = HttpClients.custom().build();
Apache5HttpTransport transport = new Apache5HttpTransport(client);
Apache5HttpRequest request =
transport.buildRequest("GET", "http://localhost:" + server.getPort() + "/");
LowLevelHttpResponse response = request.execute();
assertEquals(302, response.getStatusCode());
assertEquals(1, requestCount.get());
assertFalse(redirected.get());
}
}

@Test
public void testRequestCanSetHeaders() {
public void testRequestCanSetHeaders() throws IOException {
final AtomicBoolean interceptorCalled = new AtomicBoolean(false);
HttpClient client =
HttpClients.custom()
Expand All @@ -178,16 +184,26 @@ public void process(
})
.build();

Apache5HttpTransport transport = new Apache5HttpTransport(client);
Apache5HttpRequest request = transport.buildRequest("GET", "https://google.com");
request.addHeader("foo", "bar");
try {
LowLevelHttpResponse response = request.execute();
fail("should not actually make the request");
} catch (IOException exception) {
assertEquals("cancelling request", exception.getMessage());
HttpRequestHandler dummyHandler =
new HttpRequestHandler() {
@Override
public void handle(
ClassicHttpRequest request, ClassicHttpResponse response, HttpContext context) {}
};

try (FakeServer server = new FakeServer(dummyHandler)) {
Apache5HttpTransport transport = new Apache5HttpTransport(client);
Apache5HttpRequest request =
transport.buildRequest("GET", "http://localhost:" + server.getPort() + "/");
request.addHeader("foo", "bar");
try {
LowLevelHttpResponse response = request.execute();
fail("should not actually make the request");
} catch (IOException exception) {
assertEquals("cancelling request", exception.getMessage());
}
assertTrue("Expected to have called our test interceptor", interceptorCalled.get());
}
assertTrue("Expected to have called our test interceptor", interceptorCalled.get());
}

@Test(timeout = 10_000L)
Expand Down
Loading