Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TIdHTTPServer : HTML Dokument vor dem versenden bearbeiten (https://www.delphipraxis.net/50280-tidhttpserver-html-dokument-vor-dem-versenden-bearbeiten.html)

MrKnogge 22. Jul 2005 23:01


TIdHTTPServer : HTML Dokument vor dem versenden bearbeiten
 
Hallo,

ich habe einen kleinen HTTP-Server mit den Indy's (Version 10):

Delphi-Quellcode:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  root: String;
begin
  root := ExtractFilePath(ParamStr(0));
  AResponseInfo.ContentStream := TFileStream.Create(root + ARequestInfo.Document, fmOpenRead);
end;
klappt soweit alles gut, nur möchte ich jetzt aber die angeforderte HTML-Datei vor dem übermitteln bearbeiten, hierbei soll aber nicht die Datei auf der Platte verändert werden, da die Veränderung der Datei für diesen einen User bestimmt ist.


Daher dachte ich an folgendes:

Delphi-Quellcode:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  root : String;
  htmlfile: TStrings;
begin
  root := ExtractFilePath(ParamStr(0));
  htmlfile := TStringList.Create;
  try
    htmlfile.LoadFromFile(root + ARequestInfo.Document);
    // <-- HTML-Code modifizieren -->
    AResponseInfo.ContentText := htmlfile.Text;
  finally
    htmlfile.Free;
  end;
end;
Bei dieser Variante gibt es aber Probleme mit Bilder etc.


Gibt es eine Möglichkeit den HTML-Source vor dem senden zu bearbeiten oder
kann man bei der unteren Variante ein "Arbeitsverzeichniss" festlegen, so das
links und Bilder funktionieren ?

gruss

TStringlist 23. Jul 2005 19:29

Re: TIdHTTPServer : HTML Dokument vor dem versenden bearbeit
 
Hi,

event. könnte man zuerst abfragen, was denn der Requester überhaupt gerade haben möchte. Und dann je nachdem, ...wenn er kein HTML haben will, dann lädst du immer ContentStream nach deinem Code oben, ...ansonsten nimmst du den Code unten, zum Laden von ContentText:

Delphi-Quellcode:
if UpperCase(extractFileExt(ARequestInfo.Document)) <> '.HTML'
then "Code-oben"
else "Code-unten"

MrKnogge 23. Jul 2005 19:37

Re: TIdHTTPServer : HTML Dokument vor dem versenden bearbeit
 
Er möchte ja immer HTML-Dateien, aber ich möchte vor dem übertragen bestimmten Informationen einfügen.

TStringlist 23. Jul 2005 20:22

Re: TIdHTTPServer : HTML Dokument vor dem versenden bearbeit
 
Warum sollte das nach deinem Code unten nicht gehen? Wenn eine Seite vom Server abgerufen wird, dann kommt natürlich zuerst immer die Frage nach dem HTML-Document (welches aber auch immer nur der reine nackte HTML-Code ist, also ohne das wirkliche Bildmaterial, sondern nur mit den Links zu diesen jeweiligen Pics) ...und erst anschließend fragt dann der Requester den Server weiter ab nach jedem einzelnen Picture, das auf dieser HTML-Seite eben noch mit abgebildet wird (z.B. als gif o. jpg). Ergo kannst du beide Code-Teile brauchen und musst immer nur nachzusehen, ob er gerade am Anfang das HTML-Docu haben will oder jeweils dann nachher die Bilder.

(...oder ich muss irgendwie deine Frage nicht richtig verstand haben)

MrKnogge 23. Jul 2005 20:48

Re: TIdHTTPServer : HTML Dokument vor dem versenden bearbeit
 
Ich verstehe irgendwie nicht was du meinst, könntest du mir ein beispiel posten ?

TStringlist 23. Jul 2005 22:08

Re: TIdHTTPServer : HTML Dokument vor dem versenden bearbeit
 
Folgende Situation: Man packe einen WebBrowser auf eine Form und gleichzeitig noch einen TIdHTTPServer dazu. Der WebBrowser wird dann also der "Requester" sein und der läd nun seine Seite von diesem TIdHTTPServer auf der gleichen Form, und zwar bei einem Click auf Button1. Das HTML-Document beinhaltet dabei neben irgendeinem Text noch ein Bild. Was passiert also nun im IdHTTPServer1? Es kommen dort insgesamt 2 Anfragen an. Nämlich die erste nach dem eigentlichen HTML-Document, hier mal z.B. 'FAQsHTML0.HTML' genannt, und danach die zweite nach eben diesem Bild darauf!

Wenn du den Beispiel-Code unten mal selbst ausprobieren willst, dann sollte in deinem HTML-Code bezüglich des Bildes noch ungefähr so etwas drinstehen:
http://127.0.0.1/BildName.gif


Delphi-Quellcode:
procedure TFAQ_Form.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var htmlfile : TStringList;

function doFilename : string;
begin
  result := ExtractFilePath(ParamStr(0)) + copy(ARequestInfo.Document,2,256);
end;

begin
  if UpperCase(extractFileExt(ARequestInfo.Document)) <> '.HTML' then begin
    AResponseInfo.ContentStream := TFileStream.Create(doFilename,fmOpenRead);
  end
  else begin
    htmlfile := TStringList.Create;
    try
      htmlfile.LoadFromFile(doFilename);
      // <-- HTML-Code modifizieren -->
      AResponseInfo.ContentText := htmlfile.Text;
    finally
      htmlfile.Free;
    end;
  end;
end;


procedure TFAQ_Form.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://127.0.0.1/FAQsHTML0.HTML');
end;
Habe's noch schnell gecheckt und bei mir funzte es.

MrKnogge 23. Jul 2005 23:02

Re: TIdHTTPServer : HTML Dokument vor dem versenden bearbeit
 
Hi,

jetzt hab ich kapiert was du gemeint hast !
Das Beispiel hat mir sehr geholfen.

Gibt es auch eine Möglichkeit, dass ich statt:

Code:
[img]http://127.0.0.1:4444/BildName.gif[/img]
Code:
[img]BildName.gif[/img]
schreiben kann ?

TStringlist 23. Jul 2005 23:47

Re: TIdHTTPServer : HTML Dokument vor dem versenden bearbeit
 
Ja, nur dieses:

[img]BildName.gif[/img]

...(also ohne eigene Pfadangabe) geht auch, denn wenn kein eigener Pfad dabeisteht, nimmt der Browser zum Requesten ja denjenigen des HTML-Documentes selbst.

MrKnogge 23. Jul 2005 23:52

Re: TIdHTTPServer : HTML Dokument vor dem versenden bearbeit
 
Stimmt funzt !

Hab vorhin beim Testen versehentlich "Bildname" statt "BildName" geschrieben :wall:

thx !

TStringlist 24. Jul 2005 00:05

Re: TIdHTTPServer : HTML Dokument vor dem versenden bearbeit
 
?, denn der BildFileName, den man dort in den img-Tag einträgt, ist normalerweise nicht CaseSensitiv.


(edit: Ich nehme an, du wirst dich an dieser Stelle event. sonst irgendwie minimal beim BildFileName verschrieben haben, und danach gab es das Bild für den Server natürlich nicht mehr. Der Browser zeigt dann an dessen Stelle ein rotes Keuzchen an. Das ist zwischen Client und Server eher ein alltägliches undramatisches Ereignis, konnte von dir in dieser Situation aber leicht als irgendein anderes Problem interpretiert werden.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz