Provizorní odpověď HTTP 1×x

DefenestrationPraha
Člen | 99
+
0
-

Řeším teď výměnu dat mezi dvěma endpointy, oba jsou psány v Nette. Jeden je takzvaný forwardér (shromažďuje data zvenčí a v balíčcích je pravidelně přeposílá dál), druhý je centrála. K přeposílání používám curl.

Jelikož zpracování velkých balíků dat může trvat i desítky sekund, rád bych na straně centrály posílal průběžné odpovědi 102 Processing, aby odesílající věděl, že se něco děje.

Je možné poslat takové provizorní odpovědi z Nette, aniž by se běh prezentéru ukončil?

David Grudl
Nette Core | 8129
+
0
-

$this->getHttpResponse()->setCode(102)

DefenestrationPraha
Člen | 99
+
0
-

David Grudl napsal(a):

$this->getHttpResponse->setCode(102)

No dobře, ale možná to úplně nechápu.

102 je víceméně od toho, aby se poslala před definitivní odpovědí. Tj. něco jako:

  • Přijde request
  • Pošlu 102
  • Za pár sekund pošlu zase 102
  • Za pár sekund pošlu zase 102
  • Konečně pošlu 200.

Jak můžu v průběhu renderXXXmetody poslat protistraně opakovaně nedefinitivní odpovědi, aniž bych způsobil ukončení běhu metody? Mám chytat AbortException?

Marek Bartoš
Nette Blogger | 1167
+
0
-

Tohle afaik nejde, celé php je stavěné tak, že po odeslání response chcípne. Technika co potřebuješ se jmenuje chunk file upload. Spočívá v tom, že soubor rozdělíš na malé části, které odešleš v samostatných requestech a na konci je spojíš dohromady.

Editoval Marek Bartoš (29. 3. 2023 12:14)

DefenestrationPraha
Člen | 99
+
0
-

Marek Bartoš napsal(a):

Tohle afaik úplně nejde, celé php je stavěné tak, že po odeslání response chcípne. Technika co potřebuješ se jmenuje chunk file upload. Spočívá v tom, že soubor rozdělíš na malé části, které odešleš v samostatných requestech a na konci je spojíš dohromady.

No, já to zatím řeším jinak, ono je to spousta malých souborů, které se balí do balíčků, takže ty balíčky můžu rozdělit na menší. Momentálně to posílám po padesáti, to je snesitelná zátěž.

Jenom jsem chtěl vědět, jestli to jde. Na rozdíl od tohoto problému, který je bezpečnostně dost palčivý, by toto bylo v mém světě jen „nice to have“.