HTTP服务器在使用请求时能否生成响应?
考虑将请求主体反映到响应中的http服务器。在伪代码中:HTTP服务器在使用请求时能否生成响应?,http,specifications,rfc,Http,Specifications,Rfc,考虑将请求主体反映到响应中的http服务器。在伪代码中: recv_req_headers() send_resp_headers() while have_req_body_data: chunk = recv_req_body_chunk() send_resp_body_chunk(chunk) 类似地,考虑在读取响应之前发送整个请求的HTTP客户端: send_req_headers() send_req_body() recv_resp_headers() recv_
recv_req_headers()
send_resp_headers()
while have_req_body_data:
chunk = recv_req_body_chunk()
send_resp_body_chunk(chunk)
类似地,考虑在读取响应之前发送整个请求的HTTP客户端:
send_req_headers()
send_req_body()
recv_resp_headers()
recv_resp_body()
现在,当这两个请求尝试通信时,它们会死锁,因为一旦发送缓冲区已满,服务器将停止使用请求。在这一点上,双方都被阻止试图向另一方发送数据
哪一方违反了HTTP规范?我已经通读了一遍,但在这两方面都找不到指导。有,但没有令人满意的答案。为什么会僵持?客户端在收到响应之前发送整个请求。服务器得到一个完整的请求并能够发送一个完整的响应。服务器没有得到整个请求,而是读取数据块并将其重新发送给客户端。最终,发送缓冲区将填满,服务器将在
send_resp_chunk
中阻塞,然后客户端将在send_req_body
中阻塞。只有当客户端将响应重新发送回服务器时,这才会死锁。否则,客户端只向服务器发送有限数量的数据,因此服务器将读取有限数量的数据块。否,因为传输中只能有有限数量的数据。如果请求的大小(比如)为1GB,那么在服务器没有读取连接的情况下,客户端无法发送整个请求。网络接收缓冲区的大小不是1GB。因此,一旦服务器的缓冲区已满,服务器可能只会发送413。这将终止连接并删除任何挂起的数据。这里没有违反规范的情况。双方都在做协议允许的事情,但数量很大。