TCP Networking in Gawk funziona per alcuni indirizzi, ma non altri
Domanda
Sono stato a giocherellare con il protocollo TCP / IP di rete in Gawk e sto attraversando un periodo difficile capire perché si comporta bene con alcuni siti, ma non per gli altri. Ho anche provato ad utilizzare intestazioni HTTP Live in Windows per provare e mettere a punto quello che sta succedendo, ma senza alcun risultato.
Il codice di esempio riportato di seguito Gawk (versione 3.1.5) funziona bene per il sito www.sobell.com ma si bloccherà www.drudgreport.com.
BEGIN {
print "Dumping HTML of www.sobell.com"
server = "/inet/tcp/0/www.sobell.com/80"
print "GET http://www.sobell.com" |& server
while ((server |& getline) > 0)
print $0
close(server)
print "Dumping HTML of www.drudgereport.com"
server = "/inet/tcp/0/www.drudgereport.com/80"
print "GET http://www.drudgereport.com" |& server
while ((server |& getline) > 0)
print $0
close(server)
}
Apprezzo tutto l'aiuto! Grazie a tutti.
Soluzione
Il tuo codice (e il manuale gawk) utilizza l'obsoleto HTTP / 0.9 sintassi. A quanto pare il secondo server non supporta più questo. importanti differenze:
- Le linee deve terminare con "\ r \ n" invece che a capo UNIX pianura.
- È necessario terminare la richiesta con una riga vuota.
- Aggiungi un tipo di versione (HTTP / 1.0 o HTTP / 1.1) fino alla fine della linea di richiesta.
- Di solito la stringa di richiesta non contiene il nome dell'host, questo viene messo su un "Host:" separata linea.
Il seguente codice funziona per me:
BEGIN {
ORS = "\r\n"
server = "/inet/tcp/0/www.drudgereport.com/80"
print "GET / HTTP/1.1" |& server
print "Host: www.drudgereport.com" |& server
print "" |& server
while ((server |& getline) > 0)
print $0
close(server)
}
È possibile trovare tutti i dettagli scabrosi in RFC 1945 (1.0) e RFC 2616 (1.1).