无法从C中的HTTP请求获取路径和方法

时间:2014-09-06 02:20:15

标签: c sockets http

我的服务器代码基于this,虽然我修改了deal_with_data函数,如下所示:

void dealWithData (int list, void (*callback)(struct Request, int socket)) {
    char buffer[8196];
    int n;

    if (sock_gets(connectlist[list], buffer, 8196) < 0) {
        close(connectlist[list]);
        connectlist[list] = 0;
    } else {
        n = read(connectlist[list], buffer, sizeof(buffer));
        buffer[n] = 0;

        printf("%s\n", buffer);
        struct Request req = parseRequest(buffer, n);
        callback(req, connectlist[list]);

        close(connectlist[list]);
        connectlist[list] = 0;
    }

}; 

我从printf获得的数据是:

Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

包含路径,方法和协议的第一行没有出现,我猜是收到了但我不知道为什么没有得到,也许是因为异步功能?我以同步方式执行HTTP服务器,它完美地获得了该行。也许是因为我读取套接字数据的方式?

感谢先进!

1 个答案:

答案 0 :(得分:2)

几乎可以肯定sock_gets()正在阅读你的第一行,然后你只是在随后的read()调用中覆盖它。尝试更改为:

} else {
    printf("%s\n", buffer);    /*  <--- Add this line  */

    n = read(connectlist[list], buffer, sizeof(buffer));
    buffer[n] = 0;

    printf("%s\n", buffer);

你应该看到第一行。

或者,要将其全部放在一个字符串中,假定sock_gets()的行为类似于gets()并删除换行符:

} else {
    size_t offset = strlen(buffer);
    buffer[offset] = '\n';

    n = read(connectlist[list], buffer + offset + 1,
             sizeof(buffer) - offset - 1);
    buffer[n + offset + 1] = 0;

    printf("%s\n", buffer);

顺便说一句,请注意在HTTP行下以CRLF结束。 sock_gets()可能会为您手动执行转换,但通过直接read()调用,您必须自己进行翻译。否则,您将使用\r调用打印一堆printf()个字符。