功能cgi.field存储冻结Python

2024-04-20 13:47:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个Python-HTTPS服务器,客户端将文件(1到10mb之间的二进制文件)上传到其中。我使用带有自定义BaseHTTPRequestHandler的HTTPServer。请求由以下代码处理:

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(...)。如果我不上传文件它就不会冻结。你知道吗


Tags: 文件代码self服务器客户端stringeasycurl
1条回答
网友
1楼 · 发布于 2024-04-20 13:47:59

我错了!为了得到参数,我首先读取了这个代码的输入:

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

然后做cgi.FieldStorage得到实际上传的文件。实际上,我假设初始读取消耗了socket输入,而我冻结的只是我的服务器在等待新数据。你知道吗

最后,我删除了这3行,并单独使用cgi.FieldStorage处理所有数据。你知道吗

相关问题 更多 >