2015-12-09 72 views
0

我正在编写一个Python HTTPS服务器,其中客户端将文件(1到10 MB之间的二进制文件)上载到其中。我使用HTTPServer与定制BaseHTTPRequestHandler。该请求由该下面的代码处理:函数cgi.FieldStorage冻结Python HTTPS服务器

ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) 
if ctype == "multipart/form-data": 
    fs = cgi.FieldStorage(fp = self.rfile, \ 
     headers = self.headers, \ 
     environ = {'REQUEST_METHOD':'POST'}) 

客户端被用C++编写与的libcurl。该请求是通过此下面的代码发送:

std::string url = getURLServer("senddata"); 
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); 
std::string szPostFields = "id=" + std::to_string(ID); 
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, szPostFields.c_str()); 

struct curl_httppost *post = NULL; 
struct curl_httppost *last = NULL; 
curl_formadd(&post, &last, 
    CURLFORM_COPYNAME, "logfile", 
    CURLFORM_FILECONTENT, ".\\log.bin", 
    CURLFORM_END); 
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); 

curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL); 
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM"); 
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); 

res = curl_easy_perform(curl); 

的问题是在cgi.FieldStorage(...)服务器死机。如果我不上传文件,它不会冻结。

回答

0

我的错!我第一次读这段代码的输入,以获得参数:

length = int(self.headers.getheader('content-length')) 
field_data = self.rfile.read(length) 
fields = urlparse.parse_qs(field_data) 

,然后做cgi.FieldStorage以获得实际的上传。实际上,我猜想最初的读取会消耗套接字输入,而我冻结的东西只是我的服务器等待新数据。

最后,我只是删除了这3行,并仅用cgi.FieldStorage处理所有数据。