我正在开发一个使用套接字通过 HTTP GET 请求检索文件的 C 程序。我使用该recv
函数写入缓冲区,然后将缓冲区的内容附加到一个新文件中。该程序运行良好,除了一个问题:每个文件的顶部都包含 HTTP 响应。
例如,我可以使用我的程序从网上成功下载并打开一个 PDF 文件,并且它会毫无问题地打开。但是,如果我在 Notepad++ 中编辑 PDF,我会在顶部看到以下内容:
HTTP/1.1 200 OK
Date: Wed, 07 Nov 2012 19:57:54 GMT
Server: Apache/2.2.21 (Unix) mod_python/3.3.1 Python/2.6.6 PHP/5.3.8
Last-Modified: Wed, 01 Aug 2012 21:31:31 GMT
ETag: "f2ae8c-4134aa-4c63b04c07df2"
Accept-Ranges: bytes
Content-Length: 4273322
Content-Type: application/pdf
%PDF-1.4
%äðíø
10 0 obj
<</Filter/FlateDecode/Length 2722>>
...
如果我使用浏览器下载 PDF 文件,则文件匹配,但我的程序检索到的文件顶部的 HTML 响应除外。我已经通过删除有问题的行并比较文件哈希来验证这一点。
我觉得有更优雅和正确的方法来解决这个问题。我知道在文件开始之前 HTTP 响应之后总是有两个换行符,所以这是我(草率,不工作)尝试提取响应:
FILE* ptr_file = fopen("PDF_TEST.pdf", "w+");
char* buffer[BUFFER_SIZE];
int file_pos = 0;
int bytes_rcvd = 0;
int first_iter = 1;
while((bytes_rcvd = recv(socket_server, buffer, BUFFER_SIZE, 0)) > 0)
{
if(first_iter)
{// Need to remove the HTTP response from the buffer
char* str_buffer;
char* html_resp = strstr(buffer, "\n\n");
int html_resp_length = strlen(html_resp) + 2;
printf("HTML RESPONSE:\n%s\n\n", html_resp);
char* first_buffer[BUFFER_SIZE - html_resp_length];
memcpy(first_buffer, buffer+html_resp_length-1, sizeof(first_buffer));
printf("\n\nREST OF BUFFER:%s\n", first_buffer);
bytes_rcvd -= html_resp_length;
fwrite(first_buffer, 1, bytes_rcvd, ptr_file);
first_iter = 0;
continue;
}
fwrite(buffer, 1, bytes_rcvd, ptr_file);
file_pos += bytes_rcvd;
}
我在这段代码中遇到了分段错误,但我相信这是因为我的缓冲区是一个数组,char*
并且我正在使用它,就好像它在char
数组中一样。
我的问题:
1.) 将 HTTP 响应与文件分开的最佳方法是什么?
2.)使用Content-Length
HTML响应指定的写入文件更好,还是应该使用我当前的方法来写入接收到的字节数?
任何输入表示赞赏。