/**
* action for routing all requests directly to the third party API
*
* @param Request $request request
*
* @return \Psr\Http\Message\ResponseInterface|Response
*/
public function proxyAction(Request $request)
{
$api = $this->decideApiAndEndpoint($request->getUri());
$this->registerProxySources();
$url = $this->apiLoader->getEndpoint($api['endpoint'], true);
if (parse_url($url, PHP_URL_SCHEME) === false) {
$scheme = $request->getScheme();
$url = $scheme . '://' . $url;
}
$response = null;
try {
$newRequest = Request::create($url, $request->getMethod(), array(), array(), array(), array(), $request->getContent(false));
$newRequest->headers->add($request->headers->all());
$newRequest = $this->transformationHandler->transformRequest($api['apiName'], $api['endpoint'], $request, $newRequest);
$psrRequest = $this->diactorosFactory->createRequest($newRequest);
$psrRequest = $psrRequest->withUri($psrRequest->getUri()->withPort(parse_url($url, PHP_URL_PORT)));
$psrResponse = $this->proxy->forward($psrRequest)->to($this->getHostWithScheme($url));
$response = $this->httpFoundationFactory->createResponse($psrResponse);
$this->transformationHandler->transformResponse($api['apiName'], $api['endpoint'], $response, clone $response);
} catch (ClientException $e) {
$response = $e->getResponse();
} catch (ServerException $serverException) {
$response = $serverException->getResponse();
}
return $response;
}