/**
* @param Gpf_Net_Http_Request $request
* @return Gpf_Net_Http_Response
*/
private function executeWithSocketOpen(Gpf_Net_Http_Request $request)
{
$scheme = $request->getScheme() == 'ssl' || $request->getScheme() == 'https' ? 'ssl://' : '';
$proxySocket = @fsockopen($scheme . $request->getHost(), $request->getPort(), $errorNr, $errorMessage, self::CONNECTION_TIMEOUT);
if ($proxySocket === false) {
$gpfErrorMessage = $this->_sys('Could not connect to server: %s:%s, Failed with error: %s', $request->getHost(), $request->getPort(), $errorMessage);
Gpf_Log::error($gpfErrorMessage);
throw new Gpf_Exception($gpfErrorMessage);
}
$requestText = $request->toString();
$result = @fwrite($proxySocket, $requestText);
if ($result === false || $result != strlen($requestText)) {
@fclose($proxySocket);
$gpfErrorMessage = $this->_sys('Could not send request to server %s:%s', $request->getHost(), $request->getPort());
Gpf_Log::error($gpfErrorMessage);
throw new Gpf_Exception($gpfErrorMessage);
}
$result = '';
while (false === @feof($proxySocket)) {
try {
if (false === ($data = @fread($proxySocket, 8192))) {
Gpf_Log::error($this->_sys('Could not read from proxy socket'));
throw new Gpf_Exception("could not read from proxy socket");
}
$result .= $data;
} catch (Exception $e) {
Gpf_Log::error($this->_sys('Proxy failed: %s', $e->getMessage()));
@fclose($proxySocket);
throw new Gpf_Exception($this->_('Proxy failed: %s', $e->getMessage()));
}
}
@fclose($proxySocket);
$response = new Gpf_Net_Http_Response();
$response->setResponseText($result);
return $response;
}