Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Получить данные, если не известен размер


Автор: ILN 29.9.2005, 17:29
На основе примера "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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)