Open
Description
The code:
$request = (new Client())->get('http://test.site');
$request->cookies->add(new Cookie(['name' => 'name1', 'value' => 'value1']));
echo $request->toString();
Produce next output:
GET http://test.site
There is no Cookie header.
But if add to request any headers:
$request = (new Client())->get('http://test.site');
$request->headers->add('Test-Header', 'Test-Value');
$request->cookies->add(new Cookie(['name' => 'name1', 'value' => 'value1']));
echo $request->toString();
Then output is right:
GET http://test.site
Test-Header: Test-Value
Cookie: name1=value1
This is because Message::toString() check headers existence BEFORE it composing:
if ($this->hasHeaders()) {
$headers = $this->composeHeaderLines();
Request::composeHeaderLines() overrides Message:composeHeaderLines and compose cookies header after:
public function composeHeaderLines()
{
$headers = parent::composeHeaderLines();
if ($this->hasCookies()) {
$headers[] = $this->composeCookieHeader();
}
To fix this, we need override Message::hasHeaders in Request also:
public function hasHeaders()
{
return parent::hasHeaders() || $this-hasCookies();
}