/**
* Copyright (C) 2010 Orbeon, Inc.
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU Lesser General Public License as published by the Free Software Foundation; either version
* 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* The full text of the license is available at http://www.gnu.org/copyleft/lesser.html
*/
package org.orbeon.oxf.util;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.orbeon.dom.Document;
import org.orbeon.oxf.externalcontext.TestExternalContext;
import org.orbeon.oxf.externalcontext.ExternalContext;
import org.orbeon.oxf.pipeline.api.PipelineContext;
import org.orbeon.oxf.processor.ProcessorUtils;
import org.orbeon.oxf.properties.Properties;
import org.orbeon.oxf.test.ResourceManagerTestBase;
import java.util.List;
import static org.junit.Assert.*;
public class URLRewriterTest extends ResourceManagerTestBase {
private PipelineContext directPipelineContext;
private PipelineContext forwardPipelineContext;
private PipelineContext filterPipelineContext;
private ExternalContext.Request directRequest;
private ExternalContext.Request forwardRequest;
private ExternalContext.Request filterRequest;
@Before
public void setupResourceManagerTestPipelineContext() {
{
directPipelineContext = new PipelineContext();
final Document requestDocument = ProcessorUtils.createDocumentFromURL("oxf:/org/orbeon/oxf/util/url-rewriter-test-request.xml", null);
final ExternalContext externalContext = new TestExternalContext(directPipelineContext, requestDocument);
directRequest = externalContext.getRequest();
// NOTE: PipelineContext is not really used by TestExternalContext in this test suite
directPipelineContext.setAttribute(PipelineContext.EXTERNAL_CONTEXT, externalContext);
}
{
forwardPipelineContext = new PipelineContext();
final Document requestDocument = ProcessorUtils.createDocumentFromURL("oxf:/org/orbeon/oxf/util/url-rewriter-test-request-forward.xml", null);
final ExternalContext externalContext = new TestExternalContext(forwardPipelineContext, requestDocument);
forwardRequest = externalContext.getRequest();
// NOTE: PipelineContext is not really used by TestExternalContext in this test suite
forwardPipelineContext.setAttribute(PipelineContext.EXTERNAL_CONTEXT, externalContext);
}
{
filterPipelineContext = new PipelineContext();
final Document requestDocument = ProcessorUtils.createDocumentFromURL("oxf:/org/orbeon/oxf/util/url-rewriter-test-request-filter.xml", null);
final ExternalContext externalContext = new TestExternalContext(filterPipelineContext, requestDocument);
filterRequest = externalContext.getRequest();
// NOTE: PipelineContext is not really used by TestExternalContext in this test suite
filterPipelineContext.setAttribute(PipelineContext.EXTERNAL_CONTEXT, externalContext);
}
// Reinitialize properties to enable versioned resources
Properties.invalidate();
org.orbeon.oxf.properties.Properties.init("oxf:/ops/unit-tests/properties-versioned-all.xml");
}
@After
public void tearDownResourceManagerTestPipelineContext() {
directPipelineContext.destroy(true);
forwardPipelineContext.destroy(true);
filterPipelineContext.destroy(true);
}
@Test
public void testServiceRewrite() {
// Test with oxf.url-rewriting.service.base-uri is set to http://example.org/cool/service
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteServiceURL(directRequest, "https://foo.com/bar", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteServiceURL(request, "relative/sub/path", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
assertEquals("http://example.org/cool/service/bar", URLRewriterUtils.rewriteServiceURL(directRequest, "/bar", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
assertEquals("http://example.org/cool/service/bar?a=1&b=2", URLRewriterUtils.rewriteServiceURL(directRequest, "/bar?a=1&b=2", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
assertEquals("http://example.org/cool/service/bar?a=1&b=2#there", URLRewriterUtils.rewriteServiceURL(directRequest, "/bar?a=1&b=2#there", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
assertEquals("http://example.org/cool/service?a=1&b=2", URLRewriterUtils.rewriteServiceURL(directRequest, "?a=1&b=2", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteServiceURL(directRequest, "https://foo.com/bar", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteServiceURL(request, "relative/sub/path", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
assertEquals("http://example.org/bar", URLRewriterUtils.rewriteServiceURL(directRequest, "/bar", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
assertEquals("http://example.org/bar?a=1&b=2", URLRewriterUtils.rewriteServiceURL(directRequest, "/bar?a=1&b=2", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
assertEquals("http://example.org/bar?a=1&b=2#there", URLRewriterUtils.rewriteServiceURL(directRequest, "/bar?a=1&b=2#there", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
// NOTE: Ideally should have a "/" between host name and query
assertEquals("http://example.org?a=1&b=2", URLRewriterUtils.rewriteServiceURL(directRequest, "?a=1&b=2", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
// TODO: test with oxf.url-rewriting.service.base-uri set to absolute path
// TODO: test without oxf.url-rewriting.service.base-uri set
}
@Test
public void testRewrite() {
// Test against request
int mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteURL(directRequest, "https://foo.com/bar", mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteURL(request, "relative/sub/path", mode));
assertEquals("http://localhost:8080/orbeon/bar", URLRewriterUtils.rewriteURL(directRequest, "/bar", mode));
assertEquals("http://localhost:8080/orbeon/bar?a=1&b=2", URLRewriterUtils.rewriteURL(directRequest, "/bar?a=1&b=2", mode));
assertEquals("http://localhost:8080/orbeon/bar?a=1&b=2#there", URLRewriterUtils.rewriteURL(directRequest, "/bar?a=1&b=2#there", mode));
assertEquals("http://localhost:8080/orbeon/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteURL(directRequest, "?a=1&b=2", mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteURL(directRequest, "https://foo.com/bar", mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteURL(request, "relative/sub/path", mode));
assertEquals("/orbeon/bar", URLRewriterUtils.rewriteURL(directRequest, "/bar", mode));
assertEquals("/orbeon/bar?a=1&b=2", URLRewriterUtils.rewriteURL(directRequest, "/bar?a=1&b=2", mode));
assertEquals("/orbeon/bar?a=1&b=2#there", URLRewriterUtils.rewriteURL(directRequest, "/bar?a=1&b=2#there", mode));
assertEquals("/orbeon/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteURL(directRequest, "?a=1&b=2", mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_NO_CONTEXT;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteURL(directRequest, "https://foo.com/bar", mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteURL(request, "relative/sub/path", mode));
assertEquals("/bar", URLRewriterUtils.rewriteURL(directRequest, "/bar", mode));
assertEquals("/bar?a=1&b=2", URLRewriterUtils.rewriteURL(directRequest, "/bar?a=1&b=2", mode));
assertEquals("/bar?a=1&b=2#there", URLRewriterUtils.rewriteURL(directRequest, "/bar?a=1&b=2#there", mode));
assertEquals("/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteURL(directRequest, "?a=1&b=2", mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_OR_RELATIVE;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteURL(directRequest, "https://foo.com/bar", mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteURL(request, "relative/sub/path", mode));
assertEquals("/orbeon/bar", URLRewriterUtils.rewriteURL(directRequest, "/bar", mode));
assertEquals("/orbeon/bar?a=1&b=2", URLRewriterUtils.rewriteURL(directRequest, "/bar?a=1&b=2", mode));
assertEquals("/orbeon/bar?a=1&b=2#there", URLRewriterUtils.rewriteURL(directRequest, "/bar?a=1&b=2#there", mode));
assertEquals("/orbeon/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteURL(directRequest, "?a=1&b=2", mode));
}
@Test
public void testResourceRewrite() {
final List<URLRewriterUtils.PathMatcher> pathMatchers = URLRewriterUtils.MATCH_ALL_PATH_MATCHERS;
final String version = URLRewriterUtils.getOrbeonVersionForClient();
// Test against request
int mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(directRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("http://localhost:8080/orbeon/42/bar", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar", pathMatchers , mode));
assertEquals("http://localhost:8080/orbeon/42/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("http://localhost:8080/orbeon/42/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("http://localhost:8080/orbeon/42/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(directRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("http://localhost:8080/orbeon/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(directRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("http://localhost:8080/orbeon/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(directRequest, "/config/bar.png", pathMatchers , mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(directRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("/orbeon/42/bar", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar", pathMatchers , mode));
assertEquals("/orbeon/42/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("/orbeon/42/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("/orbeon/42/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(directRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("/orbeon/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(directRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("/orbeon/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(directRequest, "/config/bar.png", pathMatchers , mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_NO_CONTEXT;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(directRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("/42/bar", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar", pathMatchers , mode));
assertEquals("/42/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("/42/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("/42/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(directRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(directRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(directRequest, "/config/bar.png", pathMatchers , mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_OR_RELATIVE;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(directRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("/orbeon/42/bar", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar", pathMatchers , mode));
assertEquals("/orbeon/42/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("/orbeon/42/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(directRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("/orbeon/42/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(directRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("/orbeon/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(directRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("/orbeon/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(directRequest, "/config/bar.png", pathMatchers , mode));
}
@Test
public void testServiceRewriteForward() {
// Test with oxf.url-rewriting.service.base-uri is set to http://example.org/cool/service
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteServiceURL(forwardRequest, "https://foo.com/bar", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteServiceURL(request, "relative/sub/path", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
assertEquals("http://example.org/cool/service/bar", URLRewriterUtils.rewriteServiceURL(forwardRequest, "/bar", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
assertEquals("http://example.org/cool/service/bar?a=1&b=2", URLRewriterUtils.rewriteServiceURL(forwardRequest, "/bar?a=1&b=2", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
assertEquals("http://example.org/cool/service/bar?a=1&b=2#there", URLRewriterUtils.rewriteServiceURL(forwardRequest, "/bar?a=1&b=2#there", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
assertEquals("http://example.org/cool/service?a=1&b=2", URLRewriterUtils.rewriteServiceURL(forwardRequest, "?a=1&b=2", ExternalContext.Response.REWRITE_MODE_ABSOLUTE));
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteServiceURL(forwardRequest, "https://foo.com/bar", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteServiceURL(request, "relative/sub/path", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
assertEquals("http://example.org/bar", URLRewriterUtils.rewriteServiceURL(forwardRequest, "/bar", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
assertEquals("http://example.org/bar?a=1&b=2", URLRewriterUtils.rewriteServiceURL(forwardRequest, "/bar?a=1&b=2", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
assertEquals("http://example.org/bar?a=1&b=2#there", URLRewriterUtils.rewriteServiceURL(forwardRequest, "/bar?a=1&b=2#there", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
// NOTE: Ideally should have a "/" between host name and query
assertEquals("http://example.org?a=1&b=2", URLRewriterUtils.rewriteServiceURL(forwardRequest, "?a=1&b=2", ExternalContext.Response.REWRITE_MODE_ABSOLUTE_NO_CONTEXT));
// TODO: test with oxf.url-rewriting.service.base-uri set to absolute path
// TODO: test without oxf.url-rewriting.service.base-uri set
}
@Test
public void testRewriteForward() {
// Test against request
int mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteURL(forwardRequest, "https://foo.com/bar", mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteURL(request, "relative/sub/path", mode));
assertEquals("http://localhost:8080/myapp/bar", URLRewriterUtils.rewriteURL(forwardRequest, "/bar", mode));
assertEquals("http://localhost:8080/myapp/bar?a=1&b=2", URLRewriterUtils.rewriteURL(forwardRequest, "/bar?a=1&b=2", mode));
assertEquals("http://localhost:8080/myapp/bar?a=1&b=2#there", URLRewriterUtils.rewriteURL(forwardRequest, "/bar?a=1&b=2#there", mode));
assertEquals("http://localhost:8080/myapp/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteURL(forwardRequest, "?a=1&b=2", mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteURL(forwardRequest, "https://foo.com/bar", mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteURL(request, "relative/sub/path", mode));
assertEquals("/myapp/bar", URLRewriterUtils.rewriteURL(forwardRequest, "/bar", mode));
assertEquals("/myapp/bar?a=1&b=2", URLRewriterUtils.rewriteURL(forwardRequest, "/bar?a=1&b=2", mode));
assertEquals("/myapp/bar?a=1&b=2#there", URLRewriterUtils.rewriteURL(forwardRequest, "/bar?a=1&b=2#there", mode));
assertEquals("/myapp/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteURL(forwardRequest, "?a=1&b=2", mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_NO_CONTEXT;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteURL(forwardRequest, "https://foo.com/bar", mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteURL(request, "relative/sub/path", mode));
assertEquals("/bar", URLRewriterUtils.rewriteURL(forwardRequest, "/bar", mode));
assertEquals("/bar?a=1&b=2", URLRewriterUtils.rewriteURL(forwardRequest, "/bar?a=1&b=2", mode));
assertEquals("/bar?a=1&b=2#there", URLRewriterUtils.rewriteURL(forwardRequest, "/bar?a=1&b=2#there", mode));
assertEquals("/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteURL(forwardRequest, "?a=1&b=2", mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_OR_RELATIVE;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteURL(forwardRequest, "https://foo.com/bar", mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteURL(request, "relative/sub/path", mode));
assertEquals("/myapp/bar", URLRewriterUtils.rewriteURL(forwardRequest, "/bar", mode));
assertEquals("/myapp/bar?a=1&b=2", URLRewriterUtils.rewriteURL(forwardRequest, "/bar?a=1&b=2", mode));
assertEquals("/myapp/bar?a=1&b=2#there", URLRewriterUtils.rewriteURL(forwardRequest, "/bar?a=1&b=2#there", mode));
assertEquals("/myapp/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteURL(forwardRequest, "?a=1&b=2", mode));
}
@Test
public void testResourceRewriteForward() {
final List<URLRewriterUtils.PathMatcher> pathMatchers = URLRewriterUtils.MATCH_ALL_PATH_MATCHERS;
final String version = URLRewriterUtils.getOrbeonVersionForClient();
// Test against request
int mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(forwardRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/bar", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(forwardRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/orbeon/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/orbeon/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/config/bar.png", pathMatchers , mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(forwardRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("/myapp/bar", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar", pathMatchers , mode));
assertEquals("/myapp/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("/myapp/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("/myapp/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(forwardRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("/myapp/orbeon/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("/myapp/orbeon/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/config/bar.png", pathMatchers , mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_NO_CONTEXT;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(forwardRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("/bar", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar", pathMatchers , mode));
assertEquals("/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(forwardRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/config/bar.png", pathMatchers , mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_OR_RELATIVE;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(forwardRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("/myapp/bar", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar", pathMatchers , mode));
assertEquals("/myapp/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("/myapp/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("/myapp/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(forwardRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("/myapp/orbeon/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("/myapp/orbeon/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(forwardRequest, "/config/bar.png", pathMatchers , mode));
}
@Test
public void testResourceRewriteFilter() {
final List<URLRewriterUtils.PathMatcher> pathMatchers = URLRewriterUtils.MATCH_ALL_PATH_MATCHERS;
final String version = URLRewriterUtils.getOrbeonVersionForClient();
// Test against request
int mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(filterRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/bar", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(filterRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/orbeon/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(filterRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("http://localhost:8080/myapp/orbeon/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(filterRequest, "/config/bar.png", pathMatchers , mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(filterRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("/myapp/bar", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar", pathMatchers , mode));
assertEquals("/myapp/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("/myapp/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("/myapp/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(filterRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("/myapp/orbeon/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(filterRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("/myapp/orbeon/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(filterRequest, "/config/bar.png", pathMatchers , mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_NO_CONTEXT;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(filterRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("/bar", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar", pathMatchers , mode));
assertEquals("/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(filterRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(filterRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(filterRequest, "/config/bar.png", pathMatchers , mode));
mode = ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_OR_RELATIVE;
assertEquals("https://foo.com/bar", URLRewriterUtils.rewriteResourceURL(filterRequest, "https://foo.com/bar", pathMatchers , mode));
// assertEquals("http://example.org/cool/service/relative/sub/path", URLRewriterUtils.rewriteResourceURL(request, "relative/sub/path", pathMatchers , mode));
assertEquals("/myapp/bar", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar", pathMatchers , mode));
assertEquals("/myapp/bar?a=1&b=2", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar?a=1&b=2", pathMatchers , mode));
assertEquals("/myapp/bar?a=1&b=2#there", URLRewriterUtils.rewriteResourceURL(filterRequest, "/bar?a=1&b=2#there", pathMatchers , mode));
assertEquals("/myapp/doc/home-welcome?a=1&b=2", URLRewriterUtils.rewriteResourceURL(filterRequest, "?a=1&b=2", pathMatchers , mode));
assertEquals("/myapp/orbeon/" + version + "/ops/bar.png", URLRewriterUtils.rewriteResourceURL(filterRequest, "/ops/bar.png", pathMatchers , mode));
assertEquals("/myapp/orbeon/" + version + "/config/bar.png", URLRewriterUtils.rewriteResourceURL(filterRequest, "/config/bar.png", pathMatchers , mode));
}
@Test
public void testDecodeResourceURI() {
// NOTE: Unclear case: /xforms-server/foobar. URLRewriterUtils.rewriteResourceURL() does not rewrite
// /xforms-server/foobar as a resource URL and it is not clear why.
final String orbeonVersion = URLRewriterUtils.getOrbeonVersionForClient();
final String[] propertiesURLs = { "oxf:/ops/unit-tests/properties-versioned-all.xml", "oxf:/ops/unit-tests/properties-versioned-orbeon.xml" };
final String[] platformPaths = { "/ops/bar", "/config/bar", "/xbl/orbeon/bar", "/forms/orbeon/bar", "/apps/fr/bar", "/xforms-server" };
for (final String propertiesURL: propertiesURLs) {
// Reinitialize properties
Properties.invalidate();
org.orbeon.oxf.properties.Properties.init(propertiesURL);
// Check platform paths
for (final String path: platformPaths) {
final String versionedPath = "/" + orbeonVersion + path;
// Make sure this is recognized as a platform path
assertTrue(URLRewriterUtils.isPlatformPath(path));
// Just decoding
assertEquals(path, URLRewriterUtils.decodeResourceURI(versionedPath, true));
// Encoding/decoding
assertEquals(path, URLRewriterUtils.decodeResourceURI(URLRewriterUtils.rewriteResourceURL(directRequest, path,
URLRewriterUtils.MATCH_ALL_PATH_MATCHERS, ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_NO_CONTEXT), true));
}
// Check non-platform paths
final String[] customPaths = { "/opsla", "/configuration", "/xbl/acme/bar", "/forms/acme/bar", "/apps/myapp/bar", "/xforms-foo" };
final String[] decodedCustomPaths = { "/apps/opsla", "/apps/configuration", "/xbl/acme/bar", "/forms/acme/bar", "/apps/myapp/bar", "/apps/xforms-foo" };
final String appVersion = URLRewriterUtils.getApplicationResourceVersion();
int i = 0;
for (final String path: customPaths) {
// Make sure this is recognized as a non-platform path
assertFalse(URLRewriterUtils.isPlatformPath(path));
final String decodedCustomPath = decodedCustomPaths[i];
if (appVersion != null) {
// Case where there is an app version number
final String versionedPath = "/" + appVersion + path;
// Just decoding
assertEquals(decodedCustomPath, URLRewriterUtils.decodeResourceURI(versionedPath, true));
// Encoding/decoding
assertEquals(decodedCustomPath, URLRewriterUtils.decodeResourceURI(URLRewriterUtils.rewriteResourceURL(directRequest, path,
URLRewriterUtils.MATCH_ALL_PATH_MATCHERS, ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_NO_CONTEXT), true));
} else {
// Case where there is NO app version number
// Just decoding
assertEquals(decodedCustomPath, URLRewriterUtils.decodeResourceURI(path, true));
// Encoding/decoding
assertEquals(decodedCustomPath, URLRewriterUtils.decodeResourceURI(URLRewriterUtils.rewriteResourceURL(directRequest, path,
URLRewriterUtils.MATCH_ALL_PATH_MATCHERS, ExternalContext.Response.REWRITE_MODE_ABSOLUTE_PATH_NO_CONTEXT), true));
}
i++;
}
}
}
@Test
public void testHRRI() {
// Test for spaces
assertEquals("http://localhost:8080/myapp/a%20b", NetUtils.encodeHRRI("http://localhost:8080/myapp/a b", true));
assertEquals("http://localhost:8080/myapp/a b", NetUtils.encodeHRRI("http://localhost:8080/myapp/a b", false));
// Test for trim()
assertEquals("http://localhost:8080/", NetUtils.encodeHRRI(" http://localhost:8080/ ", true));
// Test for other characters
assertEquals("http://localhost:8080/myapp/%3C%3E%22%7B%7D%7C%5C%5E%60", NetUtils.encodeHRRI("http://localhost:8080/myapp/<>\"{}|\\^`", true));
}
@Test
public void testResolveURI() {
assertEquals("http://localhost:8080/myapp/a%20b", NetUtils.resolveURI("a b", "http://localhost:8080/myapp/"));
assertEquals("http://localhost:8080/myapp/a%20b", NetUtils.resolveURI("http://localhost:8080/myapp/a b", null));
}
}