diff --git a/src/main/java/jenkins/plugins/http_request/HttpRequest.java b/src/main/java/jenkins/plugins/http_request/HttpRequest.java index 24687385..bd0ec407 100644 --- a/src/main/java/jenkins/plugins/http_request/HttpRequest.java +++ b/src/main/java/jenkins/plugins/http_request/HttpRequest.java @@ -73,6 +73,7 @@ public class HttpRequest extends Builder { private Boolean wrapAsMultipart = DescriptorImpl.wrapAsMultipart; private Boolean useSystemProperties = DescriptorImpl.useSystemProperties; private boolean useNtlm = DescriptorImpl.useNtlm; + private boolean followRedirects = DescriptorImpl.followRedirects; private List customHeaders = DescriptorImpl.customHeaders; private List formData = DescriptorImpl.formData; @@ -459,7 +460,16 @@ public void setUseNtlm(boolean useNtlm) { this.useNtlm = useNtlm; } - @Extension + public boolean isFollowRedirects() { + return this.followRedirects; + } + + @DataBoundSetter + public void setFollowRedirects(boolean followRedirects) { + this.followRedirects = followRedirects; + } + + @Extension public static final class DescriptorImpl extends BuildStepDescriptor { public static final boolean ignoreSslErrors = false; public static final HttpMode httpMode = HttpMode.GET; @@ -481,6 +491,7 @@ public static final class DescriptorImpl extends BuildStepDescriptor { public static final boolean wrapAsMultipart = true; public static final Boolean useSystemProperties = false; public static final boolean useNtlm = false; + public static final boolean followRedirects = true; public static final List customHeaders = Collections.emptyList(); public static final List formData = Collections.emptyList(); diff --git a/src/main/java/jenkins/plugins/http_request/HttpRequestExecution.java b/src/main/java/jenkins/plugins/http_request/HttpRequestExecution.java index ab56febe..61cca0ea 100644 --- a/src/main/java/jenkins/plugins/http_request/HttpRequestExecution.java +++ b/src/main/java/jenkins/plugins/http_request/HttpRequestExecution.java @@ -104,6 +104,7 @@ public class HttpRequestExecution extends MasterToSlaveCallable run, PrintStream logger ) { this.url = url; this.httpMode = httpMode; this.ignoreSslErrors = ignoreSslErrors; + this.followRedirects = followRedirects; if (httpProxy != null && !httpProxy.isBlank()) { this.httpProxy = HttpHost.create(URI.create(httpProxy)); @@ -313,6 +315,10 @@ private ResponseContentSupplier authAndRequest() clientBuilder.disableAutomaticRetries(); clientBuilder.setRedirectStrategy(new BackWardCompatibleRedirectStrategy()); + if (!this.followRedirects) { + clientBuilder.disableRedirectHandling(); + } + if (useSystemProperties) { clientBuilder.useSystemProperties(); } diff --git a/src/main/java/jenkins/plugins/http_request/HttpRequestStep.java b/src/main/java/jenkins/plugins/http_request/HttpRequestStep.java index a9dd6ad6..8d10e2ff 100644 --- a/src/main/java/jenkins/plugins/http_request/HttpRequestStep.java +++ b/src/main/java/jenkins/plugins/http_request/HttpRequestStep.java @@ -59,6 +59,7 @@ public final class HttpRequestStep extends Step { private boolean wrapAsMultipart = DescriptorImpl.wrapAsMultipart; private Boolean useSystemProperties = DescriptorImpl.useSystemProperties; private boolean useNtlm = DescriptorImpl.useNtlm; + private boolean followRedirects = DescriptorImpl.followRedirects; private List customHeaders = DescriptorImpl.customHeaders; private List formData = DescriptorImpl.formData; private String outputFile = DescriptorImpl.outputFile; @@ -273,6 +274,15 @@ public boolean isUseNtlm() { return useNtlm; } + @DataBoundSetter + public void setFollowRedirects(boolean followRedirects) { + this.followRedirects = followRedirects; + } + + public boolean isFollowRedirects() { + return this.followRedirects; + } + @Override public StepExecution start(StepContext context) { return new Execution(context, this); @@ -322,7 +332,8 @@ public static final class DescriptorImpl extends StepDescriptor { public static final boolean wrapAsMultipart = HttpRequest.DescriptorImpl.wrapAsMultipart; public static final Boolean useSystemProperties = HttpRequest.DescriptorImpl.useSystemProperties; public static final boolean useNtlm = HttpRequest.DescriptorImpl.useNtlm; - public static final List customHeaders = Collections.emptyList(); + public static final boolean followRedirects = HttpRequest.DescriptorImpl.followRedirects; + public static final List customHeaders = Collections.emptyList(); public static final List formData = Collections.emptyList(); public static final String outputFile = ""; public static final ResponseHandle responseHandle = ResponseHandle.STRING; diff --git a/src/main/resources/jenkins/plugins/http_request/HttpRequest/config.jelly b/src/main/resources/jenkins/plugins/http_request/HttpRequest/config.jelly index 934411e6..6ca0d93f 100644 --- a/src/main/resources/jenkins/plugins/http_request/HttpRequest/config.jelly +++ b/src/main/resources/jenkins/plugins/http_request/HttpRequest/config.jelly @@ -76,6 +76,9 @@ + + + diff --git a/src/main/resources/jenkins/plugins/http_request/HttpRequestStep/config.jelly b/src/main/resources/jenkins/plugins/http_request/HttpRequestStep/config.jelly index f6a13a42..3875cb53 100644 --- a/src/main/resources/jenkins/plugins/http_request/HttpRequestStep/config.jelly +++ b/src/main/resources/jenkins/plugins/http_request/HttpRequestStep/config.jelly @@ -65,6 +65,9 @@ + + + diff --git a/src/main/resources/jenkins/plugins/http_request/HttpRequestStep/help-followRedirects.html b/src/main/resources/jenkins/plugins/http_request/HttpRequestStep/help-followRedirects.html new file mode 100644 index 00000000..725aaf74 --- /dev/null +++ b/src/main/resources/jenkins/plugins/http_request/HttpRequestStep/help-followRedirects.html @@ -0,0 +1,3 @@ +
+ This allows to turn off automatic redirect handling +
diff --git a/src/main/webapp/help-followRedirects.html b/src/main/webapp/help-followRedirects.html new file mode 100644 index 00000000..725aaf74 --- /dev/null +++ b/src/main/webapp/help-followRedirects.html @@ -0,0 +1,3 @@ +
+ This allows to turn off automatic redirect handling +
diff --git a/src/test/java/jenkins/plugins/http_request/HttpRequestTest.java b/src/test/java/jenkins/plugins/http_request/HttpRequestTest.java index d2f22424..5d53c4ec 100644 --- a/src/test/java/jenkins/plugins/http_request/HttpRequestTest.java +++ b/src/test/java/jenkins/plugins/http_request/HttpRequestTest.java @@ -12,6 +12,7 @@ import static jenkins.plugins.http_request.Registers.registerFormAuth; import static jenkins.plugins.http_request.Registers.registerFormAuthBad; import static jenkins.plugins.http_request.Registers.registerInvalidStatusCode; +import static jenkins.plugins.http_request.Registers.registerRedirects; import static jenkins.plugins.http_request.Registers.registerReqAction; import static jenkins.plugins.http_request.Registers.registerRequestChecker; import static jenkins.plugins.http_request.Registers.registerTimeout; @@ -1191,4 +1192,40 @@ boolean doHandle(Request request, Response response, Callback callback) { assertTrue(redirectStatus.redirected); assertTrue(redirectStatus.called); } + + @Test + public void testFollowRedirects() throws Exception { + registerRequestChecker(HttpMode.HEAD); + registerRedirects(); + + // Prepare HttpRequest + HttpRequest httpRequest = new HttpRequest(baseURL() + "/redirects"); + httpRequest.setHttpMode(HttpMode.HEAD); + + // Run build + FreeStyleProject project = this.j.createFreeStyleProject(); + project.getBuildersList().add(httpRequest); + FreeStyleBuild build = project.scheduleBuild2(0).get(); + + this.j.assertBuildStatusSuccess(build); + this.j.assertLogContains("Success: Status code 200 is in the accepted range: 100:399", build); + } + + @Test + public void testNotFollowRedirects() throws Exception { + registerRedirects(); + + // Prepare HttpRequest + HttpRequest httpRequest = new HttpRequest(baseURL() + "/redirects"); + httpRequest.setHttpMode(HttpMode.HEAD); + httpRequest.setFollowRedirects(false); + + // Run build + FreeStyleProject project = this.j.createFreeStyleProject(); + project.getBuildersList().add(httpRequest); + FreeStyleBuild build = project.scheduleBuild2(0).get(); + + this.j.assertBuildStatusSuccess(build); + this.j.assertLogContains("Success: Status code 302 is in the accepted range: 100:399", build); + } } diff --git a/src/test/java/jenkins/plugins/http_request/Registers.java b/src/test/java/jenkins/plugins/http_request/Registers.java index c71d03ed..f74de588 100644 --- a/src/test/java/jenkins/plugins/http_request/Registers.java +++ b/src/test/java/jenkins/plugins/http_request/Registers.java @@ -380,6 +380,17 @@ boolean doHandle(Request request, Response response, Callback callback) { }); } + static void registerRedirects() { + registerHandler("/redirects", HttpMode.HEAD, new SimpleHandler() { + @Override + boolean doHandle(Request request, Response response, Callback callback) { + assertEquals("HEAD", request.getMethod()); + Response.sendRedirect(request, response, callback, 302,"/doHEAD", false); + return false; + } + }); + } + private static void registerHandler(String target, HttpMode method, SimpleHandler handler) { HttpRequestTestBase.registerHandler(target, method, handler); }