package biz.aQute.http.testservers;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.GZIPInputStream;
import java.util.zip.InflaterInputStream;
import aQute.http.testservers.HttpTestServer;
import aQute.http.testservers.Httpbin;
import aQute.http.testservers.HttpTestServer.Config;
import aQute.lib.converter.TypeReference;
import aQute.lib.io.IO;
import aQute.lib.json.JSONCodec;
import junit.framework.TestCase;
public class HttpTestServerTest extends TestCase {
final static TypeReference<Map<String, Object>> MAP_REF = new TypeReference<Map<String, Object>>() {
};
public void testSimple() throws Exception {
HttpTestServer http = getHttps();
System.out.println(http.getBaseURI());
System.out.println(Arrays.toString(http.getCertificateChain()));
assertFalse(0 == http.getAddress().getPort());
}
static Pattern DN_P = Pattern.compile("(^|\\s)CN=(?<cn>[^, ]+)", Pattern.CASE_INSENSITIVE);
public void testCorrectCommonName() throws Exception {
HttpTestServer http = getHttps();
X509Certificate cert = http.getCertificateChain()[0];
String name = cert.getSubjectDN().getName();
Matcher m = DN_P.matcher(name);
assertTrue(m.find());
assertEquals(m.group("cn"), http.getAddress().getHostName());
}
public void testURI() throws Exception {
try (HttpTestServer http = getHttps();) {
URI uri = http.getBaseURI();
assertEquals(http.getAddress().getPort(), uri.getPort());
assertEquals(http.getAddress().getHostName(), uri.getHost());
assertEquals("https", uri.getScheme());
}
}
public void testDefault() throws Exception {
try (HttpTestServer http = getHttp();) {
URL uri = http.getBaseURI().toURL();
String s = aQute.lib.io.IO.collect(uri.openStream());
System.out.println(s);
}
}
public void testStatus() throws Exception {
try (HttpTestServer http = getHttp();) {
URL uri = new URI(http.getBaseURI() + "/status/500").toURL();
HttpURLConnection connection = (HttpURLConnection) uri.openConnection();
assertEquals(500, connection.getResponseCode());
}
}
public void testIp() throws Exception {
try (HttpTestServer http = getHttp();) {
assertNotNull(get(http, MAP_REF, "/ip").get("origin"));
}
}
public void testUserAgent() throws Exception {
try (HttpTestServer http = getHttp();) {
assertNotNull(toCaseInsensitive(get(http, MAP_REF, "/user-agent")).get("user-agent"));
}
}
public void testHeaders() throws Exception {
try (HttpTestServer http = getHttp();) {
assertNotNull(toCaseInsensitive(get(http, MAP_REF, "/headers")).get("user-agent"));
}
}
public void testBasicAuth() throws Exception {
try (HttpTestServer http = getHttp();) {
URL uri = new URL(http.getBaseURI() + "/basic-auth/john/doe");
HttpURLConnection hrc = (HttpURLConnection) uri.openConnection();
hrc.setRequestProperty("Authorization",
"Basic " + aQute.lib.base64.Base64.encodeBase64("john:doe".getBytes("UTF-8")));
hrc.connect();
assertEquals(200, hrc.getResponseCode());
}
}
public void testBasicFalseAuth() throws Exception {
try (HttpTestServer http = getHttp();) {
URL uri = new URL(http.getBaseURI() + "/basic-auth/john/xxxxxxx");
HttpURLConnection hrc = (HttpURLConnection) uri.openConnection();
hrc.setRequestProperty("Authorization",
"Basic " + aQute.lib.base64.Base64.encodeBase64("john:doe".getBytes("UTF-8")));
hrc.connect();
assertEquals(401, hrc.getResponseCode());
}
}
public void testGet() throws Exception {
try (HttpTestServer http = getHttp();) {
Map<String, ?> map = get(http, MAP_REF, "/get");
assertNotNull(map.get("headers"));
}
}
public void testEncoding() throws Exception {
try (HttpTestServer http = getHttp();) {
URL url = new URL(http.getBaseURI() + "/encoding/utf8");
String s = IO.collect(url.openStream(), "UTF-8");
assertNotNull(s);
assertEquals(9995, s.length());
url = new URL(http.getBaseURI() + "/encoding/utf16");
s = IO.collect(url.openStream(), "UTF-16");
assertNotNull(s);
assertEquals(9995, s.length());
url = new URL(http.getBaseURI() + "/encoding/ascii");
s = IO.collect(url.openStream(), "ascii");
assertNotNull(s);
assertEquals(9995, s.length());
url = new URL(http.getBaseURI() + "/encoding/ISO_8859_1");
s = IO.collect(url.openStream(), "ISO_8859_1");
assertNotNull(s);
assertEquals(9995, s.length());
}
}
public void testGzip() throws Exception {
try (HttpTestServer http = getHttp();) {
URL url = new URL( http.getBaseURI() +"/gzip");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestProperty("Accept-Encoding", "gzip");
byte data[] = IO.read(con.getInputStream());
ByteArrayInputStream bin = new ByteArrayInputStream(data);
GZIPInputStream gzin = new GZIPInputStream(bin);
String s = IO.collect(gzin, "UTF-8");
System.out.println(s);
}
}
public void testDeflate() throws Exception {
try (HttpTestServer http = getHttp();) {
URL url = new URL( http.getBaseURI() +"/deflate?abc=def&abc%24=12");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestProperty("Accept-Encoding", "gzip");
byte data[] = IO.read(con.getInputStream());
ByteArrayInputStream bin = new ByteArrayInputStream(data);
InflaterInputStream gzin = new InflaterInputStream(bin);
String s = IO.collect(gzin, "UTF-8");
System.out.println(s);
}
}
public void testPut() throws IOException, Exception {
try (HttpTestServer http = getHttp();) {
URL url = new URL( http.getBaseURI() + "/put");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("PUT");
IO.copy( "ABC".getBytes(), con.getOutputStream());
assertEquals( 200, con.getResponseCode());
String s = IO.collect( con.getInputStream());
assertEquals( "ABC", s);
}
}
public void testPost() throws IOException, Exception {
try (HttpTestServer http = getHttp();) {
URL url = new URL( http.getBaseURI() + "/put");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
IO.copy( "ABC".getBytes(), con.getOutputStream());
assertEquals( 200, con.getResponseCode());
String s = IO.collect( con.getInputStream());
assertEquals( "ABC", s);
}
}
private SortedMap<String, Object> toCaseInsensitive(Map<String, Object> map) {
TreeMap<String, Object> tm = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
tm.putAll(map);
return tm;
}
private <T> T get(HttpTestServer http, TypeReference<T> tref, String path) throws Exception {
URL uri = new URI(http.getBaseURI() + path).toURL();
HttpURLConnection connection = (HttpURLConnection) uri.openConnection();
String collect = IO.collect(connection.getInputStream());
return new JSONCodec().dec().from(collect).get(tref);
}
public HttpTestServer getHttps() throws Exception {
HttpTestServer.Config config = new Config();
config.https = true;
HttpTestServer http = new HttpTestServer(config);
http.start();
return http;
}
public HttpTestServer getHttp() throws Exception {
HttpTestServer.Config config = new Config();
config.https = false;
HttpTestServer http = new Httpbin(config);
http.start();
return http;
}
}