diff --git a/config/alfresco/messages/webscripts-test-help.txt b/config/alfresco/messages/webscripts-test-help.txt index bdee6ca945..26f5d3215d 100644 --- a/config/alfresco/messages/webscripts-test-help.txt +++ b/config/alfresco/messages/webscripts-test-help.txt @@ -55,6 +55,21 @@ ok> delete URL relative to /alfresco/service +ok> tunnel + + Tunnel a request via POST. + + The actual is encoded as either the URL parameter named alf:method or + the request header named X-HTTP-Method-Override as specified via the + parameter: + + param - encode method as URL parameter + header - encode method in Request Header + + e.g. to tunnel 'get /index' via post (where method is encoded in header) issue + + tunnel header get /index + ## ## end ## diff --git a/source/java/org/alfresco/web/scripts/TestWebScriptServer.java b/source/java/org/alfresco/web/scripts/TestWebScriptServer.java index 4ec42f4135..aaa657c998 100644 --- a/source/java/org/alfresco/web/scripts/TestWebScriptServer.java +++ b/source/java/org/alfresco/web/scripts/TestWebScriptServer.java @@ -32,6 +32,8 @@ import java.io.InputStreamReader; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; import org.alfresco.config.Config; import org.alfresco.config.ConfigService; @@ -204,6 +206,31 @@ public class TestWebScriptServer return res; } + /** + * Submit a Web Script Request + * + * @param method http method + * @param uri web script uri (relative to /alfresco/service) + * @param headers headers + * @return response + * @throws IOException + */ + public MockHttpServletResponse submitRequest(String method, String uri, Map headers) + throws IOException + { + MockHttpServletRequest req = createRequest(method, uri); + for (Map.Entry header: headers.entrySet()) + { + req.addHeader(header.getKey(), header.getValue()); + } + MockHttpServletResponse res = new MockHttpServletResponse(); + + WebScriptRuntime runtime = new WebScriptServletRuntime(registry, transactionService, null, req, res, serverConfig); + runtime.executeScript(); + + return res; + } + /** * A Read-Eval-Print loop. */ @@ -358,6 +385,44 @@ public class TestWebScriptServer bout.write(res.getContentAsByteArray()); out.println(); } + + else if (command[0].equals("tunnel")) + { + if (command.length < 4) + { + return "Syntax Error.\n"; + } + + if (command[1].equals("param")) + { + String uri = command[3]; + if (uri.indexOf('?') == -1) + { + uri += "?alf:method=" + command[2]; + } + else + { + uri += "&alf:method=" + command[2]; + } + MockHttpServletResponse res = submitRequest("post", uri); + bout.write(res.getContentAsByteArray()); + out.println(); + } + + else if (command[1].equals("header")) + { + Map headers = new HashMap(); + headers.put("X-HTTP-Method-Override", command[2]); + MockHttpServletResponse res = submitRequest("post", command[3], headers); + bout.write(res.getContentAsByteArray()); + out.println(); + } + + else + { + return "Syntax Error.\n"; + } + } else if (command[0].equals("reset")) { diff --git a/source/java/org/alfresco/web/scripts/WebScriptServletRuntime.java b/source/java/org/alfresco/web/scripts/WebScriptServletRuntime.java index 5f9875c0c5..88f2905234 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptServletRuntime.java +++ b/source/java/org/alfresco/web/scripts/WebScriptServletRuntime.java @@ -70,7 +70,27 @@ public class WebScriptServletRuntime extends WebScriptRuntime @Override protected String getScriptMethod() { - return req.getMethod(); + // Is this an overloaded POST request? + String method = req.getMethod(); + if (method.equalsIgnoreCase("post")) + { + boolean overloadParam = false; + String overload = req.getHeader("X-HTTP-Method-Override"); + if (overload == null || overload.length() == 0) + { + overload = req.getParameter("alf:method"); + overloadParam = true; + } + if (overload != null && overload.length() > 0) + { + if (logger.isDebugEnabled()) + logger.debug("POST is tunnelling method '" + overload + "' as specified by " + (overloadParam ? "alf:method parameter" : "X-HTTP-Method-Override header")); + + method = overload; + } + } + + return method; } /* (non-Javadoc)