
# Cookie-tár

Alapértelmezés szerint a Phasis `fetch()` figyelmen kívül hagyja a válaszok `Set-Cookie` értékeit, és nem küld `Cookie` fejlécet a kérésekben. Ez a megfelelő alapbeállítás a szerveroldali beágyazáshoz — általában nem szeretné, hogy az egyik felhasználó válasza hatással legyen egy másik felhasználó kérésére.

Ha szüksége van cookie-kra — például munkamenet-állapottól függő folyamat vezérléséhez, bejelentkezés mögötti adatgyűjtéshez vagy böngészőviselkedés tesztekben történő utánzásához — csatlakoztasson egy tárolót a `$engine->setCookieJar($jar)` segítségével.

## A felület

A tároló bármilyen objektum lehet, amely két metódust valósít meg:

```
get(url: string): string         // returns a "Cookie:" header value, e.g. "sid=abc; pref=dark"
set(url: string, header: string): void   // receives one Set-Cookie line
```

Mind a PHP objektumok, mind a megfelelő tagokkal rendelkező, JS-oldali `JsObject`-ok működnek. A `null` átadásával törölhető a tároló.

A Phasis minden kérési lépésnél egyszer meghívja a `get(url)`-et (így az eltérő gazdagépre irányító átirányítások új cookie-kat kapnak), a válasz minden egyes `Set-Cookie` fejlécénél pedig egyszer a `set(url, line)`-t. A cookie-kra vonatkozó házirend — a domain egyeztetése, az útvonal hatóköre, a lejárat, az `SameSite` és az `Secure` — a tároló feladata, nem a Phasis-é.

## Memóriabeli tároló (tesztekhez)

```php
final class MemoryJar
{
    /** @var array<string, array<string, string>> host → name → "name=value" */
    private array $store = [];

    public function get(string $url): string
    {
        $host = parse_url($url, PHP_URL_HOST) ?? '';
        return implode('; ', $this->store[$host] ?? []);
    }

    public function set(string $url, string $header): void
    {
        $host = parse_url($url, PHP_URL_HOST) ?? '';
        [$nv] = explode(';', $header, 2);
        [$name, $value] = explode('=', trim($nv), 2) + ['', ''];
        if ($name !== '') {
            $this->store[$host][$name] = "$name=$value";
        }
    }
}

$engine->setCookieJar(new MemoryJar());
```

Ez elegendő egy sikeres útvonalat ellenőrző tesztsegédlethez, de figyelmen kívül hagyja az `Domain=`, `Path=`, `Expires=` értékeket, valamint az `Secure`/`HttpOnly`/`SameSite` attribútumokat. Ne használja bizalmi határt átlépő esetekhez.

## Symfony BrowserKit

Ha már telepítette a Symfony HTTP-könyvtárait, a `BrowserKit\CookieJar` megfelelően kezeli a házirendet.

```php
use Symfony\Component\BrowserKit\CookieJar as BrowserCookieJar;
use Symfony\Component\BrowserKit\Cookie;

final class SymfonyJarAdapter
{
    public function __construct(private BrowserCookieJar $jar) {}

    public function get(string $url): string
    {
        $cookies = $this->jar->allValues($url);
        return implode('; ', array_map(
            fn ($n, $v) => "$n=$v",
            array_keys($cookies),
            array_values($cookies),
        ));
    }

    public function set(string $url, string $header): void
    {
        $cookie = Cookie::fromString($header, $url);
        $this->jar->set($cookie);
    }
}

$engine->setCookieJar(new SymfonyJarAdapter(new BrowserCookieJar()));
```

## JS-oldali tároló

Ha a tároló a JS oldalán van — például mert a JavaScript-ből szeretné megvizsgálni vagy feltölteni —, egy JS objektumon keresztül kösse be:

```js
const jar = new Map();
$jar.get = (url) => Array.from(jar.entries()).map(([k, v]) => `${k}=${v}`).join('; ');
$jar.set = (url, header) => {
  const [nv] = header.split(';');
  const [name, value] = nv.split('=');
  jar.set(name.trim(), value.trim());
};
```

```php
$engine->eval($script);
$engine->setCookieJar($engine->eval('$jar'));
```

Ugyanazokat a `get`/`set` metódusokat hívja meg a rendszer, akár PHP objektum, akár `JsObject` a címzett.

## Hatókör kérésenként

A tároló a realmhez tartozik — minden `fetch()` alatt megmarad, amíg a `setCookieJar(null)` segítségével nem törli. Ha egyetlen kérési folyamatra szeretné korlátozni a tárolót, ezt kifejezetten állítsa be:

```php
$engine->setCookieJar($jar);
$engine->eval('await runLoginFlow()');
$engine->setCookieJar(null);
```

## Megtekintés innen: PHP

A `$engine->getCookieJar()` azt adja vissza, amit átadtak neki — tesztbeli ellenőrzésekhez hasznos.

```php
$jar = new MemoryJar();
$engine->setCookieJar($jar);
$engine->eval('await fetch("https://api.example.com/login", { method: "POST" })');

assertNotEmpty($engine->getCookieJar()->get('https://api.example.com/'));
```

## Lásd még

- [Fetch-átvitel](https://phasis.inline0.dev/hu/docs/interop/fetch-transport) — a cookie-tár a Phasis átirányítási ciklusán **belül** fut, az éppen beállított átviteli módra rétegezve.
- [Webes API-k (WPT)](https://phasis.inline0.dev/hu/docs/compatibility/web-apis) — a cookie-k viselkedését ellenőrző Fetch csomag tesztjei.
