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)
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.
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:
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());
};
$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:
$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.
$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 — 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) — a cookie-k viselkedését ellenőrző Fetch csomag tesztjei.