AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Proxy-Server leitet keine https-Seiten weiter

Proxy-Server leitet keine https-Seiten weiter

Ein Thema von skyobserver · begonnen am 24. Okt 2007 · letzter Beitrag vom 30. Okt 2007
Antwort Antwort
Seite 2 von 2     12
hinnack

Registriert seit: 18. Nov 2004
22 Beiträge
 
#11

Re: Proxy-Server leitet keine https-Seiten weiter

  Alt 29. Okt 2007, 06:31
stimmt, INDY10 will man nicht

Ich habe mich schon immer bei 9 gefragt, ob das je schon mal jemand benutzt hat - vieles ist einfach nur buggy, angefangen, etc...

du musst eine weiters Verb neben GET, POST, etc. unterstützen: CONNECT

darin mache ich folgendes:
Delphi-Quellcode:
procedure TidHTTPService.CommandConnect(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo);
var
   TCP: TidHTTPConnectProxy;
   LCloseConnection: Boolean;
   ConnectStr: String;
   Host: String;
   Port: Integer;
   
begin
   TCP := TidHTTPConnectProxy.Create(AThread.Connection);

   if FConnectForwardingHost <> 'then
   begin
      Host := FConnectForwardingHost;
      Port := FConnectForwardingPort;
   end
   else
   begin
      Host := Copy(ARequestInfo.Document, 1, Pos(':', ARequestInfo.Document) - 1);
      Port := StrToInt( Copy(ARequestInfo.Document, Pos(':', ARequestInfo.Document) + 1, MAXINT));
   end;

   if Assigned(OnBeforeConnect) then
      OnBeforeConnect(ARequestInfo, Host, Port);


   TCP.Server.Host := Host;
   TCP.Server.Port := Port;

   LCloseConnection := false;
   ConnectStr := TCP.Server.Host + ':' + IntToStr(TCP.Server.Port);
   System.Writeln('CONNECT ' + ConnectStr);

   with AThread.Connection do
   try
      try
         TCP.Server.Connect;
         OpenWriteBuffer;
         try
            WriteLn('HTTP/1.1 200 Connection established');
            WriteLn('Proxy-agent: ' + ServerSoftware);
            WriteLn;

         finally
            CloseWriteBuffer;
         end;

      except
         on E: Exception do
         begin
            OpenWriteBuffer;
            try
               WriteLn('HTTP/1.1 502 Bad Gateway');
               WriteLn('Proxy-agent: ' + ServerSoftware);
               WriteLn;
               WriteLn('Server unreachable ' + e.Message);
               TCP.Terminate;
               Exit;
            finally
               CloseWriteBuffer;
            end;
         end;
      end;

      TCP.ConnectionHandle := TObject((AThread.Connection.IOHandler as TIdIOHandlerSocket).Binding.Handle);
      TCP.OutBoundHandle := TObject((TCP.Server.IOHandler as TIdIOHandlerSocket).Binding.Handle);

      TCP.Resume;

      repeat
         {$IFDEF MSWINDOWS}
         SleepEx(10, true);
         {$ELSE}
         Sleep(10);
         {$ENDIF}
      until (LCloseConnection) or (TCP.Terminated) or (not TCP.Server.Connected) or (not AThread.Connection.Connected);
   finally
      TCP.Server.Disconnect;
      while not TCP.Terminated do
{$IFDEF MSWINDOWS}
      SleepEx(5, true);
{$ENDIF}
{$IFDEF LINUX}
      Sleep(5);
{$ENDIF}
      FreeAndNil(TCP);

      AThread.Connection.Disconnect;
      System.Writeln('DISCONNECT ' + ConnectStr);
   end;
end;

dazu braucht man:
Delphi-Quellcode:
   TidHTTPConnectProxy = class(TThread)
      private
         FClient: TidTCPServerConnection;
         FServer: TidTCPClient;
         FReadList: TList;
         FNetData: String;
         FConnectionHandle: TObject;
         FOutBoundHandle: TObject;

      protected
         procedure Execute; override;

      public
         constructor Create(Owner: TidTCPServerConnection);
         destructor Destroy; override;

         property Server: TidTCPClient read FServer write FServer;
         property ReadList: TList read FReadList write FReadList;
         property ConnectionHandle: TObject read FConnectionHandle write FConnectionHandle;
         property OutBoundHandle: TObject read FOutBoundHandle write FOutBoundHandle;
   end;
mit:
Delphi-Quellcode:
{ TidHTTPConnectProxy }

constructor TidHTTPConnectProxy.Create(Owner: TidTCPServerConnection);
begin
   FClient := Owner;
   FReadList := TList.Create;
   FServer := TIdTCPClient.Create(nil);
   inherited Create(true);
end;

destructor TidHTTPConnectProxy.Destroy;
begin
  FreeAndNil(FServer);
  FreeAndNil(FReadList);
  inherited;
end;

procedure TidHTTPConnectProxy.Execute;
begin
   while not Terminated do
   begin
      if (Server.Connected) and (FClient.Connected) then
      begin
         try
            FReadList.Clear;
            FReadList.Add(FConnectionHandle);
            FReadList.Add(FOutBoundHandle);

            if GStack.WSSelect(FReadList, nil, nil, IdTimeoutInfinite) > 0 then
            begin
               if FReadList.IndexOf(FConnectionHandle) > -1 then
               begin
                  // TODO: WSAECONNRESET (Exception [EIdSocketError] Socket Error # 10054 Connection reset by peer)
                  FNetData := FClient.CurrentReadBuffer;
                  if Length(FNetData) > 0 then
                  begin
                     Server.Write(FNetData);
                  end;
               end;
               if FReadList.IndexOf(FOutBoundHandle) > -1 then
               begin
                  FNetData := Server.CurrentReadBuffer;
                 if Length(FNetData)>0 then
                 begin
                     FClient.Write(FNetData);
                 end;
               end;
            end
            else
               System.WriteLn('seems nothing to do...');
         except
            Terminate;
         end;
      end
      else
      begin
         Terminate;
      end;
   end;
end;
die System.Writeln kannst du wegschmeissen, wenn du keine Console hast => ist aber immer gut zum debuggen...
  Mit Zitat antworten Zitat
Benutzerbild von skyobserver
skyobserver

Registriert seit: 18. Mai 2005
Ort: Ense
114 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#12

Re: Proxy-Server leitet keine https-Seiten weiter

  Alt 29. Okt 2007, 13:28
Dazu habe ich ein paar Fragen:

procedure TidHTTPService.CommandConnect(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo); Wo ist denn die Methode "CommandConnect" implementiert?

In idHTTPServer habe ich als Ereignisse:
-"OnCommandGet" (wird nur bei Kommando "GET" aufgerufen),
-"OnCommandOther" (wird bei Kommando "CONNECT" aufgerufen) - Parameter: "Thread", "asCommand", "asData", "asVersion"
-"OnConnect" - Parameter: "AThread"

Wo kommt "ARequestInfo" und "GStack" her?
Die größte Enttäuschung für einen Perfektionisten ist die Realität
  Mit Zitat antworten Zitat
hinnack

Registriert seit: 18. Nov 2004
22 Beiträge
 
#13

Re: Proxy-Server leitet keine https-Seiten weiter

  Alt 30. Okt 2007, 06:24
die INDY Programmierer haben sich nicht viel Mühe gemacht mit OnCommandGet und OnCommandOther...
Verben gibt es schliesslich viel mehr (GET, POST, PUT, TRACE, OPTIONS, PROPFIND, etc.) ich rufe in OnCommandOther für jedes Verb eine eigene Methode auf (also für Connect: CommandConnect).

GStack ist in UNIT: IdStack.pas und wird immer implizit instanziert.

meine CommandOther aus TIdHTTPServer hat folgende Parameter:

AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo; const asCommand, asData, asVersion: string

von dort geben ich AThread und ARequestInfo an CommandConnect weiter
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:45 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