使用HTTP/1.1协议时style.css未复用同一条TCP连接的问题排查
问题原因与解决方案
核心问题:请求处理逻辑错误导致单请求返回多响应
你当前的请求判断使用了多个独立if分支,而非互斥的if-elif分支:
- 当请求
/good.html时,第一个if命中返回正常响应后,后续判断/redirect.html不命中,会触发elif data:分支额外返回404响应 - 客户端在同一个TCP连接中收到非法的双响应,会判定该连接异常,主动断开连接,后续请求
style.css时只能新建TCP连接,就出现了端口变化的情况
次要问题:部分响应的Content-Length值与实际内容长度不匹配
你可以实际计算响应体的字节长度,修正各个res_*变量中的Content-Length头取值,长度不符也会导致客户端认为连接传输异常,主动断开持久连接。
修复代码
首先修正serveClient函数中的请求判断逻辑:
def serveClient(clientsocket, address): start = datetime.now() objcount=0 while True: objcount+=1 data = clientsocket.recv(1024) if not data: objcount -=1 break data_utf8=data.decode('utf-8').split('\r\n') print(address) print(data) # 改成互斥分支,一次请求只返回一个响应 if '/good.html' in data_utf8[0]: clientsocket.sendall(res_for_good.encode()) elif '/style.css' in data_utf8[0]: print("transfer css") clientsocket.sendall(res_for_style.encode()) elif '/redirect.html' in data_utf8[0]: clientsocket.sendall(res_for_redirect.encode()) else: clientsocket.sendall(res_for_notfound.encode()) print("object count: " + str(objcount)) now = datetime.now() if objcount == max_rec_Object or (now-start).total_seconds()>waiting_time: print(start) print(now) print('close socket') clientsocket.close() break
其次核对每个响应的Content-Length:以res_for_good为例,统计响应头后空行之后的所有内容字节数,替换原有Content-Length的取值即可。
内容的提问来源于stack exchange,提问作者Ying
相关产品推荐
相关产品推荐

