Есть задача дизайна, уже всю голову сломал какую реализацию выбрать
Итак, написан код для отправки HTTP GET и POST сообщений используя следующее API из WinInet.lib: InternetOpen(), InternetConnect(), HttpOpenRequest(), HttpAddRequestHeaders(), HttpSendRequest(). Запросы уходят отлично, проблемы с чтением приемов. В ответе я ожидаю получить HTML страничку, а затем парсить ее.
Теперь начинаются вопросы:
1 — При вызове HttpQueryInfo() с параметром HTTP_QUERY_CONTENT_LENGTH возвращается ERROR_HTTP_HEADER_NOT_FOUND. Это нормально в случае, если я ожидаю получить в ответе HTML страницу?
2 — Т.к. нет возможности узнать размер контента, то наверное можно попытаться читать данные в цикле с помощью InternetQueryDataAvailable() и InternetReadFile(). Теперь нужно как-то сохранить данные, и вот тут начинаются сложности. Т.к. размера данных мы не знаем до тех самых пор, пока не дочитаем до конца, то сразу аллокировать память нужного размера не получится. Насколько это корректно перенаправлять данные в файл, а затем уже парсить его? Софт будет крутиться на Windows Mobile. Можно, конечно, выделить большой буфер, и в случае, если размер конента превышает его, то просто проигнорировать остаток данных, но это как-то криво выглядит. Вот такая дилема Какие еще варианты посоветуете?
Задача исключительно важная и срочная.
Заранее спасибо!
14.05.08 15:50: Перенесено модератором из 'C/C++' — Кодт
А>2 — Т.к. нет возможности узнать размер контента, то наверное можно попытаться читать данные в цикле с помощью InternetQueryDataAvailable() и InternetReadFile(). Теперь нужно как-то сохранить данные, и вот тут начинаются сложности. Т.к. размера данных мы не знаем до тех самых пор, пока не дочитаем до конца, то сразу аллокировать память нужного размера не получится. Насколько это корректно перенаправлять данные в файл, а затем уже парсить его? Софт будет крутиться на Windows Mobile. Можно, конечно, выделить большой буфер, и в случае, если размер конента превышает его, то просто проигнорировать остаток данных, но это как-то криво выглядит. Вот такая дилема Какие еще варианты посоветуете?
Код препологает что вопрошающий знаком с понятием динамический массив:
Здравствуйте, Аноним, Вы писали:
А>Есть задача дизайна, уже всю голову сломал какую реализацию выбрать А>Итак, написан код для отправки HTTP GET и POST сообщений используя следующее API из WinInet.lib: InternetOpen(), InternetConnect(), HttpOpenRequest(), HttpAddRequestHeaders(), HttpSendRequest(). Запросы уходят отлично, проблемы с чтением приемов. В ответе я ожидаю получить HTML страничку, а затем парсить ее. А>Теперь начинаются вопросы: А>1 — При вызове HttpQueryInfo() с параметром HTTP_QUERY_CONTENT_LENGTH возвращается ERROR_HTTP_HEADER_NOT_FOUND. Это нормально в случае, если я ожидаю получить в ответе HTML страницу? А>2 — Т.к. нет возможности узнать размер контента, то наверное можно попытаться читать данные в цикле с помощью InternetQueryDataAvailable() и InternetReadFile(). Теперь нужно как-то сохранить данные, и вот тут начинаются сложности. Т.к. размера данных мы не знаем до тех самых пор, пока не дочитаем до конца, то сразу аллокировать память нужного размера не получится. Насколько это корректно перенаправлять данные в файл, а затем уже парсить его? Софт будет крутиться на Windows Mobile. Можно, конечно, выделить большой буфер, и в случае, если размер конента превышает его, то просто проигнорировать остаток данных, но это как-то криво выглядит. Вот такая дилема Какие еще варианты посоветуете?
А>Задача исключительно важная и срочная.
А>Заранее спасибо!
1. Думаю да.
2. Ну допустим HeapAlloc/HeapReAlloc/HeapFree есть на "Windows Mobile Version 5.0 and later".
Здравствуйте, Аноним, Вы писали:
А>Теперь начинаются вопросы: А>1 — При вызове HttpQueryInfo() с параметром HTTP_QUERY_CONTENT_LENGTH возвращается ERROR_HTTP_HEADER_NOT_FOUND. Это нормально в случае, если я ожидаю получить в ответе HTML страницу?
имхо, ты просто не дождался еще ответа в этот момент. как вариант, ты получил РЕЕЗ-ответ "безразмерный" — не содержащий в своем заголовке своей длины вообще: тогда да, читаешь кусками (размер куска выбираешь от задачи), пишешь парсер "кусочный" — который предполагает, что данные ему будут кусками даваться и в случае необходимости он может потребовать от "условного читающего" следующий кусок — и парсишь. Есть точно только HTML-страницы — можно считать концом тег </HTML>.
MSDN также дает пример использования пары InternetQueryDataAvailable() + InternetReadFile() для вычитки "всего что вообще удалось получить" — тоже вариант, просто плотнее упирается на реализацию WinInet, имхо.
Голь на выдумку хитра, однако...
Re[3]: Обработка HTTP response, срочно нужна помощь
Здравствуйте, c-smile, Вы писали:
TL>>... Есть точно только HTML-страницы — можно считать концом тег </HTML>. CS>Tags <html> and </html> are optional in HTML. CS>От засада, да?
Да, засада. Какие есть предложения как ловить конец файла?
Голь на выдумку хитра, однако...
Re[4]: Обработка HTTP response, срочно нужна помощь
Здравствуйте, Аноним, Вы писали:
А>Есть задача дизайна, уже всю голову сломал какую реализацию выбрать А>Итак, написан код для отправки HTTP GET и POST сообщений используя следующее API из WinInet.lib: InternetOpen(), InternetConnect(), HttpOpenRequest(), HttpAddRequestHeaders(), HttpSendRequest(). Запросы уходят отлично, проблемы с чтением приемов. В ответе я ожидаю получить HTML страничку, а затем парсить ее. А>Теперь начинаются вопросы: А>1 — При вызове HttpQueryInfo() с параметром HTTP_QUERY_CONTENT_LENGTH возвращается ERROR_HTTP_HEADER_NOT_FOUND. Это нормально в случае, если я ожидаю получить в ответе HTML страницу? А>2 — Т.к. нет возможности узнать размер контента, то наверное можно попытаться читать данные в цикле с помощью InternetQueryDataAvailable() и InternetReadFile(). Теперь нужно как-то сохранить данные, и вот тут начинаются сложности. Т.к. размера данных мы не знаем до тех самых пор, пока не дочитаем до конца, то сразу аллокировать память нужного размера не получится. Насколько это корректно перенаправлять данные в файл, а затем уже парсить его? Софт будет крутиться на Windows Mobile. Можно, конечно, выделить большой буфер, и в случае, если размер конента превышает его, то просто проигнорировать остаток данных, но это как-то криво выглядит. Вот такая дилема Какие еще варианты посоветуете?
Если HTTP >= 1.1, то если нет Content-Length, то перед каждым блоком будет строка с кол-вом байт в очередном блоке (и заголовок Content-encoding: chunked).
Если HTTP < 1.1, то можно читать данные любыми удобными порциями, пока сервер не закроет соединение.
--
Спасибо
Re[6]: Обработка HTTP response, срочно нужна помощь
На всякий случай сразу реализовал и вывод в файл.
Вот теперь стою перед дилеммой как парсить HTML & XML. Впринципе, парсинг XML достаточно тривиален. Решил пойти стандартным путем, написал утилитный класс для использования IXMLDOM и сам парсер для сообщений, представленных в виде XML. А вот извлечения XML из HTML оставил на последок. Сначала решил посмотреть что люди пишут по этому поводу и набрел на знакомый ник http://www.codeproject.com/KB/recipes/HTML_XML_Scanner.aspx
Вообщем спасибо большое, все так стройненько и аккуратненько. Руки чешутся прикрутить поскорее
Re[2]: Обработка HTTP response, срочно нужна помощь
Здравствуйте, The Lex, Вы писали:
TL>Здравствуйте, Аноним, Вы писали:
TL>... пишешь парсер "кусочный" — который предполагает, что данные ему будут кусками даваться и в случае необходимости он может потребовать от "условного читающего" следующий кусок — и парсишь. Есть точно только HTML-страницы — можно считать концом тег </HTML>.
Зачем так сложно, когда можно просто создать простенький динамический массив в котором сохранять считываемые фрагменты.
Потом выделить суммарный обьем памяти необходимый для хранения всех фрагментов и слить фрагменты в единый кусок памяти.
Элемент динамического массива может иметь следующую структуру:
struct
{
int iSize;
char* pData;
};
Re[6]: Обработка HTTP response, срочно нужна помощь
Здравствуйте, c-smile, Вы писали:
CS>А html ты как/чем собрался прасить-то?
Твой парсер (http://www.codeproject.com/KB/recipes/HTML_XML_Scanner.aspx) работает и очень здорово мне помог.
Есть два момента:
1 — Могу ли я его использовать? (надеюсь, что да)
2 — Вероятно в файле xh_scanner.cpp строка 165, предполагалось использовать число 7 в качестве передаваемого пар-ра при вызове equal(tag_name,"!ENTITY",8)
Re[3]: Обработка HTTP response, срочно нужна помощь
Здравствуйте, pjBrain, Вы писали:
TL>>... пишешь парсер "кусочный" — который предполагает, что данные ему будут кусками даваться и в случае необходимости он может потребовать от "условного читающего" следующий кусок — и парсишь. Есть точно только HTML-страницы — можно считать концом тег </HTML>.
B>Зачем так сложно
Привык, понимаешь, мыслить исходя из условия ограниченности ресурсов...
B>..., когда можно просто создать простенький динамический массив в котором сохранять считываемые фрагменты. B>Потом выделить суммарный обьем памяти необходимый для хранения всех фрагментов и слить фрагменты в единый кусок памяти.