package org.jboss.seam.web; import java.util.Collection; import java.net.*; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import org.jboss.seam.log.LogProvider; import org.jboss.seam.log.Logging; public class RewritingResponse extends HttpServletResponseWrapper { private static LogProvider log = Logging.getLogProvider(RewritingResponse.class); private HttpServletRequest request; private Collection<Pattern> patterns; public RewritingResponse(HttpServletRequest request, HttpServletResponse response, Collection<Pattern> patterns) { super(response); this.request = request; this.patterns = patterns; } @Override public String encodeRedirectUrl(String url) { return encodeRedirectURL(url); } @Override public String encodeUrl(String url) { return encodeURL(url); } @Override public String encodeRedirectURL(String url) { String result = rewriteURL(url); log.debug("encodeRedirectURL " + url + " -> " + result); return wrappedEncodeRedirectURL(result); } private String wrappedEncodeRedirectURL(String result) { ServletResponse response = getResponse(); if (response instanceof HttpServletResponse) { return ((HttpServletResponse)response).encodeRedirectURL(result); } return result; } @Override public String encodeURL(String url) { String result = super.encodeUrl(rewriteURL(url)); log.debug("encodeURL " + url + " -> " + result); return wrappedEncodeURL(result); } private String wrappedEncodeURL(String result) { ServletResponse response = getResponse(); if (response instanceof HttpServletResponse) { return ((HttpServletResponse)response).encodeRedirectURL(result); } return result; } public boolean isLocalURL(URL url) { return url.getHost().equals(request.getServerName()); } public String rewritePath(String originalPath) { String contextPath = request.getContextPath(); String path = originalPath.startsWith(contextPath) ? originalPath.substring(contextPath.length()) : originalPath; for (Pattern pattern: patterns) { Rewrite rewrite = pattern.matchOutgoing(path); if (rewrite != null) { return request.getContextPath() + rewrite.rewrite(); } } return originalPath; } public String rewriteURL(String originalUrl) { if (originalUrl.startsWith("http://") || originalUrl.startsWith("https://")) { try { URL url = new URL(originalUrl); if (isLocalURL(url)) { URL newUrl = new URL(url, rewritePath(url.getFile())); return newUrl.toExternalForm(); } } catch (MalformedURLException e) { // ignore - we simply don't care. we could log this at info/debug level. } } return rewritePath(originalUrl); } }