AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von bogdan · begonnen am 27. Apr 2018 · letzter Beitrag vom 28. Apr 2018
Antwort Antwort
Seite 2 von 3     12 3      
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#11

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

  Alt 27. Apr 2018, 10:44
Ehm okay. Back to the future schätze ich.


"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"
Michael Justin
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#12

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

  Alt 27. Apr 2018, 11:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

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

  Alt 27. Apr 2018, 11:45
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?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#14

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

  Alt 27. Apr 2018, 11:51
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
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#15

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

  Alt 27. Apr 2018, 11:53
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/
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#16

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

  Alt 27. Apr 2018, 12:15
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#17

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

  Alt 27. Apr 2018, 12:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#18

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

  Alt 27. Apr 2018, 18:12
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 = '80then 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.
Gruß vom KodeZwerg

Geändert von KodeZwerg (27. Apr 2018 um 19:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#19

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

  Alt 27. Apr 2018, 21:11
Zitat:
DownloadHTMLSource(var xUrl : ansiString): ansiString;
Das kann schon mal nichts werden
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#20

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

  Alt 27. Apr 2018, 21:29
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!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 18:48 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