Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft (https://www.delphipraxis.net/196160-mit-idhttp-seite-aufrufen-und-memorystream-uebergeben-%3D-zeichen-fehlerhaft.html)

mjustin 27. Apr 2018 10:44

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Zitat:

Zitat von Neutral General (Beitrag 1400685)
Ehm okay. Back to the future schätze ich.

:spin2:

"dazu habe ich schon in einem anderen Beitrag das Problem erläutert." -> Post #10 aus dem anderen Beitrag (von gestern, weiter unten) enthält die URL einer Warez-Seite, und diese verwendet das Content-Encoding "br"

bogdan 27. Apr 2018 11:43

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Vielen Dank schon mal für die zahlreichen Antworten.

KodeZwerg:
Mit deinem Code werden leider bei mir die kyrillischen Zeichen immer noch als Hieroglyphen angezeigt.
Getestet habe ich es mit der folgenden Seite: mail.ru.

Neutral General:
Ich kann leider TStringStream nicht nutzen, da ich sonst den HTML Code bestimmter Seiten als Text nicht komplett angezeigt bekomme.

Neutral General 27. Apr 2018 11:45

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Zitat:

Zitat von bogdan (Beitrag 1400746)
Neutral General:
Ich kann leider TStringStream nicht nutzen, da ich sonst den HTML Code bestimmter Seiten als Text nicht komplett angezeigt bekomme.

Wieso? Warum sollte das passieren?
Welche Seite denn? Und welche Delphi-Version benutzt du?

bogdan 27. Apr 2018 11:51

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Wegen der unvollständigen Anzeige des HTML Codes, habe ich das Problem in diesem Thema erläutert:
https://www.delphipraxis.net/196148-...g-geladen.html

bogdan 27. Apr 2018 11:53

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Auf dieser "dubiosen" Seite wurden heute weitere Beiträge hinzgefügt, somit hat sich der unvollständige HTML Code auf die Seite 37 verschoben:
https://ddl-warez.to/downloads/haupt...rt/D/seite/37/

KodeZwerg 27. Apr 2018 12:15

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Stell doch mal dein komplettes Projekt (Source) ohne kompilierung gepackt als .zip/.rar Anhang rein, kann ja nicht groß sein, vielleicht liegt der Fehler an ganz anderer Stelle.

bogdan 27. Apr 2018 12:43

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Code:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdHTTP, Vcl.StdCtrls, Vcl.ExtCtrls,
  IdZLibCompressorBase, IdCompressorZLib, IdCookieManager, IdBaseComponent,
  IdComponent, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
  IdSSLOpenSSL, IdSSLOpenSSLHeaders, IdCTypes;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Memo1: TMemo;
    Edit1: TEdit;
    Button1: TButton;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    IdCookieManager1: TIdCookieManager;
    IdCompressorZLib1: TIdCompressorZLib;
    procedure Button1Click(Sender: TObject);
    procedure IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(ASender: TObject;
      const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType,
      AMsg: string);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure SetNewIdHTTP;
  end;

var
  Form1: TForm1;
  gIdHTTP : TIdHTTP;

implementation

{$R *.dfm}

procedure TForm1.IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(ASender: TObject;
  const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType,
  AMsg: string);
begin
  SSL_set_tlsext_host_name(AsslSocket, gIdHTTP.Request.Host);
end;


procedure TForm1.SetNewIdHTTP;
begin
  if Assigned(gIdHTTP) then
  begin
    Memo1.Clear;
    gIdHTTP.Free;
  end;
  gIdHTTP := TIdHTTP.Create(nil);
  gIdHTTP.AllowCookies := True;
  gIdHTTP.HandleRedirects := True;
  gIdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
  gIdHTTP.CookieManager := IdCookieManager1;
  gIdHTTP.Compressor := IdCompressorZLib1;
end;

function StreamToText(sStream: TStream; sOldSign, sNewSign: Integer): AnsiString;
var
  xBuf: TBytes;
  i : Integer;
begin
  try
    SetLength(xBuf, sStream.Size); // puffer größe bestimmen
    sStream.ReadBuffer(Pointer(xBuf)^, Length(xBuf)); // puffer füllen
    for I := 0 to Length(xBuf) -1 do
      if xBuf[i] = sOldSign then xBuf[i] := sNewSign; // mache aus 0 ein Leerzeichen
  finally
    SetLength(Result, Length(xBuf)); // ausgabegröße
    for I := 0 to Length(xBuf) -1 do
      Result[i+1] := AnsiChar(xBuf[i]); // alles aus puffer ins Result
  end;
end;

function IdHTTP_Get(sHTTP: TIdHTTP; sURL: String): String;
var
  xResult : TStringList;
  xMemoRes : TMemoryStream;
begin
  xResult := TStringList.Create;
  xMemoRes := TMemoryStream.Create;
  try
    try
      sHTTP.Get(sURL, xMemoRes);
      xMemoRes.Position := 0;
      xResult.Text := StreamToText(xMemoRes, 0, 20);
    except
      on E: EIdHTTPProtocolException do
      begin
        xResult.Add('E.Message: ' + E.Message);
        xResult.Add('E.ErrorMessage:');
        xResult.Add(E.ErrorMessage);
      end;
    end;
  finally
    Result := xResult.Text;
    xResult.Free;
    xMemoRes.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetNewIdHTTP;
  Memo1.Text := IdHTTP_Get(gIdHTTP, Edit1.Text);
end;

end.

KodeZwerg 27. Apr 2018 18:12

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Hallo bogdan,
gut wäre ein Projekt-Upload gewesen für alle Properties (die stehen in der .dfm Datei) die Du so gesetzt hast.
Auch gut zu Wissen was in Edit1.Text steht, nur eine blanko Webadresse ohne Endung?
Soll das Ziel sein den HTML Source-Code zu laden oder eine bestimmte Datei?


edit
Hier ein Beispiel um HTTP HTML Sourcecode zu laden:
Delphi-Quellcode:
function DownloadHTMLSource( var xUrl : ansiString ):ansiString;
const
  INET_USERAGENT   = 'Mozilla/4.0, Indy Library (Windows; en-US)'; // Damit sagst Du "Hallo, ich bin..."
  INET_TIMEOUT_SECS = 3;                                           // Wieviele Sekunden warten bevor Timeout kommt?
  INET_REDIRECT_MAX = 10;                                          // Maximale Redirect-Tiefe
begin
 with tIdHttp.create(nil) do begin        // Create Indy http object
  request.userAgent := INET_USERAGENT;    // Custom user agent string
  redirectMaximum := INET_REDIRECT_MAX;   // Maximum redirects
  handleRedirects := INET_REDIRECT_MAX<>0; // Handle redirects
  readTimeOut := INET_TIMEOUT_SECS*1000;  // Read timeout msec
  try                                     // Catch errors
   Result := Get(xUrl);                   // Do the request
   if URL.Port = '80' then URL.Port := ''; // Remove port 80 from final URL
   xUrl := URL.GetFullURI                 // Return final URL <<- da könnte nun eine andere URL stehen als wie Du eingegeben hast
  except                                  // Return an error message if failed
    on E: Exception do
    Result := 'Error! HTTP Adress: ' +xUrl+ #13#10 + 'E.Message: ' + E.Message;  // Return Error Message
  end;
  free                                    // Free the http object
 end
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  temp1, temp2: ansiString;
  i : Integer;
begin
  Memo1.Clear;
  Memo1.Lines.Add('Working...');
  Temp1 := Edit1.Text;
  if Length(Edit1.Text) > 0 then Temp2 := DownloadHTMLSource(Temp1);
  // hier noch irgendwas mit ansiString anstellen, zum Beispiel nullen entfernen
  for I := 1 to Length(Temp2) do
    if Temp2[i] = Char(Ord($00)) then Temp2[i] := Char(Ord($20));
  Memo1.Lines.Text := Temp2;
  Memo1.Lines.Add('HTTP HTML Source from: '+Temp1);
end;
Alles noch unoptimiert aber vielleicht ist es ja das was Du wolltest?
Viel Spass damit.
Ps: Diesen Code solltest Du in einem leeren Projekt testen ohne Indy Komponenten aufm Formular aber in Uses.

Neutral General 27. Apr 2018 21:11

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Zitat:

DownloadHTMLSource(var xUrl : ansiString): ansiString;
Das kann schon mal nichts werden ;)

KodeZwerg 27. Apr 2018 21:29

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Zitat:

Zitat von Neutral General (Beitrag 1400793)
Zitat:

DownloadHTMLSource(var xUrl : ansiString): ansiString;
Das kann schon mal nichts werden ;)

Sorry und sorry, 1. weil ja falsch und 2. weil ich nicht dahinter komme warum ich ansiString nicht als puffer nehmen sollte. Ich mach mich hier bestimmt gerade voll zum Honk aber bitte erleuchte mich damit ich aus meinen Fehlern auch lernen kann. Danke & nochmal sorry für den falschen Code!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.
Seite 2 von 3     12 3      

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