Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi idHTTPServer und Client als eine art Proxy (https://www.delphipraxis.net/106396-idhttpserver-und-client-als-eine-art-proxy.html)

Schubi 10. Jan 2008 08:45


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:
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;
Hat jemand eine Idee, warum nur dieser komische Müll bei mir ankommt?
Fehlt vieleicht CSS?

mashutu 10. Jan 2008 09:11

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:
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;
So dass dann irgendwann
'http://127.0.0.1:8080/gui/'
und spaeter
'http://127.0.0.1:8080/:8080/gui/'
entsteht...? nur mal so geraten.

Schubi 10. Jan 2008 09:17

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]

marabu 10. Jan 2008 10:18

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

Schubi 10. Jan 2008 10:35

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.

marabu 10. Jan 2008 11:56

Re: idHTTPServer und Client als eine art Proxy
 
Hallo Christian,

Zitat:

Zitat von Schubi
... Aber die Methode heißt doch OnCommandGET, da hat doch Post nichts zu suchen?! ...

aber gewiss doch: Alle gängigen HTTP Commands (Get, Head, Post) werden über das Ereignis OnCommandGet() abgearbeitet. Ich meinte übrigens die Methode Get() der HTTP Client-Komponente, nicht das Ereignis OnCommandGet() der HTTP Server-Komponente.

Zitat:

Zitat von Schubi
... Und nochmal zum Tunnel: Ich hab Indy10 ...

MappedPortTCP heißt das "Äquivalent" unter Indy10

Freundliche Grüße

Schubi 10. Jan 2008 12:27

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!

marabu 10. Jan 2008 13:53

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:

Zitat von Schubi
... 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!

Nein, lass es. Bei der Entgegennahme der Anfrage durch deinen eigenen HTTP Server wurden die Kommunikationsdaten ja schon auf dem obersten Layer verarbeitet. Da nochmal zurück auf TCP macht nur dann Sinn, wenn du wirklich nochmal tunneln müsstest. Sorry.

Schubi 10. Jan 2008 14:01

Re: idHTTPServer und Client als eine art Proxy
 
Delphi-Quellcode:
Temp := StringReplace(ARequestInfo.Document,'/gui/',':8080/gui/',[rfIgnoreCase]);
    if (ARequestInfo.Params.Text <> '') then begin
      Temp := Temp + '?' + ARequestInfo.Params.Text;
    end;
ergibt:
Socket Error # 10054 "Connection reset by peer"

http://127.0.0.1/gui/ -> http://127.0.0.1:8080/gui/?action=getsettings

any Ideas? :gruebel:

Schubi 14. Jan 2008 15:08

Re: idHTTPServer und Client als eine art Proxy
 
*PUSH* :coder2:


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