package org.zaproxy.zap.spider;
import org.junit.Test;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
/**
* Unit test for RFC 1808 compliance of {@link org.zaproxy.zap.spider.URLResolver}.
*
*/
public class URLResolverRfc1808ExamplesUnitTest {
/**
* @see <a href="https://tools.ietf.org/html/rfc1808#section-5.1">RFC 1808 - 5.1. Normal Examples</a>
*/
@Test
public void resolveRfc1808NormalExamples() {
final String baseUrl = "http://a/b/c/d;p?q#f";
assertThat(URLResolver.resolveUrl(baseUrl, "g:h"), is("g:h"));
assertThat(URLResolver.resolveUrl(baseUrl, "g"), is("http://a/b/c/g"));
assertThat(URLResolver.resolveUrl(baseUrl, "./g"), is("http://a/b/c/g"));
assertThat(URLResolver.resolveUrl(baseUrl, "g/"), is("http://a/b/c/g/"));
assertThat(URLResolver.resolveUrl(baseUrl, "/g"), is("http://a/g"));
assertThat(URLResolver.resolveUrl(baseUrl, "//g"), is("http://g"));
assertThat(URLResolver.resolveUrl(baseUrl, "?y"), is("http://a/b/c/d;p?y"));
assertThat(URLResolver.resolveUrl(baseUrl, "g?y"), is("http://a/b/c/g?y"));
assertThat(URLResolver.resolveUrl(baseUrl, "g?y/./x"), is("http://a/b/c/g?y/./x"));
assertThat(URLResolver.resolveUrl(baseUrl, "#s"), is("http://a/b/c/d;p?q#s"));
assertThat(URLResolver.resolveUrl(baseUrl, "g#s"), is("http://a/b/c/g#s"));
assertThat(URLResolver.resolveUrl(baseUrl, "g#s/./x"), is("http://a/b/c/g#s/./x"));
assertThat(URLResolver.resolveUrl(baseUrl, "g?y#s"), is("http://a/b/c/g?y#s"));
assertThat(URLResolver.resolveUrl(baseUrl, ";x"), is("http://a/b/c/d;x"));
assertThat(URLResolver.resolveUrl(baseUrl, "g;x"), is("http://a/b/c/g;x"));
assertThat(URLResolver.resolveUrl(baseUrl, "g;x?y#s"), is("http://a/b/c/g;x?y#s"));
assertThat(URLResolver.resolveUrl(baseUrl, "."), is("http://a/b/c/"));
assertThat(URLResolver.resolveUrl(baseUrl, "./"), is("http://a/b/c/"));
assertThat(URLResolver.resolveUrl(baseUrl, ".."), is("http://a/b/"));
assertThat(URLResolver.resolveUrl(baseUrl, "../"), is("http://a/b/"));
assertThat(URLResolver.resolveUrl(baseUrl, "../g"), is("http://a/b/g"));
assertThat(URLResolver.resolveUrl(baseUrl, "../.."), is("http://a/"));
assertThat(URLResolver.resolveUrl(baseUrl, "../../"), is("http://a/"));
assertThat(URLResolver.resolveUrl(baseUrl, "../../g"), is("http://a/g"));
}
/**
* @see <a href="https://tools.ietf.org/html/rfc1808#section-5.2">RFC 1808 - 5.2. Abnormal Examples</a>
*/
@Test
public void resolveRfc1808AbnormalExamples() {
final String baseUrl = "http://a/b/c/d;p?q#f";
assertThat(URLResolver.resolveUrl(baseUrl, ""), is("http://a/b/c/d;p?q#f"));
// Deviations from RFC 1808 to match browsers' behaviour.
// Expected by RFC 1808:
//assertThat(URLResolver.resolveUrl(baseUrl, "../../../g"), is("http://a/../g"));
//assertThat(URLResolver.resolveUrl(baseUrl, "../../../../g"), is("http://a/../../g"));
//assertThat(URLResolver.resolveUrl(baseUrl, "/../g"), is("http://a/../g"));
// Browsers' behaviour:
assertThat(URLResolver.resolveUrl(baseUrl, "../../../g"), is("http://a/g"));
assertThat(URLResolver.resolveUrl(baseUrl, "../../../../g"), is("http://a/g"));
assertThat(URLResolver.resolveUrl(baseUrl, "/../g"), is("http://a/g"));
assertThat(URLResolver.resolveUrl(baseUrl, "/./g"), is("http://a/./g"));
assertThat(URLResolver.resolveUrl(baseUrl, "g."), is("http://a/b/c/g."));
assertThat(URLResolver.resolveUrl(baseUrl, ".g"), is("http://a/b/c/.g"));
assertThat(URLResolver.resolveUrl(baseUrl, "g.."), is("http://a/b/c/g.."));
assertThat(URLResolver.resolveUrl(baseUrl, "..g"), is("http://a/b/c/..g"));
assertThat(URLResolver.resolveUrl(baseUrl, "./../g"), is("http://a/b/g"));
assertThat(URLResolver.resolveUrl(baseUrl, "./g/."), is("http://a/b/c/g/"));
assertThat(URLResolver.resolveUrl(baseUrl, "g/./h"), is("http://a/b/c/g/h"));
assertThat(URLResolver.resolveUrl(baseUrl, "g/../h"), is("http://a/b/c/h"));
assertThat(URLResolver.resolveUrl(baseUrl, "http:g"), is("http:g"));
assertThat(URLResolver.resolveUrl(baseUrl, "http:"), is("http:"));
}
}