我使用https://gist.github.com/bradmontgomery/2219997 python代码来设置一个http服务器。对于我的使用,我只是在'do_POST‘方法中添加了几行代码:
def _set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def do_POST(self):
self._set_headers()
self.wfile.write("POST!")
content_length = int(self.headers['Content-Length'])
print(content_length )
post_data = self.rfile.read(content_length)
print(post_data)我想通过Curl发送一个文件:
curl -F "file=@file.txt" "http://myServer.noip.me:22222/" --trace-ascii debugdump.txt客户端: Curl响应是:
curl: (52) Empty reply from server服务器端:服务器打印content_length值,然后完全挂起"self.rfile.read(content_length)“。它不打印“打印(Post_data)”。
防火墙已在两边被禁用。
debugdump.txt (客户端)的最后一行:
== Info: Empty reply from server
== Info: Connection #0 to host myServer.noip.me left intact我错过了什么?
发布于 2019-05-05 13:35:02
Empty reply from server意味着服务器关闭连接而不响应任何违反HTTP协议的内容。
这不应该发生在适当的服务器上,因此它表明服务器端出现了严重的错误。
有时发生这种情况是因为服务器被天真地实现,并在来自客户端的意外请求中崩溃或行为不当。这样做的最佳机会是尝试修改请求,使其更类似于糟糕编写的服务器软件所期望的方式。
这只是猜测而已。你的服务器出了点问题。
发布于 2022-07-11 12:42:35
对于Python的http.server包,您有责任显式地发送HTTP代码,作为do_POST()覆盖的一部分。
在您的示例代码中,您首先回答客户端(即通过标头()、标头()和wfile ),然后再从客户端读取整个POST请求!
还请参阅Python的wfile文档:
包含用于将响应写入客户端的输出流。在写入此流时,必须使用对HTTP协议的适当依附,以便与HTTP客户端实现成功的互操作。
因此,这看起来很时髦,您可能只需要确保在开始回复之前阅读完整的POST请求。
IOW,curl只是抱怨在连接关闭之前它没有从您的服务器接收到任何HTTP状态代码。显然,连接双方都没有正确关闭,因此服务器在读取端阻塞。
卷曲误差
curl: (52) Empty reply from server如果您简单地忘记通过省略发送状态代码,也会出现
self.send_response(200)
self.end_headers()在方法的末尾--或者如果方法过早退出(例如,因为它会引发异常)。
但是,后一个问题应该会出现在服务器的stderr输出中。
https://stackoverflow.com/questions/55990530
复制相似问题