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;
+ }
}