Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion src/main/java/jenkins/plugins/http_request/HttpRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<HttpRequestNameValuePair> customHeaders = DescriptorImpl.customHeaders;
private List<HttpRequestFormDataPart> formData = DescriptorImpl.formData;

Expand Down Expand Up @@ -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<Builder> {
public static final boolean ignoreSslErrors = false;
public static final HttpMode httpMode = HttpMode.GET;
Expand All @@ -481,6 +491,7 @@ public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {
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<HttpRequestNameValuePair> customHeaders = Collections.emptyList();
public static final List<HttpRequestFormDataPart> formData = Collections.emptyList();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ public class HttpRequestExecution extends MasterToSlaveCallable<ResponseContentS
private final boolean wrapAsMultipart;

private final boolean useNtlm;
private final boolean followRedirects;
private final boolean useSystemProperties;
private final String validResponseCodes;
private final String validResponseContent;
Expand Down Expand Up @@ -141,7 +142,7 @@ static HttpRequestExecution from(HttpRequest http,

http.getValidResponseCodes(), http.getValidResponseContent(),
http.getConsoleLogResponseBody(), outputFile,
ResponseHandle.NONE,
ResponseHandle.NONE, http.isFollowRedirects(),

project,
run,
Expand Down Expand Up @@ -172,7 +173,7 @@ static HttpRequestExecution from(HttpRequestStep step, TaskListener taskListener

step.getValidResponseCodes(), step.getValidResponseContent(),
step.getConsoleLogResponseBody(), outputFile,
step.getResponseHandle(),
step.getResponseHandle(), step.isFollowRedirects(),
project, run, taskListener.getLogger());
}

Expand All @@ -186,13 +187,14 @@ private HttpRequestExecution(

String validResponseCodes, String validResponseContent,
Boolean consoleLogResponseBody, FilePath outputFile,
ResponseHandle responseHandle,
ResponseHandle responseHandle, boolean followRedirects,

Item project, Run<?, ?> 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));
Expand Down Expand Up @@ -313,6 +315,10 @@ private ResponseContentSupplier authAndRequest()
clientBuilder.disableAutomaticRetries();
clientBuilder.setRedirectStrategy(new BackWardCompatibleRedirectStrategy());

if (!this.followRedirects) {
clientBuilder.disableRedirectHandling();
}

if (useSystemProperties) {
clientBuilder.useSystemProperties();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<HttpRequestNameValuePair> customHeaders = DescriptorImpl.customHeaders;
private List<HttpRequestFormDataPart> formData = DescriptorImpl.formData;
private String outputFile = DescriptorImpl.outputFile;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 <HttpRequestNameValuePair> customHeaders = Collections.emptyList();
public static final boolean followRedirects = HttpRequest.DescriptorImpl.followRedirects;
public static final List <HttpRequestNameValuePair> customHeaders = Collections.emptyList();
public static final List <HttpRequestFormDataPart> formData = Collections.emptyList();
public static final String outputFile = "";
public static final ResponseHandle responseHandle = ResponseHandle.STRING;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@
<f:entry field="quiet" title="Quiet all output?" help="/plugin/http_request/help-quiet.html">
<f:booleanRadio />
</f:entry>
<f:entry field="followRedirects" title="Enable redirect handling?" help="/plugin/http_request/help-followRedirects.html">
<f:booleanRadio />
</f:entry>
</f:section>
</f:advanced>
</j:jelly>
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@
<f:entry field="useSystemProperties" title="Use system properties" help="/plugin/http_request/use-system-properties.html">
<f:booleanRadio />
</f:entry>
<f:entry field="followRedirects" title="Enable redirect handling?" help="/plugin/http_request/help-followRedirects.html">
<f:booleanRadio />
</f:entry>
<f:entry title="Custom headers">
<f:repeatableProperty field="customHeaders" />
</f:entry>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
This allows to turn off automatic redirect handling
</div>
3 changes: 3 additions & 0 deletions src/main/webapp/help-followRedirects.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
This allows to turn off automatic redirect handling
</div>
37 changes: 37 additions & 0 deletions src/test/java/jenkins/plugins/http_request/HttpRequestTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
11 changes: 11 additions & 0 deletions src/test/java/jenkins/plugins/http_request/Registers.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Loading