You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wink.apache.org by el...@apache.org on 2009/07/21 09:37:17 UTC

svn commit: r796171 - in /incubator/wink/trunk/wink-server/src: main/java/org/apache/wink/server/internal/ main/java/org/apache/wink/server/internal/handlers/ main/resources/META-INF/ test/java/org/apache/wink/server/internal/

Author: elman
Date: Tue Jul 21 07:37:17 2009
New Revision: 796171

URL: http://svn.apache.org/viewvc?rev=796171&view=rev
Log:
make http method override configurable

Modified:
    incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java
    incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java
    incubator/wink/trunk/wink-server/src/main/resources/META-INF/wink-default.properties
    incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/MethodOverrideTest.java

Modified: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java?rev=796171&r1=796170&r2=796171&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java (original)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java Tue Jul 21 07:37:17 2009
@@ -75,12 +75,15 @@
  */
 public class DeploymentConfiguration {
 
-    private static final Logger       logger                   =
-                                                                   LoggerFactory
-                                                                       .getLogger(DeploymentConfiguration.class);
-    private static final String       ALTERNATIVE_SHORTCUTS    =
-                                                                   "META-INF/wink-alternate-shortcuts.properties";
-    private static final String       VALIDATE_LOCATION_HEADER = "wink.validateLocationHeader";
+    private static final Logger       logger                            =
+                                                                            LoggerFactory
+                                                                                .getLogger(DeploymentConfiguration.class);
+    private static final String       ALTERNATIVE_SHORTCUTS             =
+                                                                            "META-INF/wink-alternate-shortcuts.properties";
+    private static final String       VALIDATE_LOCATION_HEADER          =
+                                                                            "wink.validateLocationHeader";
+    private static final String       HTTP_METHOD_OVERRIDE_HEADERS_PROP =
+                                                                            "wink.httpMethodOverrideHeaders";
 
     // handler chains
     private RequestHandlersChain      requestHandlersChain;
@@ -107,6 +110,8 @@
     private ServletConfig             servletConfig;
     private ServletContext            servletContext;
 
+    private String[]                  httpMethodOverrideHeaders;
+
     /**
      * Makes sure that the object was properly initialized. Should be invoked
      * AFTER all the setters were invoked.
@@ -115,6 +120,11 @@
         if (properties == null) {
             properties = new Properties();
         }
+        String httpMethodOverrideHeadersProperty =
+            properties.getProperty(HTTP_METHOD_OVERRIDE_HEADERS_PROP);
+        httpMethodOverrideHeaders =
+            httpMethodOverrideHeadersProperty != null ? httpMethodOverrideHeadersProperty
+                .split(",") : null;
         initRegistries();
         initAlternateShortcutMap();
         initMediaTypeMapper();
@@ -432,4 +442,12 @@
         }
     }
 
+    public void setHttpMethodOverrideHeaders(String[] httpMethodOverrideHeaders) {
+        this.httpMethodOverrideHeaders = httpMethodOverrideHeaders;
+    }
+
+    public String[] getHttpMethodOverrideHeaders() {
+        return httpMethodOverrideHeaders;
+    }
+
 }

Modified: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java?rev=796171&r1=796170&r2=796171&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java (original)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java Tue Jul 21 07:37:17 2009
@@ -37,7 +37,6 @@
 import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.ext.Providers;
 
-import org.apache.wink.common.http.HttpHeadersEx;
 import org.apache.wink.common.internal.contexts.ProvidersImpl;
 import org.apache.wink.common.internal.registry.ProvidersRegistry;
 import org.apache.wink.common.internal.runtime.AbstractRuntimeContext;
@@ -57,13 +56,14 @@
     private int       responseStatusCode;
     private Object    responseEntity;
     private MediaType responseMediaType;
-
     private String    httpMethod;
 
     public ServerMessageContext(HttpServletRequest servletRequest,
                                 HttpServletResponse servletResponse,
                                 DeploymentConfiguration configuration) {
-        this.httpMethod = buildHttpMethod(servletRequest);
+
+        this.httpMethod =
+            buildHttpMethod(configuration.getHttpMethodOverrideHeaders(), servletRequest);
         this.responseStatusCode = -1;
 
         // save stuff on attributes
@@ -95,17 +95,18 @@
         setAttribute(LinkBuilders.class, new LinkBuildersImpl(this));
     }
 
-    private String buildHttpMethod(HttpServletRequest servletRequest) {
-        String xHttpMethodOverride = servletRequest.getHeader(HttpHeadersEx.X_HTTP_METHOD_OVERRIDE);
-        if (xHttpMethodOverride != null) {
-            return xHttpMethodOverride.trim();
-        }
+    private String buildHttpMethod(String[] httpMethodOverrideHeaders,
+                                   HttpServletRequest servletRequest) {
 
-        String xMethodOverride = servletRequest.getHeader(HttpHeadersEx.X_METHOD_OVERRIDE);
-        if (xMethodOverride != null) {
-            return xMethodOverride.trim();
+        if (httpMethodOverrideHeaders != null) {
+            for (String httpMethodOverrideHeader : httpMethodOverrideHeaders) {
+                String xHttpMethodOverride =
+                    servletRequest.getHeader(httpMethodOverrideHeader.trim());
+                if (xHttpMethodOverride != null) {
+                    return xHttpMethodOverride.trim();
+                }
+            }
         }
-
         try {
             return servletRequest.getMethod();
         } catch (IllegalArgumentException e) {

Modified: incubator/wink/trunk/wink-server/src/main/resources/META-INF/wink-default.properties
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/resources/META-INF/wink-default.properties?rev=796171&r1=796170&r2=796171&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/resources/META-INF/wink-default.properties (original)
+++ incubator/wink/trunk/wink-server/src/main/resources/META-INF/wink-default.properties Tue Jul 21 07:37:17 2009
@@ -17,6 +17,13 @@
 ## under the License.
 ##
 
+# Http Method Override Headers
+# When this property is defined and one of the wink.httpMethodOverrideHeaders headers is present
+# the HTTP method is taken from the header and not from the request
+# Examples:
+#   wink.httpMethodOverrideHeaders=X-HTTP-Method-Override,X-Method-Override
+wink.httpMethodOverrideHeaders=
+
 # Validate Location Header
 wink.validateLocationHeader=false
 

Modified: incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/MethodOverrideTest.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/MethodOverrideTest.java?rev=796171&r1=796170&r2=796171&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/MethodOverrideTest.java (original)
+++ incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/MethodOverrideTest.java Tue Jul 21 07:37:17 2009
@@ -20,6 +20,8 @@
 
 package org.apache.wink.server.internal;
 
+import java.util.Properties;
+
 import javax.ws.rs.HttpMethod;
 
 import junit.framework.TestCase;
@@ -37,23 +39,64 @@
 public class MethodOverrideTest extends TestCase {
 
     public void testXHttpMethodOverride() {
+
         MockHttpServletRequest request = new MockHttpServletRequest();
         request.setMethod("POST");
         request.addHeader(HttpHeadersEx.X_HTTP_METHOD_OVERRIDE, "PUT");
         MessageContext context =
-            new ServerMessageContext(request, new MockHttpServletResponse(),
-                                     new DeploymentConfiguration());
+            new ServerMessageContext(
+                                     request,
+                                     new MockHttpServletResponse(),
+                                     getDeploymentConfiguration("X-HTTP-Method-Override,X-Method-Override"));
         assertEquals("HTTP method", HttpMethod.PUT, context.getHttpMethod());
     }
+    
+    public void testDefaultXHttpMethodOverride() {
+
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setMethod("POST");
+        request.addHeader(HttpHeadersEx.X_HTTP_METHOD_OVERRIDE, "PUT");
+        MessageContext context =
+            new ServerMessageContext(
+                                     request,
+                                     new MockHttpServletResponse(),
+                                     getDeploymentConfiguration(null));
+        assertEquals("HTTP method", HttpMethod.POST, context.getHttpMethod());
+    }
 
     public void testXMethodOverride() {
         MockHttpServletRequest request = new MockHttpServletRequest();
         request.setMethod("POST");
         request.addHeader(HttpHeadersEx.X_METHOD_OVERRIDE, "DELETE");
         MessageContext context =
-            new ServerMessageContext(request, new MockHttpServletResponse(),
-                                     new DeploymentConfiguration());
+            new ServerMessageContext(
+                                     request,
+                                     new MockHttpServletResponse(),
+                                     getDeploymentConfiguration("X-HTTP-Method-Override,X-Method-Override"));
         assertEquals("HTTP method", HttpMethod.DELETE, context.getHttpMethod());
     }
+    
+    public void testDefaultXMethodOverride() {
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setMethod("POST");
+        request.addHeader(HttpHeadersEx.X_METHOD_OVERRIDE, "DELETE");
+        MessageContext context =
+            new ServerMessageContext(
+                                     request,
+                                     new MockHttpServletResponse(),
+                                     getDeploymentConfiguration(null));
+        assertEquals("HTTP method", HttpMethod.POST, context.getHttpMethod());
+    }
+
+    private DeploymentConfiguration getDeploymentConfiguration(String winkhttpMethodOverrideHeader) {
+        DeploymentConfiguration configuration = new DeploymentConfiguration();
+        Properties properties = new Properties();
+        if (winkhttpMethodOverrideHeader != null) {
+            properties.setProperty("wink.httpMethodOverrideHeaders", winkhttpMethodOverrideHeader);
+        }
+        configuration.setProperties(properties);
+        configuration.init();
+        return configuration;
+    }
 
 }