Python中如何为构造的HTTP数据包添加自定义响应头?
问题说明
你当前的代码直接向客户端发送图片二进制内容,没有遵循HTTP响应的标准格式,既无法正常添加自定义响应头,浏览器也无法正确识别返回的图片资源。
HTTP响应的标准结构如下:
- 第一行是状态行,格式为
HTTP/版本号 状态码 状态描述,正常返回资源时固定为HTTP/1.1 200 OK即可 - 状态行后逐行排列响应头,格式为
头字段名: 字段值,自定义头和Content-Type、Content-Length这类标准头都放在这个区域 - 所有响应头写完后,必须加一个单独的空行(由
\r\n组成),用来分隔响应头和响应体 - 空行之后才是实际要返回的资源内容(也就是你读取的图片二进制数据)
修正后代码
import socket # 读取目标图片二进制内容 img_file = open(r"C:\Users\hadad\Desktop\webroot\imgs\abstract.jpg", "rb") img_content = img_file.read() img_file.close() server_socket = socket.socket() server_socket.bind(("0.0.0.0", 80)) server_socket.listen() while True: client_socket, client_addr = server_socket.accept() # 读取客户端请求,不需要解析内容直接返回响应即可 client_socket.recv(1024) # 按HTTP规范构造响应头 resp_headers = [ "HTTP/1.1 200 OK", "Content-Type: image/jpeg", # 声明返回内容类型为jpg图片 f"Content-Length: {len(img_content)}", # 声明响应体长度,避免浏览器加载异常 "my header: some information", # 自定义头直接按格式添加即可 "Connection: close" # 声明响应完成后关闭连接 ] # 拼接响应头:头字段之间用\r\n分隔,末尾额外加\r\n形成分隔头和体的空行 resp_header_bytes = ("\r\n".join(resp_headers) + "\r\n\r\n").encode("utf-8") # 拼接完整响应:响应头字节 + 图片二进制内容 full_resp = resp_header_bytes + img_content client_socket.send(full_resp) client_socket.close()
注意事项
- HTTP协议要求行分隔符必须是
\r\n,不能只用\n,否则部分浏览器、抓包工具会将响应识别为非法格式 - 运行代码后,既可以通过浏览器F12开发者工具的「网络」面板查看对应请求的响应头,也可以通过抓包工具看到你添加的自定义
my header字段 - 代码中加了循环逻辑,可以持续处理访问请求,不会处理一次请求后就自动退出
内容的提问来源于stack exchange,提问作者tomi
相关产品推荐
相关产品推荐

