Liigu sisu juurde

Küpsiste hoidla

Vaikimisi eirab Phasis fetch() vastustes saadetud Set-Cookie ega lisa päringutele Cookie päist. See on serveripoolse manustamise puhul õige vaikevalik — tavaliselt ei soovi, et ühe kasutaja vastus mõjutaks teise kasutaja päringut.

Kui küpsiseid siiski vajate — näiteks seansiolekust sõltuva voo juhtimiseks, sisselogimist nõudvalt saidilt andmete kogumiseks või brauseri käitumise jäljendamiseks testides — ühendage hoidla käsuga $engine->setCookieJar($jar).

Liides

Hoidlaks sobib iga objekt, millel on kaks meetodit:

Kood
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

Sobivad nii PHP objektid kui ka JS-poole JsObject-id, millel on vastavad liikmed. null edastamisel tühjendatakse hoidla.

Phasis kutsub get(url) igal päringuhüppel korra (seega saavad teise hosti ümbersuunamised värsked küpsised) ja kutsub set(url, line) iga vastuse Set-Cookie päise kohta korra. Küpsiste reeglite — domeeni ja tee sobitamise, aegumise, SameSite ja Secure — eest vastutab hoidla, mitte Phasis.

Mälusisene hoidla (testid)

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

See sobib õnnestunud põhistsenaariumi testimiseks, kuid eirab Domain=, Path=, Expires= ja atribuute Secure/HttpOnly/SameSite. Ärge kasutage seda usalduspiiri ületavas olukorras.

Symfony BrowserKit

Kui Symfony HTTP teegid on juba paigaldatud, hoolitseb BrowserKit\CookieJar reeglite eest õigesti.

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-poole hoidla

Kui teie hoidla asub JS poolel — näiteks soovite seda vaadata või täita JavaScript kaudu — siduge see objektiga JS:

JavaScript
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'));

Samu meetodeid get/set kutsutakse nii juhul, kui vastuvõtja on objekt PHP, kui ka juhul, kui see on JsObject.

Päringupõhine ulatus

Hoidla elab käituskeskkonnas — see säilib kõigi fetch()-ide vältel, kuni see setCookieJar(null) abil tühjendatakse. Ühe päringuvookäigu jaoks hoidla kasutamiseks piirake selle ulatust selgesõnaliselt:

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

Vaatamine PHP kaudu

$engine->getCookieJar() tagastab selle, mis talle edastati — see on testides väidete kontrollimiseks kasulik.

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/'));

Vt ka

  • Päringutransport — küpsiste hoidla töötab Phasis sees ja lisatakse teie paigaldatud transpordile ümbersuunamistsükli käigus.
  • Veebi API-d (WPT) — Fetch Packi testid, mis katavad küpsiste käitumist.