2012-01-18 12 views
8

Esistono modi semplici per effettuare una richiesta HTTP e ottenere la risposta non elaborata (in particolare le intestazioni)?Ottenere una risposta HTTP non analizzata

+0

Che cosa speri di fare con esso che non si può fare con i modi più user-friendly di ricevere i dati? –

+1

Voglio vedere se il server sta usando '\ n' invece di' \ r \ n' nelle sue risposte. – Acorn

risposta

13

Utilizzando il modulo socket direttamente:

import socket 

CRLF = "\r\n" 

request = [ 
    "GET/HTTP/1.1", 
    "Host: www.example.com", 
    "Connection: Close", 
    "", 
    "", 
] 

# Connect to the server 
s = socket.socket() 
s.connect(('www.example.com', 80)) 

# Send an HTTP request 
s.send(CRLF.join(request)) 

# Get the response (in several parts, if necessary) 
response = '' 
buffer = s.recv(4096) 
while buffer: 
    response += buffer 
    buffer = s.recv(4096) 

# HTTP headers will be separated from the body by an empty line 
header_data, _, body = response.partition(CRLF + CRLF) 

print header_data 
HTTP/1.0 302 Found 
Location: http://www.iana.org/domains/example/ 
Server: BigIP 
Connection: Keep-Alive 
Content-Length: 0 
+0

Wow, grazie per la soluzione pienamente funzionante! Questo diventa enormemente più complicato se hai bisogno di usare HTTPS? – Acorn

+0

Grazie, Jeremy - Ho appena effettuato l'accesso di nuovo per aggiungere la divisione di risposta, e tu mi hai battuto ad esso :) –

+3

@Acorn: Se vuoi fare SSL in questo modo, dovrai imporre il modulo ssl e usare un SSLSocket piuttosto che un normale socket. Non l'ho usato da solo, quindi potrebbero esserci altre differenze. Sembra un buon argomento per un'altra domanda SO, però :) –

Problemi correlati