Gestionnaire de cookies
Par défaut, le fetch() de Phasis ignore les Set-Cookie des réponses et n’envoie aucun en-tête Cookie dans les requêtes. C’est le bon choix par défaut pour une intégration côté serveur : en général, vous ne voulez pas que la réponse d’un utilisateur influence la requête d’un autre.
Si vous avez besoin de cookies — pour suivre un parcours dépendant d’une session, extraire des données derrière une connexion ou reproduire le comportement d’un navigateur dans les tests — montez un gestionnaire avec $engine->setCookieJar($jar).
Interface
Le gestionnaire peut être n’importe quel objet qui possède deux méthodes :
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
Les objets PHP comme les JsObject côté JS avec les membres correspondants fonctionnent. Passer null vide le gestionnaire.
Phasis appelle get(url) à chaque étape de requête (ainsi, les redirections vers un autre hôte reçoivent de nouveaux cookies) et set(url, line) pour chaque en-tête Set-Cookie de la réponse. La politique des cookies — correspondance des domaines, portée des chemins, expiration, SameSite, Secure — relève du gestionnaire, pas de Phasis.
Gestionnaire en mémoire (tests)
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());
Cela suffit pour un scénario de test nominal, mais ignore Domain=, Path=, Expires= et les attributs Secure/HttpOnly/SameSite. Ne l’utilisez pas au-delà d’une frontière de confiance.
Symfony BrowserKit
Si les bibliothèques HTTP de Symfony sont déjà installées, BrowserKit\CookieJar gère correctement la politique.
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()));
Gestionnaire côté JS
Si votre gestionnaire se trouve côté JS — par exemple, si vous voulez l’inspecter ou le préremplir depuis JavaScript — liez-le à l’aide d’un objet 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());
};
$engine->eval($script);
$engine->setCookieJar($engine->eval('$jar'));
Les mêmes méthodes get/set sont appelées, que le récepteur soit un objet PHP ou un JsObject.
Portée par requête
Un gestionnaire vit dans le realm — il persiste à travers chaque fetch() jusqu’à ce qu’il soit vidé avec setCookieJar(null). Pour limiter son usage à un seul flux de requêtes, faites-le explicitement :
$engine->setCookieJar($jar);
$engine->eval('await runLoginFlow()');
$engine->setCookieJar(null);
Inspection depuis PHP
$engine->getCookieJar() renvoie la valeur transmise — pratique pour les assertions dans les tests.
$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/'));
Voir aussi
- Transport Fetch — le gestionnaire de cookies s’exécute dans la boucle de redirection de Phasis, par-dessus le transport installé.
- API Web (WPT) — tests Fetch Pack portant sur le comportement des cookies.