![]() |
idHTTPServer und Client als eine art Proxy
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen!
Ich habe ein Programm das als HTTP-Server fungiert geschrieben. Das läuft zuhause auf einem kleinen Server. Ich greife mit GlobeDNS darauf zu. Im Programm enthalten ist ein Datei-Browser und einige andere fest integrierte HTML-Forms. Das alles läuft über den Indy HTTP-Server auf Port 80. Das funktioniert auch alles super. Ausserdem läuft auf dem Rechner µTorrent mit dem neuen Java Web-Interface auf Port 8080. Nun will ich, dass mein HTTP-Server bei der Anfrage 192.168.X.X:80/gui/ das Web-Interface von µTorrent durchreicht (zu erreichen unter 192.168.X.X:8080/gui/ ). Hintergrund ist der, dass ich auf Arbeit hinter einem Proxy sitze der nur Port 80 durch lässt. Ich ersetze also im eingehenden Request vom HTTP-Server einfach 192.186.X.X/gui/ durch 192.168.X.X:8080/gui/ und hole mir diese URL dann mit dem Indy HTTP-Client per Client.Get(). Auch das funktioniert im Grunde schon, aber die Seite,was ich dann angezeigt bekomme ist komplett durcheinander. Im Anhang sind zwei Bilder. Das eine, wie es aussehen müsste, und das zweite so wie es mein Server raus gibt. Hier mal noch die Get-Routine der idHTTPServers:
Delphi-Quellcode:
Hat jemand eine Idee, warum nur dieser komische Müll bei mir ankommt?
procedure TForm2.ServerCommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var URL : String; s : String; Temp : String; begin If Pos('/gui/',LowerCase(ARequestInfo.Document)) > 0 then begin //Request für das Webinterface auf 8080 Temp := StringReplace(ARequestInfo.Document,'/gui/',':8080/gui/',[rfIgnoreCase]); URL := 'http://127.0.0.1'+ Temp; // xyz.globedns.info/gui/ -> 127.0.0.1:8080/gui/ try while HTTP.Tag=1 do Application.ProcessMessages; HTTP.Tag:=1; s := HTTP.Get(URL); AResponseInfo.RawHeaders.Text := HTTP.Response.RawHeaders.Text; AResponseInfo.WriteHeader; AResponseInfo.ContentText := s; AResponseInfo.ContentType := HTTP.Response.ContentType; HTTP.Tag:=0; AResponseInfo.WriteContent; except end; end else begin AResponseInfo.ContentText := 'normaler Request für Port 80 (HTTP server)'; AResponseInfo.WriteContent; //Hier sind noch die Verzweigungen für die ganzen anderen Dokumente end; end; Fehlt vieleicht CSS? |
Re: idHTTPServer und Client als eine art Proxy
Ich kann jetzt Dein Problem auf die schnelle nicht nachvollziehen, aber
kann es sein, dass die Routine evtl. mehrfach aufgerufen wird? Dann kann der folgende code naemlich problematisch werden:
Delphi-Quellcode:
So dass dann irgendwann
begin
If Pos('/gui/',LowerCase(ARequestInfo.Document)) > 0 then begin //Request für das Webinterface auf 8080 Temp := StringReplace(ARequestInfo.Document,'/gui/',':8080/gui/',[rfIgnoreCase]); URL := 'http://127.0.0.1'+ Temp; 'http://127.0.0.1:8080/gui/' und spaeter 'http://127.0.0.1:8080/:8080/gui/' entsteht...? nur mal so geraten. |
Re: idHTTPServer und Client als eine art Proxy
Hallo!
Es sind mehrere Dokumente, aber das passt alles. Hier eine Liste mit den Requests (Vorher -> Nachher)
Delphi-Quellcode:
http://127.0.0.1/gui/ -> [url]http://127.0.0.1:8080/gui/[/url]
[url]http://127.0.0.1/gui/stable.css[/url] -> [url]http://127.0.0.1:8080/gui/stable.css[/url] [url]http://127.0.0.1/gui/style.css[/url] -> [url]http://127.0.0.1:8080/gui/style.css[/url] [url]http://127.0.0.1/gui/common.js[/url] -> [url]http://127.0.0.1:8080/gui/common.js[/url] [url]http://127.0.0.1/gui/stable.js[/url] -> [url]http://127.0.0.1:8080/gui/stable.js[/url] [url]http://127.0.0.1/gui/script.js[/url] -> [url]http://127.0.0.1:8080/gui/script.js[/url] [url]http://127.0.0.1/gui/content.js[/url] -> [url]http://127.0.0.1:8080/gui/content.js[/url] [url]http://127.0.0.1/gui/[/url] -> [url]http://127.0.0.1:8080/gui/[/url] |
Re: idHTTPServer und Client als eine art Proxy
Hallo Christian,
bist du sicher, dass du mit Get() immer die richtige Methode verwendest? Du wirst irgendwann auch Post() benötigen um beispielsweise Parameter (wie z.B. SessionID) zu übermitteln, die in deinen Beispiel-URLs nicht zu sehen sind. Vielleicht wird alles einfacher, wenn du das PortMapping auf einem niedrigeren Layer machst (INDY9: TunnelMaster, TunnelSlave). Grüße vom marabu |
Re: idHTTPServer und Client als eine art Proxy
Hallo Marabu,
an dem Thema bin ich gerade am forschen, welche Requests da alles kommen. Aber die Methode heißt doch OnCommandGET, da hat doch Post nichts zu suchen?! :lol: Über einen Tunnel hab ich auch nachgedacht, aber ich habe inzwischen mehrere hunder Zeilen Code die auf dem idHTTP-Server basieren. Sprich: das umleiten von 80 auf 8080 ist nur ein winziger Teil der jetzt mit zu Programm dazu kommt. Der Queltext oben ist quasi ein Testprojekt ohne den ganzen Ballast aus dem echten. Und nochmal zum Tunnel: Ich hab Indy10 :wall: --EDIT-- ARequestInfo.Command ist immer GET. Bekomme nichts Anderes. Auch OnCommandOther wird nie aufgerufen. |
Re: idHTTPServer und Client als eine art Proxy
Hallo Christian,
Zitat:
Zitat:
Freundliche Grüße |
Re: idHTTPServer und Client als eine art Proxy
OK. Danke!
Aber etwas anderes als Get() muss ich ja nur aufrufen, wenn ich am Server auch etwas anderes bekomme. Und da kommt nichts weiter als ARequestInfo.Command = 'GET'. Bis jetzt zumindest. Momentan scheint er hängen zu bleiben weil beim letzten GET ARequestInfo.Params.Text etwas enthält. Wie muss ich das weitergeben? '127.0.0.1:8080/gui/' ist die URL und in den Params steht 'action=getsettings'. Muss das dann mit einem '?' hinten ran? Wenn ich das mache und Get(URL) aufrufe, bekomme ich einen Socket-Fehler. Wie gebe ich also die Parameter weiter? --EDIT-- Den mapped Port hab ich gerade mal getestet. Das funktioniert grundsätzlich schon mal, aber das ding wirft Exceptions als wenn er nichts anderes kennt :roll: Ausserden nützt der mir glaube ich wenig, weil ich nach wie vor meinen idHTTPserver brauche um alle anderen Anfragen zu beantworten. Oder kann ich bei dem Ding sagen er soll nur auf 8080 umleiten, falls in der URKL /gui/ drin vorkommt? Dann wäre es denkbar! |
Re: idHTTPServer und Client als eine art Proxy
Die Parameter müssen beim GET Command natürlich wieder in den URL eingebaut werden - das hast du schon die richtige Idee. Vielleicht hast du einen Fehler bei der Umsetzung gemacht?
Zitat:
|
Re: idHTTPServer und Client als eine art Proxy
Delphi-Quellcode:
ergibt:
Temp := StringReplace(ARequestInfo.Document,'/gui/',':8080/gui/',[rfIgnoreCase]);
if (ARequestInfo.Params.Text <> '') then begin Temp := Temp + '?' + ARequestInfo.Params.Text; end; Socket Error # 10054 "Connection reset by peer" ![]() ![]() any Ideas? :gruebel: |
Re: idHTTPServer und Client als eine art Proxy
*PUSH* :coder2:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 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