Fixes a problem with URL parsing when the host ends with a dot
The WebAddress class provides a lenient parser for URLs. Currently, it identifies the host portion with the regex [<chars>]+(\.[<chars>]+)* where <chars> is the set of characters valid for the host name. This pattern excludes the case where the host ends with a dot, which is valid possibility. As a result, any trailing dot is pushed into the path component. Since we add a leading slash to the path if one is missing, the result is a path that begins with '/.'. This fix changes the host regex to [<chars>]+[<chars>\.]* which allows trailing dots and fixes the problem. Bug: 2337042 Change-Id: I310512531787e0f742988f5d815ad944fd39e059
This commit is contained in:
@@ -56,7 +56,7 @@ public class WebAddress {
|
||||
static Pattern sAddressPattern = Pattern.compile(
|
||||
/* scheme */ "(?:(http|https|file)\\:\\/\\/)?" +
|
||||
/* authority */ "(?:([-A-Za-z0-9$_.+!*'(),;?&=]+(?:\\:[-A-Za-z0-9$_.+!*'(),;?&=]+)?)@)?" +
|
||||
/* host */ "([-" + GOOD_IRI_CHAR + "%_]+(?:\\.[-" + GOOD_IRI_CHAR + "%_]+)*|\\[[0-9a-fA-F:\\.]+\\])?" +
|
||||
/* host */ "([" + GOOD_IRI_CHAR + "%_-][" + GOOD_IRI_CHAR + "%_\\.-]*|\\[[0-9a-fA-F:\\.]+\\])?" +
|
||||
/* port */ "(?:\\:([0-9]*))?" +
|
||||
/* path */ "(\\/?[^#]*)?" +
|
||||
/* anchor */ ".*", Pattern.CASE_INSENSITIVE);
|
||||
|
||||
@@ -285,6 +285,13 @@ public class UriTest extends TestCase {
|
||||
assertEquals("d", uri.getQueryParameter("c"));
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testHostWithTrailingDot() {
|
||||
Uri uri = Uri.parse("http://google.com./b/c/g");
|
||||
assertEquals("google.com.", uri.getHost());
|
||||
assertEquals("/b/c/g", uri.getPath());
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testSchemeOnly() {
|
||||
Uri uri = Uri.parse("empty:");
|
||||
|
||||
31
core/tests/coretests/src/android/net/WebAddressTest.java
Normal file
31
core/tests/coretests/src/android/net/WebAddressTest.java
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* 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 android.net;
|
||||
|
||||
import android.net.WebAddress;
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class WebAddressTest extends TestCase {
|
||||
|
||||
@SmallTest
|
||||
public void testHostWithTrailingDot() {
|
||||
WebAddress webAddress = new WebAddress("http://google.com./b/c/g");
|
||||
assertEquals("google.com.", webAddress.mHost);
|
||||
assertEquals("/b/c/g", webAddress.mPath);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user