|
#16
|
|||
|
|||
пока были такие 400,404,301,504 наверняка и другие будут если продолжать так не правильно делать
всплывают на idhttp.get я думаю изза того что idhttp пытается скачать несколько файлов одновременно - саму страницу + подключенные скрипты+ картинки может быть, а сам может скачивать только один файл за один подход. настроил создание экземпляров но видимо тоже криво и программа все равно заставляет myhttp скачать все сразу, отсюда и всевозможные ошибки http |
#17
|
||||
|
||||
Не-не-не, idHTTP делает только то, что ему говорят Это браузер может делать параллельные запросы, да.
Вообще, proxy-сервер на Indy - это неправильно (ИМХО). Ну, и так как ты делаешь - тоже не совсем правильно. Например, использование строк в этом случае - неверный подход, ибо она будет обрезана до первого нулевого байта. Ну и получение результата на прокси с последующей его отдачей - тоже нехорошо, ибо если юзер захочет скачать 100-мегабайтный файл, то он будет висеть в памяти пока не скачается полностью, что не круто. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
pireved (25.08.2012)
|
#18
|
|||
|
|||
попробую более прозрачно объяснить вопрос. цель - добится того чтобы
при посещении пользователем любых страничек в интернете (с редиректами с ajax с javascript c CSS и тп) получал в браузер (внешний или встроеный, желательно во внешний) уже отредактированую страницу, без javascript блоков рекламы, счетчиков и тп но с картинками естественно. не важно каким способом этого добится, фильтровать через прокси или перехватывать в twebbrowser'е или каким то другиим способом, главное - на делфи 7 ну и если нужно то с использованием php. "фильтрация" и правка контента - только если есть необходимость, если не нужна то пользователь получает страницу в нетронутом виде. для скачиваний файлов тем более больших есть много других удобных средств, через эту прогу скачивать видео или архивы и тп никто не будет по замыслу. например как реализовано здесь http://anonymouse.org/cgi-bin/anon-w...www.yandex.ru/ встроен рекламный блок + еще некоторые коректировки страницы. только у них на perl видимо а мне нужно на делфи... |
#19
|
||||
|
||||
Ну тогда в любом случае нужно следующее (назовём клиента браузером):
1. Изначально используются потоки. Строки используем только после того, как проверили, что формат (content-type), пришедший с сервера, является текстовым (text/*, application/javascript, application/xml*). 2. Заголовки (от браузера к серверу и обратно) тоже надо бы передавать, в том числе Cookies. 3. В случае ошибки (3хх, 4хх, 5хх) - обрабатывать это (гугли "delphi try except") и отдавать соответствующий код браузеру (грамотно сделанный п. 2 решает и эту проблему). Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 03.09.2012 в 03:57. |
#20
|
|||
|
|||
получилось отдавать браузеру то что он запрашивает, пока что без ошибок сокета и без ошибок хтмл. теперь новая беда - браузер не хочет отображать рисунки (хотя idhttp их загружает и возвращает браузеру), не применяются и стили которые в css файлах, а сценарии javascript во внешних файлах подгружаются и выполнятся нормально. плюс в браузере вместо русских букв вопросительные знаки. это изза заголовков.
не могли бы Вы приветси пару строк примера как передавать эти самые заголовки и куки туда и обратно? куки, насколько я понял, приходят в Код:
ARequestInfo.RawHeaders в строке в начале которой есть Cookie: например Cookie: uid=7384;mid=32432;fid=37483247; всю остальную строку (кроме слова Cookie нужно разбить по строкам по разделителю ";" и передать браузеру например так Код:
AResponseInfo.Cookies.Add(uid=03232); ни куки ни стили ни картинки, которые возвращает прокси - браузер не видит либо не может определить что ему возвращают |
#21
|
||||
|
||||
Сниффер + дебагер в зубы, и смотрим, что и где повреждается.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#22
|
|||
|
|||
Цитата:
если бы знал как это делается и как устроено то не обратился за помощью сюда, а сделал бы все сам молча, но все знать не возможно. кое что получается уже: -запускается локальный прокси -прокси получает запросы от браузеров -прокси через idhttp скачивает запрошеные страницы и возвращает их содержимое браузеру в девственном виде. -ошибок и вылетов нет пока. -сессии сохраняются. но браузеры не могут определить что за документы им возвращаются от прокся. служебную информацию. как ему подсказать я не знаю. пробую вручную определить тип по расширению и подсказать браузеру mime, но не получается он не слыши меня. вероятно нужно спросить это у idhttp и синхронно передать ответ браузеру, но и этого я не знаю как сделать (через какие поля или свойства idhttp) главная задача в следующем : есть сайт забитый javascript функциями, и стилями (типа гугла только хуже), мне нужно найти в этом javascript коде например буквально такое : myval=true; и заменить на myval=false; каждый раз при открытии страницы, причем чтобы сохранились и сессия и куки, что бы в бравзере выполнялись все javascript'ы, ну и чтобы картинки отображались. вобщем нужно программно сделать маленькую подмену "на лету" не заметно для браузера, подмену в коде страницы, остальное должно быть не тронуто. еще пример - vksaver, он как то нечто очень похожее делает - вставляет на определенные страницы в определенные места свой небольшой код, в любом бровзере, сохраняя и куки и сессии и все прочее. наверняка он так же через прокси пропускает все адреса и обрабатывает только нужные места. но моя программа (если получится сделать) будет работать только на моем компе, прога лично и сугубо для меня. |
#23
|
||||
|
||||
IdHTTP.Response.БлаБлаБла
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#24
|
|||
|
|||
Цитата:
Код:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var doc:string; typ,mime:string; body:tstringstream; begin body:=tstringstream.Create(''); try myhttp := TIdHTTP.Create(nil); myhttp.HandleRedirects := true; myhttp.AllowCookies:=true; myhttp.CookieManager:=cm; doc:='http://'+ARequestInfo.Host+ARequestInfo.Document; typ:=get_type(doc); mime:=get_mime(typ); myhttp.Request.RawHeaders.Text:=ARequestInfo.RawHeaders.Text; AResponseInfo.ContentType:=mime; AResponseInfo.CustomHeaders:=ARequestInfo.RawHeaders; body.WriteString(myhttp.Get(doc)); AResponseInfo.RawHeaders.Text:=myhttp.Response.RawHeaders.Text; AResponseInfo.ResponseText:=myhttp.ResponseText; AResponseInfo.ContentText:=body.DataString; body.Free; except // end; end; напоминает узелковую письменность)) но вариантов перепробовал сотни уже всяких. так работает более менее без ошибок и вылетов. или это тупик или я вообще не туда пошел get_mime и get_type функции определяющие mime type по расширению скачиваемого документа, если его нету - значит тип =text/html Последний раз редактировалось pireved, 04.09.2012 в 18:59. |
#25
|
||||
|
||||
Код:
AResponseInfo.ContentStream:=TMemoryStream.Create; myhttp.Get(doc,AResponseInfo.ContentStream); AResponseInfo.ContentType:=myhttp.Response.ContentType; Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 04.09.2012 в 19:00. |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
pireved (06.09.2012)
|
#26
|
|||
|
|||
Цитата:
теперь вторая часть задачи - убрать или заменить лишнее на загруженных страничках. к примеру, у меня есть кустарная функция my_page_filter(doc_body,src,dest:string):string; где src-искомая подстрока, dest - чем ее заменить, если найдено src. как мне ее применить для потока? конвертировать в строку потом обратно?или как то можно фильтровать поток сразу, но как использовать строковые функции для поиска и замены подстроки в строке для потока? |
#27
|
||||
|
||||
StringReplace
<a href заменить на <!-- a href — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#28
|
|||
|
|||
нет нет..
Код:
function filter_doc(body:tmemorystream;before,after:string):tmemorystream; var ms:tmemorystream; begin ms:=tmemorystream.create; //здесь нужно отфильтровать body, а именно - найти подстроку, заменить ее, если она найдена и вернуть результат в ms. result:=ms; end; StringReplace - применима только для строковых переменных ведь. как ее использовать для потока в памяти я не знаю. надеюсь без assembler'a и указателей есть какой то способ попроще. |
#29
|
||||
|
||||
вариантов как обычно много...
можно в Memo загрузить из MemoryStream и работать с Memo. пример есть в файле справки. Пишу программы за еду. __________________ |
#30
|
||||
|
||||
Цитата:
|