http.server 直到连接关闭后才响应
http.server not responding until after the connection closes
我有一个应用程序使用 requests
包来 POST 到服务器。在我的测试环境中,我想建立一个简单的服务器,以便我可以验证客户端的请求。但是,当我调用 requests.post
时,它只是挂起。在客户端最终超时并且连接关闭之前,服务器根本不响应。具有讽刺意味的是,服务器随后发送了一个 200 OK。
这是我的服务器 MRE:
import http.server
class TestHandler(http.server.BaseHTTPRequestHandler):
def do_POST(self):
print('Received:', self.rfile.read())
self.send_response(200)
self.end_headers()
if __name__ == '__main__':
http.server.HTTPServer(('127.0.0.1', 8080), TestHandler).serve_forever()
这是我给客户的 MRE:
import requests
if __name__ == '__main__':
print(requests.post('http://127.0.0.1:8080/hello', data='Testing', timeout=5))
self.rfile.read()
读取套接字直到它关闭,这就是为什么当客户端超时并关闭套接字时,您最终会在服务器上发送响应。您需要提供一个长度,可以在 headers 中找到。试试这个服务器:
import http.server
class TestHandler(http.server.BaseHTTPRequestHandler):
def do_POST(self):
print(self.headers)
length = int(self.headers['content-length'])
print('Received:', self.rfile.read(length))
self.send_response(200)
self.end_headers()
if __name__ == '__main__':
http.server.HTTPServer(('127.0.0.1', 8080), TestHandler).serve_forever()
与您的客户的输出:
Host: 127.0.0.1:8080
User-Agent: python-requests/2.25.1
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 7
Received: b'Testing'
127.0.0.1 - - [10/Dec/2021 09:50:39] "POST /hello HTTP/1.1" 200 -
我有一个应用程序使用 requests
包来 POST 到服务器。在我的测试环境中,我想建立一个简单的服务器,以便我可以验证客户端的请求。但是,当我调用 requests.post
时,它只是挂起。在客户端最终超时并且连接关闭之前,服务器根本不响应。具有讽刺意味的是,服务器随后发送了一个 200 OK。
这是我的服务器 MRE:
import http.server
class TestHandler(http.server.BaseHTTPRequestHandler):
def do_POST(self):
print('Received:', self.rfile.read())
self.send_response(200)
self.end_headers()
if __name__ == '__main__':
http.server.HTTPServer(('127.0.0.1', 8080), TestHandler).serve_forever()
这是我给客户的 MRE:
import requests
if __name__ == '__main__':
print(requests.post('http://127.0.0.1:8080/hello', data='Testing', timeout=5))
self.rfile.read()
读取套接字直到它关闭,这就是为什么当客户端超时并关闭套接字时,您最终会在服务器上发送响应。您需要提供一个长度,可以在 headers 中找到。试试这个服务器:
import http.server
class TestHandler(http.server.BaseHTTPRequestHandler):
def do_POST(self):
print(self.headers)
length = int(self.headers['content-length'])
print('Received:', self.rfile.read(length))
self.send_response(200)
self.end_headers()
if __name__ == '__main__':
http.server.HTTPServer(('127.0.0.1', 8080), TestHandler).serve_forever()
与您的客户的输出:
Host: 127.0.0.1:8080
User-Agent: python-requests/2.25.1
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 7
Received: b'Testing'
127.0.0.1 - - [10/Dec/2021 09:50:39] "POST /hello HTTP/1.1" 200 -