AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi idHTTPServer und Client als eine art Proxy
Thema durchsuchen
Ansicht
Themen-Optionen

idHTTPServer und Client als eine art Proxy

Offene Frage von "Schubi"
Ein Thema von Schubi · begonnen am 10. Jan 2008 · letzter Beitrag vom 14. Jan 2008
Antwort Antwort
Schubi

Registriert seit: 4. Nov 2003
Ort: Happurg (Nürnberg)
331 Beiträge
 
Delphi 2006 Professional
 
#1

idHTTPServer und Client als eine art Proxy

  Alt 10. Jan 2008, 09:45
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?
Miniaturansicht angehängter Grafiken
web_ui_richtig_144.jpg   web_ui_falsch_163.jpg  
Christian Schubert
Ich fange gerade erst an, den Umfang meiner Ahnungslosigkeit zu begreifen...
  Mit Zitat antworten Zitat
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#2

Re: idHTTPServer und Client als eine art Proxy

  Alt 10. Jan 2008, 10:11
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.
utu

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
Schubi

Registriert seit: 4. Nov 2003
Ort: Happurg (Nürnberg)
331 Beiträge
 
Delphi 2006 Professional
 
#3

Re: idHTTPServer und Client als eine art Proxy

  Alt 10. Jan 2008, 10:17
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]
Christian Schubert
Ich fange gerade erst an, den Umfang meiner Ahnungslosigkeit zu begreifen...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: idHTTPServer und Client als eine art Proxy

  Alt 10. Jan 2008, 11:18
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
  Mit Zitat antworten Zitat
Schubi

Registriert seit: 4. Nov 2003
Ort: Happurg (Nürnberg)
331 Beiträge
 
Delphi 2006 Professional
 
#5

Re: idHTTPServer und Client als eine art Proxy

  Alt 10. Jan 2008, 11:35
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?!

Ü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

--EDIT--

ARequestInfo.Command ist immer GET. Bekomme nichts Anderes.
Auch OnCommandOther wird nie aufgerufen.
Christian Schubert
Ich fange gerade erst an, den Umfang meiner Ahnungslosigkeit zu begreifen...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: idHTTPServer und Client als eine art Proxy

  Alt 10. Jan 2008, 12:56
Hallo Christian,

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 von Schubi:
... Und nochmal zum Tunnel: Ich hab Indy10 ...
MappedPortTCP heißt das "Äquivalent" unter Indy10

Freundliche Grüße
  Mit Zitat antworten Zitat
Schubi

Registriert seit: 4. Nov 2003
Ort: Happurg (Nürnberg)
331 Beiträge
 
Delphi 2006 Professional
 
#7

Re: idHTTPServer und Client als eine art Proxy

  Alt 10. Jan 2008, 13:27
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

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!
Christian Schubert
Ich fange gerade erst an, den Umfang meiner Ahnungslosigkeit zu begreifen...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: idHTTPServer und Client als eine art Proxy

  Alt 10. Jan 2008, 14:53
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 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.
  Mit Zitat antworten Zitat
Schubi

Registriert seit: 4. Nov 2003
Ort: Happurg (Nürnberg)
331 Beiträge
 
Delphi 2006 Professional
 
#9

Re: idHTTPServer und Client als eine art Proxy

  Alt 10. Jan 2008, 15:01
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?
Christian Schubert
Ich fange gerade erst an, den Umfang meiner Ahnungslosigkeit zu begreifen...
  Mit Zitat antworten Zitat
Schubi

Registriert seit: 4. Nov 2003
Ort: Happurg (Nürnberg)
331 Beiträge
 
Delphi 2006 Professional
 
#10

Re: idHTTPServer und Client als eine art Proxy

  Alt 14. Jan 2008, 16:08
*PUSH*
Christian Schubert
Ich fange gerade erst an, den Umfang meiner Ahnungslosigkeit zu begreifen...
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:11 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