/** * @param string $url * @param string $method * @param Response $response * @return void */ public function logApiCall($url, $method, Response $response) { if ($this->settings['gitApi']['requestListener']['log'] === TRUE) { $directory = $this->getLogDirectory(); file_put_contents($directory . '/SurfCaptain_Request.log', $method . '_' . $url . "\n", FILE_APPEND); file_put_contents($directory . '/SurfCaptain_Request.log', $response->getContent() . "\n", FILE_APPEND); } }
/** * */ public function __construct($message, $code, \TYPO3\Flow\Http\Response $response, \TYPO3\Flow\Http\Request $request = NULL, \Exception $previous = NULL) { $this->response = $response; $this->request = $request; if ($request !== NULL) { $message = sprintf("[%s %s]: %s\n\nRequest data: %s", $request->getMethod(), $request->getUri(), $message . '; Response body: ' . $response->getContent(), $request->getContent()); } parent::__construct($message, $code, $previous); }
/** * Just return the processed value * * @return mixed */ public function evaluate() { $httpResponse = new Response(); $httpResponse->setStatus($this->getStatusCode()); $httpResponse->setHeaders(new Headers()); foreach ($this->getHeaders() as $name => $value) { $httpResponse->setHeader($name, $value); } return implode("\r\n", $httpResponse->renderHeaders()) . "\r\n\r\n"; }
/** * Starts the authentication by redirecting to the SSO endpoint * * The redirect includes the callback URI (the original URI from the given request) * the client identifier and a signature of the arguments with the client private key. * * @param \TYPO3\Flow\Http\Request $request The current request * @param \TYPO3\Flow\Http\Response $response The current response * @return void */ public function startAuthentication(Request $request, Response $response) { $callbackUri = $request->getUri(); if (!isset($this->options['server'])) { throw new Exception('Missing "server" option for SingleSignOnRedirect entry point. Please specifiy one using the entryPointOptions setting.', 1351690358); } $ssoServer = $this->ssoServerFactory->create($this->options['server']); $ssoClient = $this->ssoClientFactory->create(); $redirectUri = $ssoServer->buildAuthenticationEndpointUri($ssoClient, $callbackUri); $response->setStatus(303); $response->setHeader('Location', $redirectUri); }
/** * Echoes an exception for the web. * * @param \Exception $exception The exception * @return void */ protected function echoExceptionWeb(\Exception $exception) { if ($exception instanceof Exception) { $statusCode = 400; $json = ['status' => 'invalid_request', 'reason' => $exception->getMessage()]; } elseif ($exception instanceof \TYPO3\Flow\Security\Exception) { $statusCode = 403; $json = ['status' => 'unauthorized', 'reason' => $exception->getMessage()]; } else { $statusCode = 500; if ($exception instanceof FlowException) { $statusCode = $exception->getStatusCode(); } $json = ['status' => 'error', 'reason' => $exception->getMessage(), 'errorClass' => get_class($exception)]; } if ($exception->getPrevious() !== NULL) { $json['previous'] = $exception->getPrevious()->getMessage(); } $json['stacktrace'] = explode("\n", $exception->getTraceAsString()); $statusMessage = Response::getStatusMessageByCode($statusCode); if (!headers_sent()) { header(sprintf('HTTP/1.1 %s %s', $statusCode, $statusMessage)); header('Content-Type: application/json'); } print json_encode($json); }
/** * Sends the specified HTTP status immediately. * * NOTE: This method only supports web requests and will throw an exception if used with other request types. * * @param integer $statusCode The HTTP status code * @param string $statusMessage A custom HTTP status message * @param string $content Body content which further explains the status * @throws \TYPO3\Flow\Mvc\Exception\UnsupportedRequestTypeException If the request is not a web request * @throws \TYPO3\Flow\Mvc\Exception\StopActionException * @api */ protected function throwStatus($statusCode, $statusMessage = null, $content = null) { $this->response->setStatus($statusCode, $statusMessage); if ($content === null) { $content = $this->response->getStatus(); } $this->response->setContent($content); throw new \TYPO3\Flow\Mvc\Exception\StopActionException(); }
/** * @test */ public function throwStatusSetsTheStatusMessageAsContentIfNoFurtherContentIsProvided() { $controller = $this->getAccessibleMock(\TYPO3\Flow\Mvc\Controller\AbstractController::class, array('processRequest')); $controller->_call('initializeController', $this->mockActionRequest, $this->mockHttpResponse); $this->mockHttpResponse->expects($this->atLeastOnce())->method('setStatus')->with(404, null); $this->mockHttpResponse->expects($this->atLeastOnce())->method('getStatus')->will($this->returnValue('404 Not Found')); $this->mockHttpResponse->expects($this->atLeastOnce())->method('setContent')->with('404 Not Found'); try { $controller->_call('throwStatus', 404); } catch (\TYPO3\Flow\Mvc\Exception\StopActionException $e) { } }
/** * Redirects the web request to another uri. * * NOTE: This method only supports web requests and will throw an exception * if used with other request types. * * @param mixed $uri Either a string representation of a URI or a \TYPO3\Flow\Http\Uri object * @param integer $delay (optional) The delay in seconds. Default is no delay. * @param integer $statusCode (optional) The HTTP status code for the redirect. Default is "303 See Other" * @return void * @throws \TYPO3\Flow\Mvc\Exception\StopActionException * @api */ protected function redirectToUri($uri, $delay = 0, $statusCode = 303) { // the parent method throws the exception, but we need to act afterwards // thus the code in catch - it's the expected state try { parent::redirectToUri($uri, $delay, $statusCode); } catch (\TYPO3\Flow\Mvc\Exception\StopActionException $exception) { if ($this->request->getFormat() === 'json') { $this->response->setContent(''); } throw $exception; } }
/** * Starts the authentication: Redirect to login page * * @param \TYPO3\Flow\Http\Request $request The current request * @param \TYPO3\Flow\Http\Response $response The current response * @return void * @throws MissingConfigurationException */ public function startAuthentication(Request $request, Response $response) { if (isset($this->options['routeValues'])) { $routeValues = $this->options['routeValues']; if (!is_array($routeValues)) { throw new MissingConfigurationException(sprintf('The configuration for the WebRedirect authentication entry point is incorrect. "routeValues" must be an array, got "%s".', gettype($routeValues)), 1345040415); } $actionRequest = new ActionRequest($request); $this->uriBuilder->setRequest($actionRequest); $actionName = $this->extractRouteValue($routeValues, '@action'); $controllerName = $this->extractRouteValue($routeValues, '@controller'); $packageKey = $this->extractRouteValue($routeValues, '@package'); $subPackageKey = $this->extractRouteValue($routeValues, '@subpackage'); $uri = $this->uriBuilder->setCreateAbsoluteUri(true)->uriFor($actionName, $routeValues, $controllerName, $packageKey, $subPackageKey); } elseif (isset($this->options['uri'])) { $uri = strpos($this->options['uri'], '://') !== false ? $this->options['uri'] : $request->getBaseUri() . $this->options['uri']; } else { throw new MissingConfigurationException('The configuration for the WebRedirect authentication entry point is incorrect or missing. You need to specify either the target "uri" or "routeValues".', 1237282583); } $response->setContent(sprintf('<html><head><meta http-equiv="refresh" content="0;url=%s"/></head></html>', htmlentities($uri, ENT_QUOTES, 'utf-8'))); $response->setStatus(303); $response->setHeader('Location', $uri); }
/** * Handles a HTTP request * * @return void */ public function handleRequest() { // Create the request very early so the Resource Management has a chance to grab it: $this->request = Request::createFromEnvironment(); $this->response = new Response(); $this->boot(); $this->resolveDependencies(); if (isset($this->settings['http']['baseUri'])) { $this->request->setBaseUri(new Uri($this->settings['http']['baseUri'])); } $componentContext = new ComponentContext($this->request, $this->response); $this->baseComponentChain->handle($componentContext); $this->response->send(); $this->bootstrap->shutdown(Bootstrap::RUNLEVEL_RUNTIME); $this->exit->__invoke(); }
/** * Handles a HTTP request * * @return void */ public function handleRequest() { // Create the request very early so the Resource Management has a chance to grab it: $this->request = Request::createFromEnvironment(); $this->response = new Response(); $this->boot(); $this->resolveDependencies(); $this->request->injectSettings($this->settings); $this->router->setRoutesConfiguration($this->routesConfiguration); $actionRequest = $this->router->route($this->request); $this->securityContext->setRequest($actionRequest); $this->dispatcher->dispatch($actionRequest, $this->response); $this->response->makeStandardsCompliant($this->request); $this->response->send(); $this->bootstrap->shutdown('Runtime'); $this->exit->__invoke(); }
/** * Render this form. * * @return string rendered form * @api * @throws \TYPO3\Form\Exception\RenderingException */ public function render() { if ($this->isAfterLastPage()) { $this->invokeFinishers(); return $this->response->getContent(); } $this->formState->setLastDisplayedPageIndex($this->currentPage->getIndex()); if ($this->formDefinition->getRendererClassName() === NULL) { throw new \TYPO3\Form\Exception\RenderingException(sprintf('The form definition "%s" does not have a rendererClassName set.', $this->formDefinition->getIdentifier()), 1326095912); } $rendererClassName = $this->formDefinition->getRendererClassName(); $renderer = new $rendererClassName(); if (!$renderer instanceof \TYPO3\Form\Core\Renderer\RendererInterface) { throw new \TYPO3\Form\Exception\RenderingException(sprintf('The renderer "%s" des not implement RendererInterface', $rendererClassName), 1326096024); } $controllerContext = $this->getControllerContext(); $renderer->setControllerContext($controllerContext); $renderer->setFormRuntime($this); return $renderer->renderRenderable($this); }
/** * Echoes an exception for the web. * * @param \Exception $exception The exception * @return void */ protected function echoExceptionWeb(\Exception $exception) { if ($exception instanceof Exception) { $statusCode = 400; $json = ['status' => 'invalid_request']; } elseif ($exception instanceof \TYPO3\Flow\Security\Exception) { $statusCode = 403; $json = ['status' => 'unauthorized']; } else { $statusCode = 500; if ($exception instanceof FlowException) { $statusCode = $exception->getStatusCode(); } $json = ['status' => 'error']; } $statusMessage = Response::getStatusMessageByCode($statusCode); if (!headers_sent()) { header(sprintf('HTTP/1.1 %s %s', $statusCode, $statusMessage)); header('Content-Type: application/json'); } print json_encode($json); }
/** * @test */ public function shutdownCreatesSpecialDataEntryForSessionWithAuthenticatedAccounts() { $session = new Session(); $this->inject($session, 'bootstrap', $this->mockBootstrap); $this->inject($session, 'objectManager', $this->mockObjectManager); $this->inject($session, 'settings', $this->settings); $this->inject($session, 'metaDataCache', $this->createCache('Meta')); $this->inject($session, 'storageCache', $this->createCache('Storage')); $session->initializeObject(); $session->start(); $account = new Account(); $account->setAccountIdentifier('admin'); $account->setAuthenticationProviderName('MyProvider'); $token = new UsernamePassword(); $token->setAuthenticationStatus(TokenInterface::AUTHENTICATION_SUCCESSFUL); $token->setAccount($account); $this->mockSecurityContext->expects($this->any())->method('isInitialized')->will($this->returnValue(TRUE)); $this->mockSecurityContext->expects($this->any())->method('getAuthenticationTokens')->will($this->returnValue(array($token))); $session->close(); $this->httpRequest->setCookie($this->httpResponse->getCookie('TYPO3_Flow_Session')); $session->resume(); $this->assertEquals(array('MyProvider:admin'), $session->getData('TYPO3_Flow_Security_Accounts')); }
/** * Prepares a Fluid view for rendering the custom error page. * * @param \Exception $exception * @param array $renderingOptions Rendering options as defined in the settings * @return StandaloneView */ protected function buildCustomFluidView(\Exception $exception, array $renderingOptions) { $statusCode = 500; $referenceCode = NULL; if ($exception instanceof FlowException) { $statusCode = $exception->getStatusCode(); $referenceCode = $exception->getReferenceCode(); } $statusMessage = Response::getStatusMessageByCode($statusCode); $fluidView = new StandaloneView(); $fluidView->getRequest()->setControllerPackageKey('TYPO3.Flow'); $fluidView->setTemplatePathAndFilename($renderingOptions['templatePathAndFilename']); if (isset($renderingOptions['layoutRootPath'])) { $fluidView->setLayoutRootPath($renderingOptions['layoutRootPath']); } if (isset($renderingOptions['partialRootPath'])) { $fluidView->setPartialRootPath($renderingOptions['partialRootPath']); } if (isset($renderingOptions['format'])) { $fluidView->setFormat($renderingOptions['format']); } if (isset($renderingOptions['variables'])) { $fluidView->assignMultiple($renderingOptions['variables']); } $fluidView->assignMultiple(array('exception' => $exception, 'renderingOptions' => $renderingOptions, 'statusCode' => $statusCode, 'statusMessage' => $statusMessage, 'referenceCode' => $referenceCode)); return $fluidView; }
/** * @return Response */ protected function getResponse() { $responseInfo = $this->oAuthClient->getLastResponseInfo(); $response = Response::createFromRaw($responseInfo['headers_recv']); $response->appendContent($this->oAuthClient->getLastResponse()); return $response; }
/** * Returns the statically rendered exception message * * @param integer $statusCode * @param string $referenceCode * @return string */ protected function renderStatically($statusCode, $referenceCode) { $statusMessage = \TYPO3\Flow\Http\Response::getStatusMessageByCode($statusCode); $referenceCodeMessage = $referenceCode !== NULL ? '<p>When contacting the maintainer of this application please mention the following reference code:<br /><br />' . $referenceCode . '</p>' : ''; return '<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>' . $statusCode . ' ' . $statusMessage . '</title> <style type="text/css"> body { font-family: Helvetica, Arial, sans-serif; margin: 0; } h1 { font-size: 15px; } .ApplicationWindow { position: absolute; width: 100%; height: 100%; background-color: #515151; margin: 0; z-index:1000; } .FloatingWindow { width: 500px; height: 360px; background-color: none; background-image: url(data:image/gif;base64,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); } .FloatingWindow .Window_TitleBar { font-size: 13px; position: relative; padding: 25px 0 0 26px; width: 440px; text-align: center; color: #404040; } .FloatingWindow .Window_Body { font-size: 14px; position: relative; padding: 30px 0 0 50px; width: 400px; text-align: left; color: #202020; line-height: 18px; } .StandardView_Package { width: 70px; float: right; margin: 0 0 80px 10px; } </style> <!--[if lte IE 7]> <style type="text/css"> .FloatingWindow { background-color: #ccc; background-image: none; } .Window_TitleBar { background-color:#aaa; font-weight:bold; } .StandardView_Package { display:none; } </style> <![endif]--> </head> <body> <div class="ApplicationWindow"> <div class="FloatingWindow"> <div class="Window_TitleBar">' . $statusCode . ' ' . $statusMessage . '</div> <div class="Window_Body"> <h1>' . $statusCode . ' ' . $statusMessage . '</h1> <p>An internal error occurred.</p> ' . $referenceCodeMessage . ' </div> </div> </div> </body> </html>'; }
/** * @test * @expectedException \TYPO3\Flow\Http\Client\InfiniteRedirectionException */ public function browserHaltsOnExceedingMaximumRedirections() { $requestEngine = $this->getMock(\TYPO3\Flow\Http\Client\RequestEngineInterface::class); for ($i = 0; $i <= 10; $i++) { $response = new Response(); $response->setHeader('Location', 'http://localhost/this/willLead/you/knowhere/' . $i); $response->setStatus(301); $requestEngine->expects($this->at($i))->method('sendRequest')->will($this->returnValue($response)); } $this->browser->setRequestEngine($requestEngine); $this->browser->request('http://localhost/some/initialRequest'); }
/** * Returns the statically rendered exception message * * @param integer $statusCode * @param \Exception $exception * @return void */ protected function renderStatically($statusCode, \Exception $exception) { $statusMessage = Response::getStatusMessageByCode($statusCode); $exceptionHeader = ''; while (true) { $pathPosition = strpos($exception->getFile(), 'Packages/'); $filePathAndName = $pathPosition !== false ? substr($exception->getFile(), $pathPosition) : $exception->getFile(); $exceptionCodeNumber = $exception->getCode() > 0 ? '#' . $exception->getCode() . ': ' : ''; $moreInformationLink = $exceptionCodeNumber != '' ? '<p><a href="http://typo3.org/go/exception/' . $exception->getCode() . '">More information</a></p>' : ''; $exceptionMessageParts = $this->splitExceptionMessage($exception->getMessage()); $exceptionHeader .= '<h2 class="ExceptionSubject">' . $exceptionCodeNumber . htmlspecialchars($exceptionMessageParts['subject']) . '</h2>'; if ($exceptionMessageParts['body'] !== '') { $exceptionHeader .= '<p class="ExceptionBody">' . nl2br(htmlspecialchars($exceptionMessageParts['body'])) . '</p>'; } $exceptionHeader .= $moreInformationLink . ' <span class="ExceptionProperty">' . get_class($exception) . '</span> thrown in file<br /> <span class="ExceptionProperty">' . $filePathAndName . '</span> in line <span class="ExceptionProperty">' . $exception->getLine() . '</span>.<br />'; if ($exception instanceof FlowException) { $exceptionHeader .= '<span class="ExceptionProperty">Reference code: ' . $exception->getReferenceCode() . '</span><br />'; } if ($exception->getPrevious() === null) { break; } $exceptionHeader .= '<br /><div style="width: 100%; background-color: #515151; color: white; padding: 2px; margin: 0 0 6px 0;">Nested Exception</div>'; $exception = $exception->getPrevious(); } $backtraceCode = Debugger::getBacktraceCode($exception->getTrace()); echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr"> <head> <title>' . $statusCode . ' ' . $statusMessage . '</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style> .ExceptionSubject { margin: 0; padding: 0; font-size: 15px; color: #BE0027; } .ExceptionBody { padding: 10px; margin: 10px; color: black; background: #DDD; } .ExceptionProperty { color: #101010; } pre { margin: 0; font-size: 11px; color: #515151; background-color: #D0D0D0; padding-left: 30px; } </style> </head> <div style=" position: absolute; left: 10px; background-color: #B9B9B9; outline: 1px solid #515151; color: #515151; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin: 10px; padding: 0; "> <div style="width: 100%; background-color: #515151; color: white; padding: 2px; margin: 0 0 6px 0;">Uncaught Exception in Flow</div> <div style="width: 100%; padding: 2px; margin: 0 0 6px 0;"> ' . $exceptionHeader . ' <br /> ' . $backtraceCode . ' </div> </div> '; }
/** * @param string $filePathAndName Absolute path to the file to serve * @param HttpResponse $httpResponse The current HTTP response (allows setting headers, ...) * @return void */ public function serve($filePathAndName, HttpResponse $httpResponse) { $httpResponse->setHeader('X-Sendfile', $filePathAndName); }
/** * @param string $filePathAndName Absolute path to the file to serve * @param HttpResponse $httpResponse The current HTTP response (allows setting headers, ...) * @return void */ public function serve($filePathAndName, HttpResponse $httpResponse) { $httpResponse->setHeader('X-Accel-Redirect', $filePathAndName); }
/** * @param string $output * @param Runtime $typoScriptRuntime * @return string The message body without the message head */ protected function mergeHttpResponseFromOutput($output, Runtime $typoScriptRuntime) { if (substr($output, 0, 5) === 'HTTP/') { $endOfHeader = strpos($output, "\r\n\r\n"); if ($endOfHeader !== false) { $header = substr($output, 0, $endOfHeader + 4); try { $renderedResponse = Response::createFromRaw($header); /** @var Response $response */ $response = $typoScriptRuntime->getControllerContext()->getResponse(); $response->setStatus($renderedResponse->getStatusCode()); foreach ($renderedResponse->getHeaders()->getAll() as $headerName => $headerValues) { $response->setHeader($headerName, $headerValues[0]); } $output = substr($output, strlen($header)); } catch (\InvalidArgumentException $exception) { } } } return $output; }
/** * Adds an HTTP header to the Response which indicates that the application is powered by Flow. * * @param Response $response * @return void */ protected function addPoweredByHeader(Response $response) { if ($this->settings['http']['applicationToken'] === 'Off') { return; } $applicationIsFlow = $this->settings['core']['applicationPackageKey'] === 'TYPO3.Flow'; if ($this->settings['http']['applicationToken'] === 'ApplicationName') { if ($applicationIsFlow) { $response->getHeaders()->set('X-Flow-Powered', 'Flow'); } else { $response->getHeaders()->set('X-Flow-Powered', 'Flow ' . $this->settings['core']['applicationName']); } return; } /** @var Package $applicationPackage */ /** @var Package $flowPackage */ $flowPackage = $this->bootstrap->getEarlyInstance('TYPO3\\Flow\\Package\\PackageManagerInterface')->getPackage('TYPO3.Flow'); $applicationPackage = $this->bootstrap->getEarlyInstance('TYPO3\\Flow\\Package\\PackageManagerInterface')->getPackage($this->settings['core']['applicationPackageKey']); if ($this->settings['http']['applicationToken'] === 'MajorVersion') { $flowVersion = $this->renderMajorVersion($flowPackage->getInstalledVersion()); $applicationVersion = $this->renderMajorVersion($applicationPackage->getInstalledVersion()); } else { $flowVersion = $this->renderMinorVersion($flowPackage->getInstalledVersion()); $applicationVersion = $this->renderMinorVersion($applicationPackage->getInstalledVersion()); } if ($applicationIsFlow) { $response->getHeaders()->set('X-Flow-Powered', 'Flow/' . ($flowVersion ?: 'dev')); } else { $response->getHeaders()->set('X-Flow-Powered', 'Flow/' . ($flowVersion ?: 'dev') . ' ' . $this->settings['core']['applicationName'] . '/' . ($applicationVersion ?: 'dev')); } }
/** * Explicitly destroys all session data * * @param string $reason A reason for destroying the session – used by the LoggingAspect * @return void * @throws \TYPO3\Flow\Session\Exception * @throws \TYPO3\Flow\Session\Exception\SessionNotStartedException * @api */ public function destroy($reason = null) { if ($this->started !== true) { throw new \TYPO3\Flow\Session\Exception\SessionNotStartedException('Tried to destroy a session which has not been started yet.', 1351162668); } if ($this->remote !== true) { if (!$this->response->hasCookie($this->sessionCookieName)) { $this->response->setCookie($this->sessionCookie); } $this->sessionCookie->expire(); } $this->removeSessionMetaDataCacheEntry($this->sessionIdentifier); $this->storageCache->flushByTag($this->storageIdentifier); $this->started = false; $this->sessionIdentifier = null; $this->storageIdentifier = null; $this->tags = array(); $this->request = null; }
/** * Sets the array based headers into the Response * * @param Response $response * @param $headers */ private function _setHeadersIntoResponse(Response $response, $headers) { foreach ($headers as $key => $value) { $response->getHeaders()->set($key, $value); } }
/** * Starts the authentication: Send HTTP header * * @param \TYPO3\Flow\Http\Request $request The current request * @param \TYPO3\Flow\Http\Response $response The current response * @return void */ public function startAuthentication(Request $request, Response $response) { $response->setStatus(401); $response->setHeader('WWW-Authenticate', 'Basic realm="' . (isset($this->options['realm']) ? $this->options['realm'] : sha1(FLOW_PATH_ROOT)) . '"'); $response->setContent('Authorization required'); }
/** * Sends the given HTTP request * * @param \TYPO3\Flow\Http\Request $request * @return \TYPO3\Flow\Http\Response The response or FALSE * @api * @throws \TYPO3\Flow\Http\Exception * @throws CurlEngineException */ public function sendRequest(Request $request) { if (!extension_loaded('curl')) { throw new \TYPO3\Flow\Http\Exception('CurlEngine requires the PHP CURL extension to be installed and loaded.', 1346319808); } $requestUri = $request->getUri(); $curlHandle = curl_init((string) $requestUri); curl_setopt_array($curlHandle, $this->options); // Send an empty Expect header in order to avoid chunked data transfer (which we can't handle yet). // If we don't set this, cURL will set "Expect: 100-continue" for requests larger than 1024 bytes. curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array('Expect:')); // If the content is a stream resource, use cURL's INFILE feature to stream it $content = $request->getContent(); if (is_resource($content)) { curl_setopt_array($curlHandle, array(CURLOPT_INFILE => $content, CURLOPT_INFILESIZE => $request->getHeader('Content-Length'))); } switch ($request->getMethod()) { case 'GET': if ($request->getContent()) { // workaround because else the request would implicitly fall into POST: curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'GET'); if (!is_resource($content)) { curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $content); } } break; case 'POST': curl_setopt($curlHandle, CURLOPT_POST, TRUE); if (!is_resource($content)) { $body = $content !== '' ? $content : http_build_query($request->getArguments()); curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $body); } break; case 'PUT': curl_setopt($curlHandle, CURLOPT_PUT, TRUE); if (!is_resource($content) && $content !== '') { $inFileHandler = fopen('php://temp', 'r+'); fwrite($inFileHandler, $request->getContent()); rewind($inFileHandler); curl_setopt_array($curlHandle, array(CURLOPT_INFILE => $inFileHandler, CURLOPT_INFILESIZE => strlen($request->getContent()))); } break; default: if (!is_resource($content)) { $body = $content !== '' ? $content : http_build_query($request->getArguments()); curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $body); } curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, $request->getMethod()); } $preparedHeaders = array(); foreach ($request->getHeaders()->getAll() as $fieldName => $values) { foreach ($values as $value) { $preparedHeaders[] = $fieldName . ': ' . $value; } } curl_setopt($curlHandle, CURLOPT_HTTPHEADER, $preparedHeaders); // curl_setopt($curlHandle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP && CURLPROTO_HTTPS); // CURLOPT_UPLOAD if ($requestUri->getPort() !== NULL) { curl_setopt($curlHandle, CURLOPT_PORT, $requestUri->getPort()); } // CURLOPT_COOKIE $curlResult = curl_exec($curlHandle); if ($curlResult === FALSE) { throw new CurlEngineException(sprintf('cURL reported error code %s with message "%s". Last requested URL was "%s" (%s).', curl_errno($curlHandle), curl_error($curlHandle), curl_getinfo($curlHandle, CURLINFO_EFFECTIVE_URL), $request->getMethod()), 1338906040); } elseif (strlen($curlResult) === 0) { return FALSE; } curl_close($curlHandle); $response = Response::createFromRaw($curlResult); if ($response->getStatusCode() === 100) { $response = Response::createFromRaw($response->getContent(), $response); } return $response; }
/** * @test */ public function renderSetsContentTypeHeader() { $this->response->expects($this->once())->method('setHeader')->with('Content-Type', 'application/json'); $this->view->render(); }
/** * Prepare a response in case an error occurred. * * @param \Throwable $exception * @param Http\Response $response * @return void */ protected function prepareErrorResponse($exception, Http\Response $response) { $pathPosition = strpos($exception->getFile(), 'Packages/'); $filePathAndName = $pathPosition !== false ? substr($exception->getFile(), $pathPosition) : $exception->getFile(); $exceptionCodeNumber = $exception->getCode() > 0 ? '#' . $exception->getCode() . ': ' : ''; $content = PHP_EOL . 'Uncaught Exception in Flow ' . $exceptionCodeNumber . $exception->getMessage() . PHP_EOL; $content .= 'thrown in file ' . $filePathAndName . PHP_EOL; $content .= 'in line ' . $exception->getLine() . PHP_EOL . PHP_EOL; $content .= Debugger::getBacktraceCode($exception->getTrace(), false, true) . PHP_EOL; if ($exception instanceof Exception) { $statusCode = $exception->getStatusCode(); } else { $statusCode = 500; } $response->setStatus($statusCode); $response->setContent($content); $response->setHeader('X-Flow-ExceptionCode', $exception->getCode()); $response->setHeader('X-Flow-ExceptionMessage', $exception->getMessage()); }
/** * @test * @dataProvider contentAndExpectedStringRepresentation() */ public function toStringAlwaysReturnsAStringRepresentationOfContent($content, $expectedString) { $response = new Response(); $response->setContent($content); $this->assertSame($expectedString, (string) $response); }