mirror of
https://github.com/scm-manager/scm-manager.git
synced 2026-01-03 14:19:47 +01:00
Merge pull request #1430 from scm-manager/feature/ignore_codes_on_tracing
Enhance trace api with accepted status codes
This commit is contained in:
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- Delete branches directly in the UI ([#1422](https://github.com/scm-manager/scm-manager/pull/1422))
|
||||
- Lookup command which provides further repository information ([#1415](https://github.com/scm-manager/scm-manager/pull/1415))
|
||||
- Include messages from scm protocol in modification or merge errors ([#1420](https://github.com/scm-manager/scm-manager/pull/1420))
|
||||
- Enhance trace api to accepted status codes ([#1430](https://github.com/scm-manager/scm-manager/pull/1430))
|
||||
|
||||
### Fixed
|
||||
- Missing close of hg diff command ([#1417](https://github.com/scm-manager/scm-manager/pull/1417))
|
||||
|
||||
@@ -257,6 +257,22 @@ public abstract class BaseHttpRequest<T extends BaseHttpRequest>
|
||||
return self();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the response codes which should be traced as successful.
|
||||
*
|
||||
* Example: If 400 is set as {@link #acceptedStatusCodes} then all requests
|
||||
* which get a response with status code 400 will be traced as successful (not failed) request
|
||||
*
|
||||
* @param codes status codes which should be traced as successful
|
||||
* @return request instance
|
||||
*
|
||||
* @since 2.10.0
|
||||
*/
|
||||
public T acceptStatusCodes(int... codes) {
|
||||
this.acceptedStatusCodes = codes;
|
||||
return self();
|
||||
}
|
||||
|
||||
/**
|
||||
* Disables tracing for the request.
|
||||
* This should only be done for internal requests.
|
||||
@@ -314,6 +330,18 @@ public abstract class BaseHttpRequest<T extends BaseHttpRequest>
|
||||
return spanKind;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the response codes which are accepted as successful by tracer.
|
||||
*
|
||||
* @return codes
|
||||
*
|
||||
* @since 2.10.0
|
||||
*/
|
||||
public int[] getAcceptedStatus() {
|
||||
return acceptedStatusCodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the request decodes gzip compression.
|
||||
*
|
||||
@@ -434,4 +462,7 @@ public abstract class BaseHttpRequest<T extends BaseHttpRequest>
|
||||
|
||||
/** kind of span for trace api */
|
||||
private String spanKind = "HTTP Request";
|
||||
|
||||
/** codes which will be marked as successful by tracer */
|
||||
private int[] acceptedStatusCodes = new int[]{};
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@ import java.io.OutputStream;
|
||||
import java.net.*;
|
||||
import java.security.KeyManagementException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Set;
|
||||
|
||||
//~--- JDK imports ------------------------------------------------------------
|
||||
@@ -206,7 +207,7 @@ public class DefaultAdvancedHttpClient extends AdvancedHttpClient
|
||||
try {
|
||||
DefaultAdvancedHttpResponse response = doRequest(request);
|
||||
span.label("status", response.getStatus());
|
||||
if (!response.isSuccessful()) {
|
||||
if (isFailedRequest(request, response)) {
|
||||
span.failed();
|
||||
}
|
||||
return response;
|
||||
@@ -219,6 +220,13 @@ public class DefaultAdvancedHttpClient extends AdvancedHttpClient
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isFailedRequest(BaseHttpRequest<?> request, AdvancedHttpResponse responseStatus) {
|
||||
if (Arrays.stream(request.getAcceptedStatus()).anyMatch(code -> code == responseStatus.getStatus())) {
|
||||
return false;
|
||||
}
|
||||
return !responseStatus.isSuccessful();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private DefaultAdvancedHttpResponse doRequest(BaseHttpRequest<?> request) throws IOException {
|
||||
HttpURLConnection connection = openConnection(request, new URL(request.getUrl()));
|
||||
|
||||
@@ -317,6 +317,28 @@ public class DefaultAdvancedHttpClientTest
|
||||
verify(tracer, never()).span(anyString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldNotTraceRequestIfAcceptedResponseCode() throws IOException {
|
||||
when(connection.getResponseCode()).thenReturn(400);
|
||||
|
||||
new AdvancedHttpRequest(client, HttpMethod.GET, "https://www.scm-manager.org").acceptStatusCodes(400).request();
|
||||
verify(tracer).span("HTTP Request");
|
||||
verify(span).label("status", 400);
|
||||
verify(span, never()).failed();
|
||||
verify(span).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldTraceRequestAsFailedIfAcceptedResponseCodeDoesntMatch() throws IOException {
|
||||
when(connection.getResponseCode()).thenReturn(401);
|
||||
|
||||
new AdvancedHttpRequest(client, HttpMethod.GET, "https://www.scm-manager.org").acceptStatusCodes(400).request();
|
||||
verify(tracer).span("HTTP Request");
|
||||
verify(span).label("status", 401);
|
||||
verify(span).failed();
|
||||
verify(span).close();
|
||||
}
|
||||
|
||||
|
||||
//~--- set methods ----------------------------------------------------------
|
||||
|
||||
@@ -328,7 +350,7 @@ public class DefaultAdvancedHttpClientTest
|
||||
public void setUp()
|
||||
{
|
||||
configuration = new ScmConfiguration();
|
||||
transformers = new HashSet<ContentTransformer>();
|
||||
transformers = new HashSet<>();
|
||||
client = new TestingAdvacedHttpClient(configuration, transformers);
|
||||
when(tracer.span(anyString())).thenReturn(span);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user