From d6d6d57cb97f55c0c58ac5b8ffdc476bfba97a7e Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 2 Apr 2013 20:59:26 +0200 Subject: [PATCH 1/2] use content type text/html for mercurial error messages, if the client accept it --- .../sonia/scm/web/HgCGIExceptionHandler.java | 66 +++++++++++++++---- .../main/java/sonia/scm/web/HgCGIServlet.java | 26 ++++---- 2 files changed, 66 insertions(+), 26 deletions(-) diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIExceptionHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIExceptionHandler.java index c1e068b665..71d766072d 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIExceptionHandler.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIExceptionHandler.java @@ -30,11 +30,13 @@ */ + package sonia.scm.web; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Charsets; +import com.google.common.base.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,7 +61,7 @@ import javax.servlet.http.HttpServletResponse; * @author Sebastian Sdorra */ public class HgCGIExceptionHandler - implements CGIExceptionHandler, CGIStatusCodeHandler + implements CGIExceptionHandler, CGIStatusCodeHandler { /** Field description */ @@ -68,6 +70,9 @@ public class HgCGIExceptionHandler /** Field description */ public static final String CONTENT_TYPE_ERROR = "application/hg-error"; + /** Field description */ + public static final String CONTENT_TYPE_HTML = "text/html"; + /** TODO create a bundle for error messages */ public static final String ERROR_NOT_CONFIGURED = "error.notConfigured"; @@ -77,6 +82,9 @@ public class HgCGIExceptionHandler /** Field description */ public static final String ERROR_UNEXPECTED = "error.unexpected"; + /** Field description */ + private static final String HEADER_ACCEPT = "Accept"; + /** * the logger for HgCGIExceptionHandler */ @@ -106,15 +114,20 @@ public class HgCGIExceptionHandler */ @Override public void handleException(HttpServletRequest request, - HttpServletResponse response, Throwable ex) + HttpServletResponse response, Throwable ex) { if (logger.isErrorEnabled()) { logger.error("not able to handle mercurial request", ex); } - sendError(response, - bundle.getString(ERROR_UNEXPECTED, Util.nonNull(ex.getMessage()))); + //J- + sendError( + request, + response, + bundle.getString(ERROR_UNEXPECTED, Util.nonNull(ex.getMessage())) + ); + //J+ } /** @@ -130,13 +143,12 @@ public class HgCGIExceptionHandler */ @Override public void handleStatusCode(HttpServletRequest request, - HttpServletResponse response, - OutputStream output, int statusCode) - throws IOException + HttpServletResponse response, OutputStream output, int statusCode) + throws IOException { if (statusCode != 0) { - response.setContentType(CONTENT_TYPE_ERROR); + setContentType(request, response); String msg = bundle.getLine(ERROR_STATUSCODE, statusCode); @@ -180,13 +192,16 @@ public class HgCGIExceptionHandler * Method description * * + * + * @param request * @param response * @param message * */ - public void sendError(HttpServletResponse response, String message) + public void sendError(HttpServletRequest request, + HttpServletResponse response, String message) { - response.setContentType(CONTENT_TYPE_ERROR); + setContentType(request, response); PrintWriter writer = null; @@ -209,12 +224,39 @@ public class HgCGIExceptionHandler * Method description * * + * + * @param request * @param response * @param key */ - public void sendFormattedError(HttpServletResponse response, String key) + public void sendFormattedError(HttpServletRequest request, + HttpServletResponse response, String key) { - sendError(response, bundle.getString(key)); + sendError(request, response, bundle.getString(key)); + } + + //~--- set methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param request + * @param response + */ + private void setContentType(HttpServletRequest request, + HttpServletResponse response) + { + String accept = Strings.nullToEmpty(request.getHeader(HEADER_ACCEPT)); + + if (accept.contains(CONTENT_TYPE_HTML)) + { + response.setContentType(CONTENT_TYPE_HTML); + } + else + { + response.setContentType(CONTENT_TYPE_ERROR); + } } //~--- fields --------------------------------------------------------------- diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java index 0ec9a9d23a..0447b8f8fb 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java @@ -123,10 +123,9 @@ public class HgCGIServlet extends HttpServlet */ @Inject public HgCGIServlet(CGIExecutorFactory cgiExecutorFactory, - ScmConfiguration configuration, - RepositoryProvider repositoryProvider, - HgRepositoryHandler handler, HgHookManager hookManager, - RepositoryRequestListenerUtil requestListenerUtil) + ScmConfiguration configuration, RepositoryProvider repositoryProvider, + HgRepositoryHandler handler, HgHookManager hookManager, + RepositoryRequestListenerUtil requestListenerUtil) { this.cgiExecutorFactory = cgiExecutorFactory; this.configuration = configuration; @@ -164,8 +163,8 @@ public class HgCGIServlet extends HttpServlet */ @Override protected void service(HttpServletRequest request, - HttpServletResponse response) - throws ServletException, IOException + HttpServletResponse response) + throws ServletException, IOException { Repository repository = repositoryProvider.get(); @@ -180,8 +179,8 @@ public class HgCGIServlet extends HttpServlet } else if (!handler.isConfigured()) { - exceptionHandler.sendFormattedError(response, - HgCGIExceptionHandler.ERROR_NOT_CONFIGURED); + exceptionHandler.sendFormattedError(request, response, + HgCGIExceptionHandler.ERROR_NOT_CONFIGURED); } else { @@ -208,9 +207,8 @@ public class HgCGIServlet extends HttpServlet * @throws ServletException */ private void handleRequest(HttpServletRequest request, - HttpServletResponse response, - Repository repository) - throws ServletException, IOException + HttpServletResponse response, Repository repository) + throws ServletException, IOException { if (requestListenerUtil.callListeners(request, response, repository)) { @@ -262,8 +260,8 @@ public class HgCGIServlet extends HttpServlet * @throws ServletException */ private void process(HttpServletRequest request, - HttpServletResponse response, Repository repository) - throws IOException, ServletException + HttpServletResponse response, Repository repository) + throws IOException, ServletException { String name = repository.getName(); File directory = handler.getDirectory(repository); @@ -278,7 +276,7 @@ public class HgCGIServlet extends HttpServlet executor.setContentLengthWorkaround(true); executor.getEnvironment().set(ENV_REPOSITORY_NAME, name); executor.getEnvironment().set(ENV_REPOSITORY_PATH, - directory.getAbsolutePath()); + directory.getAbsolutePath()); executor.getEnvironment().set(ENV_URL, hookManager.createUrl(request)); executor.getEnvironment().set(ENV_CHALLENGE, hookManager.getChallenge()); executor.getEnvironment().set(ENV_PYTHON_PATH, pythonPath); From 321f8f1934d51bda5ef6c6f9ac1016bece99c59a Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 2 Apr 2013 21:00:13 +0200 Subject: [PATCH 2/2] close branch issue-336