![]() |
|
|
#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; |
|
#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.
|
|
#36
|
||||
|
||||
|
Цитата:
|
|
#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; |
|
#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.
|
|
#44
|
||||
|
||||
|
Вот еще что, страница от сервера пожет прийти пожатой GZipом.
|
|
#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; |