in server/src/main/java/com/epam/aidial/core/server/controller/DeploymentPostController.java [328:378]
private void handleProxyResponse(HttpClientResponse proxyResponse) {
UpstreamRoute upstreamRoute = context.getUpstreamRoute();
Upstream currentUpstream = upstreamRoute.get();
log.info("Received header from origin. Trace: {}. Span: {}. Project: {}. Deployment: {}. Endpoint: {}. Upstream: {}. Status: {}. Headers: {}",
context.getTraceId(), context.getSpanId(),
context.getProject(), context.getDeployment().getName(),
context.getDeployment().getEndpoint(), currentUpstream == null ? "N/A" : currentUpstream.getEndpoint(),
proxyResponse.statusCode(), proxyResponse.headers().size());
int responseStatusCode = proxyResponse.statusCode();
if (isRetriableError(responseStatusCode)) {
upstreamRoute.fail(proxyResponse);
// get next upstream
if (canRetry(upstreamRoute)) {
sendRequest(); // try next
}
return;
}
if (responseStatusCode == 200) {
upstreamRoute.succeed();
} else {
// mark the upstream as failed
// and the next time we will select another one
upstreamRoute.fail(proxyResponse);
}
CollectResponseAttachmentsFn handler = context.isStreamingRequest() ? new CollectResponseAttachmentsFn(proxy, context) : null;
BufferingReadStream responseStream = new BufferingReadStream(proxyResponse,
ProxyUtil.contentLength(proxyResponse, 1024), handler);
context.setProxyResponse(proxyResponse);
context.setProxyResponseTimestamp(System.currentTimeMillis());
context.setResponseStream(responseStream);
HttpServerResponse response = context.getResponse();
response.setChunked(true);
response.setStatusCode(proxyResponse.statusCode());
ProxyUtil.copyHeaders(proxyResponse.headers(), response.headers());
response.putHeader(Proxy.HEADER_UPSTREAM_ATTEMPTS, Integer.toString(upstreamRoute.getAttemptCount()));
responseStream.pipe()
.endOnFailure(false)
.endOnSuccess(false)
.to(response)
.onSuccess(ignored -> handleResponse(responseStream))
.onFailure(this::handleResponseError);
}