Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: HTTP (CRLF)
 
 автор: Unkind   (14.01.2007 в 20:26)   письмо автору
 
 

Вот пример ответа сервера 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?

   
 
 автор: Саня   (14.01.2007 в 21:18)   письмо автору
 
   для: 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"? Правильно, пустая строка!

   
 
 автор: Unkind   (14.01.2007 в 21:34)   письмо автору
 
   для: Саня   (14.01.2007 в 21:18)
 

А что в таком случае "c8e"?

   
 
 автор: Саня   (14.01.2007 в 21:57)   письмо автору
 
   для: Unkind   (14.01.2007 в 21:34)
 

Ну наверное косяки работы вашего скрипта.

   
 
 автор: Unkind   (14.01.2007 в 22:28)   письмо автору
 
   для: Саня   (14.01.2007 в 21:57)
 

Где?

<?php
header
("Content-type: text/plain");

$headers "";

$fp fsockopen('mail.ru'80$errno$errstr1);
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($fp1024);
echo(
$buffer);
fclose($fp);
?>

   
 
 автор: Trianon   (14.01.2007 в 22:46)   письмо автору
 
   для: 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";

   
 
 автор: Unkind   (14.01.2007 в 22:55)   письмо автору
 
   для: Trianon   (14.01.2007 в 22:46)
 

Хм...Ясн, спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования