如何处理 CGI 中 POST 请求中的 0 内容长度

How to handle 0 Content length in POST request in CGI?

本文关键字:请求 POST 处理 CGI 何处理      更新时间:2023-10-16

在我的CGI应用程序中,当我传递0内容长度的POST请求时会发生一些事情。这是我的代码:

char* len_ = getenv("CONTENT_LENGTH");
char* type_ = getenv("REQUEST_METHOD");
if(len_ != NULL)
{
    // The code crashes somewhere here
    long int len = strtol(len_, NULL, 10);
    char* postdata = (char*)malloc(len + 1);
    if (!postdata) { exit(EXIT_FAILURE); }
    //fgets(postdata, len + 1, stdin);
    string temp = "";
    fstream ff;
    string fileName = string(XML_DATA_DIRECTORY) + string("data.xml");
    ff.open(fileName.c_str(), ios::in | ios::out | ios::trunc);
    // ff.open(fileName.c_str());
    if(ff)
    {
        // Modified: To handle new line in the Xml request
        while(fgets(postdata, len + 1, stdin) != NULL)
        {
            temp.append(postdata);
        }
        ff << temp;
    }
    else
    {
        // Error on the ifstream
    }
    ff.close();
    //free(postdata);
}
else
{
    // No Data
}

我使用 Firefox 的 Http-Requester 插件测试我的应用程序,当我传递一个没有数据的 POST 请求时,应用程序似乎进入了一个循环并且没有响应。如果我传递一个 GET 请求,代码工作正常,因为len_变为 NULL 并退出 if 语句。如果我传递带有数据的 POST 请求,它工作正常并且可以很好地接收数据并保存它。

我无法弄清楚的情况是 POST CONTENT_LENGTH = 0。如何计算这种情况?我尝试了strlen(len_)但没有用。感谢您的帮助。

检查getenv是否返回NULL,例如:

char* len_;
long int len;
len_ = getenv("CONTENT_LENGTH");
if (len_ && sscanf(len_, "%ld", &len) == 1) {
   if (len > 0) {
      ...
   }
}

请注意,(如@Deduplicator所指出的)最好将len声明为 unsigned longsize_t,因为CONTENT_LENGTH(客户端发送的字节数)始终为正数。