1: <?php
2: /*
3: * Copyright (c) 2015 @trashtoy
4: * https://github.com/trashtoy/
5: *
6: * Permission is hereby granted, free of charge, to any person obtaining a copy of
7: * this software and associated documentation files (the "Software"), to deal in
8: * the Software without restriction, including without limitation the rights to use,
9: * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
10: * Software, and to permit persons to whom the Software is furnished to do so,
11: * subject to the following conditions:
12: *
13: * The above copyright notice and this permission notice shall be included in all
14: * copies or substantial portions of the Software.
15: *
16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18: * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
19: * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20: * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21: * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22: */
23: /**
24: * PHP class file.
25: * @auhtor trashtoy
26: * @since 2.2.0
27: */
28: namespace Peach\Http\Header;
29:
30: use InvalidArgumentException;
31: use Peach\Http\SingleHeaderField;
32: use Peach\Util\Values;
33:
34: /**
35: * HTTP レスポンスのステータスを表すクラスです.
36: *
37: * このクラスは HTTP/1 におけるステータスライン, HTTP/2 における :status 擬似ヘッダーを表現します.
38: */
39: class Status implements SingleHeaderField
40: {
41: /**
42: * 3 桁の数字から成る文字列です.
43: *
44: * @var string
45: */
46: private $code;
47:
48: /**
49: * HTTP ステータスの "Reason-phrase" をあらわす文字列です.
50: *
51: * @var string
52: */
53: private $reasonPhrase;
54:
55: /**
56: * 指定されたステータスコードおよび Reason-Phrase からなる Status インスタンスを構築します.
57: *
58: * @param string $code "200", "404" など, 3 桁の数字から成る文字列
59: * @param string $reasonPhrase "OK", "Not Found" など, HTTP ステータスの Reason-Phrase に相当する文字列 (省略可能)
60: */
61: public function __construct($code, $reasonPhrase = "")
62: {
63: $this->code = $this->cleanCode($code);
64: $this->reasonPhrase = $reasonPhrase;
65: }
66:
67: /**
68: * 引数を 3 桁の数字文字列に変換します.
69: *
70: * @param mixed $code ステータスコードをあらわす文字列または整数
71: * @return string 3 桁の数字から成る文字列
72: * @throws InvalidArgumentException 引数がステータスコードとして妥当ではない場合
73: */
74: private function cleanCode($code)
75: {
76: $value = Values::stringValue($code);
77: if (!strlen($value)) {
78: throw new InvalidArgumentException("Code must not be empty");
79: }
80: if (!preg_match("/\\A[0-9]{3}\\z/", $value)) {
81: throw new InvalidArgumentException("Code must be composed of 3 digits.");
82: }
83: return $value;
84: }
85:
86: /**
87: * 3 桁のステータスコードを返します.
88: *
89: * @return string
90: */
91: public function getCode()
92: {
93: return $this->code;
94: }
95:
96: /**
97: * このステータスの Reason-Phrase 部分を返します.
98: *
99: * @return string
100: */
101: public function getReasonPhrase()
102: {
103: return $this->reasonPhrase;
104: }
105:
106: /**
107: * このメソッドは HTTP/2 ベースのレスポンスでのみ利用されます.
108: * ステータスコードのみ返します.
109: *
110: * @return string
111: */
112: public function format()
113: {
114: return $this->code;
115: }
116:
117: /**
118: * 文字列 ":status" を返します.
119: *
120: * @return string このヘッダーの名前 (":status")
121: */
122: public function getName()
123: {
124: return ":status";
125: }
126:
127: /**
128: * この Status オブジェクトの情報を返します.
129: * 返り値はステータスコードおよび Reason-Phrase から成る要素数 2 の配列となります.
130: *
131: * @return array
132: */
133: public function getValue()
134: {
135: return array($this->code, $this->reasonPhrase);
136: }
137:
138: /**
139: * "200 OK" をあらわす Status オブジェクトを返します.
140: *
141: * @return Status
142: */
143: public static function getOK()
144: {
145: // @codeCoverageIgnoreStart
146: static $ok = null;
147: if ($ok === null) {
148: $ok = new self("200", "OK");
149: }
150: // @codeCoverageIgnoreEnd
151:
152: return $ok;
153: }
154: }
155: