Fórum Root.cz
Hlavní témata => Server => Téma založeno: Hamparle 24. 10. 2020, 20:35:18
-
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,
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.
-
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).
-
Zajímavé, ale trochu mě zaráží jedna věc:
( 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