Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 67
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
HttpStatus
0.00% covered (danger)
0.00%
0 / 67
0.00% covered (danger)
0.00%
0 / 3
72
0.00% covered (danger)
0.00%
0 / 1
 getMessage
0.00% covered (danger)
0.00%
0 / 53
0.00% covered (danger)
0.00%
0 / 1
2
 getHeader
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
30
 header
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2/**
3 * List of HTTP status codes.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * http://www.gnu.org/copyleft/gpl.html
19 *
20 * @file
21 */
22
23/**
24 * @todo document
25 */
26class HttpStatus {
27
28    /**
29     * Get the message associated with an HTTP response status code
30     *
31     * @param int $code Status code
32     * @return string|null Message, or null if $code is not known
33     */
34    public static function getMessage( $code ) {
35        static $statusMessage = [
36            100 => 'Continue',
37            101 => 'Switching Protocols',
38            102 => 'Processing',
39            200 => 'OK',
40            201 => 'Created',
41            202 => 'Accepted',
42            203 => 'Non-Authoritative Information',
43            204 => 'No Content',
44            205 => 'Reset Content',
45            206 => 'Partial Content',
46            207 => 'Multi-Status',
47            300 => 'Multiple Choices',
48            301 => 'Moved Permanently',
49            302 => 'Found',
50            303 => 'See Other',
51            304 => 'Not Modified',
52            305 => 'Use Proxy',
53            307 => 'Temporary Redirect',
54            400 => 'Bad Request',
55            401 => 'Unauthorized',
56            402 => 'Payment Required',
57            403 => 'Forbidden',
58            404 => 'Not Found',
59            405 => 'Method Not Allowed',
60            406 => 'Not Acceptable',
61            407 => 'Proxy Authentication Required',
62            408 => 'Request Timeout',
63            409 => 'Conflict',
64            410 => 'Gone',
65            411 => 'Length Required',
66            412 => 'Precondition Failed',
67            413 => 'Request Entity Too Large',
68            414 => 'Request-URI Too Large',
69            415 => 'Unsupported Media Type',
70            416 => 'Request Range Not Satisfiable',
71            417 => 'Expectation Failed',
72            422 => 'Unprocessable Entity',
73            423 => 'Locked',
74            424 => 'Failed Dependency',
75            428 => 'Precondition Required',
76            429 => 'Too Many Requests',
77            431 => 'Request Header Fields Too Large',
78            500 => 'Internal Server Error',
79            501 => 'Not Implemented',
80            502 => 'Bad Gateway',
81            503 => 'Service Unavailable',
82            504 => 'Gateway Timeout',
83            505 => 'HTTP Version Not Supported',
84            507 => 'Insufficient Storage',
85            511 => 'Network Authentication Required',
86        ];
87        return $statusMessage[$code] ?? null;
88    }
89
90    /**
91     * Construct an HTTP status code header
92     *
93     * @since 1.42
94     * @param int $code Status code
95     * @return string
96     */
97    public static function getHeader( $code ): string {
98        static $version = null;
99        $message = self::getMessage( $code );
100        if ( $message === null ) {
101            throw new InvalidArgumentException( "Unknown HTTP status code $code" );
102        }
103
104        if ( $version === null ) {
105            $version = isset( $_SERVER['SERVER_PROTOCOL'] ) &&
106            $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.0' ?
107                '1.0' :
108                '1.1';
109        }
110
111        return "HTTP/$version $code $message";
112    }
113
114    /**
115     * Output an HTTP status code header
116     *
117     * @since 1.26
118     * @param int $code Status code
119     */
120    public static function header( $code ) {
121        \MediaWiki\Request\HeaderCallback::warnIfHeadersSent();
122
123        try {
124            header( self::getHeader( $code ) );
125        } catch ( InvalidArgumentException $ex ) {
126            trigger_error( "Unknown HTTP status code $code", E_USER_WARNING );
127        }
128    }
129
130}