public static function makeRequest(HttpRequest $request) { $requestUri = $request->getRequestUri()->getUri(); // if the request is towards a file URL, return the response constructed // from file if (0 === strpos($requestUri, "file:///")) { return HttpResponse::fromFile($requestUri); } $httpResponse = new HttpResponse(); $curlChannel = curl_init(); curl_setopt($curlChannel, CURLOPT_URL, $requestUri); curl_setopt($curlChannel, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curlChannel, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curlChannel, CURLOPT_TIMEOUT, 10); if ($request->getRequestMethod() === "POST") { curl_setopt($curlChannel, CURLOPT_POST, 1); curl_setopt($curlChannel, CURLOPT_POSTFIELDS, $request->getContent()); } $basicAuthUser = $request->getBasicAuthUser(); $basicAuthPass = $request->getBasicAuthPass(); if (NULL !== $basicAuthUser) { $request->setHeader("Authorization", "Basic " . base64_encode($basicAuthUser . ":" . $basicAuthPass)); } // Including HTTP headers in request $headers = $request->getHeaders(TRUE); if (!empty($headers)) { curl_setopt($curlChannel, CURLOPT_HTTPHEADER, $headers); } // Connect to SSL/TLS server, validate certificate and host if ($request->getRequestUri()->getScheme() === "https") { curl_setopt($curlChannel, CURLOPT_SSL_VERIFYPEER, 1); curl_setopt($curlChannel, CURLOPT_SSL_VERIFYHOST, 2); } // Callback to extract all the HTTP headers from the response... // In order to really correctly parse HTTP headers one would have to look at RFC 2616... curl_setopt($curlChannel, CURLOPT_HEADERFUNCTION, function ($curlChannel, $header) use($httpResponse) { // Ignore Status-Line (RFC 2616, section 6.1) if (0 === preg_match('|^HTTP/\\d+.\\d+ [1-5]\\d\\d|', $header)) { // Only deal with header lines that contain a colon if (strpos($header, ":") !== FALSE) { // Only deal with header lines that contain a colon list($key, $value) = explode(":", trim($header)); $httpResponse->setHeader(trim($key), trim($value)); } } return strlen($header); }); $output = curl_exec($curlChannel); if ($errorNumber = curl_errno($curlChannel)) { throw new OutgoingHttpRequestException(curl_error($curlChannel)); } $httpResponse->setStatusCode(curl_getinfo($curlChannel, CURLINFO_HTTP_CODE)); $httpResponse->setContent($output); curl_close($curlChannel); return $httpResponse; }
/** * Sends the response using the result * * @param mixed $result Result * @return void */ public function send($result = null) { if ($result instanceof HttpResponse) { $result->send(); exit; } // Output the result if (!$result instanceof GenericResult) { $result = new SuccessResult($result); } $result = elgg_trigger_plugin_hook('result', 'graph', null, $result); $output = elgg_view('graph/output', array('result' => $result)); if (elgg_get_viewtype() === 'default') { $layout = elgg_view_layout('one_column', array('content' => $output)); $output = elgg_view_page('', $layout); } $this->response->setStatusCode($result->getStatusCode())->setContent($output)->prepare($this->request)->send(); exit; }
/** * Test's the status line getter with a non existing http status code */ public function testGetResponseStatusLineWithNonExistingHttpStatusCode() { $this->response->setStatusCode(999); $this->assertSame("HTTP/1.1 999 Unassigned\r\n", $this->response->getStatusLine()); }
/** * @covers \http\HttpResponse::setStatusCode */ public function testSetStatusCode() { $this->object->setStatusCode(301); $code = $this->object->getStatusCode(); $this->assertEquals(301, $code, 'Status code should be 301'); }