这个是用来模拟测试环境的,但是 302 那个 response 的 FIN 被置 1 ,连接断开了 如何在以下过程中保持 TCP 长连接? GET->302->GET
from http.server import SimpleHTTPRequestHandler
from http.server import HTTPServer
#Listen Address
ADDR = ''
#Listen Port
PORT = 80
class WebRequestHandler(SimpleHTTPRequestHandler):
def do_GET(self):
#self.close_connection=False
self.protocol_version='HTTP/1.1'
rawpath = self.path.split('?')[0]
if(rawpath == '/ITPage/SurftheInternet.aspx' ):
self.send_response(302)
self.send_header('Content-Type','text/html; charset=utf-8')
self.send_header('Location','/ITPage/SurftheInternet.html?openid=testestestestest')
self.end_headers()
if(rawpath == '/ITPage/SurftheInternet.html'):
self.send_response(200)
self.end_headers()
server = HTTPServer((ADDR,PORT),WebRequestHandler)
print("Server start!")
server.serve_forever()
1
ryd994 2016-11-28 01:20:30 +08:00 via Android
1. protocol version 直接放 class 里
2. 设置 header Connection: keep-alive |
2
qq446015875 2016-11-28 09:54:46 +08:00 via iPhone
@ryd994 我试了下,抓包确实看到了 302 没有 FIN ,但是浏览器似乎不认这个 302 ,浏览器 F12 没有记录到,也没有跳转
如果只按 1 操作,抓包没有 302 , python 没有回应 GET |
3
qq446015875 2016-11-28 10:15:31 +08:00 via iPhone
我好像知道了, Content-Length 吧?
|
4
julyclyde 2016-11-28 11:01:00 +08:00
你自己写 handler 啊
那你输出的 header 里并没提到 Connection: Keep-Alive 啊 |
5
ryd994 2016-11-29 03:46:13 +08:00
@qq446015875 不是 content-length
你查查 Connection: keep-alive |
6
axisray OP @ryd994
不需要 Connection: Keep-Alive ,浏览器在发起 GET 请求的时候就已经包含了 Connection: Keep-Alive 而且 HTTP/1.1 默认就是长连接 我遇到的问题是因为没有包含 Content-Length 浏览器一直在等待数据,所以就卡死在哪了 添加 self.send_header('Content-Length','0') 这样就可以了 |
7
ryd994 2016-11-30 14:18:43 +08:00 1
说什么都比不上源码: https://hg.python.org/cpython/file/3.6/Lib/http/server.py#l344
你自己问的是连接断开了怎么办,怎么保持长连接 请求 header 和响应 header 是两回事 另外,你的问题文档里有明确说过: https://docs.python.org/3.7/library/http.server.html#http.server.BaseHTTPRequestHandler.protocol_version |
8
qq446015875 2016-12-03 15:58:06 +08:00 via iPhone
@ryd994 嗯是我描述不清楚,我也是发完帖子注意到文档里说要加 content-length
还是谢谢你了:) |
9
axisray OP 我擦,没注意,暴露马甲了....
|