Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TWebBrowser - Kommunikation selbst verrichten (https://www.delphipraxis.net/161013-twebbrowser-kommunikation-selbst-verrichten.html)

Neotracer 12. Jun 2011 13:15

TWebBrowser - Kommunikation selbst verrichten
 
Hallo DP-Gemeine,

ich möchte die TWebBrowser Komponente benutzen, allerdings möchte ich mich um die Internet-Kommunikation selbst kümmern.
Wenn also eine URL angefragt wird, dann sollte das meiner Unit übergeben werden und diese kümmert sich darum diese mit eigenen HTTP-Routinen usw. aufzurufen. Die Antwort will ich der Komponente dann auch wieder selbst übergeben. Das ist nötig, weil oftmals Umwege (nicht direkt ans Internet angeschlossen) gemacht werden müssen. Und manchmal auch nur auf Offline-Caches zugegriffen wird nach meinem eigenen System.

Dabei ergibt sich noch eine besondere Schwierigkeit. Denn es reicht nicht, einfach nur beispielsweise den HTML-Code von delphipraxis.net zu übergeben und TwebBrowser macht den Rest, weil beispielsweise andere Ressourcen innerhalb der HTML (Bilder, CSS usw.) auch wieder aus dem Internet geladen werden müssen.

Ich brauche also so etwas wie ein Callback für jede URL (auch Bilder, CSS), die aufgerufen wird, damit ich das selber handhaben kann.
Weiss jemand wie das zu bewerkstelligen wäre? Wenn ja, wie geht es?

Danke schonmal

nuclearping 12. Jun 2011 16:51

AW: TWebBrowser - Kommunikation selbst verrichten
 
Als erstes würde mir IdHTTP von Indy einfallen.

Neotracer 12. Jun 2011 18:23

AW: TWebBrowser - Kommunikation selbst verrichten
 
Zitat:

Zitat von nuclearping (Beitrag 1105970)
Als erstes würde mir IdHTTP von Indy einfallen.

Nun ja. IdHTTP holt ja nur eine bestimmte HTML Seite aus dem Internet. Aber das kann ich ja schon, und bewerkstellige das auf verschiedene Weisen.
Ich brauche im Prinzip nur einen HTML-Interpreter, der den HTML Code schön anzeigt und mir jedesmal sagt, was er aus dem Internet braucht, wenn er gerade auf ein Bild stößt oder eine CSS Datei. Er soll es auf keinen Fall selber herunterladen.
Verstehst du was ich meine?

Lannes 12. Jun 2011 19:10

AW: TWebBrowser - Kommunikation selbst verrichten
 
Wenn in keinem Fall irgendwas heruntergeladen werden soll, brauchst du nicht nur einen HTML- sondern auch einen CSS-, JavaScript- ... etc.-Interpreter.

Neotracer 12. Jun 2011 19:21

AW: TWebBrowser - Kommunikation selbst verrichten
 
Zitat:

Zitat von Lannes (Beitrag 1105983)
Wenn in keinem Fall irgendwas heruntergeladen werden soll, brauchst du nicht nur einen HTML- sondern auch einen CSS-, JavaScript- ... etc.-Interpreter.

TWebBrowser kann doch schon alles, oder? Ich kann damit wunderbar surfen. JS und CSS geht. Wird also alles interpretiert.
Intern läuft das ja so:

Es wird zunächst nur EINE URL geholt:

http://example.de/index.php

Beim Interpretieren stellt der Browser fest, dass dort auf noch mehr URLs verwiesen wird. Ein Bild, JS-Script, CSS oder HTML in Frames.
Er findet beispielsweise raus, dass er diese URL braucht um die Seite anzuzeigen:

http://example.de/Bild1.jpg

Mir soll der Interpreter (der ja schon alles kann) einfach alle URLS geben, die er findet, und ich lade diese für ihn runter und übergebe das als Buffer. Sei das ein BILD, ein JS-Script, ein Stylesheet. Völlig egal. Er soll eben nur nicht selbstständig das Bild runterladen.

Ich brauche also eine Art Callback. Sowas:

function GetRessource(URL: String; var outbuffer: Pointer; var len: Integer): Boolean;
begin
// Ich besorge das Bild, HTML oder JS-Sript.. Whatever
end;

Kann ich das irgendwie mit TWebBrowser einrichten? Wenn ja, wie?

Hoffe das ist jetzt verständlich.

Thom 12. Jun 2011 19:33

AW: TWebBrowser - Kommunikation selbst verrichten
 
Wie wär's mit einem Proxy?

himitsu 12. Jun 2011 21:48

AW: TWebBrowser - Kommunikation selbst verrichten
 
Man braucht nichtmal einen richtigen Proxy.
TWebBrowser sollte doch IMHO schon die Schnittstellen bieten, um URLs umzuleiten.

Thom 12. Jun 2011 22:03

AW: TWebBrowser - Kommunikation selbst verrichten
 
Zitat:

Zitat von himitsu (Beitrag 1106002)
Man braucht nichtmal einen richtigen Proxy.
TWebBrowser sollte doch IMHO schon die Schnittstellen bieten, um URLs umzuleiten.

Wenn Du dafür eine Lösung hast, laß hören... :stupid:

himitsu 12. Jun 2011 22:08

AW: TWebBrowser - Kommunikation selbst verrichten
 
Nicht im Kopf.
Aber es gab mindestens 1 oder 2 Ereignissmethoden, welche vor dem Laden von Dateien, aufgerufen werden und ich glaube mich zu erinnern, daß man in einer davon die URL manipulieren konnte.

Thom 12. Jun 2011 22:19

AW: TWebBrowser - Kommunikation selbst verrichten
 
Leider mit Einschränkungen: Diese Methoden werden - zumindest so weit mir bekannt ist - nicht bei jedem einzelnen Element, das die Seite enthält, aufgerufen.
Aber ich laß mich gern eines Besseren belehren. :gruebel:

Lannes 12. Jun 2011 22:32

AW: TWebBrowser - Kommunikation selbst verrichten
 
genauso ist es.

//Edit: reagieren kann man nur dann, wenn eine Navigation ansteht, in BeforeNavigate

Neotracer 12. Jun 2011 22:42

AW: TWebBrowser - Kommunikation selbst verrichten
 
Hey, danke für eure Überlegungen.

Ein Proxy fällt schon einmal raus, da es sich um Strukturen handelt, die nicht dem Standard entsprechen; manchmal auch um Zugriffe auf eigens entwickelte Offline-Datenbanken aus dem die Daten dann kommen. Jedenfalls stellt das ja alles kein Problem da. Ich kann die Daten ja liefern.
Nur will ich das Rad nicht neu erfinden und das komplette Rendern von HTML und CSS Features nochmals entwickeln.

@himitsu:
Wenn du BeforeNavigate meinst, dann ist das ungeeignet. Es lädt die komplette Seiten mit allen Unter-URLs. Ich kann also nur die AnfangsURL abfangen. Aber wenn Bilder, Frames, CSS, oder JS-Dateien darin sind, dann werden diese selbst geladen ohne ein Ereignis zu feuern.
(Das was Thom schon sagte)

Wenn ich durch die Sources schaue, dann lande ich irgendwann bei Interfaces für OLE-Kram. :(
Wird schwer sein, da nen Callback einzurichten ohne sich da "reinzuhacken".

Thom 12. Jun 2011 22:55

AW: TWebBrowser - Kommunikation selbst verrichten
 
Zitat:

Zitat von Neotracer (Beitrag 1106014)
Ein Proxy fällt schon einmal raus, da es sich um Strukturen handelt, die nicht dem Standard entsprechen [...]

:wiejetzt: Hast Du Dir mal den von mir verlinkten Thread angeschaut? Wahrscheinlich nicht. :zwinker:
Genau das macht nämlich der in dem genannten Thread gepostete Proxy: Jede einzelne Anforderung kann dort weiter- oder umgeleitet, manipuliert oder einfach blockiert werden...

himitsu 12. Jun 2011 23:08

AW: TWebBrowser - Kommunikation selbst verrichten
 
Zitat:

Zitat von Neotracer (Beitrag 1106014)
Es lädt die komplette Seiten mit allen Unter-URLs. Ich kann also nur die AnfangsURL abfangen. Aber wenn Bilder, Frames, CSS, oder JS-Dateien darin sind, dann werden diese selbst geladen ohne ein Ereignis zu feuern.

Würde doch reichen?

> Die seite selber laden und die enthaltenen Verlinkungen, zu Bildern, JS, CSS und Co. ändern.
> Danach werden auch Diese dann von den gewünschten Stellen geholt.

Thom 12. Jun 2011 23:21

AW: TWebBrowser - Kommunikation selbst verrichten
 
@himitsu:

Logisch weitergedacht, könnte die Seite auch gleich so gestaltet werden, daß die Ressourcen von den richtigen Stellen geladen werden.
Denkbar wäre da zum Beispiel der Aufruf von Delphi-Methoden von JavaScript aus.

Aber das war ja nicht die Frage, sondern es ging (geht) darum, wie das Laden einzelner Ressourcen gezielt gesteuert werden kann. Und das kann TWebBrowser leider nicht ohne Hilfe.

Neotracer 12. Jun 2011 23:32

AW: TWebBrowser - Kommunikation selbst verrichten
 
Zitat:

Zitat von himitsu (Beitrag 1106017)
Würde doch reichen?
> Die seite selber laden und die enthaltenen Verlinkungen, zu Bildern, JS, CSS und Co. ändern.
> Danach werden auch Diese dann von den gewünschten Stellen geholt.

Naja. Es reicht nicht die URLS umzuschreiben. Meine gewünschte Stelle ist ein Buffer. :wink:
Soetwas gibt es nicht als URL. Es muss ein Buffer sein, weil nicht alles als URI-Form immer verfügbar ist, da ich auch über andere Protokolle (RPC, Samba) usw. die gewünschten Ressourcen hole.

@Thom:
Hmm. Also du meinst ich starte einen lokalen Proxy und dann gehen alle anfragen durch mich selbst durch?
Hört sich ganz gut an. Muss ich mir mal genauer anschauen, wie das zusammenpasst.
Danke schonmal ^^ :thumb:

Wenn jemand noch andere Vorschläge, immer her damit. :wink:

Thom 12. Jun 2011 23:35

AW: TWebBrowser - Kommunikation selbst verrichten
 
Zitat:

Zitat von Neotracer (Beitrag 1106020)
Also du meinst ich starte einen lokalen Proxy und dann gehen alle anfragen durch mich selbst durch?

Interessant ausgedrückt: Aber Ja - das trifft es! :lol:

Andreas L. 13. Jun 2011 09:10

AW: TWebBrowser - Kommunikation selbst verrichten
 
Den Proxy kann man ganz einfach mit TIdHTTPProxyServer umsetzen. Statt den TWebBrowser würde ich die "verbesserte Variante" TEmbeddedWB ( http://www.bsalsa.com ) nehmen. Dort kannst du auch einstellen das alle Requests auf deinen lokalen Proxy (z. B. über Port 8080) umgeleitet werden.

Thom 13. Jun 2011 11:00

AW: TWebBrowser - Kommunikation selbst verrichten
 
Zitat:

Zitat von Andreas L. (Beitrag 1106052)
Den Proxy kann man ganz einfach mit TIdHTTPProxyServer umsetzen.

Kann man eben leider nicht in der Originalvariante. :zwinker:
Der macht "nur" das, was dem Namen nach seine Aufgabe ist: Die Anfragen entgegennehmen und weiterleiten. Die Eingiffsmöglichkeiten seitens des Programmierers sind sehr beschränkt. Genau aus diesem Grund entstand in einigen Wochen Arbeit die "aufgebohrte" Variante in dem angesprochenen Thread...
Zitat:

Zitat von Andreas L. (Beitrag 1106052)
Dort kannst du auch einstellen das alle Requests auf deinen lokalen Proxy (z. B. über Port 8080) umgeleitet werden..

Kann auch der angesprochenen Proxy... 8-)

Andreas L. 13. Jun 2011 11:51

AW: TWebBrowser - Kommunikation selbst verrichten
 
Zitat:

Zitat von Thom (Beitrag 1106079)
Zitat:

Zitat von Andreas L. (Beitrag 1106052)
Den Proxy kann man ganz einfach mit TIdHTTPProxyServer umsetzen.

Kann man eben leider nicht in der Originalvariante. :zwinker:
Der macht "nur" das, was dem Namen nach seine Aufgabe ist: Die Anfragen entgegennehmen und weiterleiten. Die Eingiffsmöglichkeiten seitens des Programmierers sind sehr beschränkt. Genau aus diesem Grund entstand in einigen Wochen Arbeit die "aufgebohrte" Variante in dem angesprochenen Thread...

Mit den Ereignissen
Code:
IdHTTPProxyServer1HTTPBeforeCommand(AContext: TIdHTTPProxyServerContext);
IdHTTPProxyServer1HTTPDocument(AContext: TIdHTTPProxyServerContext; var VStream: TStream);
geht das sehr wohl. Habe es selber schon benutzt. :wink:

Zitat:

Zitat von Thom (Beitrag 1106079)
Zitat:

Zitat von Andreas L. (Beitrag 1106052)
Dort kannst du auch einstellen das alle Requests auf deinen lokalen Proxy (z. B. über Port 8080) umgeleitet werden..

Kann auch der angesprochenen Proxy... 8-)

Was du mir damit sagen willst verstehe ich nicht :?:

Thom 13. Jun 2011 16:17

AW: TWebBrowser - Kommunikation selbst verrichten
 
Zitat:

Zitat von Andreas L. (Beitrag 1106106)
Mit den Ereignissen
Code:
IdHTTPProxyServer1HTTPBeforeCommand(AContext: TIdHTTPProxyServerContext);
IdHTTPProxyServer1HTTPDocument(AContext: TIdHTTPProxyServerContext; var VStream: TStream);
geht das sehr wohl. Habe es selber schon benutzt. :wink:

Toll! Dann kannst Du mir sicher auch sagen, wie man mit folgenden Aufgabestellungen umgeht (betrifft auch die Fragen des Threaderstellers):
  • Abbruch einer Anfrage und Übergabe von 204 (No Content).
  • Weiterleitung der Anfrage an einen beliebigen folgenden Proxy.
  • Übergabe eines eigenen Contents ohne (!!!) vorherige Anfrage beim ursprünglichen Server.
  • Übergabe eines eigenen Contents im Streaming-Modus.
Bin gespannt auf Deine Lösungen! :stupid:
Zitat:

Zitat von Andreas L. (Beitrag 1106106)
Was du mir damit sagen willst verstehe ich nicht :?:

Sorry - war eine Kurzantwort vor dem Mittagessen.
Ausführlich: Du empfiehlst den Embedded WB. Begründung:
Zitat:

Zitat von Andreas L. (Beitrag 1106052)
Dort kannst du auch einstellen das alle Requests auf deinen lokalen Proxy (z. B. über Port 8080) umgeleitet werden.

Und genau das geht auch mit dem vorgestellten Proxy durch einen einfachen Aufruf von SetProxy(...).
Installation und Nutzung einer (sehr guten) umfangreichen Komponentensammlung wegen einer Funktion!? :zwinker:

CCRDude 14. Jun 2011 09:56

AW: TWebBrowser - Kommunikation selbst verrichten
 
Abhängig von der Komplexität des Inhaltes würde ich evtl. auf den IE ganz verzichten und etwa PBear THtmlViewer verwenden. Der fragt für jede Resource nach, bzw. der ist von Anfang an darauf ausgelegt, daß man die Resourcen selber lädt.

Ist natürlich auch eine zusätzliche Komponente, entfernt aber die Abhängigkeit vom IE.

Thom 14. Jun 2011 10:58

AW: TWebBrowser - Kommunikation selbst verrichten
 
Ja, das wäre eine Alternative - aber scheinbar werden diese Komponenten leider nicht mehr weiterentwickelt. Das letzte Update war im Februar 2008 und als höchste Compilerversion wird Delphi 2006 angegeben. Diese Lösung würde also wahrscheinlich viel manuelle Arbeit nach sich ziehen, um das Ganze unicodetauglich und damit zukunftssicher zu machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 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