private Object prepareAndCall()

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();
    }