in src/com/intellij/idea/plugin/hybris/tools/remote/http/AbstractHybrisHacHttpClient.java [142:212]
public final HttpResponse post(
@NotNull final Project project,
@NotNull final String actionUrl,
@NotNull final List<BasicNameValuePair> params,
final boolean canReLoginIfNeeded,
final long timeout,
final RemoteConnectionSettings settings
) {
var cookies = cookiesPerSettings.get(settings);
if (cookies == null || !cookies.containsKey(COOKIE_JSESSIONID)) {
final String errorMessage = login(project, settings);
if (StringUtils.isNotBlank(errorMessage)) {
return createErrorResponse(errorMessage);
}
}
cookies = cookiesPerSettings.get(settings);
final var sessionId = cookies.get(COOKIE_JSESSIONID);
final var csrfToken = getCsrfToken(settings.getGeneratedURL(), settings);
if (csrfToken == null) {
cookiesPerSettings.remove(settings);
if (canReLoginIfNeeded) {
return post(project, actionUrl, params, false, timeout, settings);
}
return createErrorResponse("Unable to obtain csrfToken for sessionId=" + sessionId);
}
final var client = createAllowAllClient(timeout);
if (client == null) {
return createErrorResponse("Unable to create HttpClient");
}
final var post = new HttpPost(actionUrl);
final var cookie = cookies.entrySet().stream()
.map(it -> it.getKey() + '=' + it.getValue())
.collect(Collectors.joining("; "));
post.setHeader("User-Agent", HttpHeaders.USER_AGENT);
post.setHeader("X-CSRF-TOKEN", csrfToken);
post.setHeader("Cookie", cookie);
post.setHeader("Accept", "application/json");
post.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
post.setHeader("Sec-Fetch-Dest", "empty");
post.setHeader("Sec-Fetch-Mode", "cors");
post.setHeader("Sec-Fetch-Site", "same-origin");
final HttpResponse response;
try {
post.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8));
response = client.execute(post);
} catch (IOException e) {
LOG.warn(e.getMessage(), e);
return createErrorResponse(e.getMessage());
}
final var statusCode = response.getStatusLine().getStatusCode();
final var needsLogin = switch (statusCode) {
case HttpStatus.SC_FORBIDDEN,
HttpStatus.SC_METHOD_NOT_ALLOWED -> true;
case HttpStatus.SC_MOVED_TEMPORARILY -> {
final var location = response.getFirstHeader("Location");
yield location != null && location.getValue().contains("login");
}
default -> false;
};
if (needsLogin) {
cookiesPerSettings.remove(settings);
if (canReLoginIfNeeded) {
return post(project, actionUrl, params, false, DEFAULT_HAC_TIMEOUT, settings);
}
}
return response;
}