Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить данные, если не известен размер, сокет, еще раз сокет, но уже прокся 
:(
    Опции темы
ILN
Дата 29.9.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.9.2005

Репутация: нет
Всего: нет



На основе примера "Learner Proxy", сделал проксю под себя, все нормально до тех пор, пока известен размер получаемых данных, как только сервер отправляет данные, которые формируется динамически, то все, пусто.. как быть?
Код


  Server.CreateSocket;
  Server.Connect('127.0.0.1', '8080');

  FContentType := '';
  FContentLength := -1;
  Headers.Clear;
  repeat
    s := Client.RecvString(TimeOut);
    su := UpperCase(s);
    Headers.Add(s);
    Server.SendString(s + CRLF);
    if (Pos('CONTENT-LENGTH:', su) <> 0)
      then FContentLength := StrToIntDef(SeparateRight(su, ' '), -1);
    if (Pos('CONTENT-TYPE:', su) <> 0)
      then FContentType := SeparateRight(s, ' ');
  until (s = '') or (Client.LastError <> 0);
  
  WriteHeaders(0);

  if (FContentLength <> -1) then
  begin
    Stream.Clear;
    Stream.SetSize(FContentLength);
    Client.RecvBufferEx(Stream.Memory, FContentLength, TimeOut);
    Stream.Seek(0, soFromBeginning);
    Server.SendBuffer(Stream.Memory, FContentLength);
    Stream.Seek(0, soFromBeginning);
    WriteContent(0);
  end;
  
  
  // Read From Server
  
  Chunked := False;
  FContentType := '';
  FContentLength := -1;
  Headers.Clear;
  if Server.CanRead(TimeOut) then
  begin
    repeat
      s := Server.RecvString(TimeOut);
      Headers.Add(s);
      Client.SendString(s + CRLF);
      su := UpperCase(s);
      if (Pos('CONTENT-LENGTH:', su) <> 0)
        then FContentLength := StrToIntDef(SeparateRight(su, ' '), -1);
      if (Pos('CONTENT-TYPE:', su) <> 0)
        then FContentType := SeparateRight(s, ' ');
      if (su = 'TRANSFER-ENCODING: CHUNKED')
        then Chunked := True;
    until (s = '') or (Server.LastError <> 0);
  
    WriteHeaders(1);
  
    if Chunked then
    begin
      repeat
        s := Server.RecvString(TimeOut);
        Client.SendString(s + CRLF);
        ToWriteLn := s;
        DoWriteLn(1);
        if (s = '0') then Break;
        FContentLength := StrToInt('$' + Trim(s)); // Trim. Trim. Trim. Why they send trailing spaces?
        Stream.Clear;
        Stream.SetSize(FContentLength);
        Server.RecvBufferEx(Stream.Memory, FContentLength, TimeOut);
        Stream.Seek(0, soFromBeginning);
        Client.SendBuffer(Stream.Memory, FContentLength);
        Stream.Seek(0, soFromBeginning);
        WriteContent(1);
  
        s := Server.RecvString(TimeOut);
        Client.SendString(s + CRLF);

      until False;
    end else
    begin
      if (FContentLength <> -1) then
      begin
        Stream.Clear;
        Stream.SetSize(FContentLength);
        Server.RecvBufferEx(Stream.Memory, FContentLength, TimeOut);
        Stream.Seek(0, soFromBeginning);
        Client.SendBuffer(Stream.Memory, FContentLength);
        Stream.Seek(0, soFromBeginning);
        WriteContent(1);
      end;
    end;

  end else
  begin
    Client.SendString('HTTP/1.1 200 OK' + CRLF);
    Client.SendString('Content-Type: text/html' + CRLF);
    Client.SendString('Transfer-Encoding: chunked' + CRLF);
    Client.SendString('Connection: close' + CRLF);
    Client.SendString(CRLF);
    s := '<html><body>Response Error from HTTP Server (Timed Out))</body></html>';
    Client.SendString(IntToHex(Length(s), 2) + CRLF);
    Client.SendString(s + CRLF);
  end;

  Synchronize(LogAll);

  Client.CloseSocket;
  Server.CloseSocket;


особенно это касается строчки if (FContentLength <> -1) then
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0385 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.