HTTP server pomocí nc vrací odpověď na předchozí požadavek

Hamparle

  • ****
  • 360
  • junior developer ucho
    • Zobrazit profil
    • E-mail
Když si zprovozním http server přes nc, tak aby vypisoval pro každý request unikátní a aktuální odpověď, vznikne problém,
Kód: [Vybrat]
while true;  do
 {
  echo -ne "HTTP/1.1 200 OK\r\nConnection:close;\r\nContent-type:text/html; Charset=utf-8\r\n\r\n<html>" ;
  date '+%T %d/%b' ;
 }  |  nc -l -N  -C -p 80  >/dev/null
done
že odpověď pro request vznikne dřív , než dojde k requestu, což znamená že pro první request přijde odpovď z doby spuštění příkazu a je to pak celé "o krok" dozadu.

(vím, proč se tomu tak, děje, to je dané posloupností, že nejdřív se do spící pípy vypíše teď odpověď a až přijde request, ji nc schroustá a pošle jako odpověď a hned poté se připraví odpověď na příště)

A kromě toho nelze do odpověď dostat data z aktuálního requestu (například "hlavičku" GET s cestou  ).

Jak elegantně pomocí smyčky a nc  (a asi coproc nebo píp) zprovoznit demonstraci serveru aby nebyl o krok pozadu?


A další věc: vzniká mi mraky otevřených socketů TCP TIME_WAIT, které zůstávají viset. Hádám, že Connection-close v tom nehraje roli.

Nejde mi o to to vyřešit to nahrazením Apache serveru s php prostředím a vytvořením index.php souboru s obsahem <?echo time(); ?>, ale vyřešit přes nc a bash.
« Poslední změna: 24. 10. 2020, 21:00:47 od Petr Krčmář »


_Jenda

  • *****
  • 1 550
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:HTTP server pomocí nc vrací odpověď na předchozí požadavek
« Odpověď #1 kdy: 24. 10. 2020, 22:17:50 »
man nc, ta část kde se píše      There is no -c or -e option in this netcat, but you still can execute a command after connection being established by redirecting file descriptors.


Ale doporučil bych použít nějaký skutečný HTTP server, rozumně vypadá Python Flask (já mám zkušenosti s Bottle, ale tam je spousta bugů a nechceš to dělat).

Hamparle

  • ****
  • 360
  • junior developer ucho
    • Zobrazit profil
    • E-mail
Re:HTTP server pomocí nc vrací odpověď na předchozí požadavek
« Odpověď #2 kdy: 25. 10. 2020, 09:55:33 »
Zajímavé, ale trochu mě zaráží jedna věc:
Kód: [Vybrat]
( while true;  do
 {
  echo -ne "HTTP/1.1 200 OK\r\nConnection:close;\r\nContent-type:text/html; Charset=utf-8\r\n\r\n<html>" ;
  date ;
  echo"<hr>" ; cat test   ;
  echo "konec"
 } |  nc -l    -C -p 80 -w 3  >test ;   done  )
Funguje to jakš takš, ale furt tam něco zlobí, čeká se na timeout dle parametru -w příkazu nc. (nejprv to vypíše odpověď po HR, a po 3 sekundách zbytek. Je to takové dobastlené

A další věc:
pokud cat test nahradím cat test | wc, tak se nevypíše z toho nic.. nerozumím tomu přesně, ale myslím, že cat normálně po řádkách vypíše svůj vstup a (do konce EOF), ale když má přesměrovat vstup do pípy wc, tak logicky čeká na konec streamu což nenastane nikdy....
Proto taky echo konec se nikdy nevypíše

Takže 3 věci:
- neuzavře se to samo - musí se čekat nc timeout nc
- nelze použít cat test | něco, jelikož cat bude čekat na konec vstupu nekonečně dlouho (například cat test |grep -P "^GET")
- nelze použít cokoliv za cat, z předhozího důvodu (například echo "")
-nadále se množí TIME_WAIT sokety
« Poslední změna: 25. 10. 2020, 09:59:29 od Hamparle »