// Copyright (c) 2003-present, Jodd Team (http://jodd.org)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
package jodd.http;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
public class KeepAliveTest {
private static final String[] RESPONSES = new String[] {
"HTTP/1.1 200 OK\r\n" +
"Content-Type: text/html; charset=utf-8\r\n" +
"Content-Length: 13\r\n" +
"Connection: Keep-Alive\r\n" +
"Keep-Alive: timeout=100, max=2\r\n" +
"\r\n" +
"<html></html>",
"HTTP/1.1 200 OK\r\n" +
"Content-Type: text/html; charset=utf-8\r\n" +
"Content-Length: 13\r\n" +
"Connection: Keep-Alive\r\n" +
"Keep-Alive: timeout=100, max=1\r\n" +
"\r\n" +
"<html></html>",
"HTTP/1.1 200 OK\r\n" +
"Content-Type: text/html; charset=utf-8\r\n" +
"Content-Length: 13\r\n" +
"Connection: Close\r\n" +
"\r\n" +
"<html></html>"
};
private static int currentResponse;
HttpConnectionProvider httpConnectionProvider = new HttpConnectionProvider() {
public void useProxy(ProxyInfo proxyInfo) {
}
public HttpConnection createHttpConnection(HttpRequest httpRequest) throws IOException {
return new HttpConnection() {
@Override
public void init() throws IOException {
// ignore
}
public OutputStream getOutputStream() throws IOException {
return new ByteArrayOutputStream();
}
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(RESPONSES[currentResponse].getBytes());
}
public void setTimeout(int milliseconds) {
// ignore
}
public void close() {
}
};
}
};
@Test
public void testKeepAlive() {
currentResponse = 0;
// ->
HttpRequest request = HttpRequest.get("http://jodd.org");
assertEquals("Close", request.header("Connection"));
request.connectionKeepAlive(true);
assertTrue(request.isConnectionPersistent());
// <-
HttpResponse response = request.open(httpConnectionProvider).send();
HttpConnection connection = request.connection();
assertTrue(request.isConnectionPersistent());
assertTrue(response.isConnectionPersistent());
assertNotNull(request.connection());
currentResponse = 1;
// ->
request = HttpRequest.get("http://jodd.org");
response = request.keepAlive(response, true).send();
// <-
assertSame(connection, request.connection());
assertTrue(request.isConnectionPersistent());
assertTrue(response.isConnectionPersistent());
assertNotNull(request.connection());
currentResponse = 2;
// -> LAST request
request = HttpRequest.get("http://jodd.org");
response = request.keepAlive(response, true).send();
// <-
assertNull(request.connection()); // connection is closed
assertTrue(request.isConnectionPersistent());
assertFalse(response.isConnectionPersistent());
currentResponse = 0;
// -> AFTER THE LAST, STARTS EVERYTHING AGAIN
request = HttpRequest.get("http://jodd.org");
response = request.keepAlive(response, true).send(); // should be false for the last connection, but ok.
// <-
assertTrue(request.isConnectionPersistent());
assertTrue(response.isConnectionPersistent());
assertNotNull(request.connection());
// CLOSE
response.close();
assertNull(request.connection()); // connection closed
}
@Test
public void testKeepAliveBrowser() {
HttpBrowser browser = new HttpBrowser();
browser.setKeepAlive(true);
browser.setHttpConnectionProvider(httpConnectionProvider);
currentResponse = 0;
// ->
HttpRequest request = HttpRequest.get("http://jodd.org");
browser.sendRequest(request);
// <-
HttpResponse response = browser.getHttpResponse();
HttpConnection connection = request.connection();
assertTrue(request.isConnectionPersistent());
assertTrue(response.isConnectionPersistent());
assertNotNull(request.connection());
currentResponse = 1;
// ->
request = HttpRequest.get("http://jodd.org");
response = browser.sendRequest(request);
// <-
assertSame(connection, request.connection());
assertTrue(request.isConnectionPersistent());
assertTrue(response.isConnectionPersistent());
assertNotNull(request.connection());
currentResponse = 2;
// -> LAST request
request = HttpRequest.get("http://jodd.org");
response = browser.sendRequest(request);
// <-
assertNull(request.connection()); // connection is closed
assertTrue(request.isConnectionPersistent());
assertFalse(response.isConnectionPersistent());
currentResponse = 0;
// -> AFTER THE LAST, STARTS EVERYTHING AGAIN
request = HttpRequest.get("http://jodd.org");
response = browser.sendRequest(request);
// <-
assertTrue(request.isConnectionPersistent());
assertTrue(response.isConnectionPersistent());
assertNotNull(request.connection());
// CLOSE
browser.close();
assertNull(request.connection()); // connection closed
}
}