Skip to content

Commit 8170066

Browse files
author
James Leigh
committed
Issue #69: Only normalize path segment when resolving IRI
1 parent c38e52f commit 8170066

2 files changed

Lines changed: 19 additions & 19 deletions

File tree

core/util/src/main/java/org/eclipse/rdf4j/common/net/ParsedIRI.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.util.Arrays;
2525
import java.util.LinkedList;
2626
import java.util.List;
27-
import java.util.StringTokenizer;
2827

2928
import org.eclipse.rdf4j.common.text.StringUtil;
3029

@@ -728,14 +727,11 @@ else if (relative.getHost() == null && relative.getPath().length() == 0) {
728727
}
729728
}
730729

731-
ParsedIRI result = new ParsedIRI(scheme, userInfo, host, port, path, query, fragment);
732-
733730
if (normalize || path.indexOf("/./") >= 0 || path.indexOf("/../") >= 0) {
734-
return result.normalize();
735-
}
736-
else {
737-
return result;
731+
path = pathSegmentNormalization(path);
738732
}
733+
734+
return new ParsedIRI(scheme, userInfo, host, port, path, query, fragment);
739735
}
740736

741737
/**
@@ -1282,15 +1278,9 @@ private String pathSegmentNormalization(String _path) {
12821278

12831279
// Split the path into its segments
12841280

1285-
LinkedList<String> segments = new LinkedList<String>();
1286-
1287-
StringTokenizer st = new StringTokenizer(_path, "/");
1288-
1289-
while (st.hasMoreTokens()) {
1290-
String segment = st.nextToken();
1291-
if (!segments.isEmpty() || !segment.equals("..") && !segment.equals(".")) {
1292-
segments.add(segment);
1293-
}
1281+
LinkedList<String> segments = new LinkedList<String>(Arrays.asList(_path.split("/")));
1282+
if (_path.startsWith("/")) {
1283+
segments.remove(0);
12941284
}
12951285

12961286
boolean lastSegmentRemoved = false;

core/util/src/test/java/org/eclipse/rdf4j/common/net/ParsedIRITest.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public void resolvesAPathRelativeUriRelativeToABaseJarUri()
102102
throws URISyntaxException
103103
{
104104
ParsedIRI uri = new ParsedIRI("jar:file:///some-file.jar!/some-nested-file");
105-
assertEquals("jar:file:/some-file.jar!/another-file", uri.resolve("another-file").toString());
105+
assertEquals("jar:file:///some-file.jar!/another-file", uri.resolve("another-file").toString());
106106
}
107107

108108
@Test
@@ -406,13 +406,22 @@ public void testAbnormalExamples()
406406
}
407407

408408
@Test
409-
public void testResolveOpaque() throws URISyntaxException {
409+
public void testResolveOpaque()
410+
throws URISyntaxException
411+
{
410412
assertResolves("", "urn:test:foo#bar", "urn:test:foo");
411413
assertResolves("", "urn:test:foo", "urn:test:foo");
412414
assertResolves("#bar", "urn:test:foo", "urn:test:foo#bar");
413415
assertResolves("#bat", "urn:test:foo#bar", "urn:test:foo#bat");
414416
}
415417

418+
@Test
419+
public void testDoubleSlash()
420+
throws URISyntaxException
421+
{
422+
assertResolves("../xyz", "http://ab//de//ghi", "http://ab//de/xyz");
423+
}
424+
416425
private void assertResolves(String relative, String base, String absolute)
417426
throws URISyntaxException
418427
{
@@ -687,7 +696,8 @@ public void testDurst()
687696
public void testDeseret()
688697
throws URISyntaxException
689698
{
690-
assertURI2IRI("http://www.example.org/U+10400/%F0%90%90%80", "http://www.example.org/U+10400/\uD801\uDC00");
699+
assertURI2IRI("http://www.example.org/U+10400/%F0%90%90%80",
700+
"http://www.example.org/U+10400/\uD801\uDC00");
691701
}
692702

693703
@Test

0 commit comments

Comments
 (0)