Presentery versus preflight requests (BC break)

David Grudl
Nette Core | 8152
+
+5
-

Pokud provádíte AJAXové požadavky na jinou (sub)doménu, můžete si všimnout, že prohlížeč vytvoří dva požadavky s identickou URL. První z těchto požadavků používá metodu OPTIONS a je známý jako „preflight request“. Jeho účelem je ověřit, zda je cílový server nastaven tak, aby povolil AJAXový požadavek z původní domény. Více informací o tomto mechanismu naleznete na MDN web docs.

Tento preflight request může však způsobit různé nechtěné situace, především pokud presenter vůbec nepočítá s metodou OPTIONS a vykoná tak běžnou akci, ke které by ale neměl mít volající oprávnění. Proto od verze nette/application v3.1.13 je zavedeno omezení, kdy presentery kontrolují, že HTTP metoda je jednou z následujících: GET, POST, HEAD, PUT, DELETE (bude doplněno ještě PATCH).

Pokud váš presenter očekává a zpracovává metodu OPTIONS, je důležité ji přidat mezi povolené metody:

class MyPresenter extends Nette\Application\UI\Presenter
{
    protected function checkHttpMethod(): void
    {
        $this->allowedMethods[] = 'OPTIONS';
        parent::checkHttpMethod();
    }
}