in git-common/src/main/java/jetbrains/buildServer/buildTriggers/vcs/git/gitProxy/GitApiClientFactoryBase.java [90:167]
private Object prepareAndCall(Method method, Map<String, Object> namedArgs, Consumer<Map<String, Object>> additionalArgsBuilder) throws URISyntaxException {
Map<String, Object> payloadArgs = new HashMap<>();
payloadArgs.put("class", myClass.getSimpleName());
payloadArgs.put("method", method.getName());
payloadArgs.put("args", namedArgs);
additionalArgsBuilder.accept(payloadArgs);
String payload = myGson.toJson(payloadArgs);
AtomicReference<Exception> exception = new AtomicReference<>();
AtomicInteger responseCode = new AtomicInteger();
AtomicReference<Object> responseObject = new AtomicReference<>();
AtomicReference<String> responseErrorBody = new AtomicReference<>();
Map<String, String> headers = new HashMap<>(myHeaders);
String operationId = myRequestContext.getOperationId();
String requestId = "teamcity" + operationId + "_" + UUID.randomUUID();
headers.put("X-Request-ID", requestId);
LOG.info(String.format("Starting request with ID: %s. Operation id %s", requestId, operationId));
long startTime = System.currentTimeMillis();
int connectTimeoutMs = myGitProxySettings.getConnectTimeoutMs();
int retryNum = 0;
while (System.currentTimeMillis() - startTime < myGitProxySettings.getTimeoutMs() && retryNum <= myGitProxySettings.getConnectRetryCnt()) {
exception.set(null);
responseCode.set(0);
responseObject.set(null);
responseErrorBody.set(null);
HTTPRequestBuilder.Request request = new HTTPRequestBuilder(myEndpoint)
.withTimeout(myGitProxySettings.getTimeoutMs())
.withConnectionTimeoutMs(connectTimeoutMs)
.withPreemptiveAuthentication(true)
.withHeader(headers)
.withTrustStore(myTrustStoreProvider.getTrustStore())
.withMaxConnections(TeamCityProperties.getInteger(CLIENT_MAX_CONNECTIONS, CLIENT_MAX_CONNECTIONS_DEFAULT))
.withData(payload.getBytes(StandardCharsets.UTF_8))
.withMethod("POST")
.onException(ex -> {
exception.set(ex);
})
.onErrorResponse(response -> {
responseCode.set(response.getStatusCode());
responseErrorBody.set(response.getBodyAsString());
})
.onSuccess(response -> {
responseCode.set(response.getStatusCode());
InputStream bodyStream = response.getContentStream();
responseObject.set(myGson.fromJson(
new InputStreamReader(Objects.requireNonNull(bodyStream, "response body should not be empty")), method.getGenericReturnType()));
})
.build();
IOGuard.allowNetworkCall(() -> myClient.doRequest(request));
Exception ex = exception.get();
if (ex != null && ex instanceof ConnectTimeoutException) {
connectTimeoutMs *= 2;
retryNum++;
} else {
break;
}
}
if (responseCode.get() != 200 || exception.get() != null) {
LOG.warn(String.format("Git proxy request to %s failed in %d ms.%s%s%s%s Operation id %s",
myEndpoint,
System.currentTimeMillis() - startTime,
responseCode.get() != 0 ? " Response code: " + responseCode.get() + "." : "",
responseErrorBody.get() != null ? " Body: " + responseErrorBody.get() + "." : "",
exception.get() != null ? " Exception: " + exception.get().toString() + "." : "",
getRequestDump(payload),
operationId));
throw new GitApiException("Api request failed", responseCode.get(), responseErrorBody.get(), exception.get());
}
return responseObject.get();
}