public function redirect($forward_url = REFERRER, $status_code = ELGG_HTTP_FOUND)
{
if ($forward_url === REFERRER) {
$forward_url = $this->request->headers->get('Referer');
}
$forward_url = elgg_normalize_url($forward_url);
// allow plugins to rewrite redirection URL
$current_page = current_page_url();
$params = ['current_url' => $current_page, 'forward_url' => $forward_url];
$forward_reason = (string) $status_code;
$forward_url = $this->hooks->trigger('forward', $forward_reason, $params, $forward_url);
if ($this->response_sent) {
// Response was sent from a forward hook
// Clearing handlers to void infinite loops
return $this->response_sent;
}
if ($forward_url === REFERRER) {
$forward_url = $this->request->headers->get('Referer');
}
if (!is_string($forward_url)) {
throw new InvalidParameterException("'forward', '{$forward_reason}' hook must return a valid redirection URL");
}
$forward_url = elgg_normalize_url($forward_url);
switch ($status_code) {
case 'system':
case 'csrf':
$status_code = ELGG_HTTP_OK;
break;
case 'admin':
case 'login':
case 'member':
case 'walled_garden':
default:
$status_code = (int) $status_code;
if (!$status_code || $status_code < 100 || $status_code > 599) {
$status_code = ELGG_HTTP_SEE_OTHER;
}
break;
}
if ($this->isXhr()) {
if ($status_code < 100 || $status_code >= 300 && $status_code <= 399 || $status_code > 599) {
// We only want to preserve OK and error codes
// Redirect responses should be converted to OK responses as this is an XHR request
$status_code = ELGG_HTTP_OK;
}
$output = ob_get_clean();
if (!$this->isAction() && !$this->ajax->isAjax2Request()) {
// legacy ajax calls are always OK
// actions are wrapped by ResponseFactory::respond()
$status_code = ELGG_HTTP_OK;
$output = $this->wrapLegacyAjaxResponse($output, $forward_url);
}
$response = new OkResponse($output, $status_code, $forward_url);
$headers = $response->getHeaders();
$headers['Content-Type'] = 'application/json; charset=UTF-8';
$response->setHeaders($headers);
return $this->respond($response);
}
if ($this->isAction()) {
// actions should always redirect on non xhr-calls
if (!is_int($status_code) || $status_code < 300 || $status_code > 399) {
$status_code = ELGG_HTTP_SEE_OTHER;
}
}
$response = new OkResponse('', $status_code, $forward_url);
if ($response->isRedirection()) {
return $this->send($this->prepareRedirectResponse($forward_url, $status_code));
}
return $this->respond($response);
}