package org.jsoup.helper; import static org.junit.Assert.*; import org.jsoup.integration.ParseTest; import org.junit.Test; import org.jsoup.Connection; import java.io.IOException; import java.util.*; import java.net.URL; import java.net.MalformedURLException; public class HttpConnectionTest { /* most actual network http connection tests are in integration */ @Test(expected=IllegalArgumentException.class) public void throwsExceptionOnParseWithoutExecute() throws IOException { Connection con = HttpConnection.connect("http://example.com"); con.response().parse(); } @Test(expected=IllegalArgumentException.class) public void throwsExceptionOnBodyWithoutExecute() throws IOException { Connection con = HttpConnection.connect("http://example.com"); con.response().body(); } @Test(expected=IllegalArgumentException.class) public void throwsExceptionOnBodyAsBytesWithoutExecute() throws IOException { Connection con = HttpConnection.connect("http://example.com"); con.response().bodyAsBytes(); } @Test public void caseInsensitiveHeaders() { Connection.Response res = new HttpConnection.Response(); Map<String, String> headers = res.headers(); headers.put("Accept-Encoding", "gzip"); headers.put("content-type", "text/html"); headers.put("refErrer", "http://example.com"); assertTrue(res.hasHeader("Accept-Encoding")); assertTrue(res.hasHeader("accept-encoding")); assertTrue(res.hasHeader("accept-Encoding")); assertEquals("gzip", res.header("accept-Encoding")); assertEquals("text/html", res.header("Content-Type")); assertEquals("http://example.com", res.header("Referrer")); res.removeHeader("Content-Type"); assertFalse(res.hasHeader("content-type")); res.header("accept-encoding", "deflate"); assertEquals("deflate", res.header("Accept-Encoding")); assertEquals("deflate", res.header("accept-Encoding")); } @Test public void sameHeadersCombineWithComma() { Map<String, List<String>> headers = new HashMap<String, List<String>>(); List<String> values = new ArrayList<String>(); values.add("no-cache"); values.add("no-store"); headers.put("Cache-Control", values); HttpConnection.Response res = new HttpConnection.Response(); res.processResponseHeaders(headers); assertEquals("no-cache, no-store", res.header("Cache-Control")); } @Test public void ignoresEmptySetCookies() { // prep http response header map Map<String, List<String>> headers = new HashMap<String, List<String>>(); headers.put("Set-Cookie", Collections.<String>emptyList()); HttpConnection.Response res = new HttpConnection.Response(); res.processResponseHeaders(headers); assertEquals(0, res.cookies().size()); } @Test public void ignoresEmptyCookieNameAndVals() { // prep http response header map Map<String, List<String>> headers = new HashMap<String, List<String>>(); List<String> cookieStrings = new ArrayList<String>(); cookieStrings.add(null); cookieStrings.add(""); cookieStrings.add("one"); cookieStrings.add("two="); cookieStrings.add("three=;"); cookieStrings.add("four=data; Domain=.example.com; Path=/"); headers.put("Set-Cookie", cookieStrings); HttpConnection.Response res = new HttpConnection.Response(); res.processResponseHeaders(headers); assertEquals(4, res.cookies().size()); assertEquals("", res.cookie("one")); assertEquals("", res.cookie("two")); assertEquals("", res.cookie("three")); assertEquals("data", res.cookie("four")); } @Test public void connectWithUrl() throws MalformedURLException { Connection con = HttpConnection.connect(new URL("http://example.com")); assertEquals("http://example.com", con.request().url().toExternalForm()); } @Test(expected=IllegalArgumentException.class) public void throwsOnMalformedUrl() { Connection con = HttpConnection.connect("bzzt"); } @Test public void userAgent() { Connection con = HttpConnection.connect("http://example.com/"); con.userAgent("Mozilla"); assertEquals("Mozilla", con.request().header("User-Agent")); } @Test public void timeout() { Connection con = HttpConnection.connect("http://example.com/"); con.timeout(1000); assertEquals(1000, con.request().timeout()); } @Test public void referrer() { Connection con = HttpConnection.connect("http://example.com/"); con.referrer("http://foo.com"); assertEquals("http://foo.com", con.request().header("Referer")); } @Test public void method() { Connection con = HttpConnection.connect("http://example.com/"); assertEquals(Connection.Method.GET, con.request().method()); con.method(Connection.Method.POST); assertEquals(Connection.Method.POST, con.request().method()); } @Test(expected=IllegalArgumentException.class) public void throwsOnOdddData() { Connection con = HttpConnection.connect("http://example.com/"); con.data("Name", "val", "what"); } @Test public void data() { Connection con = HttpConnection.connect("http://example.com/"); con.data("Name", "Val", "Foo", "bar"); Collection<Connection.KeyVal> values = con.request().data(); Object[] data = values.toArray(); Connection.KeyVal one = (Connection.KeyVal) data[0]; Connection.KeyVal two = (Connection.KeyVal) data[1]; assertEquals("Name", one.key()); assertEquals("Val", one.value()); assertEquals("Foo", two.key()); assertEquals("bar", two.value()); } @Test public void cookie() { Connection con = HttpConnection.connect("http://example.com/"); con.cookie("Name", "Val"); assertEquals("Val", con.request().cookie("Name")); } @Test public void inputStream() { Connection.KeyVal kv = HttpConnection.KeyVal.create("file", "thumb.jpg", ParseTest.inputStreamFrom("Check")); assertEquals("file", kv.key()); assertEquals("thumb.jpg", kv.value()); assertTrue(kv.hasInputStream()); kv = HttpConnection.KeyVal.create("one", "two"); assertEquals("one", kv.key()); assertEquals("two", kv.value()); assertFalse(kv.hasInputStream()); } @Test public void requestBody() { Connection con = HttpConnection.connect("http://example.com/"); con.requestBody("foo"); assertEquals("foo", con.request().requestBody()); } }