Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #31  
Старый 06.09.2012, 14:47
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

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  
Старый 06.09.2012, 14:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

TStringList лишний, 2-х строчек кода достаточно:

Код:
var
  s: String;
begin
    SetLength(s, MemoryStream.Size);
    MoveMemory(@s[1], MemoryStream.Memory, Length(s));
    // работаем со строкой s
end;

я ж писал вариантов много
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #33  
Старый 06.09.2012, 15:06
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от NumLock
TStringList лишний, 2-х строчек кода достаточно:

Код:
var
  s: String;
begin
    SetLength(s, MemoryStream.Size);
    MoveMemory(@s[1], MemoryStream.Memory, Length(s));
    // работаем со строкой s
end;

я ж писал вариантов много
Можно и одной строчкой
Код:
var
  s: String;
begin
    SetString(s, PChar(MemoryStream.Memory), MemoryStream.Size);
    // работаем со строкой s
end;
Ответить с цитированием
  #34  
Старый 06.09.2012, 15:09
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от poli-smen
Можно и одной строчкой
ну я и говорю:
Цитата:
Сообщение от NumLock
вариантов как обычно много...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #35  
Старый 06.09.2012, 15:10
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Окститесь, вы чо, есть же TStringStream.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #36  
Старый 06.09.2012, 15:26
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Окститесь, вы чо, есть же TStringStream.
Смысла в нём тут нет. DataString у него всё равно read-only.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #37  
Старый 06.09.2012, 15:30
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

Код:
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  
Старый 06.09.2012, 15:32
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

.....нафиг так то?
Код:
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  
Старый 06.09.2012, 15:53
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

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  
Старый 06.09.2012, 16:04
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

в итоге если так :

Код:
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.

если так
Цитата:
Код:
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;
то прерывается с ошибкой
ContentLength := ContentStream.Size;
в IdCustomHTTPServer.pas и прокси в ступоре.
Ответить с цитированием
  #41  
Старый 06.09.2012, 16:14
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

замени:
Код:
filter_doc(ms,'<a href','<!---<a href');
удали:
Код:
AResponseInfo.ContentStream:=TMemoryStream.Create;
и позицию на всякий пожарный в ноль
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #42  
Старый 06.09.2012, 16:25
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

здесь
Код:
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;
при отладке видно что s содержит отредактированый текст содержимого html страницы, а вот в поток возвращается пустота почему то..
вернее не известно что возвращается изза ошибки.
может изза того что строка изменилась (увеличилась длинна изза StringReplace ), а памяти на нее выделено было размером на старую строку.

Последний раз редактировалось pireved, 06.09.2012 в 16:33.
Ответить с цитированием
  #43  
Старый 06.09.2012, 16:34
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

ну, берем датастринг, модифицируем ее, чистим стрингстрим и вызываем у нее метод WriteString.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #44  
Старый 06.09.2012, 16:39
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Вот еще что, страница от сервера пожет прийти пожатой GZipом.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #45  
Старый 12.09.2012, 15:34
pireved pireved вне форума
Прохожий
 
Регистрация: 20.08.2012
Сообщения: 15
Репутация: 10
По умолчанию

убрал
Код:
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;
но он не фунциклирует у меня, опять же по причине не достаточного богажа опыта. браузеру возвращается чистый лист вообще. если кто знает подскажите пожалуйста, в чем секрет обработки POST в idhttpserver?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter