1

我正在使用 C 语言中的旧版本 mongoose(开源 Web 服务器),它不提供对请求有效负载的本机访问。为了支持 POST 和 PUT 请求,我手动修改了它:在 mongoose 读取标头后,我检查是否Content-Length已设置,如果是,我再次从套接字读取Content-Lenght字符。

    findCL = strstr(conn->buf, "Content-Length:");
    if (findCL)
    {
        // skip "Content-Length:" string
        findCL += 15 * sizeof(char);
        findCLEnd = (char*)strchr(findCL, delimiter);
        sizeLen = findCLEnd - findCL;
        strncpy(CLSize, findCL, sizeLen);
        CLSize[sizeLen] = '\0';

        size = strtoll(CLSize, NULL, 10);

        if (size > 0)
        {
            conn->content_len = read_request(NULL, conn->client.sock, conn->ssl,
                conn->buf, conn->buf_size, &conn->data_len);
            conn->content_len = size;
            perror("recv");
            body = (char*)malloc(sizeof(char) * (size + 1));
            strncpy(body, conn->buf + conn->request_len, size);
            body[size] = '\0';
        }
    }

到目前为止一切都很好,即使代码不是那么漂亮,它也会做脏活。问题是,虽然在调试中代码工作正常,但是当代码作为简单的后台进程运行时,主体没有被正确解析:有时生成的主体被截断,有时它只是空的。看来问题是由客户端的快速查询引起的。

4

1 回答 1

0

不是一个真正的答案,但这就是我解决的方法。Web 服务器模块作为 Mongoose Web 服务器启动;几个月前移植到 Civetweb 上,希望最新版本的项目也支持 body 的解析。事实并非如此,我不得不手动实现它。一段时间后,我发现 Civetweb 在向 IE8 浏览器提供 Javascript 文件时存在问题(出于某种神秘原因)。我恢复到 Mongoose 并且一切正常,除了正文解析,它带来了上面的代码和随后的错误。我终于通过恢复到 Civetweb 稳定版本 1.9.1 来解决,保留手动正文解析过程。这解决了截断的请求正文和截断的 javascript 文件。Civetweb 的第一个版本可能是一个不太稳定的测试版,尽管我想知道它是如何成功运行了几个月的。

我还没有检查diff两个版本之间的 s,但我希望它与最大响应大小有关,具体取决于平台或请求标头或其他任何内容。

于 2017-06-08T14:29:48.020 回答