2012-01-18 14 views
8

Có cách nào đơn giản để thực hiện yêu cầu HTTP và nhận phản hồi thô, không được phân tích (cụ thể là tiêu đề) không?Nhận phản hồi HTTP thô, chưa được phân tích

+0

gì chính xác bạn đang hy vọng sẽ làm gì với nó rằng bạn không thể làm gì với những cách sử dụng thân thiện hơn khi nhận được dữ liệu? –

+1

Tôi muốn xem liệu máy chủ có đang sử dụng '\ n' thay vì' \ r \ n' trong các phản hồi của nó hay không. – Acorn

Trả lời

13

Sử dụng các module socket trực tiếp:

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, cảm ơn vì giải pháp làm việc đầy đủ! Điều này có cực kỳ phức tạp hơn nếu bạn cần sử dụng HTTPS không? – Acorn

+0

Cảm ơn, Jeremy - Tôi vừa đăng nhập lại để thêm phần tách phản hồi, và bạn đánh tôi với nó :) –

+3

@Acorn: Nếu bạn muốn thực hiện SSL theo cách này, bạn sẽ cần phải mô tả mô-đun ssl và sử dụng SSLSocket thay vì một ổ cắm thông thường. Tôi đã không sử dụng nó bản thân mình, vì vậy có thể có sự khác biệt khác. Âm thanh như một chủ đề tốt cho một câu hỏi SO, mặc dù :) –