|
|
|
| Вот пример ответа сервера mail.ru на запрос главной страницы:
HTTP/1.1 200 OK
Date: Sun, 14 Jan 2007 17:16:21 GMT
Server: Apache/1.3.31 (Unix) mod_deflate/1.0.21 rus/PL30.20
Set-Cookie: Mpopl=1772418129; expires=Sun, 14 Jan 2007 17:31:21 GMT; path=/; domain=.mail.ru
Set-Cookie: mrcu=7D6C45AA6565735B65757EC7EFC3; expires=Thu, 31 Jul 2036 15:57:14 GMT; path=/; domain=.mail.ru
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Last-Modified: Thu, 31 Jul 2036 15:57:14 GMT
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=windows-1251
Vary: user-agent
c8e
|
Тело документа отделяется от заголовков с помощью "c8e". Почитал документацию HTTP/1.1:
4 HTTP Message
4.1 Message Types
HTTP messages consist of requests from client to server and responses from server to client.
HTTP-message = Request | Response ; HTTP/1.1 messages
Request (section 5) and Response (section 6) messages use the generic message format of RFC 822 [9] for transferring entities (the payload of the message). Both types of message consist of a start-line, zero or more header fields (also known as "headers"), an empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields, and possibly a message-body.
generic-message = start-line
*(message-header CRLF)
CRLF
[ message-body ]
start-line = Request-Line | Status-Line
In the interest of robustness, servers SHOULD ignore any empty line(s) received where a Request-Line is expected. In other words, if the server is reading the protocol stream at the beginning of a message and receives a CRLF first, it should ignore the CRLF.
Certain buggy HTTP/1.0 client implementations generate extra CRLF's after a POST request. To restate what is explicitly forbidden by the BNF, an HTTP/1.1 client MUST NOT preface or follow a request with an extra CRLF.
|
Написано, что эта линия, отделяющяя тело документа от заголовков, должна быть пустая.
Но ведь это не пустая линия. На всех сайтах это какая-то последовательность из трех цифр/букв, причем на некоторых сайтах эта линия меняется, а на том же mail.ru она постоянна.
Так что же это за CRLF? | |
|
|
|
|
|
|
|
для: Unkind
(14.01.2007 в 20:26)
| | Вот мой пример ответа mail.ru на запрос главной страницы:
HTTP/1.1 200 OK
Date: Sun, 14 Jan 2007 18:16:24 GMT
Server: Apache/1.3.31 (Unix) mod_deflate/1.0.21 rus/PL30.20
Set-Cookie: Mpopl=816297737; expires=Sun, 14 Jan 2007 18:31:24 GMT; path=/; domain=.mail.ru
Set-Cookie: mrcu=33EE45AA737847292010FB3CE457; expires=Thu, 31 Jul 2036 15:58:44 GMT; path=/; domain=.mail.ru
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Last-Modified: Thu, 31 Jul 2036 15:58:44 GMT
Connection: close
Content-Type: text/html; charset=windows-1251
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"> и т. д.
| Пустых строк более чем достаточно.
Да и в вашем примере что находится между "Vary: user-agent" и "c8e"? Правильно, пустая строка! | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 21:18)
| | А что в таком случае "c8e"? | |
|
|
|
|
|
|
|
для: Unkind
(14.01.2007 в 21:34)
| | Ну наверное косяки работы вашего скрипта. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 21:57)
| | Где?
<?php
header("Content-type: text/plain");
$headers = "";
$fp = fsockopen('mail.ru', 80, $errno, $errstr, 1);
if(!$fp) die("Error (".$errno."): ".$errstr."...");
$headers .= "GET / HTTP/1.1\n";
$headers .= "Host: mail.ru\n";
$headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.01\r\n\r\n";
fwrite($fp, $headers);
$buffer = "";
while(!feof($fp)) $buffer .= fread($fp, 1024);
echo($buffer);
fclose($fp);
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(14.01.2007 в 21:34)
| | Обратите внимание на
Transfer-Encoding: chunked
|
Это метод транспортного кодирования заключается в том, что тело отклика делится на блоки, каждый блок отправляется независимо, предваренный размером. В конце идут заголовки.
Подробнее - смотрите RFC-2616. (http://zeus.sai.msu.ru:7000/nets/semenov/4/45/http4561.shtml)
c8e - Это и есть размер первого блока.
А знаете, почему так получается?
Потому что Вы пытаетесь применять протокол, который не знаете. HTTP 1.1
Вместо того, чтоб применять протокол HTTP 1.0 , о котором хоть что-то представляете.
Так что косяк вот в этой строке: $headers .= "GET / HTTP/1.1\n"; | |
|
|
|
|
|
|
|
для: Trianon
(14.01.2007 в 22:46)
| | Хм...Ясн, спасибо. | |
|
|
|