public function sendRequest(RequestInterface $request, ProxyInterface $proxy = null, CookieJarInterface $cookieJar = null)
 {
     $commandOptions = $this->phantomJsOptions;
     if ($proxy) {
         $proxyHost = $proxy->getHost() . ':' . $proxy->getPort();
         $commandOptions[] = '--proxy=' . $proxyHost;
         if ($user = $proxy->getUser()) {
             $proxyAuth = $user;
             if ($password = $proxy->getPassword()) {
                 $proxyAuth .= ':' . $password;
             }
             $commandOptions[] = '--proxy-auth=' . $proxyAuth;
         }
         if ($proxy->getType() == 'SOCKS5') {
             $commandOptions[] = '--proxy-type=socks5';
         } elseif ($proxy->getType() == 'SOCKS4') {
             throw new Exception('SOCKS4 proxy are not supported by phantomjs');
         }
     }
     $initialUrl = (string) $request->getUri();
     $commandArg = ['method' => $request->getMethod(), 'url' => $initialUrl, 'headers' => []];
     foreach ($request->getHeaders() as $headerName => $headerValues) {
         $commandArg['headers'][$headerName] = implode(',', $headerValues);
     }
     $data = (string) $request->getBody();
     if ($data) {
         $commandArg['data'] = $data;
     }
     $scriptFile = __DIR__ . '/phantomjs.js';
     $commandOptions = implode(' ', $commandOptions);
     $commandArg = json_encode($commandArg);
     $process = new Process("{$this->phantomJS} {$commandOptions} {$scriptFile} '{$commandArg}'");
     $process->run();
     if (!$process->isSuccessful()) {
         throw new ProcessFailedException($process);
     }
     $dataResponse = json_decode($process->getOutput(), true);
     if (!$dataResponse) {
         throw new Exception('Unable to parse Phantomjs response: ' . json_last_error_msg());
     }
     $response = new SearchEngineResponse($dataResponse['headers'], $dataResponse['status'], $dataResponse['content'], true, UrlArchive::fromString($initialUrl), UrlArchive::fromString($dataResponse['url']), $proxy);
     return $response;
 }
 /**
  * @inheritdoc
  */
 public function sendRequest(RequestInterface $request, ProxyInterface $proxy = null, CookieJarInterface $cookieJar = null)
 {
     if ($proxy) {
         $proxyHost = $proxy->getHost();
         $proxyPort = $proxy->getPort();
         $proxyType = $proxy->getType();
         switch ($proxyType) {
             case 'SOCKS4':
                 $this->client->setOption(CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
                 break;
             case 'SOCKS5':
                 $this->client->setOption(CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
                 break;
             default:
                 $this->client->setOption(CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
                 break;
         }
         if ($user = $proxy->getUser()) {
             $proxyAuth = $user;
             if ($password = $proxy->getPassword()) {
                 $proxyAuth .= ':' . $password;
             }
         } else {
             $proxyAuth = null;
         }
         $this->client->setOption(CURLOPT_PROXY, $proxyHost);
         $this->client->setOption(CURLOPT_PROXYPORT, $proxyPort);
         if ($proxyAuth) {
             $this->client->setOption(CURLOPT_PROXYUSERPWD, $proxyAuth);
         } else {
             $this->client->removeOption(CURLOPT_PROXYUSERPWD);
         }
     } else {
         $this->client->removeOption(CURLOPT_PROXY);
         $this->client->removeOption(CURLOPT_PROXYPORT);
         $this->client->removeOption(CURLOPT_PROXYUSERPWD);
     }
     if ($cookieJar) {
         $cookieFileData = CookieFile::generate($cookieJar->all());
         $cookieFile = tempnam(sys_get_temp_dir(), 'serps_curlcookie');
         file_put_contents($cookieFile, $cookieFileData);
         $cookieJarFile = tempnam(sys_get_temp_dir(), 'serps_curlcookiejar');
         $this->client->setOption(CURLOPT_COOKIEFILE, $cookieFile);
         $this->client->setOption(CURLOPT_COOKIEJAR, $cookieJarFile);
     } else {
         $this->client->removeOption(CURLOPT_COOKIEFILE);
         $this->client->removeOption(CURLOPT_COOKIEJAR);
     }
     try {
         $rawResponse = $this->client->request($request);
         $headerSize = $this->client->getInfo(CURLINFO_HEADER_SIZE);
         $effectiveUrl = UrlArchive::fromString($this->client->getInfo(CURLINFO_EFFECTIVE_URL));
         $initialUrl = UrlArchive::fromString((string) $request->getUri());
         $this->client->close();
         if ($cookieJar) {
             $cookieJarData = file_get_contents($cookieJarFile);
             $cookies = CookieFile::parse($cookieJarData);
             foreach ($cookies as $cookie) {
                 $cookieJar->set($cookie);
             }
         }
         return ResponseBuilder::buildResponse($rawResponse, $headerSize, $initialUrl, $effectiveUrl, $proxy);
     } catch (\Exception $e) {
         throw $e;
     } finally {
         if ($cookieJar) {
             unlink($cookieFile);
             unlink($cookieJarFile);
         }
     }
 }