带有ssl的Python cherrypy和bottle - 服务器无法保存大于102199字节的文件

时间:2016-12-15 12:53:42

标签: python ssl cherrypy bottle

仅在启用SSL时才会出现下一个问题!

我使用https运行带有版本0.12.6和cherrypy版本3.2.2的服务器。 客户端代码将文件发送到服务器,服务器将其保存。 当我发送大小低于102199字节的文件时,它会被接收并成功保存。但是,当我发送大小或等于102199的文件时,我得到例外: enter image description here

服务器代码:

from bottle import request, response,static_file, run,server_names

来自OpenSSL import crypto,SSL 从瓶子导入瓶子,运行,请求,server_names,ServerAdapter

app = Bottle()
app.mount('/test' , app)

class MySSLCherryPy(ServerAdapter):
    def run(self, handler):
        from cherrypy import wsgiserver
        server = wsgiserver.CherryPyWSGIServer((self.host, self.port), handler)
        server.ssl_certificate = "./cert"
        server.ssl_private_key = "./key"
        try:
            server.start()
        finally:
            server.stop()

@app.post('/upload')
def received_file():
  file = request.files.file
  # file.save("./newfile")
  file_path="./newfile"
  with open(file_path, 'w') as open_file:
        open_file.write(file.read())

if __name__=='__main__':
    server_names['mysslcherrypy'] = MySSLCherryPy
    run(app, host='0.0.0.0', port=4430, server='mysslcherrypy')
    exit(0)

为什么服务器无法获取超过给定限制的文件?我需要改变吗? (我试图在函数received_file中设置常量MEMFILE_MAX,但它没有帮助) 如果服务器是http而不是https,问题就会消失!

纯文本中的异常(如果您无法查看图像):

  

追踪(最近一次通话):     文件“/usr/lib/python2.6/site-packages/bottle.py”,第861行,在_handle       return route.call(** args)     文件“/usr/lib/python2.6/site-packages/bottle.py”,第1727行,在包装器中       rv =回调(* a,** ka)     在received_file中文件“testser”,第28行       file = request.files.file     文件“/usr/lib/python2.6/site-packages/bottle.py”,第165行,获取       如果key不在存储中:storage [key] = self.getter(obj)     文件“/usr/lib/python2.6/site-packages/bottle.py”,第1106行,在文件中       对于名称,self.POST.allitems()中的项目:     文件“/usr/lib/python2.6/site-packages/bottle.py”,第165行,获取       如果key不在存储中:storage [key] = self.getter(obj)     POST中的文件“/usr/lib/python2.6/site-packages/bottle.py”,第1222行       args = dict(fp = self.body,environ = safe_env,keep_blank_values = True)     文件“/usr/lib/python2.6/site-packages/bottle.py”,第1193行,正文       self._body.seek(0)     文件“/usr/lib/python2.6/site-packages/bottle.py”,第165行,获取       如果key不在存储中:storage [key] = self.getter(obj)     在_body中的文件“/usr/lib/python2.6/site-packages/bottle.py”,第1162行       对于body_iter中的部分(read_func,self.MEMFILE_MAX):     文件“/usr/lib/python2.6/site-packages/bottle.py”,第1125行,在_iter_body中       part = read(min(maxread,bufsize))     文件“/usr/lib/python2.6/site-packages/cherrypy/wsgiserver/wsgiserver2.py”,第329行,正在阅读       data = self.rfile.read(size)     文件“/usr/lib/python2.6/site-packages/cherrypy/wsgiserver/wsgiserver2.py”,第1052行,正在阅读       断言n< = left,“recv(%d)返回%d字节”%(left,n)   AssertionError:recv(47)返回48个字节

解决方案

在文件bottle.py中,我将.MEMFILE_MAX的值更改为10000000,由此解决了问题。最好的方法是从服务器代码添加下一行:

bottle.BaseRequest.MEMFILE_MAX=30000000000

0 个答案:

没有答案