Allow extensions to set $wgDisableCounters.
[lhc/web/wiklou.git] / includes / MediaWiki.php
index df0870b..932dea2 100644 (file)
@@ -239,63 +239,97 @@ class MediaWiki {
                                }
                                throw new BadTitleError();
                        }
-               // Redirect loops, no title in URL, $wgUsePathInfo URLs, and URLs with a variant
-               } elseif ( $request->getVal( 'action', 'view' ) == 'view' && !$request->wasPosted()
-                       && ( $request->getVal( 'title' ) === null
-                               || $title->getPrefixedDBkey() != $request->getVal( 'title' ) )
-                       && !count( $request->getValueNames( array( 'action', 'title' ) ) )
-                       && Hooks::run( 'TestCanonicalRedirect', array( $request, $title, $output ) )
-               ) {
-                       if ( $title->isSpecialPage() ) {
-                               list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
-                               if ( $name ) {
-                                       $title = SpecialPage::getTitleFor( $name, $subpage );
-                               }
-                       }
-                       $targetUrl = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
-                       // Redirect to canonical url, make it a 301 to allow caching
-                       if ( $targetUrl == $request->getFullRequestURL() ) {
-                               $message = "Redirect loop detected!\n\n" .
-                                       "This means the wiki got confused about what page was " .
-                                       "requested; this sometimes happens when moving a wiki " .
-                                       "to a new server or changing the server configuration.\n\n";
-
-                               if ( $this->config->get( 'UsePathInfo' ) ) {
-                                       $message .= "The wiki is trying to interpret the page " .
-                                               "title from the URL path portion (PATH_INFO), which " .
-                                               "sometimes fails depending on the web server. Try " .
-                                               "setting \"\$wgUsePathInfo = false;\" in your " .
-                                               "LocalSettings.php, or check that \$wgArticlePath " .
-                                               "is correct.";
+               // Handle any other redirects.
+               // Redirect loops, titleless URL, $wgUsePathInfo URLs, and URLs with a variant
+               } elseif ( !$this->tryNormaliseRedirect( $title ) ) {
+
+                       // Special pages
+                       if ( NS_SPECIAL == $title->getNamespace() ) {
+                               // Actions that need to be made when we have a special pages
+                               SpecialPageFactory::executePath( $title, $this->context );
+                       } else {
+                               // ...otherwise treat it as an article view. The article
+                               // may still be a wikipage redirect to another article or URL.
+                               $article = $this->initializeArticle();
+                               if ( is_object( $article ) ) {
+                                       $this->performAction( $article, $requestTitle );
+                               } elseif ( is_string( $article ) ) {
+                                       $output->redirect( $article );
                                } else {
-                                       $message .= "Your web server was detected as possibly not " .
-                                               "supporting URL path components (PATH_INFO) correctly; " .
-                                               "check your LocalSettings.php for a customized " .
-                                               "\$wgArticlePath setting and/or toggle \$wgUsePathInfo " .
-                                               "to true.";
+                                       throw new MWException( "Shouldn't happen: MediaWiki::initializeArticle()"
+                                               . " returned neither an object nor a URL" );
                                }
-                               throw new HttpError( 500, $message );
-                       } else {
-                               $output->setSquidMaxage( 1200 );
-                               $output->redirect( $targetUrl, '301' );
                        }
-               // Special pages
-               } elseif ( NS_SPECIAL == $title->getNamespace() ) {
-                       // Actions that need to be made when we have a special pages
-                       SpecialPageFactory::executePath( $title, $this->context );
-               } else {
-                       // ...otherwise treat it as an article view. The article
-                       // may be a redirect to another article or URL.
-                       $article = $this->initializeArticle();
-                       if ( is_object( $article ) ) {
-                               $this->performAction( $article, $requestTitle );
-                       } elseif ( is_string( $article ) ) {
-                               $output->redirect( $article );
+               }
+       }
+
+       /**
+        * Handle redirects for uncanonical title requests.
+        *
+        * Handles:
+        * - Redirect loops.
+        * - No title in URL.
+        * - $wgUsePathInfo URLs.
+        * - URLs with a variant.
+        * - Other non-standard URLs (as long as they have no extra query parameters).
+        *
+        * Behaviour:
+        * - Normalise title values:
+        *   /wiki/Foo%20Bar -> /wiki/Foo_Bar
+        * - Normalise empty title:
+        *   /wiki/ -> /wiki/Main
+        *   /w/index.php?title= -> /wiki/Main
+        * - Don't redirect anything with query parameters other than 'title' or 'action=view'.
+        *
+        * @return bool True if a redirect was set.
+        */
+       private function tryNormaliseRedirect( $title ) {
+               $request = $this->context->getRequest();
+               $output = $this->context->getOutput();
+
+               if ( $request->getVal( 'action', 'view' ) != 'view'
+                       || $request->wasPosted()
+                       || ( $request->getVal( 'title' ) !== null
+                               && $title->getPrefixedDBkey() == $request->getVal( 'title' ) )
+                       || count( $request->getValueNames( array( 'action', 'title' ) ) )
+                       || !Hooks::run( 'TestCanonicalRedirect', array( $request, $title, $output ) )
+               ) {
+                       return false;
+               }
+
+               if ( $title->isSpecialPage() ) {
+                       list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+                       if ( $name ) {
+                               $title = SpecialPage::getTitleFor( $name, $subpage );
+                       }
+               }
+               // Redirect to canonical url, make it a 301 to allow caching
+               $targetUrl = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
+               if ( $targetUrl == $request->getFullRequestURL() ) {
+                       $message = "Redirect loop detected!\n\n" .
+                               "This means the wiki got confused about what page was " .
+                               "requested; this sometimes happens when moving a wiki " .
+                               "to a new server or changing the server configuration.\n\n";
+
+                       if ( $this->config->get( 'UsePathInfo' ) ) {
+                               $message .= "The wiki is trying to interpret the page " .
+                                       "title from the URL path portion (PATH_INFO), which " .
+                                       "sometimes fails depending on the web server. Try " .
+                                       "setting \"\$wgUsePathInfo = false;\" in your " .
+                                       "LocalSettings.php, or check that \$wgArticlePath " .
+                                       "is correct.";
                        } else {
-                               throw new MWException( "Shouldn't happen: MediaWiki::initializeArticle()"
-                                       . " returned neither an object nor a URL" );
+                               $message .= "Your web server was detected as possibly not " .
+                                       "supporting URL path components (PATH_INFO) correctly; " .
+                                       "check your LocalSettings.php for a customized " .
+                                       "\$wgArticlePath setting and/or toggle \$wgUsePathInfo " .
+                                       "to true.";
                        }
+                       throw new HttpError( 500, $message );
                }
+               $output->setSquidMaxage( 1200 );
+               $output->redirect( $targetUrl, '301' );
+               return true;
        }
 
        /**
@@ -715,7 +749,7 @@ class MediaWiki {
 
                $errno = $errstr = null;
                $info = wfParseUrl( $this->config->get( 'Server' ) );
-               wfSuppressWarnings();
+               MediaWiki\suppressWarnings();
                $sock = fsockopen(
                        $info['host'],
                        isset( $info['port'] ) ? $info['port'] : 80,
@@ -725,7 +759,7 @@ class MediaWiki {
                        // is a problem elsewhere.
                        0.1
                );
-               wfRestoreWarnings();
+               MediaWiki\restoreWarnings();
                if ( !$sock ) {
                        $runJobsLogger->error( "Failed to start cron API (socket error $errno): $errstr" );
                        // Fall back to running the job here while the user waits