// 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.http.up.ByteArrayUploadable; import jodd.util.MimeTypes; import jodd.util.StringPool; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import java.io.IOException; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; public class EncodingTest { static TestServer testServer; @BeforeClass public static void startServer() throws Exception { testServer = new TomcatServer(); testServer.start(); } @AfterClass public static void stopServer() throws Exception { testServer.stop(); } @Before public void setUp() { EchoServlet.testinit(); } @Test public void testContentTypeHeader() { HttpRequest req = HttpRequest.get("localhost/hello"); assertNull(req.contentType()); req.contentType("text/plain;charset=UTF-8"); assertEquals("text/plain", req.mediaType()); assertEquals("UTF-8", req.charset()); assertEquals("text/plain;charset=UTF-8", req.contentType()); req.mediaType("text/html"); assertEquals("text/html;charset=UTF-8", req.contentType()); req.mediaType(null); assertEquals("text/html;charset=UTF-8", req.contentType()); req.charset("ASCII"); assertEquals("text/html;charset=ASCII", req.contentType()); req.charset(null); assertEquals("text/html", req.contentType()); req.contentType("text/plain;charset=UTF-8;boundary=123"); assertEquals("text/plain", req.mediaType()); assertEquals("UTF-8", req.charset()); assertEquals("text/plain;charset=UTF-8;boundary=123", req.contentType()); } @Test public void testRequestEncoding1() throws IOException { testRequestEncoding(1); } @Test public void testRequestEncoding2() throws IOException { testRequestEncoding(2); } @Test public void testRequestEncoding3() throws IOException { testRequestEncoding(3); } @Test public void testRequestEncoding4() throws IOException { testRequestEncoding(4); } private void testRequestEncoding(int i) throws IOException { HttpRequest request = (i == 1 || i == 2) ? HttpRequest.get("http://localhost:8173/echo?id=12"): HttpRequest.post("http://localhost:8173/echo?id=12"); String utf8String = (i == 1 || i == 3) ? "Hello!" : "хелло!"; byte[] utf8Bytes = utf8String.getBytes(StringPool.UTF_8); int utf8StringRealLen = utf8Bytes.length; request.bodyText(utf8String); String rawBody = request.body(); assertEquals(utf8StringRealLen, rawBody.length()); assertArrayEquals(utf8Bytes, request.bodyBytes()); HttpResponse response = request.send(); assertEquals(200, response.statusCode()); // servlet if (i < 3) { assertTrue(EchoServlet.ref.get); assertFalse(EchoServlet.ref.post); } else { assertFalse(EchoServlet.ref.get); assertTrue(EchoServlet.ref.post); } assertEquals(String.valueOf(utf8StringRealLen), EchoServlet.ref.header.get("content-length")); assertEquals("text/html;charset=UTF-8", EchoServlet.ref.header.get("content-type")); assertEquals(utf8String, EchoServlet.ref.body); // response assertEquals(String.valueOf(utf8StringRealLen), response.contentLength()); assertEquals("text/html;charset=UTF-8", response.contentType()); assertEquals(utf8String, response.bodyText()); assertEquals(new String(utf8Bytes, StringPool.ISO_8859_1), response.body()); } @Test public void testFormParams1() { testFormParams(1); } @Test public void testFormParams2() { testFormParams(2); } @Test public void testFormParams3() { testFormParams(3); } private void testFormParams(int i) { String encoding = i == 1 ? "UTF-8" : "CP1251"; HttpRequest request = HttpRequest.post("http://localhost:8173/echo2"); request.formEncoding(encoding); if (i == 3) { request.charset("UTF-8"); } String value1 = "value"; String value2 = "валуе"; request.form("one", value1); request.form("two", value2); if (i != 3) { request.form("enc", encoding); } HttpResponse httpResponse = request.send(); assertEquals("application/x-www-form-urlencoded", request.mediaType()); if (i == 3) { assertEquals("UTF-8", request.charset()); assertEquals("CP1251", request.formEncoding); } else { assertNull(request.charset()); } assertFalse(EchoServlet.ref.get); assertTrue(EchoServlet.ref.post); assertEquals(i == 3 ? 2 : 3, EchoServlet.ref.params.size()); assertEquals(value1, EchoServlet.ref.params.get("one")); assertEquals(value2, EchoServlet.ref.params.get("two")); } @Test public void testQueryParams1() throws IOException { testQueryParams(1); } @Test public void testQueryParams2() throws IOException { testQueryParams(2); } private void testQueryParams(int i) throws IOException { String encoding = i == 1 ? "UTF-8" : "CP1251"; HttpRequest request = HttpRequest.get("http://localhost:8173/echo2"); request.queryEncoding(encoding); String value1 = "value"; String value2 = "валуе"; request.query("one", value1); request.query("two", value2); request.query("enc", encoding); HttpResponse httpResponse = request.send(); assertTrue(EchoServlet.ref.get); assertFalse(EchoServlet.ref.post); assertEquals(3, EchoServlet.ref.params.size()); assertEquals(value1, EchoServlet.ref.params.get("one")); assertEquals(value2, EchoServlet.ref.params.get("two")); } @Test public void testMultipart() { HttpRequest request = HttpRequest.post("http://localhost:8173/echo2"); request .formEncoding("UTF-8") // optional .multipart(true); String value1 = "value"; String value2 = "валуе"; request.form("one", value1); request.form("two", value2); HttpResponse httpResponse = request.send(); assertEquals("multipart/form-data", request.mediaType()); assertFalse(EchoServlet.ref.get); assertTrue(EchoServlet.ref.post); assertEquals(value1, EchoServlet.ref.parts.get("one")); assertEquals(value2, EchoServlet.ref.parts.get("two")); } @Test public void testUploadWithUploadable() throws IOException { HttpResponse response = HttpRequest .post("http://localhost:8173/echo2") .multipart(true) .form("id", "12") .form("file", new ByteArrayUploadable( "upload тест".getBytes(StringPool.UTF_8), "d ст", MimeTypes.MIME_TEXT_PLAIN)) .send(); assertEquals(200, response.statusCode()); assertEquals("OK", response.statusPhrase()); assertEquals("12", Echo2Servlet.ref.params.get("id")); assertEquals("upload тест", Echo2Servlet.ref.parts.get("file")); assertEquals("d ст", Echo2Servlet.ref.fileNames.get("file")); } }