|
#31
|
||||
|
||||
Memo лишний.
Код:
var sl: TStringList; begin sl := TStringList.Create; ms.Seek(0, 0); // Переходим в начало потока sl.LoadFromStream(ms); // Читаем из потока // Работа с sl.Text ms.Size = 0; // Сбрасываем содержимое потока sl.SaveToStream(ms); // Записываем обратно sl.Free; // Не забываем прибрать за собой end; Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#32
|
||||
|
||||
TStringList лишний, 2-х строчек кода достаточно:
Код:
var s: String; begin SetLength(s, MemoryStream.Size); MoveMemory(@s[1], MemoryStream.Memory, Length(s)); // работаем со строкой s end; я ж писал вариантов много Пишу программы за еду. __________________ |
#33
|
||||
|
||||
Цитата:
Код:
var s: String; begin SetString(s, PChar(MemoryStream.Memory), MemoryStream.Size); // работаем со строкой s end; |
#34
|
||||
|
||||
Цитата:
Цитата:
Пишу программы за еду. __________________ |
#35
|
||||
|
||||
Окститесь, вы чо, есть же TStringStream.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#36
|
||||
|
||||
Цитата:
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#37
|
|||
|
|||
Код:
function filter_doc(ms:tmemorystream;before,after:string):tmemorystream; var st:string; ss:tstringstream; ms2:tmemorystream; begin ss:=tstringstream.Create(''); ms2:=tmemorystream.Create; ss.CopyFrom(ms,ms.Size); st:=ss.DataString; st:=stringreplace(st,before,after,[rfReplaceAll, rfIgnoreCase]); ss.Seek(0,0); ss.WriteString(st); ms2.LoadFromStream(ss); result:=ms2; ms2.Free; ss.Free; end; |
#38
|
||||
|
||||
.....нафиг так то?
Код:
procedure filter_doc(ms:tmemorystream;before,after:string); var st:string; begin st:=TStringStream(ms).DataString; st:=stringreplace(st,before,after,[rfReplaceAll, rfIgnoreCase]); ms.Size := 0; ms.Write(st[1],length(st)); end; Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#39
|
||||
|
||||
TMemoryStream нельзя к TStringStream приводить.
Код:
procedure Filter(MemoryStream: TMemoryStream; const OldPattern, NewPattern: String); var s: String; begin s:=StringReplace(Copy(PChar(MemoryStream.Memory), 1, MemoryStream.Size), OldPattern, NewPattern, [rfReplaceAll, rfIgnoreCase]); MemoryStream.Size:=0; MemoryStream.Write(s[1], Length(s)); end; Пишу программы за еду. __________________ |
#40
|
|||
|
|||
в итоге если так :
Код:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var doc:string; ms:tmemorystream; begin doc:='http://'+ARequestInfo.Host+ARequestInfo.Document; ms:=tmemorystream.Create; myhttp.Get(doc,ms); filter_doc(ms,'<a href','<!---<a href'); AResponseInfo.ContentStream:=TMemoryStream.Create; AResponseInfo.ContentStream:=ms; AResponseInfo.ContentType:=myhttp.Response.ContentType; ms.Free; end; то весь контент странички где то теряется, а без промежуточной ms появляется ошибка о том, что не совместимы типы tmemory и tmemorystream. если так Цитата:
ContentLength := ContentStream.Size; в IdCustomHTTPServer.pas и прокси в ступоре. |
#41
|
||||
|
||||
замени:
Код:
filter_doc(ms,'<a href','<!---<a href'); Код:
AResponseInfo.ContentStream:=TMemoryStream.Create; Пишу программы за еду. __________________ |
#42
|
|||
|
|||
здесь
Код:
procedure filter_doc(ms:tmemorystream;before,after:string); var s:string; begin s:=StringReplace(Copy(PChar(ms.Memory), 1, ms.Size), before, after, [rfReplaceAll, rfIgnoreCase]); ms.Size:=0; ms.Seek(0,0); ms.Write(s[1], Length(s)); end; вернее не известно что возвращается изза ошибки. может изза того что строка изменилась (увеличилась длинна изза StringReplace ), а памяти на нее выделено было размером на старую строку. Последний раз редактировалось pireved, 06.09.2012 в 16:33. |
#43
|
||||
|
||||
ну, берем датастринг, модифицируем ее, чистим стрингстрим и вызываем у нее метод WriteString.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#44
|
||||
|
||||
Вот еще что, страница от сервера пожет прийти пожатой GZipом.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#45
|
|||
|
|||
убрал
Код:
ms.Free; 1. прокси работает подозрительно слишком медленно, как будто буфер чего то слишком маленький. 2. на половине страниц в инете кодировка устанавливается в ISO хотя на самом деле стоит UTF (на yandex.ru и на rambler.ru например) 3. через некоторое время активной работы появляется фатальная ошибка переполнения стека с остановкой работы программы. но это мелочи. вобщем, теперь для большей похожести на бравзер не хватает еще пары штрихов, а именно обработка POST от клиента и работа с https. про ПОСТ, нужно принять параметры формы от браузера-клиента, затем прогнать их через idhttp, получить ответ и быстренько вернуть его браузеру в нетронутом виде, и это в том случае, если требуется отправка POST данных, в остальном все GET. как это сделать? опять перепробовал уйму вариантов, самый подходящий по смыслу этот Код:
AResponseInfo.ContentStream:=TMemoryStream.Create; if ARequestInfo.Command='POST' then myhttp.post(doc,AResponseInfo.ContentStream,ARequestInfo.PostStream) else myhttp.Get(doc,AResponseInfo.ContentStream); AResponseInfo.ContentType:=myhttp.Response.ContentType; |