diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/keywordsearch.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/keywordsearch.get.desc.xml index a02bb29363..fd0e00ebfc 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/keywordsearch.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/keywordsearch.get.desc.xml @@ -6,5 +6,4 @@ guest - any \ No newline at end of file diff --git a/source/java/org/alfresco/web/scripts/AbstractWebScript.java b/source/java/org/alfresco/web/scripts/AbstractWebScript.java index 377bea1a55..b776a03ba1 100644 --- a/source/java/org/alfresco/web/scripts/AbstractWebScript.java +++ b/source/java/org/alfresco/web/scripts/AbstractWebScript.java @@ -31,6 +31,8 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; +import javax.servlet.http.HttpServletResponse; + import org.alfresco.repo.jscript.Node; import org.alfresco.repo.jscript.ScriptableHashMap; import org.alfresco.repo.template.AbsoluteUrlMethod; @@ -358,12 +360,13 @@ public abstract class AbstractWebScript implements WebScript if (logger.isDebugEnabled()) { + logger.debug("Force success status header in response: " + req.forceSuccessStatus()); logger.debug("Sending status " + statusCode + " (Template: " + template.path + ")"); logger.debug("Rendering response: content type=" + mimetype); } res.reset(); - res.setStatus(statusCode); + res.setStatus(req.forceSuccessStatus() ? HttpServletResponse.SC_OK : statusCode); res.setContentType(mimetype + ";charset=UTF-8"); renderTemplate(template.path, model, res.getWriter()); } diff --git a/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java b/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java index 08d953d978..8a327a4a9e 100644 --- a/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java +++ b/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java @@ -129,8 +129,10 @@ public class DeclarativeWebScript extends AbstractWebScript { // render output int statusCode = status.getCode(); - if (statusCode != HttpServletResponse.SC_OK) + if (statusCode != HttpServletResponse.SC_OK && !req.forceSuccessStatus()) { + logger.debug("Force success status header in response: " + req.forceSuccessStatus()); + logger.debug("Setting status " + statusCode); res.setStatus(statusCode); } diff --git a/source/java/org/alfresco/web/scripts/TestWebScriptServer.java b/source/java/org/alfresco/web/scripts/TestWebScriptServer.java index 6084744686..d85bf3893a 100644 --- a/source/java/org/alfresco/web/scripts/TestWebScriptServer.java +++ b/source/java/org/alfresco/web/scripts/TestWebScriptServer.java @@ -79,6 +79,9 @@ public class TestWebScriptServer /** Current user */ private String username = "admin"; + /** Current headers */ + private Map headers = new HashMap(); + /** I18N Messages */ private MessageSource m_messages; @@ -391,7 +394,9 @@ public class TestWebScriptServer command[0].equals("delete")) { String uri = (command.length > 1) ? command[1] : null; - MockHttpServletResponse res = submitRequest(command[0], uri); + MockHttpServletResponse res = submitRequest(command[0], uri, headers); + bout.write(("Response status: " + res.getStatus()).getBytes()); + out.println(); bout.write(res.getContentAsByteArray()); out.println(); } @@ -414,16 +419,17 @@ public class TestWebScriptServer { uri += "&alf:method=" + command[2]; } - MockHttpServletResponse res = submitRequest("post", uri); + MockHttpServletResponse res = submitRequest("post", uri, headers); 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); + Map tunnelheaders = new HashMap(); + tunnelheaders.putAll(headers); + tunnelheaders.put("X-HTTP-Method-Override", command[2]); + MockHttpServletResponse res = submitRequest("post", command[3], tunnelheaders); bout.write(res.getContentAsByteArray()); out.println(); } @@ -434,6 +440,43 @@ public class TestWebScriptServer } } + else if (command[0].equals("header")) + { + if (command.length == 1) + { + for (Map.Entry entry : headers.entrySet()) + { + out.println(entry.getKey() + " = " + entry.getValue()); + } + } + else if (command.length == 2) + { + String[] param = command[1].split("="); + if (param.length == 0) + { + return "Syntax Error.\n"; + } + if (param.length == 1) + { + headers.remove(param[0]); + out.println("deleted header " + param[0]); + } + else if (param.length == 2) + { + headers.put(param[0], param[1]); + out.println("set header " + param[0] + " = " + headers.get(param[0])); + } + else + { + return "Syntax Error.\n"; + } + } + else + { + return "Syntax Error.\n"; + } + } + else if (command[0].equals("reset")) { registry.reset(); diff --git a/source/java/org/alfresco/web/scripts/WebScriptRequest.java b/source/java/org/alfresco/web/scripts/WebScriptRequest.java index e2a3e51ec0..342a4ff262 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptRequest.java +++ b/source/java/org/alfresco/web/scripts/WebScriptRequest.java @@ -141,13 +141,6 @@ public interface WebScriptRequest */ public FormatStyle getFormatStyle(); - /** - * Get the JSON callback method - * - * @return method (or null, if not specified) - */ - public String getJSONCallback(); - /** * Get User Agent * @@ -157,4 +150,21 @@ public interface WebScriptRequest */ public String getAgent(); + /** + * Get the JSON callback method + * + * @return method (or null, if not specified) + */ + public String getJSONCallback(); + + /** + * Force response to return SUCCESS (200) code + * + * Note: This is to support clients who cannot support non-success codes + * e.g. Flash player + * + * @return true => force return of 200, otherwise return status explicitly set + */ + public boolean forceSuccessStatus(); + } diff --git a/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java b/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java index 5412a41cfb..29fa6cf824 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java +++ b/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java @@ -147,4 +147,12 @@ public abstract class WebScriptRequestImpl implements WebScriptRequest return getParameter("alf_callback"); } + /* (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptRequest#forceSuccessStatus() + */ + public boolean forceSuccessStatus() + { + return false; + } + } diff --git a/source/java/org/alfresco/web/scripts/WebScriptRuntime.java b/source/java/org/alfresco/web/scripts/WebScriptRuntime.java index b4768020ad..698809657e 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptRuntime.java +++ b/source/java/org/alfresco/web/scripts/WebScriptRuntime.java @@ -138,8 +138,7 @@ public abstract class WebScriptRuntime String reqFormat = scriptReq.getFormat(); String format = (reqFormat == null || reqFormat.length() == 0) ? "default" : scriptReq.getFormat(); WebScriptDescription desc = scriptReq.getServiceMatch().getWebScript().getDescription(); - logger.debug("Format style: " + desc.getFormatStyle()); - logger.debug("Default format: " + desc.getDefaultFormat()); + logger.debug("Format style: " + desc.getFormatStyle() + ", Default format: " + desc.getDefaultFormat()); logger.debug("Invoking Web Script " + description.getId() + (user == null ? " (unauthenticated)" : " (authenticated as " + user + ") (format " + format + ") (" + locale + ")")); } @@ -224,12 +223,13 @@ public abstract class WebScriptRuntime // render output if (logger.isDebugEnabled()) { + logger.debug("Force success status header in response: " + req.forceSuccessStatus()); logger.debug("Sending status " + statusCode + " (Template: " + templatePath + ")"); logger.debug("Rendering response: content type=" + MimetypeMap.MIMETYPE_HTML); } res.reset(); - res.setStatus(statusCode); + res.setStatus(req.forceSuccessStatus() ? HttpServletResponse.SC_OK : statusCode); res.setContentType(MimetypeMap.MIMETYPE_HTML + ";charset=UTF-8"); try { diff --git a/source/java/org/alfresco/web/scripts/WebScriptServletRequest.java b/source/java/org/alfresco/web/scripts/WebScriptServletRequest.java index b9155e50c5..9c9f952b84 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptServletRequest.java +++ b/source/java/org/alfresco/web/scripts/WebScriptServletRequest.java @@ -248,4 +248,14 @@ public class WebScriptServletRequest extends WebScriptRequestImpl return port; } + /* (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptRequestImpl#forceSuccessStatus() + */ + @Override + public boolean forceSuccessStatus() + { + String forceSuccess = req.getHeader("alf-force-success-response"); + return Boolean.valueOf(forceSuccess); + } + }