]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/exception/HttpError.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / includes / exception / HttpError.php
1 <?php
2 /**
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation; either version 2 of the License, or
6  * (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16  * http://www.gnu.org/copyleft/gpl.html
17  *
18  * @file
19  */
20
21 use MediaWiki\Logger\LoggerFactory;
22
23 /**
24  * Show an error that looks like an HTTP server error.
25  * Replacement for wfHttpError().
26  *
27  * @since 1.19
28  * @ingroup Exception
29  */
30 class HttpError extends MWException {
31         private $httpCode, $header, $content;
32
33         /**
34          * @param int $httpCode HTTP status code to send to the client
35          * @param string|Message $content Content of the message
36          * @param string|Message|null $header Content of the header (\<title\> and \<h1\>)
37          */
38         public function __construct( $httpCode, $content, $header = null ) {
39                 parent::__construct( $content );
40                 $this->httpCode = (int)$httpCode;
41                 $this->header = $header;
42                 $this->content = $content;
43         }
44
45         /**
46          * We don't want the default exception logging as we got our own logging set
47          * up in self::report.
48          *
49          * @see MWException::isLoggable
50          *
51          * @since 1.24
52          * @return bool
53          */
54         public function isLoggable() {
55                 return false;
56         }
57
58         /**
59          * Returns the HTTP status code supplied to the constructor.
60          *
61          * @return int
62          */
63         public function getStatusCode() {
64                 return $this->httpCode;
65         }
66
67         /**
68          * Report and log the HTTP error.
69          * Sends the appropriate HTTP status code and outputs an
70          * HTML page with an error message.
71          */
72         public function report() {
73                 $this->doLog();
74
75                 HttpStatus::header( $this->httpCode );
76                 header( 'Content-type: text/html; charset=utf-8' );
77
78                 print $this->getHTML();
79         }
80
81         private function doLog() {
82                 $logger = LoggerFactory::getInstance( 'HttpError' );
83                 $content = $this->content;
84
85                 if ( $content instanceof Message ) {
86                         $content = $content->text();
87                 }
88
89                 $context = [
90                         'file' => $this->getFile(),
91                         'line' => $this->getLine(),
92                         'http_code' => $this->httpCode,
93                 ];
94
95                 $logMsg = "$content ({http_code}) from {file}:{line}";
96
97                 if ( $this->getStatusCode() < 500 ) {
98                         $logger->info( $logMsg, $context );
99                 } else {
100                         $logger->error( $logMsg, $context );
101                 }
102         }
103
104         /**
105          * Returns HTML for reporting the HTTP error.
106          * This will be a minimal but complete HTML document.
107          *
108          * @return string HTML
109          */
110         public function getHTML() {
111                 if ( $this->header === null ) {
112                         $titleHtml = htmlspecialchars( HttpStatus::getMessage( $this->httpCode ) );
113                 } elseif ( $this->header instanceof Message ) {
114                         $titleHtml = $this->header->escaped();
115                 } else {
116                         $titleHtml = htmlspecialchars( $this->header );
117                 }
118
119                 if ( $this->content instanceof Message ) {
120                         $contentHtml = $this->content->escaped();
121                 } else {
122                         $contentHtml = nl2br( htmlspecialchars( $this->content ) );
123                 }
124
125                 return "<!DOCTYPE html>\n" .
126                 "<html><head><title>$titleHtml</title></head>\n" .
127                 "<body><h1>$titleHtml</h1><p>$contentHtml</p></body></html>\n";
128         }
129 }