You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by wo...@apache.org on 2009/09/11 17:32:26 UTC
svn commit: r813881 - in /portals/jetspeed-2/portal/trunk: ./
applications/jetspeed-dependencies/
applications/jetspeed/src/main/webapp/WEB-INF/ components/
components/jetspeed-db-tools/
components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipe...
Author: woonsan
Date: Fri Sep 11 15:32:25 2009
New Revision: 813881
URL: http://svn.apache.org/viewvc?rev=813881&view=rev
Log:
JS2-1063: Adding web content proxy component to allow cross-domain script retrieval from desktop page.
By default configuration, the following page visit from the browser will serve reverse proxied content from the jetspeed-2 project web site:
http://localhost:8080/jetspeed/webcontent/portals.apache.org/jetspeed-2/features.html
-->
http://portals.apache.org/jetspeed-2/features.html
Added:
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/WebContentProxyingValve.java (with props)
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/impl/WebContentProxyingValveImpl.java (with props)
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/pom.xml (with props)
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpProxyPathMapperImpl.java (with props)
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpReverseProxyPathMapperProviderImpl.java (with props)
portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/RewritableHttpReverseProxyServiceImpl.java (with props)
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapper.java (with props)
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapperProvider.java (with props)
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyService.java (with props)
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/webcontent-proxy.xml (with props)
Modified:
portals/jetspeed-2/portal/trunk/applications/jetspeed-dependencies/pom.xml
portals/jetspeed-2/portal/trunk/applications/jetspeed/src/main/webapp/WEB-INF/web.xml
portals/jetspeed-2/portal/trunk/components/jetspeed-db-tools/pom.xml
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/impl/ (props changed)
portals/jetspeed-2/portal/trunk/components/pom.xml
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/pipelines.xml
portals/jetspeed-2/portal/trunk/pom.xml
Modified: portals/jetspeed-2/portal/trunk/applications/jetspeed-dependencies/pom.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/applications/jetspeed-dependencies/pom.xml?rev=813881&r1=813880&r2=813881&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/applications/jetspeed-dependencies/pom.xml (original)
+++ portals/jetspeed-2/portal/trunk/applications/jetspeed-dependencies/pom.xml Fri Sep 11 15:32:25 2009
@@ -65,6 +65,10 @@
</dependency>
<dependency>
<groupId>org.apache.portals.jetspeed-2</groupId>
+ <artifactId>jetspeed-proxy</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.portals.jetspeed-2</groupId>
<artifactId>jetspeed-id-generator</artifactId>
</dependency>
<dependency>
Modified: portals/jetspeed-2/portal/trunk/applications/jetspeed/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/applications/jetspeed/src/main/webapp/WEB-INF/web.xml?rev=813881&r1=813880&r2=813881&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/applications/jetspeed/src/main/webapp/WEB-INF/web.xml (original)
+++ portals/jetspeed-2/portal/trunk/applications/jetspeed/src/main/webapp/WEB-INF/web.xml Fri Sep 11 15:32:25 2009
@@ -86,36 +86,37 @@
<load-on-startup>1</load-on-startup>
</servlet>
- <!-- Define Velocity template compiler -->
- <servlet>
- <servlet-name>velocity</servlet-name>
- <servlet-class>org.apache.jetspeed.velocity.JetspeedVelocityViewServlet</servlet-class>
- <init-param>
- <param-name>org.apache.velocity.toolbox</param-name>
- <param-value>/WEB-INF/toolbox.xml</param-value>
- </init-param>
- <init-param>
- <param-name>org.apache.velocity.properties</param-name>
- <param-value>/WEB-INF/velocity.properties</param-value>
- </init-param>
- <init-param>
- <param-name>org.apache.jetspeed.cache.size</param-name>
- <param-value>50</param-value>
- </init-param>
- <init-param>
- <param-name>org.apache.jetspeed.cache.validation.interval</param-name>
- <param-value>-1</param-value>
- </init-param>
- <load-on-startup>10</load-on-startup>
- </servlet>
-
+ <!-- Define Velocity template compiler -->
+ <servlet>
+ <servlet-name>velocity</servlet-name>
+ <servlet-class>
+ org.apache.jetspeed.velocity.JetspeedVelocityViewServlet</servlet-class>
+ <init-param>
+ <param-name>org.apache.velocity.toolbox</param-name>
+ <param-value>/WEB-INF/toolbox.xml</param-value>
+ </init-param>
+ <init-param>
+ <param-name>org.apache.velocity.properties</param-name>
+ <param-value>/WEB-INF/velocity.properties</param-value>
+ </init-param>
+ <init-param>
+ <param-name>org.apache.jetspeed.cache.size</param-name>
+ <param-value>50</param-value>
+ </init-param>
+ <init-param>
+ <param-name>org.apache.jetspeed.cache.validation.interval</param-name>
+ <param-value>-1</param-value>
+ </init-param>
+ <load-on-startup>10</load-on-startup>
+ </servlet>
+
<servlet>
<servlet-name>LoginProxyServlet</servlet-name>
<servlet-class>org.apache.jetspeed.login.LoginProxyServlet</servlet-class>
- <init-param>
- <param-name>credentialsFromRequest</param-name>
- <param-value>true</param-value>
- </init-param>
+ <init-param>
+ <param-name>credentialsFromRequest</param-name>
+ <param-value>true</param-value>
+ </init-param>
</servlet>
<servlet>
@@ -152,127 +153,107 @@
<servlet-name>DiagnosticsServlet</servlet-name>
<url-pattern>/diagnostics/*</url-pattern>
</servlet-mapping>
-
+
<servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/portal/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/portlet/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/jetspeed/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/fileserver/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/ajaxapi/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/ajax/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/desktop/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/action/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/render/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/configure/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/dtconfigure/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>
- jetspeed
- </servlet-name>
- <url-pattern>/healthcheck/*</url-pattern>
- </servlet-mapping>
-
- <!-- Map *.vm files to Velocity -->
- <servlet-mapping>
- <servlet-name>velocity</servlet-name>
- <url-pattern>*.vm</url-pattern>
- </servlet-mapping>
-
- <servlet-mapping>
- <servlet-name>LoginProxyServlet</servlet-name>
- <url-pattern>/login/proxy</url-pattern>
- </servlet-mapping>
-
- <servlet-mapping>
- <servlet-name>LoginServlet</servlet-name>
- <url-pattern>/login/login</url-pattern>
- </servlet-mapping>
-
- <servlet-mapping>
- <servlet-name>LoginErrorServlet</servlet-name>
- <url-pattern>/login/error</url-pattern>
- </servlet-mapping>
-
- <servlet-mapping>
- <servlet-name>LoginRedirectorServlet</servlet-name>
- <url-pattern>/login/redirector</url-pattern>
- </servlet-mapping>
-
- <servlet-mapping>
- <servlet-name>LogoutServlet</servlet-name>
- <url-pattern>/login/logout</url-pattern>
- </servlet-mapping>
-
- <servlet-mapping>
- <servlet-name>ManagerServlet</servlet-name>
- <url-pattern>/manager/*</url-pattern>
- </servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/portal/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/portlet/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/jetspeed/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/fileserver/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/ajaxapi/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/ajax/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/desktop/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/action/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/render/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/configure/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/dtconfigure/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/healthcheck/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>jetspeed</servlet-name>
+ <url-pattern>/webcontent/*</url-pattern>
+ </servlet-mapping>
+
+ <!-- Map *.vm files to Velocity -->
+ <servlet-mapping>
+ <servlet-name>velocity</servlet-name>
+ <url-pattern>*.vm</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>LoginProxyServlet</servlet-name>
+ <url-pattern>/login/proxy</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>LoginServlet</servlet-name>
+ <url-pattern>/login/login</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>LoginErrorServlet</servlet-name>
+ <url-pattern>/login/error</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>LoginRedirectorServlet</servlet-name>
+ <url-pattern>/login/redirector</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>LogoutServlet</servlet-name>
+ <url-pattern>/login/logout</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>ManagerServlet</servlet-name>
+ <url-pattern>/manager/*</url-pattern>
+ </servlet-mapping>
<!-- The Usual Welcome File List -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
-
+
<!-- JNDI Db resource -->
- <resource-ref>
- <description>DB Connection</description>
- <res-ref-name>jdbc/jetspeed</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
+ <resource-ref>
+ <description>DB Connection</description>
+ <res-ref-name>jdbc/jetspeed</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
</resource-ref>
<!-- JNDI CommonJ WorkManager resource -->
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-db-tools/pom.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-db-tools/pom.xml?rev=813881&r1=813880&r2=813881&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-db-tools/pom.xml (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-db-tools/pom.xml Fri Sep 11 15:32:25 2009
@@ -100,6 +100,10 @@
</dependency>
<dependency>
<groupId>org.apache.portals.jetspeed-2</groupId>
+ <artifactId>jetspeed-proxy</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.portals.jetspeed-2</groupId>
<artifactId>jetspeed-id-generator</artifactId>
</dependency>
<dependency>
Added: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/WebContentProxyingValve.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/WebContentProxyingValve.java?rev=813881&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/WebContentProxyingValve.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/WebContentProxyingValve.java Fri Sep 11 15:32:25 2009
@@ -0,0 +1,26 @@
+/*
+ * 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.jetspeed.pipeline.valve;
+
+/**
+ * Invokes <CODE>HttpRerverseProxyService</CODE> to serve remote web contents.
+ *
+ * @version $Id$
+ */
+public interface WebContentProxyingValve extends Valve
+{
+}
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/WebContentProxyingValve.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/WebContentProxyingValve.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/WebContentProxyingValve.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/impl/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Fri Sep 11 15:32:25 2009
@@ -1,2 +1,2 @@
-target
+target
surefire*.properties
Added: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/impl/WebContentProxyingValveImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/impl/WebContentProxyingValveImpl.java?rev=813881&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/impl/WebContentProxyingValveImpl.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/impl/WebContentProxyingValveImpl.java Fri Sep 11 15:32:25 2009
@@ -0,0 +1,65 @@
+/*
+ * 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.jetspeed.pipeline.valve.impl;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.jetspeed.pipeline.PipelineException;
+import org.apache.jetspeed.pipeline.valve.AbstractValve;
+import org.apache.jetspeed.pipeline.valve.ValveContext;
+import org.apache.jetspeed.pipeline.valve.WebContentProxyingValve;
+import org.apache.jetspeed.proxy.HttpReverseProxyService;
+import org.apache.jetspeed.request.RequestContext;
+
+public class WebContentProxyingValveImpl extends AbstractValve implements WebContentProxyingValve
+{
+
+ private HttpReverseProxyService reverseProxyService;
+
+ public WebContentProxyingValveImpl(HttpReverseProxyService reverseProxyService)
+ {
+ this.reverseProxyService = reverseProxyService;
+ }
+
+ public void invoke(RequestContext request, ValveContext context) throws PipelineException
+ {
+ HttpServletRequest servletRequest = request.getRequest();
+ HttpServletResponse servletResponse = request.getResponse();
+
+ boolean alreadyCommitted = servletResponse.isCommitted();
+
+ try
+ {
+ if (!alreadyCommitted)
+ {
+ reverseProxyService.invoke(servletRequest, servletResponse);
+ }
+ }
+ catch (IOException e)
+ {
+ new PipelineException(e);
+ }
+ finally
+ {
+ context.invokeNext(request);
+ }
+ }
+
+}
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/impl/WebContentProxyingValveImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/impl/WebContentProxyingValveImpl.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/pipeline/valve/impl/WebContentProxyingValveImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/pom.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/pom.xml?rev=813881&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/pom.xml (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/pom.xml Fri Sep 11 15:32:25 2009
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <!--
+ 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. $Id$
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <prerequisites>
+ <maven>2.0.9</maven>
+ </prerequisites>
+
+ <artifactId>jetspeed-proxy</artifactId>
+ <name>Jetspeed-2 Proxy Components</name>
+ <description>Jetspeed-2 Proxy Components</description>
+ <parent>
+ <groupId>org.apache.portals.jetspeed-2</groupId>
+ <artifactId>components</artifactId>
+ <version>2.2.1-SNAPSHOT</version>
+ </parent>
+ <packaging>jar</packaging>
+
+ <!-- Dependencies -->
+
+ <dependencies>
+
+ <!-- Build Dependencies -->
+
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>jetspeed-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.portals.applications</groupId>
+ <artifactId>apa-webcontent-jar</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-httpclient</groupId>
+ <artifactId>commons-httpclient</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-fileupload</groupId>
+ <artifactId>commons-fileupload</artifactId>
+ </dependency>
+
+ <!-- Test Dependencies -->
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ </dependencies>
+
+</project>
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/pom.xml
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/pom.xml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpProxyPathMapperImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpProxyPathMapperImpl.java?rev=813881&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpProxyPathMapperImpl.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpProxyPathMapperImpl.java Fri Sep 11 15:32:25 2009
@@ -0,0 +1,83 @@
+/*
+ * 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.jetspeed.proxy.impl;
+
+import java.util.Map;
+
+import org.apache.jetspeed.proxy.HttpReverseProxyPathMapper;
+
+/**
+ * Default implementation of <CODE>HttpProxyPathMapper</CODE> interface.
+ *
+ * @version $Id$
+ */
+public class DefaultHttpProxyPathMapperImpl implements HttpReverseProxyPathMapper
+{
+ private String localBasePath;
+ private String remoteBaseURL;
+ private Map<String, Object> attributes;
+
+ public DefaultHttpProxyPathMapperImpl(String localBasePath, String remoteBaseURL, Map<String, Object> attributes)
+ {
+ this.localBasePath = localBasePath;
+ this.remoteBaseURL = remoteBaseURL;
+ this.attributes = attributes;
+ }
+
+ public String getLocalBasePath()
+ {
+ return localBasePath;
+ }
+
+ public String getRemoteBaseURL()
+ {
+ return remoteBaseURL;
+ }
+
+ public String getRemoteURL(String localPath)
+ {
+ if (localPath.startsWith(localBasePath))
+ {
+ return remoteBaseURL + localPath.substring(localBasePath.length());
+ }
+
+ throw new IllegalArgumentException("The localPath should start with '" + localBasePath + "'.");
+ }
+
+ public String getLocalPath(String remoteURL)
+ {
+ if (remoteURL.startsWith(remoteBaseURL))
+ {
+ return localBasePath + remoteURL.substring(remoteBaseURL.length());
+ }
+
+ throw new IllegalArgumentException("The remoteURL should start with '" + remoteBaseURL + "'.");
+ }
+
+ public Object getAttribute(String attrName)
+ {
+ if (attributes != null)
+ {
+ return attributes.get(attrName);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+}
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpProxyPathMapperImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpProxyPathMapperImpl.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpProxyPathMapperImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpReverseProxyPathMapperProviderImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpReverseProxyPathMapperProviderImpl.java?rev=813881&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpReverseProxyPathMapperProviderImpl.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpReverseProxyPathMapperProviderImpl.java Fri Sep 11 15:32:25 2009
@@ -0,0 +1,54 @@
+/*
+ * 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.jetspeed.proxy.impl;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.jetspeed.proxy.HttpReverseProxyPathMapper;
+import org.apache.jetspeed.proxy.HttpReverseProxyPathMapperProvider;
+
+public class DefaultHttpReverseProxyPathMapperProviderImpl implements HttpReverseProxyPathMapperProvider
+{
+
+ /**
+ * Proxy path mappers
+ */
+ private List<HttpReverseProxyPathMapper> proxyPathMappers;
+
+ public DefaultHttpReverseProxyPathMapperProviderImpl(List<HttpReverseProxyPathMapper> proxyPathMappers)
+ {
+ this.proxyPathMappers = proxyPathMappers;
+ }
+
+ public HttpReverseProxyPathMapper findMapper(HttpServletRequest request)
+ {
+ String pathInfo = request.getPathInfo();
+
+ for (HttpReverseProxyPathMapper proxyPathMapper : proxyPathMappers)
+ {
+ if (pathInfo.startsWith(proxyPathMapper.getLocalBasePath()))
+ {
+ return proxyPathMapper;
+ }
+ }
+
+ return null;
+ }
+
+}
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpReverseProxyPathMapperProviderImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpReverseProxyPathMapperProviderImpl.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/DefaultHttpReverseProxyPathMapperProviderImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/RewritableHttpReverseProxyServiceImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/RewritableHttpReverseProxyServiceImpl.java?rev=813881&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/RewritableHttpReverseProxyServiceImpl.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/RewritableHttpReverseProxyServiceImpl.java Fri Sep 11 15:32:25 2009
@@ -0,0 +1,470 @@
+/*
+ * 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.jetspeed.proxy.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItem;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.multipart.ByteArrayPartSource;
+import org.apache.commons.httpclient.methods.multipart.FilePart;
+import org.apache.commons.httpclient.methods.multipart.FilePartSource;
+import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
+import org.apache.commons.httpclient.methods.multipart.Part;
+import org.apache.commons.httpclient.methods.multipart.PartSource;
+import org.apache.commons.httpclient.methods.multipart.StringPart;
+import org.apache.commons.io.IOUtils;
+import org.apache.jetspeed.proxy.HttpReverseProxyPathMapper;
+import org.apache.jetspeed.proxy.HttpReverseProxyPathMapperProvider;
+import org.apache.jetspeed.proxy.HttpReverseProxyService;
+import org.apache.portals.applications.webcontent.rewriter.ParserAdaptor;
+import org.apache.portals.applications.webcontent.rewriter.Rewriter;
+import org.apache.portals.applications.webcontent.rewriter.RewriterController;
+import org.apache.portals.applications.webcontent.rewriter.RewriterException;
+
+/**
+ * HTTP Reverse Proxy Service Implementation
+ *
+ * @version $Id$
+ */
+public class RewritableHttpReverseProxyServiceImpl implements HttpReverseProxyService
+{
+
+ public static final String REVERSE_PROXY_PATH_MAPPER_ATTRIBUTE = "org.apache.jetspeed.proxy.reverseProxyPathMapper";
+
+ public static final String REWRITER_CONTROLLER_ATTRIBUTE = "rewriterController";
+
+ private static final String LOCATION_HEADER = "Location";
+
+ private static final String CONTENT_TYPE_HEADER = "Content-Type";
+
+ private static final String CONTENT_LENGTH_HEADER = "Content-Length";
+
+ private static final String HOST_HEADER = "Host";
+
+ /**
+ * Proxy path mapper provider
+ */
+ private HttpReverseProxyPathMapperProvider proxyPathMapperProvider;
+
+ /**
+ * Forced host header value
+ */
+ private String hostHeaderValue;
+
+ /**
+ * local base url
+ */
+ private String localBaseURL;
+
+ /**
+ * flag to force to prefix localBaseURL when it redirects
+ */
+ private boolean prependLocalBaseURL;
+
+ /**
+ * Maximum file upload size
+ */
+ private int maxFileUploadSize;
+
+ /**
+ * File upload directory
+ */
+ private File fileUploadDir;
+
+ public RewritableHttpReverseProxyServiceImpl(HttpReverseProxyPathMapperProvider proxyPathMapperProvider)
+ {
+ this.proxyPathMapperProvider = proxyPathMapperProvider;
+ }
+
+ public void setHostHeaderValue(String hostHeaderValue)
+ {
+ this.hostHeaderValue = hostHeaderValue;
+ }
+
+ public void setLocalBaseURL(String localBaseURL)
+ {
+ this.localBaseURL = localBaseURL;
+ }
+
+ public void setPrependLocalBaseURL(boolean prependLocalBaseURL)
+ {
+ this.prependLocalBaseURL = prependLocalBaseURL;
+ }
+
+ public void setMaxFileUploadSize(int maxFileUploadSize)
+ {
+ this.maxFileUploadSize = maxFileUploadSize;
+ }
+
+ public void setFileUploadDir(File fileUploadDir)
+ {
+ this.fileUploadDir = fileUploadDir;
+ }
+
+ public void invoke(HttpServletRequest request, HttpServletResponse response) throws IOException
+ {
+ // proxyPathMapper can be injected by using request attribute.
+ HttpReverseProxyPathMapper proxyPathMapper = (HttpReverseProxyPathMapper) request.getAttribute(REVERSE_PROXY_PATH_MAPPER_ATTRIBUTE);
+
+ String pathInfo = request.getPathInfo();
+
+ if (proxyPathMapper == null)
+ {
+ proxyPathMapper = proxyPathMapperProvider.findMapper(request);
+ }
+
+ if (proxyPathMapper == null)
+ {
+ throw new IOException("Proxy configuration is not defined for " + pathInfo);
+ }
+
+ if (hostHeaderValue == null)
+ {
+ if (request.getServerPort() == 80)
+ {
+ hostHeaderValue = request.getServerName();
+ }
+ else
+ {
+ hostHeaderValue = request.getServerName() + ":" + request.getServerPort();
+ }
+ }
+
+ if (localBaseURL == null)
+ {
+ localBaseURL = request.getScheme() + "://" + hostHeaderValue + request.getServletPath();
+ }
+
+ String proxyTargetURL = proxyPathMapper.getRemoteURL(pathInfo);
+
+ String method = request.getMethod();
+ boolean isGetMethod = "GET".equals(method);
+ boolean isPostMethod = "POST".equals(method);
+ boolean isPostMultipartMethod = isPostMethod && ServletFileUpload.isMultipartContent(request);
+
+ HttpClient httpClient = new HttpClient();
+ HttpMethod httpMethodForProxyRequest = null;
+
+ if (isGetMethod)
+ {
+ httpMethodForProxyRequest = new GetMethod(proxyTargetURL);
+ }
+ else if (isPostMethod)
+ {
+ httpMethodForProxyRequest = new PostMethod(proxyTargetURL);
+
+ if (isPostMultipartMethod)
+ {
+ postMultipartParams((PostMethod) httpMethodForProxyRequest, request);
+ }
+ else
+ {
+ postFormParams((PostMethod) httpMethodForProxyRequest, request);
+ }
+ }
+ else
+ {
+ throw new IOException("Unsupported method: " + method);
+ }
+
+ // redirection should be adjusted with local host header...
+ httpMethodForProxyRequest.setFollowRedirects(false);
+
+ setProxyRequestHeaders(httpMethodForProxyRequest, request);
+
+ if (isPostMultipartMethod)
+ {
+ postMultipartParams((PostMethod) httpMethodForProxyRequest, request);
+ }
+ else if (isPostMethod)
+ {
+ postFormParams((PostMethod) httpMethodForProxyRequest, request);
+ }
+
+ int proxyResponseCode = httpClient.executeMethod(httpMethodForProxyRequest);
+
+ // Check if the proxy response is a redirect
+ if (proxyResponseCode >= HttpServletResponse.SC_MULTIPLE_CHOICES /* 300 */
+ && proxyResponseCode < HttpServletResponse.SC_NOT_MODIFIED /* 304 */)
+ {
+ String location = httpMethodForProxyRequest.getResponseHeader(LOCATION_HEADER).getValue();
+
+ if (location == null)
+ {
+ throw new IOException("Recieved status code: " + proxyResponseCode + " but no " + LOCATION_HEADER + " header was found in the response");
+ }
+
+ // Modify the redirect to go to this proxy servlet rather that the proxied host
+ String localPath = proxyPathMapper.getLocalPath(location);
+ String redirectLocation = null;
+
+ if (prependLocalBaseURL) {
+ redirectLocation = localBaseURL + localPath;
+ } else {
+ redirectLocation = localPath;
+ }
+
+ response.sendRedirect(redirectLocation);
+ return;
+ }
+ else if (proxyResponseCode == HttpServletResponse.SC_NOT_MODIFIED)
+ {
+ // 304 needs special handling. See:
+ // http://www.ics.uci.edu/pub/ietf/http/rfc1945.html#Code304
+ // We get a 304 whenever passed an 'If-Modified-Since'
+ // header and the data on disk has not changed; server
+ // responds w/ a 304 saying I'm not going to send the
+ // body because the file has not changed.
+ response.setIntHeader(CONTENT_LENGTH_HEADER, 0);
+ response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+
+ return;
+ }
+
+ // Pass the response code back to the client
+ response.setStatus(proxyResponseCode);
+
+ // Pass response headers back to the client
+ Header[] headerArrayResponse = httpMethodForProxyRequest.getResponseHeaders();
+
+ for (Header header : headerArrayResponse)
+ {
+ response.setHeader(header.getName(), header.getValue());
+ }
+
+ // Send the content to the client
+
+ InputStream in = null;
+ Reader reader = null;
+ OutputStream out = null;
+ Writer writer = null;
+
+ try
+ {
+ in = httpMethodForProxyRequest.getResponseBodyAsStream();
+ out = response.getOutputStream();
+
+ RewriterController rewriterController = (RewriterController) proxyPathMapper.getAttribute(REWRITER_CONTROLLER_ATTRIBUTE);
+
+ if (rewriterController == null)
+ {
+ IOUtils.copy(in, out);
+ out.flush();
+ }
+ else
+ {
+ String contentType = "text/html";
+ Header contentTypeHeader = httpMethodForProxyRequest.getResponseHeader(CONTENT_TYPE_HEADER);
+
+ if (contentTypeHeader != null && contentTypeHeader.getElements().length > 0)
+ {
+ contentType = contentTypeHeader.getElements()[0].getValue();
+ int offset = contentType.indexOf(';');
+
+ if (offset > 0)
+ {
+ contentType = contentType.substring(0, offset).trim();
+ }
+ }
+
+ Rewriter rewriter = rewriterController.createRewriter();
+ ParserAdaptor parserAdaptor = rewriterController.createParserAdaptor(contentType);
+ reader = new InputStreamReader(in);
+ writer = new OutputStreamWriter(out);
+ rewriter.rewrite(parserAdaptor, reader, writer);
+ writer.flush();
+ }
+ }
+ catch (RewriterException e)
+ {
+ throw new IOException(e.getLocalizedMessage());
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new IOException(e.getLocalizedMessage());
+ }
+ catch (InstantiationException e)
+ {
+ throw new IOException(e.getLocalizedMessage());
+ }
+ finally
+ {
+ if (reader != null)
+ {
+ try { reader.close(); } catch (Exception ce) { }
+ }
+ if (in != null)
+ {
+ try { in.close(); } catch (Exception ce) { }
+ }
+ if (writer != null)
+ {
+ try { writer.close(); } catch (Exception ce) { }
+ }
+ if (out != null)
+ {
+ try { out.close(); } catch (Exception ce) { }
+ }
+ }
+ }
+
+ private void setProxyRequestHeaders(HttpMethod httpMethodForProxyRequest, HttpServletRequest request)
+ {
+ // Get an Enumeration of all of the header names sent by the client
+ for (Enumeration enumHeaderNames = request.getHeaderNames(); enumHeaderNames.hasMoreElements(); )
+ {
+ String headerName = (String) enumHeaderNames.nextElement();
+
+ if (headerName.equalsIgnoreCase(CONTENT_LENGTH_HEADER))
+ continue;
+
+ // As per the Java Servlet API 2.5 documentation:
+ // Some headers, such as Accept-Language can be sent by clients
+ // as several headers each with a different value rather than
+ // sending the header as a comma separated list.
+ // Thus, we get an Enumeration of the header values sent by the client
+
+ for (Enumeration enumHeaderValues = request.getHeaders(headerName); enumHeaderValues.hasMoreElements(); )
+ {
+ String headerValue = (String) enumHeaderValues.nextElement();
+
+ // In case the proxy host is running multiple virtual servers,
+ // rewrite the Host header to ensure that we get content from
+ // the correct virtual server
+ if (headerName.equalsIgnoreCase(HOST_HEADER))
+ {
+ headerValue = hostHeaderValue;
+ }
+
+ Header header = new Header(headerName, headerValue);
+
+ // Set the same header on the proxy request
+ httpMethodForProxyRequest.setRequestHeader(header);
+ }
+ }
+ }
+
+ private void postFormParams(PostMethod httpMethodForProxyRequest, HttpServletRequest request)
+ {
+ Map<String, String[]> paramsMap = (Map<String, String[]>) request.getParameterMap();
+ List<NameValuePair> paramNameValuePairs = new ArrayList<NameValuePair>();
+
+ for (String paramName : paramsMap.keySet())
+ {
+ String [] paramValues = paramsMap.get(paramName);
+
+ for (String paramValue : paramValues)
+ {
+ NameValuePair nameValuePair = new NameValuePair(paramName, paramValue);
+ paramNameValuePairs.add(nameValuePair);
+ }
+ }
+
+ httpMethodForProxyRequest.setRequestBody(paramNameValuePairs.toArray(new NameValuePair[] {}));
+ }
+
+ private void postMultipartParams(PostMethod httpMethodForProxyRequest, HttpServletRequest request) throws IOException
+ {
+ DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
+
+ if (maxFileUploadSize > 0)
+ {
+ fileItemFactory.setSizeThreshold(maxFileUploadSize);
+ }
+
+ if (fileUploadDir != null)
+ {
+ fileItemFactory.setRepository(fileUploadDir);
+ }
+
+ ServletFileUpload fileUpload = new ServletFileUpload(fileItemFactory);
+
+ try
+ {
+ List<FileItem> fileItems = (List<FileItem>) fileUpload.parseRequest(request);
+ Part [] parts = new Part[fileItems.size()];
+ int i = 0;
+
+ for (FileItem fileItem : fileItems)
+ {
+ if (fileItem.isFormField())
+ {
+ parts[i] = (new StringPart(fileItem.getFieldName(), fileItem.getString()));
+ }
+ else
+ {
+ PartSource partSource = null;
+
+ if (fileItem.isInMemory())
+ {
+ partSource = new ByteArrayPartSource(fileItem.getName(), fileItem.get());
+ }
+ else
+ {
+ partSource = new FilePartSource(fileItem.getFieldName(), ((DiskFileItem) fileItem).getStoreLocation());
+ }
+
+ parts[i] = (new FilePart(fileItem.getFieldName(), partSource));
+ }
+
+ i++;
+ }
+
+ MultipartRequestEntity multipartRequestEntity = new MultipartRequestEntity(parts, httpMethodForProxyRequest.getParams());
+ httpMethodForProxyRequest.setRequestEntity(multipartRequestEntity);
+
+ // The current content-type header (received from the client) IS of
+ // type "multipart/form-data", but the content-type header also
+ // contains the chunk boundary string of the chunks. Currently, this
+ // header is using the boundary of the client request, since we
+ // blindly copied all headers from the client request to the proxy
+ // request. However, we are creating a new request with a new chunk
+ // boundary string, so it is necessary that we re-set the
+ // content-type string to reflect the new chunk boundary string
+ httpMethodForProxyRequest.setRequestHeader(CONTENT_TYPE_HEADER, multipartRequestEntity.getContentType());
+ }
+ catch (FileUploadException fileUploadException)
+ {
+ throw new IOException(fileUploadException.getLocalizedMessage());
+ }
+ }
+
+}
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/RewritableHttpReverseProxyServiceImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/RewritableHttpReverseProxyServiceImpl.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-proxy/src/main/java/org/apache/jetspeed/proxy/impl/RewritableHttpReverseProxyServiceImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: portals/jetspeed-2/portal/trunk/components/pom.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/pom.xml?rev=813881&r1=813880&r2=813881&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/pom.xml (original)
+++ portals/jetspeed-2/portal/trunk/components/pom.xml Fri Sep 11 15:32:25 2009
@@ -50,6 +50,7 @@
<module>jetspeed-profiler</module>
<module>jetspeed-rdbms</module>
<module>jetspeed-registry</module>
+ <module>jetspeed-proxy</module>
<module>jetspeed-search</module>
<module>jetspeed-security</module>
<module>jetspeed-serializer</module>
Added: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapper.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapper.java?rev=813881&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapper.java (added)
+++ portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapper.java Fri Sep 11 15:32:25 2009
@@ -0,0 +1,56 @@
+/*
+ * 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.jetspeed.proxy;
+
+/**
+ * proxy path mapper interface for http reverse proxy service.
+ *
+ * @version $Id$
+ */
+public interface HttpReverseProxyPathMapper
+{
+
+ /**
+ * Returns the local base path to be mapped to remote base url.
+ * @return
+ */
+ public String getLocalBasePath();
+
+ /**
+ * Returns the remote base url mapped by the local path.
+ * @return
+ */
+ public String getRemoteBaseURL();
+
+ /**
+ * Generates a remote url mapped by the path.
+ */
+ public String getRemoteURL(String localPath);
+
+ /**
+ * Generates a local url mapped by the remote url.
+ */
+ public String getLocalPath(String remoteURL);
+
+ /**
+ * Returns the attribute object specified by the attrName.
+ * @param attrName
+ * @return
+ */
+ public Object getAttribute(String attrName);
+
+}
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapper.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapper.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapper.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapperProvider.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapperProvider.java?rev=813881&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapperProvider.java (added)
+++ portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapperProvider.java Fri Sep 11 15:32:25 2009
@@ -0,0 +1,35 @@
+/*
+ * 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.jetspeed.proxy;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * proxy path mapper provider interface for http reverse proxy service.
+ *
+ * @version $Id$
+ */
+public interface HttpReverseProxyPathMapperProvider
+{
+
+ /**
+ * Finds a reverse proxy path mapper based on the request
+ * @return
+ */
+ public HttpReverseProxyPathMapper findMapper(HttpServletRequest request);
+
+}
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapperProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapperProvider.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyPathMapperProvider.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyService.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyService.java?rev=813881&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyService.java (added)
+++ portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyService.java Fri Sep 11 15:32:25 2009
@@ -0,0 +1,35 @@
+/*
+ * 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.jetspeed.proxy;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * HTTP Reverse Proxy Service interface
+ *
+ * @version $Id$
+ */
+public interface HttpReverseProxyService
+{
+
+ public void invoke(HttpServletRequest request, HttpServletResponse response) throws IOException;
+
+}
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyService.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyService.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/proxy/HttpReverseProxyService.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/pipelines.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/pipelines.xml?rev=813881&r1=813880&r2=813881&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/pipelines.xml (original)
+++ portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/pipelines.xml Fri Sep 11 15:32:25 2009
@@ -428,7 +428,15 @@
<value>true</value>
</constructor-arg>
</bean>
-
+
+ <bean id="webContentProxyingValve"
+ class="org.apache.jetspeed.pipeline.valve.impl.WebContentProxyingValveImpl">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg index="0">
+ <ref bean="webContentProxyService" />
+ </constructor-arg>
+ </bean>
+
<bean id="portletApplicationValidator"
class="org.apache.jetspeed.healthcheck.validators.PortletApplicationAvailableHeathCheckValidator">
<meta key="j2:cat" value="default" />
@@ -773,7 +781,19 @@
</list>
</constructor-arg>
</bean>
-
+
+ <bean id="webcontent-pipeline" class="org.apache.jetspeed.pipeline.JetspeedPipeline" init-method="initialize">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg>
+ <value>WebContentPipeline</value>
+ </constructor-arg>
+ <constructor-arg>
+ <list>
+ <ref bean="webContentProxyingValve" />
+ </list>
+ </constructor-arg>
+ </bean>
+
<bean id='pipeline-map' class='java.util.HashMap'>
<meta key="j2:cat" value="default" />
<constructor-arg>
@@ -819,6 +839,9 @@
<entry key='/healthcheck'>
<value>healthcheck-pipeline</value>
</entry>
+ <entry key='/webcontent'>
+ <value>webcontent-pipeline</value>
+ </entry>
</map>
</constructor-arg>
</bean>
Added: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/webcontent-proxy.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/webcontent-proxy.xml?rev=813881&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/webcontent-proxy.xml (added)
+++ portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/webcontent-proxy.xml Fri Sep 11 15:32:25 2009
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+ <bean id="reverseProxyPathMapperProvider" class="org.apache.jetspeed.proxy.impl.DefaultHttpReverseProxyPathMapperProviderImpl">
+ <constructor-arg index="0">
+ <list>
+ <bean class="org.apache.jetspeed.proxy.impl.DefaultHttpProxyPathMapperImpl">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg index="0">
+ <value>/portals.apache.org/jetspeed-2</value>
+ </constructor-arg>
+ <constructor-arg index="1">
+ <value>http://portals.apache.org/jetspeed-2</value>
+ </constructor-arg>
+ <constructor-arg index="2">
+ <null/>
+ </constructor-arg>
+ </bean>
+ <!--
+ WARNING!
+
+ It could be very dangerous in perspective of security to allow retrieving remote web content
+ by reverse-proxy components used here.
+ Also, if the remote web content provider does not allow content retrieving by reverse proxy,
+ it could be illegal to serve remote web content by reverse-proxy components used here.
+ Use of any web content with this reverse-proxy components is on your own responsibility.
+
+ You have been warned.
+ -->
+ <!--
+ <bean class="org.apache.jetspeed.proxy.impl.DefaultHttpProxyPathMapperImpl">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg index="0">
+ <value>/www.gmodules.com</value>
+ </constructor-arg>
+ <constructor-arg index="1">
+ <value>http://www.gmodules.com</value>
+ </constructor-arg>
+ <constructor-arg index="2">
+ <null/>
+ </constructor-arg>
+ </bean>
+ -->
+ </list>
+ </constructor-arg>
+ </bean>
+
+ <bean id="webContentProxyService" class="org.apache.jetspeed.proxy.impl.RewritableHttpReverseProxyServiceImpl">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg index="0">
+ <ref bean="reverseProxyPathMapperProvider" />
+ </constructor-arg>
+ </bean>
+
+</beans>
\ No newline at end of file
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/webcontent-proxy.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/webcontent-proxy.xml
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/webcontent-proxy.xml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: portals/jetspeed-2/portal/trunk/pom.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/pom.xml?rev=813881&r1=813880&r2=813881&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/pom.xml (original)
+++ portals/jetspeed-2/portal/trunk/pom.xml Fri Sep 11 15:32:25 2009
@@ -406,6 +406,11 @@
</dependency>
<dependency>
<groupId>org.apache.portals.jetspeed-2</groupId>
+ <artifactId>jetspeed-proxy</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.portals.jetspeed-2</groupId>
<artifactId>jetspeed-id-generator</artifactId>
<version>${pom.version}</version>
</dependency>
@@ -482,6 +487,11 @@
<version>${org.apache.portals.applications.apa-gems.version}</version>
</dependency>
<dependency>
+ <groupId>org.apache.portals.applications</groupId>
+ <artifactId>apa-webcontent-jar</artifactId>
+ <version>${org.apache.portals.applications.apa-webcontent.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.apache.portals.jetspeed-2</groupId>
<artifactId>jetspeed-layout-portlets</artifactId>
<version>${pom.version}</version>
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org