From: <rb...@us...> - 2018-07-13 14:36:18
|
Revision: 15457 http://sourceforge.net/p/htmlunit/code/15457 Author: rbri Date: 2018-07-13 14:36:14 +0000 (Fri, 13 Jul 2018) Log Message: ----------- url encoding has to use UTF-8 as codepage Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebRequest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PrimitiveWebServer.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient2Test.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient7Test.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlForm2Test.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/MalformedHtml2Test.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/MalformedHtmlTest.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2018-07-12 19:10:53 UTC (rev 15456) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2018-07-13 14:36:14 UTC (rev 15457) @@ -1334,7 +1334,8 @@ WebAssert.notNull("method", method); WebAssert.notNull("parameters", parameters); - url = UrlUtils.encodeUrl(url, getBrowserVersion().hasFeature(URL_MINIMAL_QUERY_ENCODING), UTF_8); + url = UrlUtils.encodeUrl(url, getBrowserVersion().hasFeature(URL_MINIMAL_QUERY_ENCODING), + webRequest.getCharset()); webRequest.setUrl(url); if (LOG.isDebugEnabled()) { Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebRequest.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebRequest.java 2018-07-12 19:10:53 UTC (rev 15456) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebRequest.java 2018-07-13 14:36:14 UTC (rev 15457) @@ -14,7 +14,7 @@ */ package com.gargoylesoftware.htmlunit; -import static java.nio.charset.StandardCharsets.ISO_8859_1; +import static java.nio.charset.StandardCharsets.UTF_8; import java.io.IOException; import java.io.ObjectInputStream; @@ -62,7 +62,7 @@ private Map<String, String> additionalHeaders_ = new HashMap<>(); private Credentials urlCredentials_; private Credentials credentials_; - private transient Charset charset_ = ISO_8859_1; + private transient Charset charset_ = UTF_8; /* These two are mutually exclusive; additionally, requestBody_ should only be set for POST requests. */ private List<NameValuePair> requestParameters_ = Collections.emptyList(); Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PrimitiveWebServer.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PrimitiveWebServer.java 2018-07-12 19:10:53 UTC (rev 15456) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PrimitiveWebServer.java 2018-07-13 14:36:14 UTC (rev 15457) @@ -21,6 +21,7 @@ import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -37,6 +38,7 @@ private final String firstResponse_; private final String otherResponse_; private ServerSocket server_; + private Charset charset_ = StandardCharsets.UTF_8; private List<String> requests_ = new ArrayList<>(); /** @@ -95,7 +97,7 @@ response = otherResponse_; } first = false; - out.write(response.getBytes(StandardCharsets.UTF_8)); + out.write(response.getBytes(charset_)); } } } @@ -131,4 +133,11 @@ public void clearRequests() { requests_.clear(); } + + /** + * @param charset the charset + */ + public void setCharset(final Charset charset) { + charset_ = charset; + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient2Test.java 2018-07-12 19:10:53 UTC (rev 15456) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient2Test.java 2018-07-13 14:36:14 UTC (rev 15457) @@ -16,7 +16,6 @@ import static com.gargoylesoftware.htmlunit.httpclient.HtmlUnitBrowserCompatCookieSpec.EMPTY_COOKIE_NAME; -import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -28,7 +27,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.util.Cookie; @@ -43,18 +41,6 @@ public class WebClient2Test extends SimpleWebTestCase { /** - * @throws Exception if an error occurs - */ - @Test - @Alerts(DEFAULT = "http://first/?param=%A3", - IE = "http://first/?param=\u00A3") - public void encodeURL() throws Exception { - final String html = "<body onload='alert(window.location.href)'></body>"; - getMockWebConnection().setDefaultResponse(html); - loadPageWithAlerts(html, new URL("http://first/?param=\u00A3"), -1); - } - - /** * Test for 3151939. The Browser removes leading '/..' from the path. * @throws Exception if something goes wrong */ Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient7Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient7Test.java 2018-07-12 19:10:53 UTC (rev 15456) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient7Test.java 2018-07-13 14:36:14 UTC (rev 15457) @@ -17,10 +17,12 @@ import static com.gargoylesoftware.htmlunit.BrowserRunner.TestedBrowser.IE; import java.net.URL; +import java.nio.charset.StandardCharsets; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; +import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; @@ -121,23 +123,23 @@ * @throws Exception if something goes wrong */ @Test - @Alerts(DEFAULT = "/test.html?param=%C2%A9", - IE = "/test.html?param=\u00A9") + @Alerts(DEFAULT = "/test.html?param=%C2%A9%C2%A3", + IE = "/test.html?param=\u00A9\u00A3") @NotYetImplemented(IE) public void loadPage_EncodeRequest7() throws Exception { // unicode - testRequestUrlEncoding("test.html?param=\u00A9"); + testRequestUrlEncoding("test.html?param=\u00A9\u00A3"); } private void testRequestUrlEncoding(final String url) throws Exception { final String response = "HTTP/1.1 200 OK\r\n" - + "Content-Length: 2\r\n" + + "Content-Length: 58\r\n" + "Content-Type: text/html\r\n" + "\r\n" + "<html><head><title>foo</title></head><body>" + "</body></html>"; - primitiveWebServer_ = new PrimitiveWebServer(PORT, response, response); + primitiveWebServer_ = new PrimitiveWebServer(PORT, response); primitiveWebServer_.start(); final WebDriver driver = getWebDriver(); @@ -151,4 +153,97 @@ assertEquals(getExpectedAlerts()[0], reqUrl); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = "/bug.html?k%C3%B6nig", + IE = "/bug.html?k\u00c3\u00b6nig") + @NotYetImplemented(IE) + public void linkUrlEncodingUTF8() throws Exception { + final String html = "<html>\n" + + "<head><title>foo</title>\n" + + " <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\n" + + "</head>\n" + + "<body>\n" + + " <a id='myLink' href='bug.html?k\u00F6nig'>Click me</a>\n" + + "</body></html>"; + + final String firstResponse = "HTTP/1.1 200 OK\r\n" + + "Content-Length: " + html.length() + "\r\n" + + "Content-Type: text/html\r\n" + + "\r\n" + + html; + + final String response = "HTTP/1.1 200 OK\r\n" + + "Content-Length: 2\r\n" + + "Content-Type: text/html\r\n" + + "\r\n" + + "<html><head><title>foo</title></head><body>" + + "</body></html>"; + + primitiveWebServer_ = new PrimitiveWebServer(PORT, firstResponse, response); + primitiveWebServer_.start(); + + final WebDriver driver = getWebDriver(); + + driver.get(URL_FIRST.toString()); + driver.findElement(By.id("myLink")).click(); + + String reqUrl = primitiveWebServer_.getRequests().get(1); + if (reqUrl.contains("/favicon.ico")) { + reqUrl = primitiveWebServer_.getRequests().get(2); + } + reqUrl = reqUrl.substring(4, reqUrl.indexOf("HTTP/1.1") - 1); + + assertEquals(getExpectedAlerts()[0], reqUrl); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = "/bug.html?k%F6nig", + IE = "/bug.html?k\u00f6nig") + @NotYetImplemented(IE) + public void linkUrlEncodingISO8859_1() throws Exception { + final String html = "<html>\n" + + "<head><title>foo</title>\n" + + " <meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1'>\n" + + "</head>\n" + + "<body>\n" + + " <a id='myLink' href='bug.html?k\u00F6nig'>Click me</a>\n" + + "</body></html>"; + + final String firstResponse = "HTTP/1.1 200 OK\r\n" + + "Content-Length: " + html.length() + "\r\n" + + "Content-Type: text/html\r\n" + + "\r\n" + + html; + + final String response = "HTTP/1.1 200 OK\r\n" + + "Content-Length: 2\r\n" + + "Content-Type: text/html\r\n" + + "\r\n" + + "<html><head><title>foo</title></head><body>" + + "</body></html>"; + + primitiveWebServer_ = new PrimitiveWebServer(PORT, firstResponse, response); + primitiveWebServer_.setCharset(StandardCharsets.ISO_8859_1); + primitiveWebServer_.start(); + + final WebDriver driver = getWebDriver(); + + driver.get(URL_FIRST.toString()); + driver.findElement(By.id("myLink")).click(); + + String reqUrl = primitiveWebServer_.getRequests().get(1); + if (reqUrl.contains("/favicon.ico")) { + reqUrl = primitiveWebServer_.getRequests().get(2); + } + reqUrl = reqUrl.substring(4, reqUrl.indexOf("HTTP/1.1") - 1); + + assertEquals(getExpectedAlerts()[0], reqUrl); + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlForm2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlForm2Test.java 2018-07-12 19:10:53 UTC (rev 15456) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlForm2Test.java 2018-07-13 14:36:14 UTC (rev 15457) @@ -46,7 +46,6 @@ import com.gargoylesoftware.htmlunit.FormEncodingType; import com.gargoylesoftware.htmlunit.HttpHeader; import com.gargoylesoftware.htmlunit.HttpMethod; -import com.gargoylesoftware.htmlunit.MockWebConnection; import com.gargoylesoftware.htmlunit.WebDriverTestCase; import com.gargoylesoftware.htmlunit.util.NameValuePair; import com.gargoylesoftware.htmlunit.util.UrlUtils; @@ -171,35 +170,6 @@ * @throws Exception if the test fails */ @Test - public void linkUrlEncoding() throws Exception { - final String html = "<html>\n" - + "<head><title>foo</title>\n" - + " <meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1'>\n" - + "</head>\n" - + "<body>\n" - + " <a href='bug.html?k\u00F6nig' id='myLink'>Click me</a>\n" - + "</body></html>"; - - final MockWebConnection webConnection = getMockWebConnection(); - webConnection.setDefaultResponse(html, "text/html", ISO_8859_1); - - final WebDriver driver = loadPage2(html); - assertEquals(URL_FIRST.toExternalForm(), driver.getCurrentUrl()); - driver.findElement(By.id("myLink")).click(); - final String linkSuffix; - if (getBrowserVersion().isIE()) { - linkSuffix = "bug.html?k\u00F6nig"; - } - else { - linkSuffix = "bug.html?k%F6nig"; - } - assertEquals(URL_FIRST + linkSuffix, driver.getCurrentUrl()); - } - - /** - * @throws Exception if the test fails - */ - @Test public void base() throws Exception { final String html = "<html><head>\n" Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/MalformedHtml2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/MalformedHtml2Test.java 2018-07-12 19:10:53 UTC (rev 15456) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/MalformedHtml2Test.java 2018-07-13 14:36:14 UTC (rev 15457) @@ -30,30 +30,6 @@ public class MalformedHtml2Test extends SimpleWebTestCase { /** - * @throws Exception if the test fails - */ - @Test - public void incompleteEntities() throws Exception { - final String html = "<html><head>\n" - + "<title>Test document</title>\n" - + "</head><body>\n" - + "<a href='foo?a=1©=2&prod=3' id='myLink'>my link</a>\n" - + "</body></html>"; - - final HtmlPage page = loadPage(html); - final HtmlPage page2 = page.getAnchors().get(0).click(); - - final String query; - if (getBrowserVersion().isIE()) { - query = "a=1\u00A9=2&prod=3"; - } - else { - query = "a=1%A9=2&prod=3"; - } - assertEquals(query, page2.getUrl().getQuery()); - } - - /** * Regression test for Bug #1018. * @throws Exception if an error occurs */ Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/MalformedHtmlTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/MalformedHtmlTest.java 2018-07-12 19:10:53 UTC (rev 15456) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/MalformedHtmlTest.java 2018-07-13 14:36:14 UTC (rev 15457) @@ -1090,4 +1090,26 @@ assertEquals(0, webDriver.findElements(By.name("main")).size()); assertEquals(1, webDriver.findElements(By.id("tester")).size()); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts("§§URL§§foo?a=1©=2&prod=3") + @NotYetImplemented + public void incompleteEntities() throws Exception { + final String html = "<html><head>\n" + + "<title>Test document</title>\n" + + "</head><body>\n" + + "<a href='foo?a=1©=2&prod=3' id='myLink'>my link</a>\n" + + "</body></html>"; + + getMockWebConnection().setDefaultResponse("<html><head><title>foo</title></head><body></body></html>"); + expandExpectedAlertsVariables(URL_FIRST); + + final WebDriver driver = loadPage2(html); + driver.findElement(By.id("myLink")).click(); + + assertEquals(getExpectedAlerts()[0], getMockWebConnection().getLastWebRequest().getUrl()); + } } |