From 8d12714714f3bb693b95fd464ab20bd717d98630 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 25 Jul 2024 09:07:12 -0400 Subject: [PATCH 1/2] Define `HttpResponses.wrap` and use from `RequestImpl.invokeConstructor` --- .../org/kohsuke/stapler/HttpResponses.java | 21 +++++++++++++++++++ .../java/org/kohsuke/stapler/RequestImpl.java | 4 ++++ 2 files changed, 25 insertions(+) diff --git a/core/src/main/java/org/kohsuke/stapler/HttpResponses.java b/core/src/main/java/org/kohsuke/stapler/HttpResponses.java index 4529fd811..e027e3b20 100644 --- a/core/src/main/java/org/kohsuke/stapler/HttpResponses.java +++ b/core/src/main/java/org/kohsuke/stapler/HttpResponses.java @@ -137,6 +137,27 @@ 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); From 4efde02f15098a4516e606cbce543cec2cfb0dda Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 25 Jul 2024 09:15:26 -0400 Subject: [PATCH 2/2] Spotless --- core/src/main/java/org/kohsuke/stapler/HttpResponses.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/kohsuke/stapler/HttpResponses.java b/core/src/main/java/org/kohsuke/stapler/HttpResponses.java index e027e3b20..aa8a8a97e 100644 --- a/core/src/main/java/org/kohsuke/stapler/HttpResponses.java +++ b/core/src/main/java/org/kohsuke/stapler/HttpResponses.java @@ -144,14 +144,16 @@ 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 { + 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 { + public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) + throws IOException, ServletException { delegate.generateResponse(req, rsp, node); } };