diff --git a/core/src/main/java/org/kohsuke/stapler/HttpResponses.java b/core/src/main/java/org/kohsuke/stapler/HttpResponses.java index 4529fd811..aa8a8a97e 100644 --- a/core/src/main/java/org/kohsuke/stapler/HttpResponses.java +++ b/core/src/main/java/org/kohsuke/stapler/HttpResponses.java @@ -137,6 +137,29 @@ public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object nod }; } + /** + * A runtime exception which honors a defined response. + */ + public static HttpResponseException wrap(HttpResponse delegate) { + if (delegate instanceof Throwable) { + return new HttpResponseException(((Throwable) delegate).getMessage(), (Throwable) delegate) { + @Override + public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) + throws IOException, ServletException { + delegate.generateResponse(req, rsp, node); + } + }; + } else { + return new HttpResponseException() { + @Override + public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) + throws IOException, ServletException { + delegate.generateResponse(req, rsp, node); + } + }; + } + } + public static HttpResponseException redirectViaContextPath(String relative) { return redirectViaContextPath(HttpServletResponse.SC_MOVED_TEMPORARILY, relative); } diff --git a/core/src/main/java/org/kohsuke/stapler/RequestImpl.java b/core/src/main/java/org/kohsuke/stapler/RequestImpl.java index 557ac11bc..12ae78720 100644 --- a/core/src/main/java/org/kohsuke/stapler/RequestImpl.java +++ b/core/src/main/java/org/kohsuke/stapler/RequestImpl.java @@ -671,6 +671,10 @@ private T invokeConstructor(Constructor c, Object[] args) { if (x instanceof RuntimeException) { throw (RuntimeException) x; } + // TODO apply similar logic to other catchers of InvocationTargetException as needed + if (x instanceof HttpResponse) { + throw HttpResponses.wrap((HttpResponse) x); + } throw new IllegalArgumentException(x); } catch (IllegalArgumentException e) { throw new IllegalArgumentException("Failed to invoke " + c + " with " + Arrays.asList(args), e);