在HTTP响应中查找换行符

时间:2011-11-18 04:46:08

标签: c http sockets http-headers

我目前有一个基本上从网页上读取html的程序。在向Web服务器发送http请求后,我得到一个响应,我使用fdopen来读取套接字:

FILE *webpage = fdopen(socket, "r");

然后我有一个循环,使用fgets获取每一行,然后将它们打印到一个文件:

while(!feof(webpage)){
    fgets(newline, 1000, webpage);
    fprintf ...
}

程序的这一部分工作正常,我最终获得了一些测试文件,如:

HTTP/1.1 200 OK^M
Date: Fri, 18 Nov 2011 04:42:40 GMT^M
Server: Apache/2.2.14^M
Accept-Ranges: bytes^M
Cache-Control: max-age=0^M
Expires: Fri, 18 Nov 2011 04:42:40 GMT^M
Vary: Accept-Encoding^M
Content-Length: 345235^M
Connection: close^M
Content-Type: text/html^M
X-Pad: avoid browser bug^M
^M
<html lang="en">
<head>
...

我想在xpad下找到这个换行符,并在找到这个换行符时插入一些东西(基本上在打印头文件后立即执行操作。但是,我不确定如何找到该行,或者是什么^ Ms是为。

目前我正在尝试像

这样的事情
if(newline == "\r\n"){
   ... 
}

或只是“\ n”,它不起作用。我认为它与^ M有关,但我不确定。

谢谢!

3 个答案:

答案 0 :(得分:1)

对于标题,HTTP使用回车符+换行符对来标记行尾 - 所以你看到的'^ M'是回车符。如果特定应用程序允许,则在标题之后,正文中的行结尾可能会有不同的标记。

标题的末尾用空行标记,因此该行的第一个字符是回车符(甚至其他空格也不能出现在它之前)。所以当你第一次找到'\ r'作为一行的第一个字符时,你就找到了标题的结尾;所有剩余的线都是身体的一部分。

if(newline == "\r\n"){无法正常工作,因为您无法以这种方式比较字符串 - 您正在检查newline指向的地址是否与字符串文字{{1}的地址相等},即使"\r\n"中的字符匹配也是假的。 newlinestrcmp()会起作用,但由于它只有两个字符,您可以单独比较它们(甚至可能更快)。你也不太可能在行结束之外得到strncmp(),所以你可能只是检查它是否安全。

如果'\r'足够大以容纳任何标题行,则以下大致概述了要做的事情(至少一种方法):

buf

答案 1 :(得分:0)

^ M(Ctrl + M)是ascii carrige返回,相信你只能搜索\ r而不是\ r \ n

我认为理想情况下你想要进行正则表达式检查,并在行的开头检查一个新的行字符,即^ \ n或者你可以检查.length并查看它是否包含一个新行,如果它为0。你只是想确保你没有抓到任何虚假的假设。

答案 2 :(得分:0)

那些^M是Windows换行符。或者说是ASCII CR。请尝试仅搜索\r而不是\r\n