Http Proxy Server

0

Chce napisać prosty server http proxy. Może są do tego jakieś gotowe komponenty ?? dawno nie pisałem w delphi i mam troche problemów. na razie napisałem takie coś :

procedure TForm1.get_host(info : string);
var
i, j : integer;
begin
client.Active:=false;
host:='';
for i:=1 to length(info) do
begin
if (info[i]=':') and (info[i-1]='t') and (info[i-2]='s') and (info[i-3]='o') and (info[i-4]='H') then
begin
j:=i+2;
repeat
host:=host+info[j];
Inc(j);
until info[j+1]=#10;
break;
end;
end;
client.Host:=host;
end;

procedure TForm1.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i : integer;
begin
temp:=Server.Socket.Connections[0].ReceiveText;
memo1.Lines.Add(temp);
if(temp<>'')then
get_host(temp);
client.Active:=true;
end;

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
s : string;
begin
s:=client.Socket.ReceiveText;
memo2.lines.Add(s);
server.Socket.Connections[0].SendText(s);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ile:=0;
czy:=true;
end;

procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
caption:='polaczony';
client.Socket.SendText(temp);
end;

procedure TForm1.ClientConnecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
form1.Caption:='lacze';
end;

procedure TForm1.ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
caption:='koniec';
client.Active:=false;
server.Socket.Connections[0].Close;
end;

Może ktoś mi powie czemu to proxy działa na stronkach na których jest mało różnych obiektów (np www.google.pl) a na np www.wp.pl załaduje troche obrazków a potem przestaje ... Proszę więc o jakiś przykład, komponent lub naprowadzenie mnie na dobrą drogę :)

0

Mam tylko teorię, bo mi się nie chce jej sprawdzać...

Wszędzie używasz Connections[0] więc:

  1. Program twój będzie mógł obsłużyć wyłącznie jedną konekcję naraz.
  2. Może jest tak, że czasami pierwsze połączenie z jakichś przyczyn się nie zamknie, a ty jednak na nie wrzucasz wszystkie dane...
0

Prawda przeglądarka nawiązuje ze mną 4 połaczenia. Już zmodyfikowałem zeby odbieral dane ze wszyskich. Jednak gdy je odbiore i spróbuje wykonywać je po kolei to niewiem jak zrobić aby funkcja get_host() czekała az klient który własnie odbiera dane, zamknął połączenie ... dostane np trzy zapytania z róznych połaczeń
GET /
GET /test.html
GET /bla.php
Chce poczekać z wykonaniem GET /test.html az klient wyśle GET / i odbierze wynik. Da sie jakoś zatrzymać pętle na czas kiedy klient jest połaczony ? :) Próbowałem juz wielu rzeczy, mase ifów, boolenów, rozkładania program na wiele funkcji ale nie wiem jak to zrobić.
btw. Moze ktoś wie czy da sie do tego wykorzystac TCPMappedPort ?? Próbowałem ale w nim chyba trzeba mieć z góry ustalony cel, i nie da się "przechwytywać" wiadomości które przez niego przechodzą :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1