创建cgi.FieldStorage对象时超时错误

0 投票
1 回答
1207 浏览
提问于 2025-04-15 14:17

嘿,有人知道我这里遇到的超时错误是什么吗:

错误追踪信息:

  File "/array/purato/python2.6/lib/python2.6/site-packages/cherrypy/_cprequest.py", line 606, in respond                                                        
    cherrypy.response.body = self.handler()                                                                                                                      
  File "/array/purato/python2.6/lib/python2.6/site-packages/cherrypy/_cpdispatch.py", line 25, in __call__                                                       
    return self.callable(*self.args, **self.kwargs)                                                                                                              
  File "sync_server.py", line 853, in put_file                                                                                                                   
    return RequestController_v1_0.put_file(self, *args, **kw)                                                                                                    
  File "sync_server.py", line 409, in put_file                                                                                                                   
    saved_path, tgt_path, root_folder = self._save_file(client_id, theFile)                                                                                      
  File "sync_server.py", line 404, in _save_file                                                                                                                 
    saved_path, tgt_path, root_folder = get_posted_file(cherrypy.request, 'theFile', staging_path)                                                               
  File "sync_server.py", line 1031, in get_posted_file                                                                                                           
    , keep_blank_values=True)                                                                                                                                    
  File "/array/purato/python2.6/lib/python2.6/cgi.py", line 496, in __init__                                                                                     
    self.read_multi(environ, keep_blank_values, strict_parsing)                                                                                                  
  File "/array/purato/python2.6/lib/python2.6/cgi.py", line 620, in read_multi                                                                                   
    environ, keep_blank_values, strict_parsing)                                                                                                                  
  File "/array/purato/python2.6/lib/python2.6/cgi.py", line 498, in __init__                                                                                     
    self.read_single()                                                                                                                                           
  File "/array/purato/python2.6/lib/python2.6/cgi.py", line 635, in read_single                                                                                  
    self.read_lines()                                                                                                                                            
  File "/array/purato/python2.6/lib/python2.6/cgi.py", line 657, in read_lines                                                                                   
    self.read_lines_to_outerboundary()                                                                                                                           
  File "/array/purato/python2.6/lib/python2.6/cgi.py", line 685, in read_lines_to_outerboundary                                                                  
    line = self.fp.readline(1<<16)                                                                                                                               
  File "/array/purato/python2.6/lib/python2.6/site-packages/cherrypy/wsgiserver/__init__.py", line 206, in readline                                              
    data = self.rfile.readline(size)                                                                                                                             
  File "/array/purato/python2.6/lib/python2.6/site-packages/cherrypy/wsgiserver/__init__.py", line 868, in readline                                              
    data = self.recv(self._rbufsize)                                                                                                                             
  File "/array/purato/python2.6/lib/python2.6/site-packages/cherrypy/wsgiserver/__init__.py", line 747, in recv                                                  
    return self._sock.recv(size)                                                                                                                                 
timeout: timed out                        

这是正在被调用的代码:

    def get_posted_file(request, form_field_name, tgt_folder, tgt_fname=None):                                                                                       
        logger.debug('get_posted_file: %s' % request.headers['Last-Modified'])                                                                                       

        lowerHeaderMap = {}                                                                                                                                          
        for key, value in request.headers.items():                                                                                                                   
            lowerHeaderMap[key.lower()] = value                                                                                                                      

--->    dataDict = TmpFieldStorage(fp=request.rfile, headers=lowerHeaderMap, environ={'REQUEST_METHOD':'POST'}                                                       
                                   , keep_blank_values=True)                                                                                                         

还有:

class TmpFieldStorage(cgi.FieldStorage):                                                                                                                         
    """                                                                                                                                                          
    Use a named temporary file to allow creation of hard link to final destination                                                                               
    """                                                                                                                                                          
    def make_file(self, binary=None):                                                                                                                            
        tmp_folder = os.path.join(get_filer_root(cherrypy.request.login), 'sync_tmp')                                                                            
        if not os.path.exists(tmp_folder):                                                                                                                       
            os.makedirs(tmp_folder)                                                                                                                              
        return tempfile.NamedTemporaryFile(dir=tmp_folder)       

1 个回答

0

environ={'REQUEST_METHOD':'POST'}

这个 environ 看起来有点不够用。根据CGI的规范,里面应该有更多的环境变量,而这些变量是 cgi 模块需要的。

特别是,缺少了 CONTENT_LENGTH 这个头信息。如果没有这个信息,cgi 就会默认读取整个数据流,直到遇到文件结束符(EOF)。但是因为这个数据流可能是网络流,而不是文件,所以不会有EOF(或者说,提交结束时并没有EOF),这样表单读取器就会一直在那儿等着更多输入,但实际上是不会再有输入的。最终会导致超时。

撰写回答