| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- <?php
- namespace Elastica\Transport;
- use Elastica\Connection;
- use Elastica\Exception\PartialShardFailureException;
- use Elastica\Exception\ResponseException;
- use Elastica\JSON;
- use Elastica\Request as ElasticaRequest;
- use Elastica\Response as ElasticaResponse;
- use Elastica\Util;
- use Ivory\HttpAdapter\HttpAdapterInterface;
- use Ivory\HttpAdapter\Message\Request as HttpAdapterRequest;
- use Ivory\HttpAdapter\Message\Response as HttpAdapterResponse;
- use Ivory\HttpAdapter\Message\Stream\StringStream;
- class HttpAdapter extends AbstractTransport
- {
- /**
- * @var HttpAdapterInterface
- */
- private $httpAdapter;
- /**
- * @var string
- */
- private $_scheme = 'http';
- /**
- * Construct transport.
- *
- * @param Connection $connection
- * @param HttpAdapterInterface $httpAdapter
- */
- public function __construct(Connection $connection = null, HttpAdapterInterface $httpAdapter)
- {
- parent::__construct($connection);
- $this->httpAdapter = $httpAdapter;
- }
- /**
- * Makes calls to the elasticsearch server.
- *
- * All calls that are made to the server are done through this function
- *
- * @param \Elastica\Request $elasticaRequest
- * @param array $params Host, Port, ...
- *
- * @throws \Elastica\Exception\ConnectionException
- * @throws \Elastica\Exception\ResponseException
- * @throws \Elastica\Exception\Connection\HttpException
- *
- * @return \Elastica\Response Response object
- */
- public function exec(ElasticaRequest $elasticaRequest, array $params)
- {
- $connection = $this->getConnection();
- if ($timeout = $connection->getTimeout()) {
- $this->httpAdapter->getConfiguration()->setTimeout($timeout);
- }
- $httpAdapterRequest = $this->_createHttpAdapterRequest($elasticaRequest, $connection);
- $start = microtime(true);
- $httpAdapterResponse = $this->httpAdapter->sendRequest($httpAdapterRequest);
- $end = microtime(true);
- $elasticaResponse = $this->_createElasticaResponse($httpAdapterResponse);
- $elasticaResponse->setQueryTime($end - $start);
- $elasticaResponse->setTransferInfo(
- [
- 'request_header' => $httpAdapterRequest->getMethod(),
- 'http_code' => $httpAdapterResponse->getStatusCode(),
- ]
- );
- if ($elasticaResponse->hasError()) {
- throw new ResponseException($elasticaRequest, $elasticaResponse);
- }
- if ($elasticaResponse->hasFailedShards()) {
- throw new PartialShardFailureException($elasticaRequest, $elasticaResponse);
- }
- return $elasticaResponse;
- }
- /**
- * @param HttpAdapterResponse $httpAdapterResponse
- *
- * @return ElasticaResponse
- */
- protected function _createElasticaResponse(HttpAdapterResponse $httpAdapterResponse)
- {
- return new ElasticaResponse((string) $httpAdapterResponse->getBody(), $httpAdapterResponse->getStatusCode());
- }
- /**
- * @param ElasticaRequest $elasticaRequest
- * @param Connection $connection
- *
- * @return HttpAdapterRequest
- */
- protected function _createHttpAdapterRequest(ElasticaRequest $elasticaRequest, Connection $connection)
- {
- $data = $elasticaRequest->getData();
- $body = null;
- $method = $elasticaRequest->getMethod();
- $headers = $connection->hasConfig('headers') ?: [];
- if (!empty($data) || '0' === $data) {
- if (ElasticaRequest::GET == $method) {
- $method = ElasticaRequest::POST;
- }
- if ($this->hasParam('postWithRequestBody') && true == $this->getParam('postWithRequestBody')) {
- $elasticaRequest->setMethod(ElasticaRequest::POST);
- $method = ElasticaRequest::POST;
- }
- if (is_array($data)) {
- $body = JSON::stringify($data, JSON_UNESCAPED_UNICODE);
- } else {
- $body = $data;
- }
- }
- $url = $this->_getUri($elasticaRequest, $connection);
- $streamBody = new StringStream($body);
- return new HttpAdapterRequest($url, $method, HttpAdapterRequest::PROTOCOL_VERSION_1_1, $headers, $streamBody);
- }
- /**
- * @param ElasticaRequest $request
- * @param \Elastica\Connection $connection
- *
- * @return string
- */
- protected function _getUri(ElasticaRequest $request, Connection $connection)
- {
- $url = $connection->hasConfig('url') ? $connection->getConfig('url') : '';
- if (!empty($url)) {
- $baseUri = $url;
- } else {
- $baseUri = $this->_scheme.'://'.$connection->getHost().':'.$connection->getPort().'/'.$connection->getPath();
- }
- $requestPath = $request->getPath();
- if (!Util::isDateMathEscaped($requestPath)) {
- $requestPath = Util::escapeDateMath($requestPath);
- }
- $baseUri .= $requestPath;
- $query = $request->getQuery();
- if (!empty($query)) {
- $baseUri .= '?'.http_build_query($query);
- }
- return $baseUri;
- }
- }
|