From: <rb...@us...> - 2018-07-12 19:10:58
|
Revision: 15456 http://sourceforge.net/p/htmlunit/code/15456 Author: rbri Date: 2018-07-12 19:10:53 +0000 (Thu, 12 Jul 2018) Log Message: ----------- url encoding has to use UTF-8 as codepage Issue 1973 Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PrimitiveWebServer.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient2Test.java Added Paths: ----------- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient7Test.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 15:36:52 UTC (rev 15455) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2018-07-12 19:10:53 UTC (rev 15456) @@ -1312,8 +1312,7 @@ return makeWebResponseForDataUrl(webRequest); default: - return loadWebResponseFromWebConnection(webRequest, ALLOWED_REDIRECTIONS_SAME_URL, - webRequest.getCharset()); + return loadWebResponseFromWebConnection(webRequest, ALLOWED_REDIRECTIONS_SAME_URL); } } @@ -1321,12 +1320,11 @@ * Loads a {@link WebResponse} from the server through the WebConnection. * @param webRequest the request * @param allowedRedirects the number of allowed redirects remaining - * @param charset the charset to use * @throws IOException if an IO problem occurs * @return the resultant {@link WebResponse} */ private WebResponse loadWebResponseFromWebConnection(final WebRequest webRequest, - final int allowedRedirects, final Charset charset) throws IOException { + final int allowedRedirects) throws IOException { URL url = webRequest.getUrl(); final HttpMethod method = webRequest.getHttpMethod(); @@ -1336,7 +1334,7 @@ WebAssert.notNull("method", method); WebAssert.notNull("parameters", parameters); - url = UrlUtils.encodeUrl(url, getBrowserVersion().hasFeature(URL_MINIMAL_QUERY_ENCODING), charset); + url = UrlUtils.encodeUrl(url, getBrowserVersion().hasFeature(URL_MINIMAL_QUERY_ENCODING), UTF_8); webRequest.setUrl(url); if (LOG.isDebugEnabled()) { @@ -1451,7 +1449,7 @@ for (final Map.Entry<String, String> entry : webRequest.getAdditionalHeaders().entrySet()) { wrs.setAdditionalHeader(entry.getKey(), entry.getValue()); } - return loadWebResponseFromWebConnection(wrs, allowedRedirects - 1, UTF_8); + return loadWebResponseFromWebConnection(wrs, allowedRedirects - 1); } else if (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == 308) { @@ -1460,7 +1458,7 @@ for (final Map.Entry<String, String> entry : webRequest.getAdditionalHeaders().entrySet()) { wrs.setAdditionalHeader(entry.getKey(), entry.getValue()); } - return loadWebResponseFromWebConnection(wrs, allowedRedirects - 1, UTF_8); + return loadWebResponseFromWebConnection(wrs, allowedRedirects - 1); } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PrimitiveWebServer.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PrimitiveWebServer.java 2018-07-12 15:36:52 UTC (rev 15455) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/PrimitiveWebServer.java 2018-07-12 19:10:53 UTC (rev 15456) @@ -54,7 +54,7 @@ * * @param port the port * @param firstResponse the first response, must contain the full response (to start with "HTTP/1.1 200 OK") - * @param otherResponse the sebsequent response, must contain the full response (to start with "HTTP/1.1 200 OK") + * @param otherResponse the subsequent response, must contain the full response (to start with "HTTP/1.1 200 OK") */ public PrimitiveWebServer(final int port, final String firstResponse, final String otherResponse) { port_ = port; Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient2Test.java 2018-07-12 15:36:52 UTC (rev 15455) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient2Test.java 2018-07-12 19:10:53 UTC (rev 15456) @@ -55,59 +55,6 @@ } /** - * Test that the path and query string are encoded to be valid. - * @throws Exception if something goes wrong - */ - @Test - public void loadPage_EncodeRequest() throws Exception { - final String htmlContent - = "<html><head><title>foo</title></head><body>\n" - + "</body></html>"; - - final WebClient client = getWebClient(); - - final MockWebConnection webConnection = new MockWebConnection(); - webConnection.setDefaultResponse(htmlContent); - client.setWebConnection(webConnection); - - // with query string not encoded - HtmlPage page = client.getPage("http://first?a=b c&d=\u00E9\u00E8"); - final String expected; - final boolean ie = getBrowserVersion().isIE(); - if (ie) { - expected = "?a=b%20c&d=\u00E9\u00E8"; - } - else { - expected = "?a=b%20c&d=%E9%E8"; - } - assertEquals("http://first/" + expected, page.getUrl()); - - // with query string already encoded - page = client.getPage("http://first?a=b%20c&d=%C3%A9%C3%A8"); - assertEquals("http://first/?a=b%20c&d=%C3%A9%C3%A8", page.getUrl()); - - // with query string partially encoded - page = client.getPage("http://first?a=b%20c&d=e f"); - assertEquals("http://first/?a=b%20c&d=e%20f", page.getUrl()); - - // with anchor - page = client.getPage("http://first?a=b c#myAnchor"); - assertEquals("http://first/?a=b%20c#myAnchor", page.getUrl()); - - // with query string containing encoded "&", "=", "+", ",", and "$" - page = client.getPage("http://first?a=%26%3D%20%2C%24"); - assertEquals("http://first/?a=%26%3D%20%2C%24", page.getUrl()); - - // with character to encode in path - page = client.getPage("http://first/page 1.html"); - assertEquals("http://first/page%201.html", page.getUrl()); - - // with character to encode in path - page = client.getPage("http://first/page 1.html"); - assertEquals("http://first/page%201.html", page.getUrl()); - } - - /** * Test for 3151939. The Browser removes leading '/..' from the path. * @throws Exception if something goes wrong */ Added: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient7Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient7Test.java (rev 0) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient7Test.java 2018-07-12 19:10:53 UTC (rev 15456) @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2002-2018 Gargoyle Software Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.gargoylesoftware.htmlunit; + +import static com.gargoylesoftware.htmlunit.BrowserRunner.TestedBrowser.IE; + +import java.net.URL; + +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.openqa.selenium.WebDriver; + +import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; +import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; + +/** + * Tests using the {@link PrimitiveWebServer}. + * + * @author Ahmed Ashour + * @author Ronald Brill + */ +@RunWith(BrowserRunner.class) +public class WebClient7Test extends WebDriverTestCase { + + private PrimitiveWebServer primitiveWebServer_; + + /** + * @throws Exception if an error occurs + */ + @After + public void stopServer() throws Exception { + if (primitiveWebServer_ != null) { + primitiveWebServer_.stop(); + } + shutDownAll(); + } + + /** + * Test that the path and query string are encoded to be valid. + * @throws Exception if something goes wrong + */ + @Test + @Alerts(DEFAULT = "/test.html?a=b%20c&d=%C3%A9%C3%A8", + IE = "/test.html?a=b%20c&d=\u00E9\u00E8") + @NotYetImplemented(IE) + public void loadPage_EncodeRequest() throws Exception { + // with query string not encoded + testRequestUrlEncoding("test.html?a=b c&d=\u00E9\u00E8"); + } + + /** + * Test that the path and query string are encoded to be valid. + * @throws Exception if something goes wrong + */ + @Test + @Alerts("/test.html?a=b%20c&d=%C3%A9%C3%A8") + public void loadPage_EncodeRequest2() throws Exception { + // with query string already encoded + testRequestUrlEncoding("test.html?a=b%20c&d=%C3%A9%C3%A8"); + } + + /** + * Test that the path and query string are encoded to be valid. + * @throws Exception if something goes wrong + */ + @Test + @Alerts("/test.html?a=b%20c&d=e%20f") + public void loadPage_EncodeRequest3() throws Exception { + // with query string partially encoded + testRequestUrlEncoding("test.html?a=b%20c&d=e f"); + } + + /** + * Test that the path and query string are encoded to be valid. + * @throws Exception if something goes wrong + */ + @Test + @Alerts("/test.html?a=b%20c") + public void loadPage_EncodeRequest4() throws Exception { + // with anchor + testRequestUrlEncoding("test.html?a=b c#myAnchor"); + } + + /** + * Test that the path and query string are encoded to be valid. + * @throws Exception if something goes wrong + */ + @Test + @Alerts("/test.html?a=%26%3D%20%2C%24") + public void loadPage_EncodeRequest5() throws Exception { + // with query string containing encoded "&", "=", "+", ",", and "$" + testRequestUrlEncoding("test.html?a=%26%3D%20%2C%24"); + } + + /** + * Test that the path and query string are encoded to be valid. + * @throws Exception if something goes wrong + */ + @Test + @Alerts("/page%201.html") + public void loadPage_EncodeRequest6() throws Exception { + // with character to encode in path + testRequestUrlEncoding("page 1.html"); + } + + /** + * Test that the path and query string are encoded to be valid. + * @throws Exception if something goes wrong + */ + @Test + @Alerts(DEFAULT = "/test.html?param=%C2%A9", + IE = "/test.html?param=\u00A9") + @NotYetImplemented(IE) + public void loadPage_EncodeRequest7() throws Exception { + // unicode + testRequestUrlEncoding("test.html?param=\u00A9"); + } + + private void testRequestUrlEncoding(final String url) throws Exception { + 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, response, response); + primitiveWebServer_.start(); + + final WebDriver driver = getWebDriver(); + + driver.get(new URL(URL_FIRST, url).toString()); + String reqUrl = primitiveWebServer_.getRequests().get(0); + if (reqUrl.contains("/favicon.ico")) { + reqUrl = primitiveWebServer_.getRequests().get(1); + } + reqUrl = reqUrl.substring(4, reqUrl.indexOf("HTTP/1.1") - 1); + + assertEquals(getExpectedAlerts()[0], reqUrl); + } +} Property changes on: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/WebClient7Test.java ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property |