2017-06-06 52 views
1

我正在使用C中的旧版mongoose(开放源代码Web服务器),它没有提供对请求负载的本地访问。为了支持POST和PUT请求,我手动修改了它:在猫鼬读取头文件之后,我检查是否设置了Content-Length,如果是,我再从套接字中读取Content-Lenght个字符。在Mongoose WebServer中检索请求正文时出错

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'; 
     } 
    } 

到目前为止,即使代码不是那么美丽,它也不会做肮脏的工作。问题是,在调试时代码工作正常,但是当代码作为一个简单的后台进程运行时,主体没有被正确解析:有时候生成的主体被截断,有时候它只是空的。看来问题是由客户端的快速查询造成的。

+1

从哪里发送?无法在Chrome或Firefox中重现...都使用'$ .ajax'正确添加Content-Length。创建一个再现丢失标题的演示 – charlietfl

+0

打开一个只有jQuery和AJAX标记的问题很奇怪,然后看到C代码但没有Javascript。 –

+0

@JaredFarrish,我也标记为“mongoose”。 – phagio

回答

0

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

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