Skip to content

Commit e2b3f7a

Browse files
authored
Merge pull request php-curl-class#491 from zachborboa/master
Fix php-curl-class#490: Allow malformed response header to be parsed without error
2 parents d0747c4 + cbacd9a commit e2b3f7a

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

src/Curl/Curl.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,14 +1363,16 @@ private function parseHeaders($raw_headers)
13631363

13641364
$raw_headers_count = count($raw_headers);
13651365
for ($i = 1; $i < $raw_headers_count; $i++) {
1366-
list($key, $value) = explode(':', $raw_headers[$i], 2);
1367-
$key = trim($key);
1368-
$value = trim($value);
1369-
// Use isset() as array_key_exists() and ArrayAccess are not compatible.
1370-
if (isset($http_headers[$key])) {
1371-
$http_headers[$key] .= ',' . $value;
1372-
} else {
1373-
$http_headers[$key] = $value;
1366+
if (strpos($raw_headers[$i], ':') !== false) {
1367+
list($key, $value) = explode(':', $raw_headers[$i], 2);
1368+
$key = trim($key);
1369+
$value = trim($value);
1370+
// Use isset() as array_key_exists() and ArrayAccess are not compatible.
1371+
if (isset($http_headers[$key])) {
1372+
$http_headers[$key] .= ',' . $value;
1373+
} else {
1374+
$http_headers[$key] = $value;
1375+
}
13741376
}
13751377
}
13761378

tests/PHPCurlClass/PHPCurlClassTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2615,6 +2615,25 @@ public function testEmptyResponse()
26152615
$this->assertArrayHasKey('Status-Line', $response_headers);
26162616
}
26172617

2618+
public function testMalformedResponseHeaders()
2619+
{
2620+
$response =
2621+
'HTTP/1.0 403 Forbidden' . "\n" .
2622+
'Cache-Control: no-cache' . "\n" .
2623+
'Content-Type: text/html' . "\n" .
2624+
'Strict-Transport-Security: max-age=0' .
2625+
"\r\n" .
2626+
"\n";
2627+
2628+
$reflector = new \ReflectionClass('\Curl\Curl');
2629+
$reflection_method = $reflector->getMethod('parseResponseHeaders');
2630+
$reflection_method->setAccessible(true);
2631+
2632+
$curl = new Curl();
2633+
$response_headers = $reflection_method->invoke($curl, $response);
2634+
$this->assertTrue($response_headers instanceof CaseInsensitiveArray);
2635+
}
2636+
26182637
public function testArrayToStringConversion()
26192638
{
26202639
$test = new Test();

0 commit comments

Comments
 (0)