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