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
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
Expand All @@ -61,9 +61,9 @@
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.ConfigurationPolicy;
Expand Down Expand Up @@ -117,6 +117,9 @@ String[] requests() default {
"--proxy proxyhost:2000 /path/example-timing-important.html => 200 && TIME < 2000"
};

@AttributeDefinition(name = "Default Request Options", description = "Curl-like options that are applied to every request spec, e.g. '-X HEAD --proxy proxyhost:2000'")
String defaultRequestOptions() default "";

@AttributeDefinition(name = "Connect Timeout", description = "Default connect timeout in ms. Can be overwritten per request with option --connect-timeout (in sec)")
int connectTimeoutInMs() default 7000;

Expand Down Expand Up @@ -151,7 +154,7 @@ String[] requests() default {
@Activate
public HttpRequestsCheck(Config config, BundleContext bundleContext) {
this.bundleContext = bundleContext;
this.requestSpecs = getRequestSpecs(config.requests());
this.requestSpecs = getRequestSpecs(config.requests(), config.defaultRequestOptions());
this.connectTimeoutInMs = config.connectTimeoutInMs();
this.readTimeoutInMs = config.readTimeoutInMs();
this.statusForFailedContraint = config.statusForFailedContraint();
Expand All @@ -173,6 +176,10 @@ String getDefaultBaseUrl() {
return defaultBaseUrl;
}

List<RequestSpec> getRequstSpecs() {
return requestSpecs;
}

private void registerServiceListener() {
try {
this.serviceListener = new ServiceListener() {
Expand Down Expand Up @@ -231,11 +238,11 @@ public Result execute() {

}

private List<RequestSpec> getRequestSpecs(String[] requestSpecStrArr) {
List<RequestSpec> requestSpecs = new ArrayList<RequestSpec>();
private List<RequestSpec> getRequestSpecs(String[] requestSpecStrArr, String defaultRequestOptions) {
List<RequestSpec> requestSpecs = new ArrayList<>();
for(String requestSpecStr: requestSpecStrArr) {
try {
RequestSpec requestSpec = new RequestSpec(requestSpecStr);
RequestSpec requestSpec = new RequestSpec(defaultRequestOptions + " " + requestSpecStr);
requestSpecs.add(requestSpec);
} catch(Exception e) {
configErrors.critical("Invalid config: {}", requestSpecStr);
Expand All @@ -252,17 +259,17 @@ static class RequestSpec {

String method = "GET";
String url;
Map<String,String> headers = new HashMap<String,String>();
Map<String,String> headers = new HashMap<>();
String data = null;

String user;

Integer connectTimeoutInMs;
Integer readTimeoutInMs;

Proxy proxy;
Proxy proxy = null;

List<ResponseCheck> responseChecks = new ArrayList<ResponseCheck>();
List<ResponseCheck> responseChecks = new ArrayList<>();

RequestSpec(String requestSpecStr) throws ParseException, URISyntaxException {

Expand Down Expand Up @@ -399,8 +406,13 @@ public FormattingResultLog check(String defaultBaseUrl, int connectTimeoutInMs,
}

String urlWithUser = user!=null ? user + " @ " + url: url;
log.debug("Checking {}", urlWithUser);
log.debug(" configured headers {}", headers.keySet());
log.debug("{} {}", method, urlWithUser);
if(!headers.isEmpty()) {
log.debug("- configured headers {}", headers.keySet());
}
if (proxy != null) {
log.debug("- using proxy {}", proxy);
}

Response response = null;
try {
Expand Down Expand Up @@ -434,7 +446,7 @@ public Response performRequest(String defaultBaseUrl, String urlWithUser, int co
URL effectiveUrl;
if(url.startsWith("/")) {
effectiveUrl = new URL(defaultBaseUrl + url);
log.debug("Effective URL: {}", effectiveUrl);
log.debug("- effective URL: {}", effectiveUrl);
} else {
effectiveUrl = new URL(url);
}
Expand All @@ -459,7 +471,7 @@ private HttpURLConnection openConnection(int defaultConnectTimeoutInMs, int defa

int effectiveConnectTimeout = this.connectTimeoutInMs !=null ? this.connectTimeoutInMs : defaultConnectTimeoutInMs;
int effectiveReadTimeout = this.readTimeoutInMs !=null ? this.readTimeoutInMs : defaultReadTimeoutInMs;
log.debug("connectTimeout={}ms readTimeout={}ms", effectiveConnectTimeout, effectiveReadTimeout);
log.debug("- connectTimeout={}ms readTimeout={}ms", effectiveConnectTimeout, effectiveReadTimeout);
conn.setConnectTimeout(effectiveConnectTimeout);
conn.setReadTimeout(effectiveReadTimeout);

Expand All @@ -486,6 +498,7 @@ private Response readResponse(HttpURLConnection conn, FormattingResultLog log) t
String actualResponseMessage = conn.getResponseMessage();
log.debug("Result: {} {}", actualResponseCode, actualResponseMessage);
Map<String, List<String>> responseHeaders = conn.getHeaderFields();
log.debug(" - response headers: {}", responseHeaders.keySet().stream().filter(Objects::nonNull).sorted().collect(Collectors.joining(", ")));

StringWriter responseEntityWriter = new StringWriter();
try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,36 @@ public void testRequestSpecParsingPost() throws Exception {
assertThat(proxyAddress, containsString("proxy"));
assertThat(proxyAddress, containsString(":2000"));
}


@Test
public void testDefaultRequestOptionsAppliedToSpecs() throws Exception {
HttpRequestsCheck httpRequestsCheck = new HttpRequestsCheck(
createConfigWithDefaults("/path/to/page.html", "-X HEAD -H \"X-Test: Default\" -H \"Accept: text/plain\""),
Mockito.mock(BundleContext.class));

RequestSpec requestSpec = httpRequestsCheck.getRequstSpecs().get(0);
assertEquals("/path/to/page.html", requestSpec.url);
assertEquals("HEAD", requestSpec.method);
HashMap<String, String> expectedHeaders = new HashMap<String,String>();
expectedHeaders.put("X-Test", "Default");
expectedHeaders.put("Accept", "text/plain");
assertEquals(expectedHeaders, requestSpec.headers);
}

@Test
public void testDefaultRequestOptionsOverriddenByRequestSpec() throws Exception {
HttpRequestsCheck httpRequestsCheck = new HttpRequestsCheck(
createConfigWithDefaults("-X POST -H \"X-Test: Specific\" /path/to/page.html", "-H \"X-Test: Default\""),
Mockito.mock(BundleContext.class));

RequestSpec requestSpec = httpRequestsCheck.getRequstSpecs().get(0);
assertEquals("/path/to/page.html", requestSpec.url);
assertEquals("POST", requestSpec.method);
HashMap<String, String> expectedHeaders = new HashMap<String,String>();
expectedHeaders.put("X-Test", "Specific");
assertEquals(expectedHeaders, requestSpec.headers);
}

@Test
public void testSimpleRequestSpec() throws Exception {

Expand Down Expand Up @@ -220,6 +249,10 @@ public void testRelativeUrlWithoutHttpServiceReturnsUnavailableLog() throws Exce
}

private HttpRequestsCheck.Config createConfig() {
return createConfigWithDefaults("/path/to/page.html", "");
}

private HttpRequestsCheck.Config createConfigWithDefaults(String requestSpec, String defaultRequestOptions) {
return new HttpRequestsCheck.Config() {
@Override
public String hc_name() {
Expand All @@ -233,7 +266,12 @@ public String[] hc_tags() {

@Override
public String[] requests() {
return new String[] { "/path/to/page.html" };
return new String[] { requestSpec };
}

@Override
public String defaultRequestOptions() {
return defaultRequestOptions;
}

@Override
Expand Down Expand Up @@ -268,5 +306,4 @@ public Class<? extends java.lang.annotation.Annotation> annotationType() {
};
}


}