From 76f77d4d82ed91834abba26b6c27a01ab555f8e1 Mon Sep 17 00:00:00 2001 From: Alexandre Emsenhuber Date: Tue, 1 Dec 2009 20:56:43 +0000 Subject: [PATCH] * (bug 21574) Redirects can now have "303 See Other" HTTP status Based on a patch by denny vrandecic - http://bug-attachment.wikimedia.org/attachment.cgi?id=6805 --- RELEASE-NOTES | 1 + includes/OutputPage.php | 126 ++++++++++++++++++++++------------------ 2 files changed, 69 insertions(+), 58 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 6f1c468d13..aa31dd22be 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -291,6 +291,7 @@ Hopefully we will remove this configuration var soon) membership in SpecialActiveusers * Allow \pagecolor and \definecolor in texvc * $wgTexvcBackgroundColor contains background color for texvc call +* (bug 21574) Redirects can now have "303 See Other" HTTP status === Bug fixes in 1.16 === diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 2f69ab8dad..86220002bc 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -905,6 +905,65 @@ class OutputPage { wfRunHooks('CacheHeadersAfterSet', array( $this ) ); } + /** + * Get the message associed with the HTTP response code $code + * + * @param $code Integer: status code + * @return String or null: message or null if $code is not in the list of + * messages + */ + public static function getStatusMessage( $code ) { + static $statusMessage = array( + 100 => 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary Redirect', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Large', + 415 => 'Unsupported Media Type', + 416 => 'Request Range Not Satisfiable', + 417 => 'Expectation Failed', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 507 => 'Insufficient Storage' + ); + return isset( $statusMessage[$code] ) ? $statusMessage[$code] : null; + } + /** * Finally, all the text has been munged and accumulated into * the object, let's actually output it: @@ -923,79 +982,30 @@ class OutputPage { if ( '' != $this->mRedirect ) { # Standards require redirect URLs to be absolute $this->mRedirect = wfExpandUrl( $this->mRedirect ); - if( $this->mRedirectCode == '301') { + if( $this->mRedirectCode == '301' || $this->mRedirectCode == '303' ) { if( !$wgDebugRedirects ) { - $wgRequest->response()->header("HTTP/1.1 {$this->mRedirectCode} Moved Permanently"); + $message = self::getStatusMessage( $this->mRedirectCode ); + $wgRequest->response()->header( "HTTP/1.1 {$this->mRedirectCode} $message" ); } $this->mLastModified = wfTimestamp( TS_RFC2822 ); } $this->sendCacheControl(); - $wgRequest->response()->header("Content-Type: text/html; charset=utf-8"); + $wgRequest->response()->header( "Content-Type: text/html; charset=utf-8" ); if( $wgDebugRedirects ) { $url = htmlspecialchars( $this->mRedirect ); print "\n\nRedirect\n\n\n"; print "

Location: $url

\n"; print "\n\n"; } else { - $wgRequest->response()->header( 'Location: '.$this->mRedirect ); + $wgRequest->response()->header( 'Location: ' . $this->mRedirect ); } wfProfileOut( __METHOD__ ); return; - } - elseif ( $this->mStatusCode ) - { - $statusMessage = array( - 100 => 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Large', - 415 => 'Unsupported Media Type', - 416 => 'Request Range Not Satisfiable', - 417 => 'Expectation Failed', - 422 => 'Unprocessable Entity', - 423 => 'Locked', - 424 => 'Failed Dependency', - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 507 => 'Insufficient Storage' - ); - - if ( $statusMessage[$this->mStatusCode] ) - $wgRequest->response()->header( 'HTTP/1.1 ' . $this->mStatusCode . ' ' . $statusMessage[$this->mStatusCode] ); + } elseif ( $this->mStatusCode ) { + $message = self::getStatusMessage( $this->mStatusCode ); + if ( $message ) + $wgRequest->response()->header( 'HTTP/1.1 ' . $this->mStatusCode . ' ' . $message ); } $sk = $wgUser->getSkin(); -- 2.20.1