Modified: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/RewritableHttpReverseProxyServiceImpl.java URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/RewritableHttpReverseProxyServiceImpl.java?rev=821934&r1=821933&r2=821934&view=diff ============================================================================== --- portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/RewritableHttpReverseProxyServiceImpl.java (original) +++ portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/RewritableHttpReverseProxyServiceImpl.java Mon Oct 5 17:50:07 2009 @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.List; +import java.util.Map; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -67,6 +68,8 @@ import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyConstants; +import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyException; +import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyNotFoundException; import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyPathMapper; import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyPathMapperProvider; import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyService; @@ -173,7 +176,7 @@ } } - public void invoke(HttpServletRequest request, HttpServletResponse response) throws IOException + public void invoke(HttpServletRequest request, HttpServletResponse response) throws HttpReverseProxyException, IOException { // proxyPathMapper can be injected by using request attribute. HttpReverseProxyPathMapper proxyPathMapper = (HttpReverseProxyPathMapper) request.getAttribute(HttpReverseProxyConstants.PATH_MAPPER); @@ -192,7 +195,7 @@ if (proxyPathMapper == null) { - throw new IOException("Proxy configuration is not defined for " + localPathInfo); + throw new HttpReverseProxyNotFoundException("Proxy configuration is not defined for " + localPathInfo); } if (hostHeaderValue == null) @@ -211,7 +214,7 @@ if (proxyTargetURL == null) { - throw new IllegalStateException("Cannot translate the location path info into remote URL. " + localPathInfo); + throw new HttpReverseProxyNotFoundException("Cannot translate the location path info into remote URL. " + localPathInfo); } String queryString = request.getQueryString(); @@ -275,7 +278,7 @@ } else { - throw new IOException("Unsupported method: " + method); + throw new HttpReverseProxyException("Unsupported method: " + method); } // set sso credentials if available @@ -321,6 +324,16 @@ } } + Map<String, String> defaultRequestHeaders = proxyPathMapper.getDefaultRequestHeaders(); + + if (defaultRequestHeaders != null) + { + for (Map.Entry<String, String> entry : defaultRequestHeaders.entrySet()) + { + httpRequest.setHeader(entry.getKey(), entry.getValue()); + } + } + HttpEntity httpEntity = null; try @@ -344,7 +357,7 @@ if (location == null) { - throw new IOException("Recieved status code: " + statusCode + " but no " + HttpReverseProxyConstants.HTTP_HEADER_LOCATION + " header was found in the response"); + throw new HttpReverseProxyException("Recieved status code is " + statusCode + " but no " + HttpReverseProxyConstants.HTTP_HEADER_LOCATION + " header was found in the response"); } // Modify the redirect to go to this proxy servlet rather that the proxied host @@ -407,12 +420,33 @@ if (httpEntity != null) { + boolean rewritable = false; + Rewriter rewriter = null; + ParserAdaptor parserAdaptor = null; + + RewriterController rewriterController = proxyPathMapperProvider.getRewriterController(proxyPathMapper); + + if (rewriterController != null) + { + parserAdaptor = createParserAdaptor(rewriterController, httpEntity); + + if (parserAdaptor != null) + { + rewriter = createRewriter(rewriterController, proxyPathMapper); + rewritable = (rewriter != null); + } + } + // Pass response headers back to the client Header [] headerArrayResponse = httpResponse.getAllHeaders(); for (Header header : headerArrayResponse) { String headerName = header.getName(); + + if (rewritable && StringUtils.equalsIgnoreCase(headerName, HTTP.CONTENT_LEN)) + continue; + String headerValue = header.getValue(); if (StringUtils.equalsIgnoreCase(headerName, HTTP.TARGET_HOST)) @@ -432,10 +466,26 @@ } // Send the content to the client - writeHttpEntityToClient(request, response, httpEntity, proxyPathMapper, rewriterContextPath, localPathInfo); + writeHttpEntityToClient(response, httpEntity, proxyPathMapper, rewriterContextPath, localPathInfo, rewriter, parserAdaptor); } } } + catch (IOException e) + { + if (log.isDebugEnabled()) + { + log.error("IOException occurred during execution for " + proxyTargetURL, e); + } + else + { + log.error("IOException occurred during execution for {} {}", proxyTargetURL, e); + } + + httpRequest.abort(); + httpEntity = null; + + throw e; + } catch (Exception e) { if (log.isDebugEnabled()) @@ -450,7 +500,7 @@ httpRequest.abort(); httpEntity = null; - throw new IOException(e.toString()); + throw new HttpReverseProxyException(e); } finally { @@ -461,11 +511,13 @@ } } - private void writeHttpEntityToClient(HttpServletRequest request, HttpServletResponse response, + private void writeHttpEntityToClient(HttpServletResponse response, HttpEntity httpEntity, HttpReverseProxyPathMapper proxyPathMapper, String rewriterContextPath, - String localPathInfo) throws IOException + String localPathInfo, + Rewriter rewriter, + ParserAdaptor parserAdaptor) throws Exception { InputStream in = null; Reader reader = null; @@ -481,127 +533,48 @@ if (in != null) { out = response.getOutputStream(); - - RewriterController rewriterController = proxyPathMapperProvider.getRewriterController(proxyPathMapper); - Rewriter rewriter = null; - if (rewriterController != null) - { - Ruleset rewriterRuleset = proxyPathMapperProvider.getRewriterRuleset(proxyPathMapper); - - if (rewriterRuleset == null) - { - rewriter = rewriterController.createRewriter(); - } - else - { - rewriter = rewriterController.createRewriter(rewriterRuleset); - } - } - - if (rewriterController == null || rewriter == null) + if (rewriter == null || parserAdaptor == null) { IOUtils.copy(in, out); out.flush(); } else { - String mimeType = "text/html"; - String contentType = null; - Header contentTypeHeader = httpEntity.getContentType(); + boolean gzipEncoded = false; + Header contentEncodingHeader = httpEntity.getContentEncoding(); - if (contentTypeHeader != null) + if (contentEncodingHeader != null) { - contentType = contentTypeHeader.getValue(); + gzipEncoded = StringUtils.equalsIgnoreCase("gzip", contentEncodingHeader.getValue()); } - if (contentType != null) + if (parserAdaptor instanceof ReverseProxyRewritingContextAware) { - int offset = contentType.indexOf(';'); - - if (offset > 0) - { - mimeType = contentType.substring(0, offset).trim(); - } - else - { - mimeType = contentType; - } + ReverseProxyRewritingContext rewritingContext = + new DefaultReverseProxyRewritingContext(proxyPathMapper, proxyPathMapperProvider, rewriterContextPath); + ((ReverseProxyRewritingContextAware) parserAdaptor).setReverseProxyRewritingContext(rewritingContext); } - ParserAdaptor parserAdaptor = null; + String responseCharSet = EntityUtils.getContentCharSet(httpEntity); - try + if (responseCharSet != null) { - parserAdaptor = rewriterController.createParserAdaptor(mimeType); - } - catch (Exception e) - { - if (log.isDebugEnabled()) - { - log.error("Failed to create parser adaptor.", e); - } - else - { - log.error("Failed to create parser adaptor. {}", e.toString()); - } - } - - if (parserAdaptor == null) - { - IOUtils.copy(in, out); - out.flush(); + reader = new InputStreamReader(gzipEncoded ? new GZIPInputStream(in) : in, responseCharSet); + writer = new OutputStreamWriter(gzipEncoded ? new GZIPOutputStream(out) : out, responseCharSet); } else { - boolean gzipEncoded = false; - Header contentEncodingHeader = httpEntity.getContentEncoding(); - - if (contentEncodingHeader != null) - { - gzipEncoded = StringUtils.equalsIgnoreCase("gzip", contentEncodingHeader.getValue()); - } - - if (parserAdaptor instanceof ReverseProxyRewritingContextAware) - { - ReverseProxyRewritingContext rewritingContext = - new DefaultReverseProxyRewritingContext(proxyPathMapper, proxyPathMapperProvider, rewriterContextPath); - ((ReverseProxyRewritingContextAware) parserAdaptor).setReverseProxyRewritingContext(rewritingContext); - } - - String responseCharSet = EntityUtils.getContentCharSet(httpEntity); - - if (responseCharSet != null) - { - reader = new InputStreamReader(gzipEncoded ? new GZIPInputStream(in) : in, responseCharSet); - writer = new OutputStreamWriter(gzipEncoded ? new GZIPOutputStream(out) : out, responseCharSet); - } - else - { - reader = new InputStreamReader(gzipEncoded ? new GZIPInputStream(in) : in); - writer = new OutputStreamWriter(gzipEncoded ? new GZIPOutputStream(out) : out); - } - - rewriter.setBaseUrl(rewriterContextPath + localPathInfo); - rewriter.rewrite(parserAdaptor, reader, writer); - writer.flush(); + reader = new InputStreamReader(gzipEncoded ? new GZIPInputStream(in) : in); + writer = new OutputStreamWriter(gzipEncoded ? new GZIPOutputStream(out) : out); } + + rewriter.setBaseUrl(rewriterContextPath + localPathInfo); + rewriter.rewrite(parserAdaptor, reader, writer); + writer.flush(); } } } - catch (Exception e) - { - if (log.isDebugEnabled()) - { - log.error("Exception occurred during writing content.", e); - } - else - { - log.error("Exception occurred during writing content. {}", e.toString()); - } - - throw new IOException(e.getLocalizedMessage()); - } finally { if (reader != null) @@ -623,6 +596,46 @@ } } + private Rewriter createRewriter(RewriterController rewriterController, HttpReverseProxyPathMapper proxyPathMapper) throws Exception + { + Ruleset rewriterRuleset = proxyPathMapperProvider.getRewriterRuleset(proxyPathMapper); + + if (rewriterRuleset == null) + { + return rewriterController.createRewriter(); + } + else + { + return rewriterController.createRewriter(rewriterRuleset); + } + } + + private ParserAdaptor createParserAdaptor(RewriterController rewriterController, HttpEntity httpEntity) throws Exception + { + String contentType = null; + Header contentTypeHeader = httpEntity.getContentType(); + + if (contentTypeHeader != null) + { + contentType = contentTypeHeader.getValue(); + } + + if (contentType == null) + { + return null; + } + + String mimeType = contentType; + int offset = mimeType.indexOf(';'); + + if (offset > 0) + { + mimeType = mimeType.substring(0, offset).trim(); + } + + return rewriterController.createParserAdaptor(mimeType); + } + private List<SSOSiteCredentials> getSSOSiteCredentials(String siteURL, DefaultHttpClient httpClient, HttpServletRequest request) { SSOSiteCredentialsProvider credsProvider = (SSOSiteCredentialsProvider) request.getAttribute(HttpReverseProxyConstants.SSO_SITE_CREDENTIALS_PROVIDER);
Added: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java?rev=821934&view=auto ============================================================================== --- portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java (added) +++ portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java Mon Oct 5 17:50:07 2009 @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.portals.applications.webcontent.rewriter; + +import java.io.BufferedWriter; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.Writer; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.LineIterator; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * AbstractTextLinesParserAdaptor + * + * @version $Id$ + */ +public abstract class AbstractTextLinesParserAdaptor implements ParserAdaptor +{ + + private static Logger log = LoggerFactory.getLogger(AbstractTextLinesParserAdaptor.class); + + public void rewrite(Rewriter rewriter, Reader reader, Writer writer) throws RewriterException + { + PrintWriter out = new PrintWriter(new BufferedWriter(writer)); + + for (LineIterator lineIt = IOUtils.lineIterator(reader); lineIt.hasNext(); ) + { + String line = lineIt.nextLine(); + + if (!StringUtils.isBlank(line)) + { + try + { + line = rewriteLine(line); + } + catch (Exception e) + { + log.warn("Error during {}: {}", "replacement", e); + } + } + + out.println(line); + } + + out.flush(); + } + + protected abstract String rewriteLine(String line) throws Exception; + + public void parse(Rewriter rewriter, Reader reader) throws RewriterException + { + throw new UnsupportedOperationException("Text lines parser adaptor does not support parse() method."); + } + +} Propchange: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java ------------------------------------------------------------------------------ svn:keywords = Id Propchange: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingClasspathRewriterController.java URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingClasspathRewriterController.java?rev=821934&r1=821933&r2=821934&view=diff ============================================================================== --- portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingClasspathRewriterController.java (original) +++ portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingClasspathRewriterController.java Mon Oct 5 17:50:07 2009 @@ -21,6 +21,7 @@ import java.io.InputStreamReader; import java.io.Reader; import java.util.List; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,6 +43,12 @@ { super(mappingFile); } + + public MappingClasspathRewriterController( String mappingFile, Class basicRewriterClass, Class ruleBasedRewriterClass, Map<String, Class> adaptorMimeTypeClassMap ) + throws RewriterException + { + super(mappingFile, basicRewriterClass, ruleBasedRewriterClass, adaptorMimeTypeClassMap); + } public MappingClasspathRewriterController( String mappingFile, List rewriterClasses, List adaptorClasses ) throws RewriterException Modified: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingRewriterController.java URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingRewriterController.java?rev=821934&r1=821933&r2=821934&view=diff ============================================================================== --- portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingRewriterController.java (original) +++ portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingRewriterController.java Mon Oct 5 17:50:07 2009 @@ -19,6 +19,7 @@ import java.io.File; import java.io.InputStream; import java.io.Reader; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -28,6 +29,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import org.apache.commons.beanutils.BeanUtils; import org.apache.portals.applications.webcontent.rewriter.html.SwingParserAdaptor; import org.apache.portals.applications.webcontent.rewriter.rules.Ruleset; import org.apache.portals.applications.webcontent.rewriter.xml.SaxParserAdaptor; @@ -65,13 +67,22 @@ /** configured basic rewriter class */ protected Class basicRewriterClass = BasicRewriter.class; - + /** configured ruleset rewriter class */ protected Class rulesetRewriterClass = RulesetRewriterImpl.class; /** Adaptors */ protected Map<String, Class> parserAdaptorMimeTypeClassMap; - + + /** Basic rewriter instance properties */ + protected Map<String, Object> basicRewriterProps; + + /** Ruleset rewriter instance properties */ + protected Map<String, Object> rulesetRewriterProps; + + /** Parser adaptor rewriter instance properties map */ + protected Map<String, Map<String, Object>> parserAdaptorMimeTypePropsMap; + public MappingRewriterController( String mappingFile ) throws RewriterException { this.mappingFile = mappingFile; @@ -181,7 +192,24 @@ public Rewriter createRewriter() throws InstantiationException, IllegalAccessException { - return (Rewriter) basicRewriterClass.newInstance(); + Rewriter rewriter = (Rewriter) basicRewriterClass.newInstance(); + + try + { + if (basicRewriterProps != null) + { + for (Map.Entry<String, Object> entry : basicRewriterProps.entrySet()) + { + BeanUtils.setProperty(rewriter, entry.getKey(), entry.getValue()); + } + } + } + catch (InvocationTargetException e) + { + throw new RuntimeException(e); + } + + return rewriter; } public RulesetRewriter createRewriter( Ruleset ruleset ) throws RewriterException @@ -190,6 +218,22 @@ { RulesetRewriter rewriter = (RulesetRewriter) rulesetRewriterClass.newInstance(); rewriter.setRuleset(ruleset); + + try + { + if (rulesetRewriterProps != null) + { + for (Map.Entry<String, Object> entry : rulesetRewriterProps.entrySet()) + { + BeanUtils.setProperty(rewriter, entry.getKey(), entry.getValue()); + } + } + } + catch (InvocationTargetException e) + { + throw new RuntimeException(e); + } + return rewriter; } catch (Exception e) @@ -203,12 +247,35 @@ { try { + ParserAdaptor parserAdaptor = null; Class parserAdaptorClass = parserAdaptorMimeTypeClassMap.get(mimeType); if (parserAdaptorClass != null) { - return (ParserAdaptor) parserAdaptorClass.newInstance(); + parserAdaptor = (ParserAdaptor) parserAdaptorClass.newInstance(); + + try + { + if (parserAdaptorMimeTypePropsMap != null) + { + Map<String, Object> parserAdaptorProps = parserAdaptorMimeTypePropsMap.get(mimeType); + + if (parserAdaptorProps != null) + { + for (Map.Entry<String, Object> entry : parserAdaptorProps.entrySet()) + { + BeanUtils.setProperty(parserAdaptor, entry.getKey(), entry.getValue()); + } + } + } + } + catch (InvocationTargetException e) + { + throw new RuntimeException(e); + } } + + return parserAdaptor; } catch (Exception e) { @@ -229,17 +296,28 @@ throw new RewriterException("The mapping file is not set."); } - File file = new File(this.mappingFile); - - if (!file.isFile()) - { - throw new RewriterException("The mapping file is not available: " + this.mappingFile); - } + Reader reader = getReader(this.mappingFile); try { - this.mapper = new Mapping(); - this.mapper.loadMapping(file.toURL()); + if (reader == null && this.mappingFile != null) + { + File file = new File(this.mappingFile); + + if (!file.isFile()) + { + throw new RewriterException("The mapping file is not available: " + this.mappingFile); + } + + this.mapper = new Mapping(); + this.mapper.loadMapping(file.toURL()); + } + else + { + InputSource is = new InputSource(reader); + is.setSystemId(this.mappingFile); + this.mapper.loadMapping(is); + } } catch (Exception e) { @@ -307,5 +385,40 @@ return ruleset; } + + public Map<String, Object> getBasicRewriterProps() + { + return basicRewriterProps; + } + + public void setBasicRewriterProps(Map<String, Object> props) + { + basicRewriterProps = props; + } + + public Map<String, Object> getRulesetRewriterProps() + { + return rulesetRewriterProps; + } + + public void setRulesetRewriterProps(Map<String, Object> props) + { + rulesetRewriterProps = props; + } + + public Map<String, Map<String, Object>> getParserAdaptorMimeTypePropsMap() + { + return parserAdaptorMimeTypePropsMap; + } + + public void setParserAdaptorMimeTypePropsMap(Map<String, Map<String, Object>> propsMap) + { + parserAdaptorMimeTypePropsMap = propsMap; + } + + protected Reader getReader(String resourcePath) throws RewriterException + { + return null; + } } \ No newline at end of file Modified: portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestProxyPathMappings.java URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestProxyPathMappings.java?rev=821934&r1=821933&r2=821934&view=diff ============================================================================== --- portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestProxyPathMappings.java (original) +++ portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestProxyPathMappings.java Mon Oct 5 17:50:07 2009 @@ -35,7 +35,7 @@ */ public class TestProxyPathMappings extends TestCase { - private HttpReverseProxyPathMapperProvider pathMapperProvider; + private DefaultHttpReverseProxyPathMapperProviderImpl pathMapperProvider; @Override public void setUp() @@ -43,9 +43,13 @@ Map<HttpReverseProxyPathMapper, RewriterController> rewriterControllerMap = new HashMap<HttpReverseProxyPathMapper, RewriterController>(); Map<HttpReverseProxyPathMapper, Ruleset> rewriterRulesetMap = new HashMap<HttpReverseProxyPathMapper, Ruleset>(); List<HttpReverseProxyPathMapper> proxyPathMappers = new ArrayList<HttpReverseProxyPathMapper>(); - proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("localhost", "/localhost/", "http://www.localhost.com/")); - proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("apache", "/*_apache/", "http://$1.apache.org/")); + proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("localhost", "/localhost/", "http://www.localhost.com/", null)); + proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("localhost1", "/localhost/path1/", "http://www.localhost.com/path1/", null)); + proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("localhost2", "/localhost/path1/path2/", "http://www.localhost.com/path1/path2/", null)); + proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("apache", "/*_apache/", "http://$1.apache.org/", null)); + proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("apache", "/*.google.*/", "http://$1.google.$2/", null)); pathMapperProvider = new DefaultHttpReverseProxyPathMapperProviderImpl(proxyPathMappers, rewriterControllerMap, rewriterRulesetMap); + pathMapperProvider.setMaxMatchingPathPartCount(3); } public void testProxyPathMappings() throws Exception @@ -80,8 +84,26 @@ mapper = pathMapperProvider.findMapperByRemoteURL("http://portals.apache.org/index.html"); assertEquals("/portals_apache/", mapper.getLocalBasePath()); + mapper = pathMapperProvider.findMapperByRemoteURL("http://www.localhost.com/path1/path2/index.html"); + assertEquals("/localhost/path1/path2/", mapper.getLocalBasePath()); + + mapper = pathMapperProvider.findMapperByRemoteURL("http://www.localhost.com/path1/index.html"); + assertEquals("/localhost/path1/", mapper.getLocalBasePath()); + mapper = pathMapperProvider.findMapperByRemoteURL("http://www.localhost.com/index.html"); assertEquals("/localhost/", mapper.getLocalBasePath()); + + mapper = pathMapperProvider.findMapperByRemoteURL("http://www.localhost.com/path2/index.html"); + assertEquals("/localhost/", mapper.getLocalBasePath()); + + mapper = pathMapperProvider.findMapperByRemoteURL("http://www.localhost.com"); + assertEquals("/localhost/", mapper.getLocalBasePath()); + + mapper = pathMapperProvider.findMapperByRemoteURL("http://www.google.com/"); + assertEquals("/www.google.com/", mapper.getLocalBasePath()); + + mapper = pathMapperProvider.findMapperByRemoteURL("http://images.google.com/query?q=1/"); + assertEquals("/images.google.com/", mapper.getLocalBasePath()); } } Modified: portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestReverseProxyLinkRewritingParserAaptor.java URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestReverseProxyLinkRewritingParserAaptor.java?rev=821934&r1=821933&r2=821934&view=diff ============================================================================== --- portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestReverseProxyLinkRewritingParserAaptor.java (original) +++ portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestReverseProxyLinkRewritingParserAaptor.java Mon Oct 5 17:50:07 2009 @@ -30,7 +30,7 @@ import org.apache.portals.applications.webcontent.proxy.impl.DefaultHttpReverseProxyPathMapperImpl; import org.apache.portals.applications.webcontent.proxy.impl.DefaultHttpReverseProxyPathMapperProviderImpl; import org.apache.portals.applications.webcontent.proxy.impl.DefaultReverseProxyRewritingContext; -import org.apache.portals.applications.webcontent.proxy.impl.PassMappingLinkRewritingParserAaptor; +import org.apache.portals.applications.webcontent.proxy.impl.DefaultReverseProxyLinkRewritingParserAaptor; import org.apache.portals.applications.webcontent.rewriter.RewriterController; import org.apache.portals.applications.webcontent.rewriter.rules.Ruleset; import org.slf4j.Logger; @@ -66,8 +66,8 @@ @Override public void setUp() { - apacheProxyPathMapper = new DefaultHttpReverseProxyPathMapperImpl("apache", "/*_apache/", "http://$1.apache.org/"); - localhostProxyPathMapper = new DefaultHttpReverseProxyPathMapperImpl("localhost", "/localhost/", "http://www.localhost.com/"); + apacheProxyPathMapper = new DefaultHttpReverseProxyPathMapperImpl("apache", "/*_apache/", "http://$1.apache.org/", null); + localhostProxyPathMapper = new DefaultHttpReverseProxyPathMapperImpl("localhost", "/localhost/", "http://www.localhost.com/", null); Map<HttpReverseProxyPathMapper, RewriterController> rewriterControllerMap = new HashMap<HttpReverseProxyPathMapper, RewriterController>(); Map<HttpReverseProxyPathMapper, Ruleset> rewriterRulesetMap = new HashMap<HttpReverseProxyPathMapper, Ruleset>(); @@ -85,7 +85,7 @@ proxyPathMapperProvider, "/webcontent/rproxy"); - PassMappingLinkRewritingParserAaptor parserAdaptor = new PassMappingLinkRewritingParserAaptor(); + DefaultReverseProxyLinkRewritingParserAaptor parserAdaptor = new DefaultReverseProxyLinkRewritingParserAaptor(); parserAdaptor.setReverseProxyRewritingContext(rewritingContext); StringReader reader = new StringReader(html); Modified: portals/applications/webcontent/trunk/webcontent-war/src/main/webapp/WEB-INF/conf/reverseproxy.properties URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-war/src/main/webapp/WEB-INF/conf/reverseproxy.properties?rev=821934&r1=821933&r2=821934&view=diff ============================================================================== --- portals/applications/webcontent/trunk/webcontent-war/src/main/webapp/WEB-INF/conf/reverseproxy.properties (original) +++ portals/applications/webcontent/trunk/webcontent-war/src/main/webapp/WEB-INF/conf/reverseproxy.properties Mon Oct 5 17:50:07 2009 @@ -68,7 +68,11 @@ # Proxy Pass Reverse Mapping configurations for each category # ... Put the path item names here. Each path item will be evaluated by the order. -proxy.reverse.pass = apache, localhost, somewhere +proxy.reverse.pass = apache, localhost, somewhere +# ... Set cache count of proxy path mappers which are dynamically created by glob style mappings. +proxy.reverse.pass.dynamicProxyPathMapperCacheCount = 1000 +# ... Set max matching path part count +proxy.reverse.pass.maxMatchingPathPartCount = 2 # ... Sets detail attributes for each path item. @@ -76,11 +80,9 @@ proxy.reverse.pass.apache.remote = http://$1.apache.org/ proxy.reverse.pass.apache.rewriter.basic = org.apache.portals.applications.webcontent.rewriter.WebContentRewriter proxy.reverse.pass.apache.rewriter.parserAdaptor = html -# ... SimpleLinkRewritingParserAaptor rewrites links only based on its remote base URLs, -# ... while PassMappingLinkRewritingParserAaptor rewrites links based on all reverse proxy pass mappings. -#proxy.reverse.pass.apache.rewriter.parserAdaptor.html = org.apache.portals.applications.webcontent.proxy.impl.SimpleLinkRewritingParserAaptor -proxy.reverse.pass.apache.rewriter.parserAdaptor.html = org.apache.portals.applications.webcontent.proxy.impl.PassMappingLinkRewritingParserAaptor +proxy.reverse.pass.apache.rewriter.parserAdaptor.html = org.apache.portals.applications.webcontent.proxy.impl.DefaultReverseProxyLinkRewritingParserAaptor proxy.reverse.pass.apache.rewriter.parserAdaptor.html.mimeType = text/html +proxy.reverse.pass.apache.rewriter.parserAdaptor.html.property.lookUpAllMappings = true proxy.reverse.pass.localhost.local = /localhost/ proxy.reverse.pass.localhost.remote = http://localhost:8080/ @@ -98,3 +100,5 @@ proxy.reverse.pass.somewhere.rewriter.parserAdaptor.xml.mimeType = text/xml proxy.reverse.pass.somewhere.rewriter.ruleMappings = /WEB-INF/conf/rewriter-rules-mapping.xml proxy.reverse.pass.somewhere.rewriter.rules = /WEB-INF/conf/default-rewriter-rules.xml +proxy.reverse.pass.somewhere.request.header.Accept-Language = en +proxy.reverse.pass.somewhere.request.header.X-Custom-Header = A custom value
