Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Webproxy (https://www.delphipraxis.net/26550-webproxy.html)

endeffects 25. Jul 2004 09:04


Webproxy
 
hallo,

ich möchte mir einen web proxy server mit indy basteln und hab mich dazu
ein wenig im netz umgesehen, gefunden hab ich dazu eine lösung
mit der indy mappedport und eine mit der httpserver komponente

schön wäre es wenn der webproxy die requests in folgender form annimmt
http://proxysserver/www.test.de/index2.html

vom (meinem) reinen verständnis her halte ich eine lösung mit hilfe von
idmappedport für die bessere variante, da ich ansonsten mit hilfe von
idhttp jeden gestellten request an den webserver modifizieren
und dann weiterleiten müßte, welche variante würdet ihr bevorzugen?

request > webserver > idhttp > webseite
request > webserver > idmappedport > webseite

anbei noch ein codeschnippsel für die variante mit hilfe von idhttp,
hier steckt allerdings noch ein fehler drin, die variante für
mappedport gibts in den indy demos

für anregungen und ideen wäre ich sehr dankbar

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdCustomHTTPServer,
  IdHTTPServer, IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    IdHTTPServer1: TIdHTTPServer;
    IdHTTP1: TIdHTTP;
    procedure IdHTTP1ServerCreatePostStream(ASender: TIdPeerThread);
    procedure IdHTTPServer1CommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
  // event handler for the OnCreatePostStream event...
procedure TForm1.IdHTTP1ServerCreatePostStream(ASender: TIdPeerThread);
var VPostStream: TStream;
begin
        // creating our own stream so that TIdHTTPServer does not automatically
        // free the PostStream before the OnCommandGet event is triggered
        VPostStream := TMemoryStream.Create;
    end;

    // event handler for the On CommandGet event...
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
        LHTTP: TIdHTTP;
        LURL: String;
        LMethod: TIdHTTPMethod;
        LSource, LDest: TStream;
begin
        LSource := nil;
        LDest := nil;

        if ARequestInfo.Command = 'GET' then begin
            LMethod := hmGet;
        end else if ARequestInfo.Command = 'POST' then begin
            LMethod := hmPost;
        end else if ARequestInfo.Command = 'HEAD' then begin
            LMethod := hmHead;
        end else begin
            AResponseInfo.ResponseNo := 501; // not implemented
            Exit;
        end;

        if LMethod <> hmHead then begin
            AResponseInfo.ContentStream := TMemoryStream.Create;
            if LMethod = hmPost then LSource := ARequestInfo.PostStream;
            LDest := AResponseInfo.ContentStream;
        end;

        LURL := 'http://' + ARequestInfo.Document;
        if Length(ARequest.QueryParams) > 0 then begin
            LURL := LURL + '?' + ARequest.QueryParams;
        end;

        LHTTP := TIdHTTP.Create(nil);
        try
            try
                LHTTP.DoRequest(LMethod, LURL, LSource, LDest);
            finally
                AResponseInfo.ResponseNo := LHTTP.Response.ResponseCode;
                AResponseInfo.ResponseText := LHTTP.Response.ResponseText;
                AResponseInfo.RawHeaders.Assign(LHTTP.Response.RawHeaders);
                // copy over anything else that is needed...
                LHTTP.Free;
            end;
        except end;
    end;

end.

fiasko 25. Jul 2004 09:55

Re: Webproxy
 
Zitat:

Zitat von endeffects
vom (meinem) reinen verständnis her halte ich eine lösung mit hilfe von
idmappedport für die bessere variante, da ich ansonsten mit hilfe von
idhttp jeden gestellten request an den webserver modifizieren

Hallo,

es ist doch grad der Witz daran das der Proxy jeden Request selbst nochmal behandelt. Überlicherweise setzen die noch ein HTTP-Header rein und dann währe da noch das Caching von Anfragen, evtl. Integration in eine Cache-Hierarchie und Proxy spez. Fehlermeldungen...

Laut RFC 2616 muß dein Proxy Server sowohl HTTP Client als auch Server funktionalität bieten.

endeffects 25. Jul 2004 10:04

Re: Webproxy
 
hallo,

wenn ich die onlinehilfe richtig verstanden habe dann
kann man mit hilfe von TIdMappedPortTCP.Intercept
die Daten ebenfalls manipulieren

endeffects 25. Jul 2004 11:48

Re: Webproxy
 
hmm wenn ich mit hilfe von idmappedport einen http request
stelle dann wird leider der host parameter auf die ip
des proxys gesetzt, weiß jmd wie man hier den domainhost
übergeben kann? ansonsten ist es nämlich nicht möglich
auf webseiten die z.b. auf einer virtuellen domain liegen
zu zugreifen

Zitat:


GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/x-gsarcade-launch, */*
Accept-Language: de
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: 127.0.0.1:81
Connection: Keep-Alive
Cookie: IW_SCE_HIDDEN_COMMAND=none



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