Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Служебная информация при передаче htm-контента  (Прочитано 16177 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« : 10-06-2005 13:20 » 

У меня программа через сокеты получает html-страничку.
Передача проходит нормально, могу выделить HTTP-заголовок и сам текст.
Но в тексте при передаче перед каждым переданным блоком ставится размер:
Код:
5AE
<html xmlns:fo="http
Код:
<table border="0" ce
5B4
llpadding="2" cellspacing="0" width="100%">
Типа такого. Но не всегда. Как избавиться от передачи таких параметров? У меня и без них, вроде, все передается полностью. Запрос вида:
Код:
"GET "+sPath+" HTTP/1.1\nHost: "+Host+"\nConnection: Close\nAccept-Language: ru\n\n"
Может, что-то в запрос добавить надо?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 11-06-2005 09:17 » 

Этого в HTTP нет - видимо у тебя кто-то балует и возможно твой код. На чем пишешь? Часом не VB? Похоже на неправильное преобразование типов.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #2 : 14-06-2005 06:58 » 

Пишу на C++ - MSVC.NET, сокеты.
Реально размер. Я считал по байтам - в hex размер текущего блока. Здесь была моя ладья...
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 14-06-2005 16:35 » 

Проверяй данные поэтапно - такой фигни быть не должно.
Часом не классы какие-нибудь используешь для хранения строк? Вот в использовании их и ищи проблему.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #4 : 15-06-2005 12:00 » new

Читаю из сокета с помощью обычной recv, результат пишется в массив из char, потом посимвольно заносится в CByteArray. Затем с помощью функции .GetData() и операции (char*) для ее результата перевожу в CString.
По мне - очевидно, что это приходит извне... Я думал, это особенность протокола, но более низкого уровня - из TCP.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 15-06-2005 13:09 » 

baldr, нет - ни HTTP, ни TCP, работа которого, кстати, на данные вообще не влияет, такого не имеет.
Распечатай данные сразу после recv().
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #6 : 15-06-2005 14:05 » 

вот оно применительно к хэдеру:
Код:
HTTP/1.1 200 OK

Server: nginx/0.1.30

Date: Wed, 15 Jun 2005 13:58:20 GMT

Content-Type: text/html; charset=windows-1251

Transfer-Encoding: chunked

Connection: close

Set-Cookie: UserID=8505032PJIYVMTYSMHJPBDABGQY; path=/; expires=Thu, 15-Jun-2006 13:58:20 GMT

Cache-Control: private, max-age=43200

Expires: Thu, 16 Jun 2005 01:58:20 GMT



B62

<html xmlns:fo=
дальше html...
Причем, я заметил, что это появляется только тогда, когда в хэдере результата отсутствует поле Content-Length:... Если оно есть - все путем.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #7 : 15-06-2005 14:10 » 

попробуй такой запрос:
Код:
GET http://fictionbook.ru/1251/pda/ru/author/dostoevskiyi_fedor_mihayilovich/bratya_karamazoviy/ HTTP/1.1
Host: fictionbook.ru
Connection: Close
Accept-Language: ru
кажется так
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #8 : 15-06-2005 14:15 » 

А может это быть из-за того, что я получаю этот контент через прозрачный HTTP-прокси?
Вообще-то вряд ли, потому что по диалапу у меня такое же, вроде было.... Жаль
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 15-06-2005 16:58 » 

Прежде всего - в запросе GET задается не URL, а URI !
URL = расположение ресурса
URI = идентификатор ресурса без указания сервера и протокола
К серверу ты уже подключился, виртуальный сервер задается в Host, а протокол ты идентифицируешь самой строкой запроса.

Посмотри на результат:

telnet fictionbook.ru 80
Trying 195.42.181.71...
Connected to fictionbook.ru.
Escape character is '^]'.
GET http://fictionbook.ru/1251/pda/ru/author/dostoevskiyi_fedor_mihayilovich/bratya_karamazoviy/ HTTP/1.1
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/0.1.30</center>
</body>
</html>

Connection closed by foreign host.

Ответ начинается сразу после первой строки, не дожидаясь "\r\n\r\n".

Вот коректный запрос и полученный результат:

telnet fictionbook.ru 80
Trying 195.42.181.71...
Connected to fictionbook.ru.
Escape character is '^]'.
GET /1251/pda/ru/author/dostoevskiyi_fedor_mihayilovich/bratya_karamazoviy/ HTTP/1.1
Host: fictionbook.ru
Connection: Close
Accept-Language: ru

HTTP/1.1 200 OK
Server: nginx/0.1.30
Date: Wed, 15 Jun 2005 16:31:08 GMT
Content-Type: text/html; charset=windows-1251
Connection: close
Set-Cookie: UserID=8510494OSLVOFOHOVKAAWBQCHDK; path=/; expires=Thu, 15-Jun-2006 16:31:08 GMT
Cache-Control: private, max-age=43200
Expires: Thu, 16 Jun 2005 04:31:08 GMT
Content-Length: 13912

<html xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:L="fblib:L"><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><title>Читать/Cкачать книгу БратьКарамазовы (Федор Михайлович Достоевский) в библиотеке FictionBook.lib :: книги в fb2, html, rtf, rb, txt, pdb, iSilo</title><link rel="StyleSheet" href="/fb_mobile.css" type="text/css"><link rel="SHORTCUT ICON" href="/favicon.ico"><link rel="alternate" type="application/rss+xml" title="RSS - Новые книги в библиотеке" href="/1251/pda/ru/new/rss/"><link rel="alternate" type="application/rss+xml" title="RSS - Новые пользовательские рецензии на книги" href="/1251/pda/ru/newrecense/rss/"><link rel="alternate" type="application/rss+xml" title="RSS - Обновленные книги" href="/1251/pda/ru/updated_books/rss/"><script language="JavaScript" type="text/javascript">

......много текста........
                        </script></body></html>

Connection closed by foreign host.

В тесте я никаких hex-подобных строк не обнаружил.


Главное, что я хочу сказать, надо писать согласно стандартам и спецификациям. Потом уже можно грешить на чужой софт.
« Последнее редактирование: 20-12-2007 21:09 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 15-06-2005 17:03 » 

Content-length не является обязательным элементом - он служит лишь для контроля.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #11 : 16-06-2005 07:56 » 

RXL, я соединяюсь через прокси - а в этом случае в host указываю свой прокси. Соответственно, строка в GET будет содержать полный путь. А прокси уже извлечет и имя сервера, и запрос.
В примере, каюсь, указал без прокси....
Вообще, по-моему это появляется не всегда... Жаль
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 16-06-2005 09:30 » 

Работа с прокси отличается от работы с сайтом только тем, что соединение браузер выполняет не с указанным сайтом напряму, а с заранее известным прокси-сервером. Данные запроса имеют тот же состав. Конечно, чтобы прокси знал куда обращаться, ему передается имя сервера назначения через Host. Передавать в Host имя прокси - ошибка.
Прозрачный прокси работает аналогично обычному. Отличие только в том, что браузер не знает о нем и делает соединение напрямую на нужный сайт, а маршрутизатор, через который проходит запрос, перехватывает эти соединения и перенаправляет на прокси. Т.е. для браузера все прозрачно.

Чтобы не повторять одно и то же лучше полистай RFC. Начни с HTTP/1.1 и посмотри отдельные дополнения по части прокси. Обращай внимание на строчку "Obsoleted by" в заголовке документов.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #13 : 20-06-2005 09:54 » 

RXL, за RTFM все-таки спасибо... Улыбаюсь
Нашел, что эти параметры будут передаваться при поле "Transfer-Encoding: chunked". Тогда не должно быть "Content-length".
Код:
chunk = chunk-size [ chunk-ext ] CRLF
             chunk-data CRLF
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines