// 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 jodd.io.FileUtil; import jodd.upload.FileUpload; import org.junit.Assert; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.*; public class HttpRequestTest { @Test public void testQueryParameters() { HttpRequest httpRequest = new HttpRequest(); httpRequest.path(""); assertEquals("/", httpRequest.path()); httpRequest.path("jodd"); assertEquals("/jodd", httpRequest.path()); assertNotNull(httpRequest.query()); assertEquals(0, httpRequest.query().size()); httpRequest.queryString("one=two"); assertEquals("/jodd", httpRequest.path()); HttpMultiMap<String> params = httpRequest.query(); assertEquals(1, params.size()); assertEquals("two", params.get("one")); httpRequest.queryString("one"); assertEquals("one", httpRequest.queryString()); params = httpRequest.query(); assertEquals(1, params.size()); assertNull(params.get("one")); httpRequest.queryString("one="); assertEquals("one=", httpRequest.queryString()); params = httpRequest.query(); assertEquals(1, params.size()); assertEquals("", params.get("one")); httpRequest.queryString("one=aaa&two=bbb"); assertEquals("one=aaa&two=bbb", httpRequest.queryString()); params = httpRequest.query(); assertEquals(2, params.size()); assertEquals("aaa", params.get("one")); assertEquals("bbb", params.get("two")); httpRequest.queryString("one=&two=aaa"); assertEquals("one=&two=aaa", httpRequest.queryString()); params = httpRequest.query(); assertEquals(2, params.size()); assertEquals("", params.get("one")); assertEquals("aaa", params.get("two")); httpRequest.clearQueries(); httpRequest.queryString("one=Супер"); assertEquals("one=%D0%A1%D1%83%D0%BF%D0%B5%D1%80", httpRequest.queryString()); params = httpRequest.query(); assertEquals(1, params.size()); assertEquals("Супер", params.get("one")); httpRequest.queryString("one=Sуp"); assertEquals("one=S%D1%83p", httpRequest.queryString()); httpRequest.queryString("one=1&one=2"); assertEquals("one=1&one=2", httpRequest.queryString()); params = httpRequest.query(); assertEquals(1, params.size()); assertEquals("1", params.getAll("one").get(0)); assertEquals("2", params.getAll("one").get(1)); httpRequest.query("one", Integer.valueOf(3)); assertEquals("one=1&one=2&one=3", httpRequest.queryString()); } @Test public void testFormParamsObjects() { Map<String, Object> params = new HashMap<>(); params.put("state", 1); HttpRequest httpRequest = new HttpRequest(); httpRequest.form(params); assertEquals(1, httpRequest.form().size()); } @Test public void testSet() { HttpRequest httpRequest = new HttpRequest(); httpRequest.set("GET http://jodd.org:173/index.html?light=true"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("jodd.org", httpRequest.host()); assertEquals(173, httpRequest.port()); assertEquals("/index.html", httpRequest.path()); assertEquals("true", httpRequest.query().get("light")); httpRequest = new HttpRequest(); httpRequest.set("http://jodd.org:173/index.html?light=true"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("jodd.org", httpRequest.host()); assertEquals(173, httpRequest.port()); assertEquals("/index.html", httpRequest.path()); assertEquals("true", httpRequest.query().get("light")); httpRequest = new HttpRequest(); httpRequest.set("jodd.org:173/index.html?light=true"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("jodd.org", httpRequest.host()); assertEquals(173, httpRequest.port()); assertEquals("/index.html", httpRequest.path()); assertEquals("true", httpRequest.query().get("light")); httpRequest = new HttpRequest(); httpRequest.set("jodd.org/index.html?light=true"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("jodd.org", httpRequest.host()); assertEquals(80, httpRequest.port()); assertEquals("/index.html", httpRequest.path()); assertEquals("true", httpRequest.query().get("light")); httpRequest = new HttpRequest(); httpRequest.set("/index.html?light=true"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("localhost", httpRequest.host()); assertEquals(80, httpRequest.port()); assertEquals("/index.html", httpRequest.path()); assertEquals("true", httpRequest.query().get("light")); httpRequest = new HttpRequest(); httpRequest.set("http://jodd.org"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("jodd.org", httpRequest.host()); assertEquals(80, httpRequest.port()); assertEquals("/", httpRequest.path()); } @Test public void testInOutForm() { HttpRequest request = HttpRequest.get("http://jodd.org/?id=173"); request.header("User-Agent", "Scaly"); request.form("one", "funny"); byte[] bytes = request.toByteArray(); // read HttpRequest request2 = HttpRequest.readFrom(new ByteArrayInputStream(bytes)); assertEquals(request.method(), request2.method()); assertEquals(request.path(), request2.path()); assertEquals(request.queryString(), request2.queryString()); assertEquals(request.header("User-Agent"), request2.header("User-Agent")); assertEquals(request.header("Content-Type"), request2.header("content-type")); assertEquals(request.header("Content-Length"), request2.header("content-length")); HttpMultiMap<?> params1 = request.form(); HttpMultiMap<?> params2 = request2.form(); assertEquals(params1.size(), params2.size()); assertEquals(params2.get("one"), params2.get("one")); } @Test public void testNegativeContentLength() { HttpRequest request = HttpRequest.get("http://jodd.org/?id=173"); request.contentLength(-123); byte[] bytes = request.toByteArray(); try { HttpRequest request2 = HttpRequest.readFrom(new ByteArrayInputStream(bytes)); assertEquals("", request2.body()); } catch (Exception ex) { Assert.fail(ex.toString()); } // the same test but with missing content length request = HttpRequest.get("http://jodd.org/?id=173"); bytes = request.toByteArray(); try { HttpRequest request2 = HttpRequest.readFrom(new ByteArrayInputStream(bytes)); assertEquals("", request2.body()); } catch (Exception ex) { Assert.fail(ex.toString()); } } @Test public void testFileUpload() throws IOException { HttpRequest request = HttpRequest.get("http://jodd.org/?id=173"); request.header("User-Agent", "Scaly").form("one", "funny"); File tempFile = FileUtil.createTempFile(); tempFile.deleteOnExit(); FileUtil.writeString(tempFile, "qwerty"); request.form("two", tempFile); byte[] bytes = request.toByteArray(); // read HttpRequest request2 = HttpRequest.readFrom(new ByteArrayInputStream(bytes)); HttpMultiMap<?> httpParams2 = request2.form(); assertEquals(request.method(), request2.method()); assertEquals(request.path(), request2.path()); assertEquals(request.queryString(), request2.queryString()); assertEquals(request.header("User-Agent"), request2.header("User-Agent")); assertEquals(request.header("Content-Type"), request2.header("content-type")); assertEquals(request.header("Content-Length"), request2.header("content-length")); HttpMultiMap<?> params1 = request.form(); HttpMultiMap<?> params2 = request2.form(); assertEquals(params1.size(), params2.size()); assertEquals(params2.get("one"), params2.get("one")); FileUpload fu = (FileUpload) httpParams2.get("two"); assertEquals(6, fu.getSize()); String str = new String(fu.getFileContent()); assertEquals("qwerty", str); tempFile.delete(); } @Test public void testUrl() { HttpRequest httpRequest = new HttpRequest(); httpRequest.set("GET http://jodd.org:173/index.html?light=true"); assertEquals("http://jodd.org:173/index.html?light=true", httpRequest.url()); assertEquals("http://jodd.org:173", httpRequest.hostUrl()); httpRequest = HttpRequest.get("foo.com/"); assertEquals("http://foo.com", httpRequest.hostUrl()); } @Test public void testBasicAuthorizationCanBeSetToNullAndIsIgnoredSilently() { HttpRequest httpRequest = new HttpRequest(); String[][] input = new String[][]{ {"non-null", null}, {null, "non-null"}, {null, null}, }; try { for(String[] pair :input) { httpRequest.basicAuthentication(pair[0], pair[1]); assertNull(httpRequest.headers.get("Authorization")); } } catch (RuntimeException e) { fail("No exception should be thrown for null authorization basic header args!"); } } @Test public void test394() { HttpRequest request = HttpRequest.get("https://jodd.org/random link"); assertEquals("GET", request.method()); assertEquals("https://jodd.org/random link", request.url()); request = HttpRequest.get("https://jodd.org/random link?q=1"); assertEquals("1", request.query().get("q")); String badUrl = "httpsjodd.org/random link?q=1:// GET"; try { HttpRequest.get(badUrl).send(); fail(); } catch (HttpException he) { assertTrue(he.getMessage().contains(badUrl)); } } }