/** * Redirect to the installation page of the application. * This method does not send the response. * * @param Response $response HTTP response. * @param Request $request HTTP request. * @return void */ static function redirectToInstall(Response $response, Request $request) { list($dirname) = Uri\split($request->getUrl()); $response->setStatus(307); $response->setHeader('Location', $dirname . '/install.php'); $response->setBody('The application is not installed. ' . 'You are going to be redirected to the installation page.'); }
/** * Sends compiled view * @param string $tpl_name Name of the template (in "dot" notation) * @param array $data Array containing your data; empty by default * @param integer $status_code HTTP status code for the response; 200 by default */ function view($tpl_name, $data = [], $status_code = 200) { $response = new HTTP\Response(); $response->setStatus($status_code); $response->setBody(twig()->render($tpl_name, $data)); HTTP\Sapi::sendResponse($response); }
<?php use Sabre\HTTP; require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/../bootstrap/bootstrap.php'; if (file_exists(app_path() . '/' . request()->getPath() . '.php')) { require_once app_path() . '/' . request()->getPath() . '.php'; } elseif (file_exists(app_path() . '/' . request()->getPath() . '/index.php')) { require_once app_path() . '/' . request()->getPath() . '/index.php'; } else { $response = new HTTP\Response(); $response->setStatus(404); $response->setBody('Page not found'); HTTP\Sapi::sendResponse($response); }
/** * Parses the result of a curl call in a format that's a bit more * convenient to work with. * * The method returns an array with the following elements: * * status - one of the 3 STATUS constants. * * curl_errno - A curl error number. Only set if status is * STATUS_CURLERROR. * * curl_errmsg - A current error message. Only set if status is * STATUS_CURLERROR. * * response - Response object. Only set if status is STATUS_SUCCESS, or * STATUS_HTTPERROR. * * http_code - HTTP status code, as an int. Only set if Only set if * status is STATUS_SUCCESS, or STATUS_HTTPERROR * * @param string $response * @param resource $curlHandle * @return Response */ protected function parseCurlResult($response, $curlHandle) { list($curlInfo, $curlErrNo, $curlErrMsg) = $this->curlStuff($curlHandle); if ($curlErrNo) { return ['status' => self::STATUS_CURLERROR, 'curl_errno' => $curlErrNo, 'curl_errmsg' => $curlErrMsg]; } $headerBlob = substr($response, 0, $curlInfo['header_size']); // In the case of 204 No Content, strlen($response) == $curlInfo['header_size]. // This will cause substr($response, $curlInfo['header_size']) return FALSE instead of NULL // An exception will be thrown when calling getBodyAsString then $responseBody = substr($response, $curlInfo['header_size']) ?: null; unset($response); // In the case of 100 Continue, or redirects we'll have multiple lists // // of headers for each separate HTTP response. We can easily split this // because they are separated by \r\n\r\n $headerBlob = explode("\r\n\r\n", trim($headerBlob, "\r\n")); // We only care about the last set of headers $headerBlob = $headerBlob[count($headerBlob) - 1]; // Splitting headers $headerBlob = explode("\r\n", $headerBlob); $response = new Response(); $response->setStatus($curlInfo['http_code']); foreach ($headerBlob as $header) { $parts = explode(':', $header, 2); if (count($parts) == 2) { $response->addHeader(trim($parts[0]), trim($parts[1])); } } $response->setBody($responseBody); $httpCode = intval($response->getStatus()); return ['status' => $httpCode >= 400 ? self::STATUS_HTTPERROR : self::STATUS_SUCCESS, 'response' => $response, 'http_code' => $httpCode]; }
/** * */ protected function sendAuthSuccess(Response $response, $accessToken = null) { // mandatory JMAP API endpoints $routes = ['apiUrl' => '!undefined', 'uploadUrl' => '!undefined', 'downloadUrl' => '!undefined', 'eventSourceUrl' => '!undefined']; // collect service endpoint routes for the registered processors foreach ($this->ctrl->processors as $processor) { $routes = array_merge($routes, $processor->getJmapRoutes()); } // send service endpoint URLs $result = []; foreach ($routes as $key => $route) { $result[$key] = $this->ctrl->url($route, true); } if (!empty($accessToken)) { $result['accessToken'] = $accessToken; } if ($this->session && $this->session->get('Auth\\identity')) { $result['username'] = $this->session->get('Auth\\identity')->username; } $status = $accessToken ? 201 : 200; $this->ctrl->emit('jmap:auth:success', [['result' => &$result, 'status' => &$status, 'processor' => $this]]); $response->setBody(json_encode($result)); $response->setStatus($status); }
/** * * @throws ProcessorException */ public function processPOST(Request $request, Response $response) { // check authentication status $auth_status = Auth::checkJmapAuth($request, $identity); if ($auth_status !== 200) { return $response->setStatus($auth_status); } // set authenticated identity to controller $this->ctrl->identity = $identity; // replace response object with a JMAP response $response = new \Roundcube\JMAP\Response($response->getStatus(), $response->getHeaders()); $this->ctrl->httpResponse = $response; // decode JMAP request data $json_input = json_decode($request->getBodyAsString(), true); if ($json_input === null) { throw new ProcessorException(400, "Invalid JSON request body"); } $this->ctrl->emit('jmap:query', [['query' => $json_input, 'auth' => &$this->ctrl->identity]]); // dispatch each query command to the registered providers foreach ($json_input as $cmd) { list($method, $args, $id) = $cmd; if (isset($this->methodmap[$method])) { foreach ($this->invokeProviders($method, $args) as $res) { $this->ctrl->emit('jmap:response', [['method' => $method, 'args' => $args, 'result' => &$res]]); $this->ctrl->emit('jmap:response:' . $method, [['args' => $args, 'result' => &$res]]); $response->addResponse($res[0], $res[1], $id); } } else { $res = ['error', ['type' => 'unknownMethod']]; $this->ctrl->emit('jmap:error', [['method' => $method, 'args' => $args, 'result' => &$res]]); $response->addResponse($res[0], $res[1], $id); } } $response->setStatus(200); }