@@ -48,38 +48,16 @@ public function getResponse()
48
48
*/
49
49
public function setHeadersFromArray (array $ headers )
50
50
{
51
- $ statusLine = trim (array_shift ($ headers ));
52
- $ parts = explode (' ' , $ statusLine , 3 );
53
- if (count ($ parts ) < 2 || substr (strtolower ($ parts [0 ]), 0 , 5 ) !== 'http/ ' ) {
54
- throw new \UnexpectedValueException (
55
- sprintf ('"%s" is not a valid HTTP status line ' , $ statusLine )
56
- );
57
- }
58
-
59
- $ reasonPhrase = count ($ parts ) > 2 ? $ parts [2 ] : '' ;
60
- $ this ->response = $ this ->response
61
- ->withStatus ((int ) $ parts [1 ], $ reasonPhrase )
62
- ->withProtocolVersion (substr ($ parts [0 ], 5 ));
51
+ $ status = array_shift ($ headers );
52
+ $ this ->setStatus ($ status );
63
53
64
54
foreach ($ headers as $ headerLine ) {
65
55
$ headerLine = trim ($ headerLine );
66
56
if ('' === $ headerLine ) {
67
57
continue ;
68
58
}
69
59
70
- $ parts = explode (': ' , $ headerLine , 2 );
71
- if (count ($ parts ) !== 2 ) {
72
- throw new \UnexpectedValueException (
73
- sprintf ('"%s" is not a valid HTTP header line ' , $ headerLine )
74
- );
75
- }
76
- $ name = trim (urldecode ($ parts [0 ]));
77
- $ value = trim (urldecode ($ parts [1 ]));
78
- if ($ this ->response ->hasHeader ($ name )) {
79
- $ this ->response = $ this ->response ->withAddedHeader ($ name , $ value );
80
- } else {
81
- $ this ->response = $ this ->response ->withHeader ($ name , $ value );
82
- }
60
+ $ this ->addHeader ($ headerLine );
83
61
}
84
62
85
63
return $ this ;
@@ -113,4 +91,58 @@ public function setHeadersFromString($headers)
113
91
114
92
return $ this ;
115
93
}
94
+
95
+ /**
96
+ * Set response status from a status string.
97
+ *
98
+ * @param string $statusLine Response status as a string.
99
+ *
100
+ * @return $this
101
+ *
102
+ * @throws \InvalidArgumentException For invalid status line.
103
+ */
104
+ public function setStatus ($ statusLine )
105
+ {
106
+ $ parts = explode (' ' , $ statusLine , 3 );
107
+ if (count ($ parts ) < 2 || strpos (strtolower ($ parts [0 ]), 'http/ ' ) !== 0 ) {
108
+ throw new \InvalidArgumentException (
109
+ sprintf ('"%s" is not a valid HTTP status line ' , $ statusLine )
110
+ );
111
+ }
112
+
113
+ $ reasonPhrase = count ($ parts ) > 2 ? $ parts [2 ] : '' ;
114
+ $ this ->response = $ this ->response
115
+ ->withStatus ((int ) $ parts [1 ], $ reasonPhrase )
116
+ ->withProtocolVersion (substr ($ parts [0 ], 5 ));
117
+
118
+ return $ this ;
119
+ }
120
+
121
+ /**
122
+ * Add header represented by a string.
123
+ *
124
+ * @param string $headerLine Response header as a string.
125
+ *
126
+ * @return $this
127
+ *
128
+ * @throws \InvalidArgumentException For invalid header names or values.
129
+ */
130
+ public function addHeader ($ headerLine )
131
+ {
132
+ $ parts = explode (': ' , $ headerLine , 2 );
133
+ if (count ($ parts ) !== 2 ) {
134
+ throw new \InvalidArgumentException (
135
+ sprintf ('"%s" is not a valid HTTP header line ' , $ headerLine )
136
+ );
137
+ }
138
+ $ name = trim (urldecode ($ parts [0 ]));
139
+ $ value = trim (urldecode ($ parts [1 ]));
140
+ if ($ this ->response ->hasHeader ($ name )) {
141
+ $ this ->response = $ this ->response ->withAddedHeader ($ name , $ value );
142
+ } else {
143
+ $ this ->response = $ this ->response ->withHeader ($ name , $ value );
144
+ }
145
+
146
+ return $ this ;
147
+ }
116
148
}
0 commit comments