AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

HTML-Code aus Stream

Ein Thema von Andreas L. · begonnen am 31. Mär 2007 · letzter Beitrag vom 3. Apr 2007
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

HTML-Code aus Stream

  Alt 31. Mär 2007, 16:41
Hi,
ich verwende die Komponente IdHTTPProxyServer. Im Ereignis OnHTTPDocument wird mir der Quellcode der angeforderten Seite in einem Stream zur Verfügung gestellt.

Ich versuche nun den Code in eine StringList zu laden, und zwar so:
Delphi-Quellcode:
 CodeOps := TFileStream.Create('blabla.txt', fmCreate);
 CodeOps.CopyFrom(VStream, 0);
 CodeOps.free;

 CodeReader := TStringList.Create;
 CodeReader.LoadFromFile('blabla.txt');
In VStream ist der Code enthalten.

Leider stehen dann in der Datei nur kryptische Zeichen. Wieso? Wie kann ich dieses Problem beheben? Muss ich da denn was konvertieren?

bye,
Andy
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: HTML-Code aus Stream

  Alt 31. Mär 2007, 19:27
Welche cryptischen Zeichen?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: HTML-Code aus Stream

  Alt 31. Mär 2007, 19:30
Hallo Andy,

welche Kodierung ein HTTP-Datenstrom hat, das erfährst du oft durch den entsprechenden HTTP-Header (Content-Type: text/html; charset=...). Die kryptischen Zeichen siehst du immer dann, wenn z.B. ein Unicode-Zeichensatz übermittelt wird. Fehlt die charset Angabe im Header, dann musst du den übermittelten Text analysieren. UTF-16 erkennst du leicht und im HEAD eines HTML-Dokumentes findest du vielleicht die Kodierung in einem META-Tag (<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">)

Um den Datenstrom zu konvertieren könntest du an Stelle eines FileStreams einen StringStream verwenden.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#4

Re: HTML-Code aus Stream

  Alt 31. Mär 2007, 19:36
Es kommt aber noch viel schlimmer...

Das ganze ist nämlich auch noch komprimiert...
Daran bin ich auch schonmal verzweifelt und habe mir den Proxy letztendlich mit TIdHTTPServer und TIdHTTP selber gebaut^^
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#5

Re: HTML-Code aus Stream

  Alt 1. Apr 2007, 10:52
Zitat von glkgereon:
Es kommt aber noch viel schlimmer...

Das ganze ist nämlich auch noch komprimiert...
Daran bin ich auch schonmal verzweifelt und habe mir den Proxy letztendlich mit TIdHTTPServer und TIdHTTP selber gebaut^^
Ich stosse bei IdHTTPProxyServer auch immer wieder an die Grenzen dieser Komponente.

Wie geht das denn mit TIdHTTPServer und TIdHTTP? Ich hatte da schonmal was, aber da wurden die Bilder im Browser nicht mehr geladen...


Zitat von marabu:
Hallo Andy,

welche Kodierung ein HTTP-Datenstrom hat, das erfährst du oft durch den entsprechenden HTTP-Header (Content-Type: text/html; charset=...). Die kryptischen Zeichen siehst du immer dann, wenn z.B. ein Unicode-Zeichensatz übermittelt wird. Fehlt die charset Angabe im Header, dann musst du den übermittelten Text analysieren. UTF-16 erkennst du leicht und im HEAD eines HTML-Dokumentes findest du vielleicht die Kodierung in einem META-Tag (<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">)

Um den Datenstrom zu konvertieren könntest du an Stelle eines FileStreams einen StringStream verwenden.

Grüße vom marabu
Brauch ich jetzt die Unicode-Controls? Momentmal, Turbo Delphi ist Unicode fähig? Oder versteh ich dich falsch?

Verwendet die DP denn unicode?

   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> Eher nicht Ich denke das, so wie glkgereon es sagt, der Code wirklich komprimiert ist. Jetzt ist nur die frage wie man den dekomprimiert?!?

Danke für eure Antworten und schönen Sonntag Morgen
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#6

Re: HTML-Code aus Stream

  Alt 2. Apr 2007, 11:12
*push*
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#7

Re: HTML-Code aus Stream

  Alt 2. Apr 2007, 12:01
Hier mal ein Code den ich mir seit monaten nicht mehr angesehen habe
Ich kann mich noch daran erinnern dass es irgendwie Probleme mit Cookies usw gab, weiss es aber auch net mehr genau

Delphi-Quellcode:
function CreateParamList(P: TStrings): String;
const Sep = '&';
begin
  if P.Count = 0 then
    Result := ''
  else
  begin
    P.Delimiter := Sep;
    Result := '?'+P.DelimitedText;
  end;
end;

procedure TForm_Main.ServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var S, URL: String;
    Response: TIdHTTPResponseInfo;
begin
// Loader: TDownloader;
// Server: TIdHTTPServer
  URL:='http://'+ARequestInfo.Host+ARequestInfo.Document+CreateParamList(ARequestInfo.Params);
  Log('URL Request "'+URL+'"', llRequest);
  Lst_Requests.Items.Insert(0,'Requesting: '+URL);
  Lst_Requests.Refresh;
  Response:=TIdHTTPResponseInfo.Create(nil,nil);
  try
    S:=Loader.Get(URL,AResponseInfo,ARequestInfo);
    AResponseInfo.ContentText:=S;
  except
    on E: Exception do
      begin
      Log('Error: "'+E.Message+'" "'+URL+'"', llErrors);
      AResponseInfo.ContentText:=
        'An internal Error occured while downloading the requested File
'+#13+#10+
        'Debug information:
'+#13+#10+
        'URL: "'+URL+'"
'+#13+#10+
        'Error: "'+E.Message+'"
';
      end;
  end;
  Org.Analyse(URL,AResponseInfo.ContentText); //Hier habe ich die Seite nochmal manipuliert wenn ich gerade Lust dazu hatte...kA
  Response.Free;
end;
Delphi-Quellcode:
unit UDownloader;

interface

uses IdHTTP, ExtCtrls, SysUtils, Windows, IdHTTPHeaderInfo, IdCustomHTTPServer;

type
  THTTPArray = array of TIdHTTP;
  TDownloader = class(TObject)
  private
    FProxySettings: TIdProxyConnectionInfo;
    FHTTPs: THTTPArray;
    LastCall: Int64;
    FTimer: TTimer;
    function Add: Integer;
    procedure Clear;
    procedure ClearIdle;
    function GetIdle: Integer;
    procedure OnTimer(Sender: TObject);
  public
    constructor Create;
    destructor Destroy;
    function Get(URL: String; var Response: TIdHTTPResponseInfo; var Request: TIdHTTPRequestInfo): String;
    property ProxySettings: TIdProxyConnectionInfo read FProxySettings write FProxySettings;
  end;

implementation

constructor TDownloader.Create;
begin
  inherited;
  Clear; //Init Client-Array
  FProxySettings:=TIdProxyConnectionInfo.Create; //ProxySettings
  FTimer:=TTimer.Create(nil); //Init Timer
  FTimer.Interval:=5*60*1000; //5 minutes
  FTimer.OnTimer:=OnTimer;
  FTimer.Enabled:=True;
end;

destructor TDownloader.Destroy;
begin
  Clear; //Clear List
  FTimer.Free; //Free Timer
  FProxySettings.Free; //Free ProxySettings
  inherited;
end;

function TDownloader.Add: Integer;
begin //Add a new Client
  Result:=Length(FHTTPs); //ID of the new Client
  SetLength(FHTTPs,Result+1); //Resize Array
  FHTTPs[Result]:=TIdHTTP.Create; //Init Client
  FHTTPs[Result].Tag:=0;
  FHTTPs[Result].ReadTimeout:=0;
  FHTTPs[Result].ConnectTimeout:=0;
  FHTTPs[Result].HandleRedirects:=True;
  FHTTPs[Result].ProxyParams.Assign(FProxySettings);
  FHTTPs[Result].AllowCookies:=True;
end;

procedure TDownloader.Clear;
var i:Integer;
begin //Clear the Client-Array
  for i:=0 to Length(FHTTPs)-1 do
    FHTTPs[i].Free;
  SetLength(FHTTPs,0);
end;

procedure TDownloader.ClearIdle;
var i:Integer;
begin //Clear all idle Clients from behind
  for i:=Length(FHTTPs)-1 downto 0 do
    if FHTTPs[i].Tag=0 then
      begin
      FHTTPs[i].Free; //Free Client
      SetLength(FHTTPs,i);
      end
    else
      Break;
end;

function TDownloader.GetIdle: Integer;
var i: Integer;
begin //Get first Idle Client
  Result:=-1;
  for i:=0 to Length(FHTTPs)-1 do
    if FHTTPs[i].Tag=0 then
      begin
      Result:=i;
      Break;
      end;
end;

procedure TDownloader.OnTimer(Sender: TObject);
begin //If not Called for 30 seconds: Clear idle
  if (GetTickCount-LastCall)>30*1000 then ClearIdle;
end;

function TDownloader.Get(URL: String; var Response: TIdHTTPResponseInfo; var Request: TIdHTTPRequestInfo): String;
var I: Integer;
begin //Download URL
  LastCall:=GetTickCount;
  I:=GetIdle; //Get idle Client
  if i=-1 then I:=Add; //If none available create new
  FHTTPs[i].Tag:=1; //Client is in use
  try
    Result:=FHTTPs[i].Get(URL); //Download
    Response.Assign(FHTTPs[i].Response);
    Request.Assign(FHTTPs[i].Request);
  finally
    FHTTPs[i].Tag:=0; //no more in use
    LastCall:=GetTickCount;
  end;
end;

end.
Viel Spaß damit
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#8

Re: HTML-Code aus Stream

  Alt 2. Apr 2007, 12:03
*doppelpost*
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#9

Re: HTML-Code aus Stream

  Alt 3. Apr 2007, 12:24
Vielen Dank. Werde mir den Source morgen mal genauer anschauen und testen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz