/** * @return Client */ public function build() { $this->buildLoggers(); if (is_null($this->handler)) { $this->handler = ClientBuilder::defaultHandler(); } $sslOptions = null; if (isset($this->sslKey)) { $sslOptions['ssl_key'] = $this->sslKey; } if (isset($this->sslCert)) { $sslOptions['cert'] = $this->sslCert; } if (isset($this->sslVerification)) { $sslOptions['verify'] = $this->sslVerification; } if (!is_null($sslOptions)) { $sslHandler = function (callable $handler, array $sslOptions) { return function (array $request) use($handler, $sslOptions) { // Add our custom headers foreach ($sslOptions as $key => $value) { $request['client'][$key] = $value; } // Send the request using the handler and return the response. return $handler($request); }; }; $this->handler = $sslHandler($this->handler, $sslOptions); } if (is_null($this->serializer)) { $this->serializer = new SmartSerializer(); } elseif (is_string($this->serializer)) { $this->serializer = new $this->serializer(); } if (is_null($this->connectionFactory)) { $connectionParams = []; $this->connectionFactory = new ConnectionFactory($this->handler, $connectionParams, $this->serializer, $this->logger, $this->tracer); } if (is_null($this->hosts)) { $this->hosts = $this->getDefaultHost(); } if (is_null($this->selector)) { $this->selector = new Selectors\RoundRobinSelector(); } elseif (is_string($this->selector)) { $this->selector = new $this->selector(); } $this->buildTransport(); if (is_null($this->endpoint)) { $transport = $this->transport; $serializer = $this->serializer; $this->endpoint = function ($class) use($transport, $serializer) { $fullPath = '\\Elasticsearch\\Endpoints\\' . $class; if ($class === 'Bulk' || $class === 'Msearch' || $class === 'MPercolate') { return new $fullPath($transport, $serializer); } else { return new $fullPath($transport); } }; } return new Client($this->transport, $this->endpoint); }