Доброе время суток. в IE 8 перехватываем InternetConnectW,HttpOpenRequestW,HttpSendRequestW,InternetConnectW,InternetQueryDataAvailable,InternetReadFile. Цель : с помощью regexp найти некоторые данные в загруженной из интернета странице. Необходимо анализировать все полученные данные вместе, а не кусочками которые мы "видим" в InternetReadFile, соответственно была мысль: Перехват InternetQueryDavaAvailable в обработчике которой мы сливаем все данные из Handle и сохраняем их. Позже в InternetReadFile мы просто отдаем буфер и слитые данные. НО проблема в том что когда реальная InternetQueryDataAvailable возвращает 0, мы сливаем не все данные. Т.е. по идеет возврат 0 означает что больше данных нет в буфере, но это не так. Смотрим лог : New_InternetConnectW : Connect to [ www.mail.ru ]:80, Handle 0x00CC0008 New_HttpOpenRequestW : Handle 0x00CC000C, File / New_HttpSendRequestW : Handle 0x00CC000C, HeadersLen -1, OptionalHeadersLen 0 New_InternetQueryDataAvailable : Handle 0x00CC000C, ReadyBytes 560 New_InternetReadFile : Handle 0x00CC000C, Read 560 bytes, Readed 560 New_InternetQueryDataAvailable : Handle 0x00CC000C, ReadyBytes 5635 New_InternetReadFile : Handle 0x00CC000C, Read 1488 bytes, Readed 1488 New_InternetReadFile : Handle 0x00CC000C, Read 4147 bytes, Readed 4147 New_InternetQueryDataAvailable : Handle 0x00CC000C, ReadyBytes 0 <- вот тут мы получаем ноль, т.е. данных больше нет. New_InternetReadFile : Handle 0x00CC000C, Read 1997 bytes, Readed 1997 <- О БОЖЕ, Откуда, бл8дь IE берет эту цифру ? 1997 байт ? New_InternetReadFile : Handle 0x00CC000C, Read 2288 bytes, Readed 2288 затем ещё !! New_InternetQueryDataAvailable : Handle 0x00CC000C, ReadyBytes 10715 а вот тут он ещё раз проверяет нет ли данных, ну шо за хня ? New_InternetReadFile : Handle 0x00CC000C, Read 5904 bytes, Readed 5904 New_InternetReadFile : Handle 0x00CC000C, Read 4811 bytes, Readed 4811 New_InternetQueryDataAvailable : Handle 0x00CC000C, ReadyBytes 0 реальный конец данных. Была мысль что дополнительные данные ( 1997 байт ) он узнает из обращений к handle с помощью функции HttpQueryInfo , но перехват и анализ всех возвращенных им данных ничего не дал. Есть идеи ?
P.S. есть идея в New_InternetQueryDataAvailable вызывать настоящую InternetQueryDataAvailable несколько раз даже если она вернула ноль. Сейчас попробуем.
Дело в том что если фильтровать в InternetReadFile, то фильтруемные данные мы будем видеть кусками, а мне необходимо пробежаться фильтром по всей странице. Можете уточнить свой вопрос, если честно не совсем понял "только опираясь на разбор http"
длину тела сообщения нужно определять, как указано в спецификации (HTTP/1.1)и при получении страницы руководствоваться только этим, не важно что возвращают API (если только это не разрыв соединения)
Прошу прощения, видать Я виноват в том что не могу донести до Вас в чем моя проблема. Причем тут rfc вообще ? httpd имеет прав вообще не вставлять этот "content-length", если вы об этом p.s. урл не открылся, что то инет у меня совсем колхозит
проблема решена: Код (Text): New_InternetQueryDataAvailable : Handle 0x00CC000C, ReadyBytes 561 New_InternetReadFile : Handle 0x00CC000C, Read 561 bytes, Readed 561 New_InternetQueryDataAvailable : Handle 0x00CC000C, ReadyBytes 5649 New_InternetReadFile : Handle 0x00CC000C, Read 1487 bytes, Readed 1487 New_InternetQueryOptionA : hFile 0x00CC000C, Option 33 (INTERNET_OPTION_DATAFILE_NAME) New_InternetReadFile : Handle 0x00CC000C, Read 4162 bytes, Readed 4162 New_InternetQueryDataAvailable : Handle 0x00CC000C, ReadyBytes 0 New_InternetStatusCallback : hFile [ 0x00CC000C ], Status [ INTERNET_STATUS_REQUEST_COMPLETE : 0x00000064 ], Recieved 1 bytes, Len 8 +------------------------------------------------+ 0x034BF8B4 01 00 00 00 F9 0E 00 00 ........ |[INTERNET_STATUS_REQUEST_COMPLETE] +------------------------------------------------+ New_InternetQueryOptionA : hFile 0x00CC000C, Option 23 (INTERNET_OPTION_REQUEST_FLAGS) New_InternetQueryOptionA : hFile 0x00CC000C, Option 31 (INTERNET_OPTION_SECURITY_FLAGS) New_InternetQueryOptionA : hFile 0x00CC000C, Option 66 (UNKNOWN) New_InternetReadFile : Handle 0x00CC000C, Read 1982 bytes, Readed 1982 New_InternetReadFile : Handle 0x00CC000C, Read 1851 bytes, Readed 1851
fsd До Вас к сожалению так и не достучалась моя проблема, которую уже решил Все равно спасибо за внимание.