Skip to content

Incorrect Request::toString #200

Open
@dicrtarasov

Description

@dicrtarasov

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();
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions