İçeriğe geç

Çerez kavanozu

Varsayılan olarak Phasis'ın fetch()'ı yanıtlardaki Set-Cookie değerini yok sayar ve isteklerde Cookie başlığı göndermez. Sunucu tarafında gömme için doğru varsayılan budur — genellikle bir kullanıcının yanıtının başka bir kullanıcının isteğini etkilemesini istemezsiniz.

Oturum durumuna bağlı bir akış yürütmek, giriş arkasından veri kazımak veya testlerde tarayıcı davranışını taklit etmek için çerez gerekiyorsa $engine->setCookieJar($jar) ile bir kavanoz bağlayın.

Arayüz

Kavanoz, şu iki yönteme yanıt veren herhangi bir nesne olabilir:

Kod
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

Hem PHP nesneleri hem de eşleşen üyeleri olan JS tarafı JsObject nesneleri çalışır. null geçirilmesi kavanozu temizler.

Phasis her istek adımında bir kez get(url) çağırır (böylece farklı bir ana makineye yönlendirmeler güncel çerezleri alır) ve yanıttaki her Set-Cookie başlığı için bir kez set(url, line) çağırır. Alan adı eşleştirme, yol kapsamı, sona erme, SameSite ve Secure gibi çerez ilkeleri kavanozun sorumluluğundadır; Phasis'ın değil.

Bellek içi kavanoz (testler)

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

Bu, başarılı akış test düzeneği için yeterlidir ancak Domain=, Path=, Expires= ve Secure/HttpOnly/SameSite özniteliklerini yok sayar. Güven sınırını aşan hiçbir şey için kullanmayın.

Symfony BrowserKit

Symfony'ın HTTP kitaplıkları zaten kuruluysa BrowserKit\CookieJar ilkeleri doğru biçimde yönetir.

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 tarafı kavanoz

Kavanozunuz JS tarafındaysa — örneğin JavaScript üzerinden incelemek veya başlangıç verileri eklemek istiyorsanız — bir JS nesnesi aracılığıyla bağlayın:

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

Alıcı bir PHP nesnesi veya JsObject olsa da aynı get/set yöntemleri çağrılır.

İstek başına kapsam

Bir kavanoz realm üzerinde yaşar — setCookieJar(null) ile temizlenene kadar her fetch() boyunca kalıcıdır. Bir kavanozu tek bir istek akışıyla sınırlamak için bunu açıkça yapın:

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

PHP üzerinden inceleme

$engine->getCookieJar(), ne geçirildiyse onu döndürür — testlerde doğrulama yapmak için kullanışlıdır.

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

Ayrıca bkz.

  • Fetch aktarımı — çerez kavanozu, Phasis'ın yönlendirme döngüsü içinde çalışır ve yüklediğiniz aktarımın üzerine eklenir.
  • Web API'leri (WPT) — çerez davranışını kapsayan Fetch Pack testleri.