[KARAF-3712] Make sure resource urls are absolute Project: http://git-wip-us.apache.org/repos/asf/karaf-cave/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf-cave/commit/dc8ee600 Tree: http://git-wip-us.apache.org/repos/asf/karaf-cave/tree/dc8ee600 Diff: http://git-wip-us.apache.org/repos/asf/karaf-cave/diff/dc8ee600
Branch: refs/heads/master Commit: dc8ee6009dade745c150d474a1b36d1ed885b680 Parents: 847a47f Author: Guillaume Nodet <[email protected]> Authored: Mon May 4 16:19:12 2015 +0200 Committer: Guillaume Nodet <[email protected]> Committed: Mon May 4 16:19:12 2015 +0200 ---------------------------------------------------------------------- server/http/pom.xml | 8 ++ .../karaf/cave/server/http/WrapperServlet.java | 87 +++++++++++++++----- 2 files changed, 76 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf-cave/blob/dc8ee600/server/http/pom.xml ---------------------------------------------------------------------- diff --git a/server/http/pom.xml b/server/http/pom.xml index b248c56..cf15f87 100644 --- a/server/http/pom.xml +++ b/server/http/pom.xml @@ -49,6 +49,11 @@ <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> </dependency> + <dependency> + <groupId>org.apache.karaf</groupId> + <artifactId>org.apache.karaf.util</artifactId> + <version>${karaf.version}</version> + </dependency> </dependencies> <build> @@ -67,6 +72,9 @@ org.osgi.framework;version="[1,4)", * </Import-Package> + <Private-Package> + org.apache.karaf.util + </Private-Package> <Webapp-Context>/cave</Webapp-Context> <Web-ContextPath>/cave</Web-ContextPath> </instructions> http://git-wip-us.apache.org/repos/asf/karaf-cave/blob/dc8ee600/server/http/src/main/java/org/apache/karaf/cave/server/http/WrapperServlet.java ---------------------------------------------------------------------- diff --git a/server/http/src/main/java/org/apache/karaf/cave/server/http/WrapperServlet.java b/server/http/src/main/java/org/apache/karaf/cave/server/http/WrapperServlet.java index 2fb8914..6b0428f 100644 --- a/server/http/src/main/java/org/apache/karaf/cave/server/http/WrapperServlet.java +++ b/server/http/src/main/java/org/apache/karaf/cave/server/http/WrapperServlet.java @@ -16,10 +16,13 @@ */ package org.apache.karaf.cave.server.http; -import org.apache.karaf.cave.server.api.CaveRepository; -import org.apache.karaf.cave.server.api.CaveRepositoryService; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.net.URI; +import java.net.URL; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; @@ -27,11 +30,21 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.URL; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.stream.XMLStreamException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.apache.karaf.cave.server.api.CaveRepository; +import org.apache.karaf.cave.server.api.CaveRepositoryService; +import org.apache.karaf.util.XmlUtils; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.xml.sax.SAXException; /** * Wrapper servlet which "exposes" Karaf Cave repository resources in HTTP. @@ -107,6 +120,10 @@ public class WrapperServlet extends HttpServlet { } url = caveRepository.getRepositoryXml(); response.setContentType("text/xml"); + String repository = resolveRelativeUrls(url, request.getRequestURL().toString()); + response.getOutputStream().print(repository); + response.getOutputStream().flush(); + response.getOutputStream().close(); } else { for (CaveRepository repository : caveRepositoryService.getRepositories()) { URL resourceUrl = repository.getResourceByUri(uri); @@ -122,18 +139,18 @@ public class WrapperServlet extends HttpServlet { throw new ServletException("No resource found with URI " + uri); } response.setContentType("application/java-archive"); - } - // send the resource content to the HTTP response - InputStream inputStream = url.openStream(); - OutputStream outputStream = response.getOutputStream(); - int c; - while ((c = inputStream.read()) >= 0) { - outputStream.write(c); + // send the resource content to the HTTP response + InputStream inputStream = url.openStream(); + OutputStream outputStream = response.getOutputStream(); + int c; + while ((c = inputStream.read()) >= 0) { + outputStream.write(c); + } + inputStream.close(); + outputStream.flush(); + outputStream.close(); } - inputStream.close(); - outputStream.flush(); - outputStream.close(); } catch (ServletException servletException) { throw servletException; @@ -142,4 +159,36 @@ public class WrapperServlet extends HttpServlet { } } + private String resolveRelativeUrls(URL url, String baseUri) throws IOException, XMLStreamException, SAXException, ParserConfigurationException, TransformerException { + // Read + Document doc = XmlUtils.parse(url.toExternalForm()); + // Transform + resolveUrls(doc, baseUri); + // Output + DOMSource src = new DOMSource(doc); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + StreamResult res = new StreamResult(baos); + XmlUtils.transform(src, res); + return baos.toString(); + } + + private void resolveUrls(Node node, String baseUri) { + if (node != null) { + if (node instanceof Element && + node.getNodeName().equals("attribute")) { + String name = ((Element) node).getAttribute("name"); + if ("url".equals(name)) { + String value = ((Element) node).getAttribute("value"); + URI uri = URI.create(value); + if (!uri.isAbsolute()) { + uri = URI.create(baseUri).resolve(uri); + ((Element) node).setAttribute("value", uri.toASCIIString()); + } + } + } + resolveUrls(node.getFirstChild(), baseUri); + resolveUrls(node.getNextSibling(), baseUri); + } + } + }
