Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

name attribute, advanced options, timeouts, head request support and accept 200 status code only #7

Merged
merged 7 commits into from
Mar 14, 2015
Merged
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
2 changes: 1 addition & 1 deletion src/main/java/jenkins/plugins/http_request/HttpMode.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
*/
public enum HttpMode {

GET, POST, PUT, DELETE;
HEAD, GET, POST, PUT, DELETE;

public static ListBoxModel getFillItems() {
ListBoxModel items = new ListBoxModel();
Expand Down
110 changes: 90 additions & 20 deletions src/main/java/jenkins/plugins/http_request/HttpRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,19 @@
public class HttpRequest extends Builder {

private static final Logger LOGGER = LoggerFactory.getLogger(HttpRequest.class);
private final String name;
private final String url;
private final HttpMode httpMode;
private final String authentication;
private final Boolean returnCodeBuildRelevant;
private final Boolean logResponseBody;
private final Boolean accept200Only;
private final Integer timeout;

@DataBoundConstructor
public HttpRequest(String url, String httpMode, String authentication, String returnCodeBuildRelevant, String logResponseBody)
public HttpRequest(String name, String url, String httpMode, String authentication, String returnCodeBuildRelevant, String accept200Only, String logResponseBody, String timeout)
throws URISyntaxException {
this.name = name;
this.url = url;
this.httpMode = Util.fixEmpty(httpMode) == null ? null : HttpMode.valueOf(httpMode);
this.authentication = Util.fixEmpty(authentication);
Expand All @@ -60,19 +64,38 @@ public HttpRequest(String url, String httpMode, String authentication, String re
} else {
this.returnCodeBuildRelevant = null;
}


if (accept200Only != null && accept200Only.trim().length() > 0) {
this.accept200Only = Boolean.parseBoolean(accept200Only);
} else {
this.accept200Only = null;
}

if (logResponseBody != null && logResponseBody.trim().length() > 0) {
this.logResponseBody = Boolean.parseBoolean(logResponseBody);
} else {
this.logResponseBody = null;
}


if (timeout != null && timeout.trim().length() > 0) {
this.timeout = Integer.parseInt(timeout);
} else {
this.timeout = null;
}
}

public Boolean getLogResponseBody() {
return logResponseBody;
}

public Boolean getAccept200Only() {
return accept200Only;
}

public String getName() {
return name;
}

public String getUrl() {
return url;
}
Expand All @@ -89,56 +112,78 @@ public Boolean getReturnCodeBuildRelevant() {
return returnCodeBuildRelevant;
}

public Integer getTimeout() {
return timeout;
}

@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
final PrintStream logger = listener.getLogger();

if ((name != null) && !name.isEmpty())
logger.println("Name: " + name);

final HttpMode mode = httpMode != null ? httpMode : getDescriptor().getDefaultHttpMode();
logger.println("HttpMode: " + mode);

final SystemDefaultHttpClient httpclient = new SystemDefaultHttpClient();
final SystemDefaultHttpClient httpClient = new SystemDefaultHttpClient();

logger.println("Parameters: ");
final EnvVars envVars = build.getEnvironment(listener);

if (!envVars.isEmpty())
logger.println("Parameters: ");

final List<NameValuePair> params = createParameters(build, logger, envVars);
String evaluatedUrl = evaluate(url, build.getBuildVariableResolver(), envVars);
logger.println(String.format("URL: %s", evaluatedUrl));
final RequestAction requestAction = new RequestAction(
name,
new URL(evaluatedUrl),
mode,
params);
final HttpClientUtil clientUtil = new HttpClientUtil();
final HttpRequestBase method = clientUtil.createRequestBase(requestAction);

int tmpTimeout = timeout != null
? timeout : getDescriptor().getDefaultTimeout();

if (authentication != null) {
final Authenticator auth = getDescriptor().getAuthentication(authentication);
if (auth == null) {
throw new IllegalStateException("Authentication " + authentication + " doesn't exists anymore");
}

logger.println("Using authentication: " + auth.getKeyName());
auth.authenticate(httpclient, method, logger);
auth.authenticate(httpClient, method, logger, tmpTimeout);
}

boolean tmpLogResponseBody = logResponseBody != null
? logResponseBody : getDescriptor().isDefaultLogResponseBody();
? logResponseBody : getDescriptor().isDefaultLogResponseBody();

final HttpResponse execute = clientUtil.execute(httpclient, method, logger, tmpLogResponseBody);
final HttpResponse execute = clientUtil.execute(httpClient, method, logger, tmpLogResponseBody, tmpTimeout);

// use global configuration as default if it is unset for this job
boolean returnCodeRelevant = returnCodeBuildRelevant != null
? returnCodeBuildRelevant : getDescriptor().isDefaultReturnCodeBuildRelevant();


boolean tmpAccept200Only = accept200Only != null
? accept200Only : getDescriptor().isDefaultAccept200Only();

LOGGER.debug("---> config local: {}", returnCodeBuildRelevant);
LOGGER.debug("---> global: {}", getDescriptor().isDefaultReturnCodeBuildRelevant());
LOGGER.debug("---> returnCodeRelevant: {}", returnCodeRelevant);
LOGGER.debug("---> Accept200Only: {}", tmpAccept200Only);
LOGGER.debug("---> Timeout: {}", tmpTimeout);

logger.println("");

if (returnCodeRelevant) {
// return false if status from 400(client error) to 599(server error)
return !(execute.getStatusLine().getStatusCode() >= 400 && execute.getStatusLine().getStatusCode() <= 599);
return !((tmpAccept200Only && execute.getStatusLine().getStatusCode() != 200) || (!tmpAccept200Only && execute.getStatusLine().getStatusCode() >= 400 && execute.getStatusLine().getStatusCode() <= 599));
} else {
// ignore status code from HTTP response
logger.println("Ignoring return code as " + (returnCodeBuildRelevant != null ? "Local" : "Global") + " configuration");
logger.println("");
return true;
}
}
Expand Down Expand Up @@ -175,20 +220,38 @@ public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {
private List<BasicDigestAuthentication> basicDigestAuthentications = new ArrayList<BasicDigestAuthentication>();
private List<FormAuthentication> formAuthentications = new ArrayList<FormAuthentication>();
private boolean defaultReturnCodeBuildRelevant = true;
private boolean defaultLogResponseBody = true;
private boolean defaultLogResponseBody = true;
private boolean defaultAccept200Only = false;
private int defaultTimeout = 0;

public DescriptorImpl() {
load();
}

public boolean isDefaultLogResponseBody() {
return defaultLogResponseBody;
}
public boolean isDefaultLogResponseBody() {
return defaultLogResponseBody;
}

public void setDefaultLogResponseBody(boolean defaultLogResponseBody) {
this.defaultLogResponseBody = defaultLogResponseBody;
}

public boolean isDefaultAccept200Only() {
return defaultAccept200Only;
}

public void setDefaultAccept200Only(boolean defaultAccept200Only) {
this.defaultAccept200Only = defaultAccept200Only;
}

public int getDefaultTimeout() {
return defaultTimeout;
}

public void setDefaultTimeout(int defaultTimeout) {
this.defaultTimeout = defaultTimeout;
}

public void setDefaultLogResponseBody(boolean defaultLogResponseBody) {
this.defaultLogResponseBody = defaultLogResponseBody;
}

public HttpMode getDefaultHttpMode() {
return defaultHttpMode;
}
Expand Down Expand Up @@ -319,6 +382,13 @@ public ListBoxModel doFillLogResponseBodyItems() {
items.add("No", "false");
return items;
}


public ListBoxModel doFillAccept200OnlyItems() {
ListBoxModel items = new ListBoxModel();
items.add("Default", "");
items.add("Yes", "true");
items.add("No", "false");
return items;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ public interface Authenticator {
String getKeyName();

void authenticate(DefaultHttpClient client, HttpRequestBase requestBase,
PrintStream logger) throws IOException;
PrintStream logger, int timeout) throws IOException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public String getPassword() {
}

public void authenticate(DefaultHttpClient client,
HttpRequestBase requestBase, PrintStream logger) {
HttpRequestBase requestBase, PrintStream logger, int timeout) {
client.getCredentialsProvider().setCredentials(
new AuthScope(requestBase.getURI().getHost(), requestBase.getURI().getPort()),
new UsernamePasswordCredentials(userName, password));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ public List<RequestAction> getActions() {
}

public void authenticate(DefaultHttpClient client,
HttpRequestBase requestBase, PrintStream logger) throws IOException {
HttpRequestBase requestBase, PrintStream logger, int timeout) throws IOException {
final HttpClientUtil clientUtil = new HttpClientUtil();
for (RequestAction requestAction : actions) {
final HttpRequestBase method = clientUtil.createRequestBase(requestAction);

final HttpResponse execute = clientUtil.execute(client, method, logger, true);
final HttpResponse execute = clientUtil.execute(client, method, logger, true, timeout);
//from 400(client error) to 599(server error)
if ((execute.getStatusLine().getStatusCode() >= 400
&& execute.getStatusLine().getStatusCode() <= 599)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,7 @@
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.*;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
Expand All @@ -33,7 +29,10 @@ public class HttpClientUtil {
public HttpRequestBase createRequestBase(RequestAction requestAction) throws
UnsupportedEncodingException, IOException {

if (requestAction.getMode() == HttpMode.GET) {
if (requestAction.getMode() == HttpMode.HEAD) {
return makeHead(requestAction);

} else if (requestAction.getMode() == HttpMode.GET) {
return makeGet(requestAction);

} else if (requestAction.getMode() == HttpMode.POST) {
Expand Down Expand Up @@ -72,6 +71,12 @@ public HttpGet makeGet(RequestAction requestAction) throws
return new HttpGet(sb.toString());
}

public HttpHead makeHead(RequestAction requestAction) throws UnsupportedEncodingException {
final HttpHead httpHead = new HttpHead(requestAction.getUrl().toString());

return httpHead;
}

public HttpPost makePost(RequestAction requestAction) throws UnsupportedEncodingException {
final HttpEntity entity = makeEntity(requestAction.getParams());
final HttpPost httpPost = new HttpPost(requestAction.getUrl().toString());
Expand All @@ -89,22 +94,30 @@ public HttpPut makePut(RequestAction requestAction) throws UnsupportedEncodingEx
}

public HttpDelete makeDelete(RequestAction requestAction) throws UnsupportedEncodingException {
final HttpEntity entity = makeEntity(requestAction.getParams());
final HttpDelete httpDelete = new HttpDelete(requestAction.getUrl().toString());

return httpDelete;
}

public HttpResponse execute(DefaultHttpClient client, HttpRequestBase method,
PrintStream logger, boolean logResponseBody) throws IOException {
PrintStream logger, boolean logResponseBody, int timeout) throws IOException {
doSecurity(client, method.getURI());

logger.println("Sending request to url: " + method.getURI());

if (timeout > 0) {
client.getParams().setParameter("http.socket.timeout", timeout * 1000);
client.getParams().setParameter("http.connection.timeout", timeout * 1000);
client.getParams().setParameter("http.connection-manager.timeout", new Long(timeout * 1000));
client.getParams().setParameter("http.protocol.head-body-timeout", timeout * 1000);
}

final HttpResponse execute = client.execute(method);
logger.println("Response Code: " + execute.getStatusLine());
if (logResponseBody){
logger.println("Response: \n" + EntityUtils.toString(execute.getEntity()));
}

if (logResponseBody){
logger.println("Response: \n" + EntityUtils.toString(execute.getEntity()));
}

EntityUtils.consume(execute.getEntity());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class HttpRequestValidation {

public static FormValidation checkUrl(String value) {
try {
URL url = new URL(value);
new URL(value);
return FormValidation.ok();
} catch (MalformedURLException ex) {
return FormValidation.error("Invalid url");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,23 @@
*/
public class RequestAction extends AbstractDescribableImpl<RequestAction> {

private final String name;
private final URL url;
private final HttpMode mode;
private final List<NameValuePair> params;

@DataBoundConstructor
public RequestAction(URL url, HttpMode mode, List<NameValuePair> params) {
public RequestAction(String name, URL url, HttpMode mode, List<NameValuePair> params) {
this.name = name;
this.url = url;
this.mode = mode;
this.params = params == null ? new ArrayList<NameValuePair>() : params;
}

public String getName() {
return name;
}

public URL getUrl() {
return url;
}
Expand All @@ -53,6 +59,15 @@ public FormValidation doCheckUrl(@QueryParameter String value) {
return HttpRequestValidation.checkUrl(value);
}

public FormValidation doCheckTimeout(@QueryParameter String timeout) {
try {
Integer.parseInt(timeout);
return FormValidation.ok();
} catch (NumberFormatException e) {
return FormValidation.error("Not a number");
}
}

public ListBoxModel doFillModeItems() {
return HttpMode.getFillItems();
}
Expand Down
Loading