我正在嘗試HTTP 1.1通過基于套接字的 HTTP 代理來實作整個 POST 請求,并且在讀取標頭后無法立即讀取請求的正文。
處理POST請求處理的主要代碼是:
import socket
...
# request_buffer is initialized with the request's first line (with the method, uri and status).
request_buffer = http_status_line
socket_file = client_socket.makefile()
raw_headers = recv_headers(socket_file)
socket_file.close()
request_buffer = raw_headers
headers = dict_headers(raw_headers)
body_len = int(headers['Content-Length'][0])
print(repr(request_buffer))
raw_request = recv_body(client_socket, body_len)
request_buffer = raw_request
print(repr(raw_request))
server_socket.send(request_buffer)
而輔助功能的源代碼是:
def recv_headers(socket_file):
raw_headers = ''
while True:
header = socket_file.readline()
raw_headers = header
if len(header) == 2: # if header == '\r\n'
break
return raw_headers
def recv_body(conn_socket, body_len):
request_body = ''
bytes_read = 0
body_chunk = conn_socket.recv(body_len - bytes_read)
while len(body_chunk) > 0:
request_body = body_chunk
bytes_read = len(body_chunk)
body_chunk = conn_socket.recv(body_len - bytes_read)
return request_body
注意:我省略了源代碼,dict_headers()因為它運行良好,并且為了您的方便,我想盡量減少代碼量。此外,我已經確保它body_len具有正確的值(Content-Length標題中的值)。
列印結果:

如您所見raw_request(請求正文)根本沒有被列印。
通過代理轉發的原始 POST 請求:

原始請求確實有一個正文:log=test&pwd=test.
任何幫助將不勝感激
uj5u.com熱心網友回復:
socket_file = client_socket.makefile()
raw_headers = recv_headers(socket_file)
...
raw_request = recv_body(client_socket, body_len)
隨著makefile您在recv_headers. 后面的recv內部recv_body改為使用原始套接字物件,因此是無緩沖的 I/O。混合緩沖和非緩沖 I/O 是麻煩的收據。
問題是初始緩沖 I/O 可能在內部從底層套接字檢索到比讀取標頭實際需要的更多資料。這些額外的資料保存在 的內部緩沖區中socket_file,可供socket_file.read. 它們不再可用,client_socket.recv因為它們已經從底層套接字中檢索到。
因此,切勿混合緩沖和非緩沖 I/O。切換到緩沖 I/O 后,請繼續使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/426769.html
