Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.01;
Скачать: CL | DM;

Вниз

И снова о Proxy-Сервере   Найти похожие ветки 

 
SergP ©   (2003-08-12 14:23) [0]

Нужны исходники простого HTTP прокси-сервера на Дельфи 5 (без наворотов - типа кеширования, поддержки SSL). И чтобы использовались только стандартные компоненты Просто мне по исходникам будет проще понять как он работает.
А то нигде в инете ничего такого не могу найти. Кроме того я и другие товарищи создавали топики на эту тему. Но все без конкретных результатов.
Если кто может найти/написать нечто подобное но не хочет просто так тратить на это время - назовите цену что вы за это хотите


 
nikkie ©   (2003-08-12 14:27) [1]

а ты для себя как понимаешь, что такое прокси? у прокси много разной функциональности может быть. mapped ports, socks, http-proxy, ftp-proxy... ты собственно о чем?


 
SergP ©   (2003-08-12 14:32) [2]

Ну я написал же http-прокси. Имеется ввиду прога выполняющая функции локального хттп прокси. (типа как WINROUTE, WINGATE и пр.) но без всех наворотов.
Просто мне нужно понять как данные от браузера (законекченого через этот прокси) передаются в инет и оттуда обратно. А то что я не пытался сделать с помощью TClientSocket и TserverSocket (как кто-то советовал) - нифига не получается...


 
Polevi ©   (2003-08-12 14:58) [3]

что тут непонятного
акцептируешь клиента, получаешь запрос, разбираешь его, создаешь TClientSocket, подключаешься им к хосту указанному в запросе, получаешь оттуда данные и передаешь акцептированному клиенту


 
SergP ©   (2003-08-12 15:30) [4]


> Polevi © (12.08.03 14:58) [3]
> что тут непонятного
> акцептируешь клиента, получаешь запрос, разбираешь его,
> создаешь TClientSocket, подключаешься им к хосту указанному
> в запросе, получаешь оттуда данные и передаешь акцептированному
> клиенту


Просто не приходилось еще с этим разбираться. А лучше всего это делать имея конкретный пример.
Было бы хорошо если бы ты на примере это объяснил.

Ну например настраиваю я прокси в браузере на 127.0.0.1:port
Port - тот что указываю в TServerSocket. Пытаюсь в браузере что-то открыть. TServerSocket при этом генерирует событие (не помню точно какое). Вот теперь как мне из него (TServerSocket) вытянуть запрос который послал браузер? И что конкретно в нем нужно разобрать и как передать дальше через TclientSocket нужному хосту?


 
Polevi ©   (2003-08-12 15:46) [5]

OnClientRead
s:=Socket.ReceiveText=Get запрос броузера

из s вытаскиваешь хост, подключаешься к нему TClientSocket"ом и в OnClientWrite его Socket.SendText(s)

а вообще поработай для начала в блок режиме, может проще тебе будет


 
nikkie ©   (2003-08-12 15:53) [6]

>Ну я написал же http-прокси.
виноват, не заметил, но в теме-то у тебя про http ничего не было. ну тогда держи пример на коленках сделанный... использовалась indy 8-й версии.

unit ProxyMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdMappedPortTCP,
IdTCPClient, IdTCPServer, IdIntercept, IdLogBase, IdLogDebug;

type
THTTPProxy = class (TIdMappedPortTCP)
protected
procedure DoConnect(AThread: TIdPeerThread); override;
end;

TIdMappedPortTCP = class(THTTPProxy);

TForm1 = class(TForm)
IdMappedPortTCP: TIdMappedPortTCP;
IdLogDebug1: TIdLogDebug;
Memo1: TMemo;
procedure IdLogDebug1LogItem(ASender: TComponent; var AText: String);
procedure IdMappedPortTCPBeforeClientConnect(ASender: TComponent;
AThread: TIdPeerThread; AClient: TIdTCPClient);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure THTTPProxy.DoConnect(AThread: TIdPeerThread);
var
Request: TStringList;
Command, Host: String;
idx1, idx2: integer;
begin
Request := TStringList.Create;
try
repeat
Command := AThread.Connection.ReadLn;
Request.Add(Command);
until Command = "";

Command := Request[0];
idx1 := StrPos(PChar(Command), "http://") - PChar(Command);
idx2 := StrPos(PChar(Command) + idx1 + 7, "/") - PChar(Command);
Host := Copy(Command, idx1 + 8, idx2 - idx1 - 7);
Delete(Command, idx1 + 1, idx2 - idx1);
Request[0] := Command;

MappedHost := Host;
MappedPort := 80;

inherited;

TIdMappedPortTCPData(AThread.Data).OutboundClient.Writeln(Request.Text );
finally
Request.Free;
end;
end;

procedure TForm1.IdLogDebug1LogItem(ASender: TComponent;
var AText: String);
begin
Memo1.Lines.Add(AText);
end;

procedure TForm1.IdMappedPortTCPBeforeClientConnect(ASender: TComponent;
AThread: TIdPeerThread; AClient: TIdTCPClient);
begin
TIdMappedPortTCPData(AThread.Data).OutboundClient.Intercept := IdLogDebug1;
TIdMappedPortTCPData(AThread.Data).OutboundClient.InterceptEnabled := True;
end;

end.


 
Polevi ©   (2003-08-12 16:03) [7]

2nikkie © (12.08.03 15:53) [6]
порт тоже неплохо бы из запроса брать, он не всегда 80


 
nikkie ©   (2003-08-12 16:12) [8]

>Polevi
оно понятно. я неуверен даже, что искать http:// в запросе - это хорошо. но нормальный разбор пусть пишет тот, кому это надо.


 
SergP ©   (2003-08-12 17:00) [9]


> nikkie © (12.08.03 16:12) [8]
> >Polevi
> оно понятно. я неуверен даже, что искать http:// в запросе
> - это хорошо. но нормальный разбор пусть пишет тот, кому
> это надо.


Ок. насчет разбора - вроде бы понял. Напишу сам.
А вот с твоим примером - немного неудобно тем что Indy 8. У меня Indy 5 вроде бы... Буду с ним позже разбираться.


> Polevi © (12.08.03 15:46) [5]
> OnClientRead
> s:=Socket.ReceiveText=Get запрос броузера
>
> из s вытаскиваешь хост, подключаешься к нему TClientSocket"ом
> и в OnClientWrite его Socket.SendText(s)
>
> а вообще поработай для начала в блок режиме, может проще
> тебе будет


Ну вот. Ставлю я на форму TServerSocket, Tmemo, и TButton
В Tserversocket.port заношу 8080

procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);

var
s:string;
begin
s:=serversocket.socket.ReceiveText; // и тут возникает ошибка.
memo1.lines.add(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
serversocket.Active:=true;
end;

Жму кнопку и в браузере набираю любой URL, чтобы в MEMO глянуть на то что из себя представляет запрос.
Но не тут то было. Возникает ошибка.
Вот здесь s:=serversocket.socket.ReceiveText;


 
Polevi ©   (2003-08-12 17:11) [10]

s:=serversocket.socket.ReceiveText; // и тут возникает ошибка.
s:=Socket.ReceiveText

почувствуйте разницу


 
SergP ©   (2003-08-12 17:25) [11]


> Polevi © (12.08.03 17:11) [10]
> s:=serversocket.socket.ReceiveText; // и тут возникает
> ошибка.
> s:=Socket.ReceiveText
>
> почувствуйте разницу


Вот черт. Въехал наконец.. Вот почему у меня в прошлый раз ничего не получилось... Теперь работает...


 
SergP ©   (2003-08-12 17:35) [12]

Кстати я так понял что мне на каждый запрос браузера придется создавать отдельный TClientSocket.

И еще. Если я хочу законектиться через внешний прокси сервер, то получается что разбирать запрос мне не нужно будет.

Правильно ли я понимаю?


 
nikkie ©   (2003-08-12 17:48) [13]

ну вот... начали с http прокси, а закончили mapped port. если ты будешь использовать внешний прокси - надо просто отмапить порт. IdMappedPortTCP для этого и сделан, ничего писать самому и не надо.

зы indy 5 такого в природе и не бывает. до версии 8 indy называлась winshoes.


 
SergP ©   (2003-08-12 18:17) [14]


> nikkie © (12.08.03 17:48) [13]
> ну вот... начали с http прокси, а закончили mapped port.
> если ты будешь использовать внешний прокси - надо просто
> отмапить порт. IdMappedPortTCP для этого и сделан, ничего
> писать самому и не надо.
>
> зы indy 5 такого в природе и не бывает. до версии 8 indy
> называлась winshoes.


Ну мне нужно и так и так (и напрямую конектиться и через внешний прокси). А вообще прокси мне нужен для того чтобы можно было немного редактировать запросы браузера, вот например:
Accept-Language: ru поменять на Accept-Language: en
Кроме того можно будет сделать фильтрацию содержимого, загружаемого в IE или TWebbrowser. А также "подменять" куки. И т.д.

А насчет indy может я ошибся. Я уже не помню какая версия у меня. вероятно 5 в названии файлов - это версия дельфей для которых эта INDY. Но пока не удалось мне откомпилировать твой пример. может у меня с Дельфей не все в порядке, но компилятор постоянно просит файлы, который мне приходится искать в папках куда сама дельфи установлена и копировать в папку с прогой. Уже задолбался копировать. Потом еще попробую...


 
SergP ©   (2003-08-12 19:29) [15]

Вот снова проблема:

procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.lines.add("событие ClientRead Серверного сокета");
s:=socket.ReceiveText;
memo1.lines.add(s);
clientsocket.Active:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
serversocket.Active:=true;
end;

procedure TForm1.ClientSocketConnecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.add("Клиентский сокет сконектился");
end;

procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.lines.add("событие OnRead клиентского сокета");
r:=socket.ReceiveText;
memo1.lines.add(r);
//...... <h>Ну и как передать теперь r в serversocket?</h>
end;

procedure TForm1.ClientSocketWrite(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.lines.add("событие OnWrite клиентского сокета");
socket.SendText(s);
end;

procedure TForm1.ServerSocketClientWrite(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.lines.add("событие СientWrite серверного сокета");
end;

Значит пробую так: клиентный сокет настроен на конкретный хост (это пока на данном этапе). Ввожу в браузере УРЛ. в Серверном сокете возникает событие OnClientRead. Активирую клиентский сокет. Он конектится и просит данные OnWrite. Я даю ему эти данные. затем он передает их указаному хосту. Через некоторое время хост отсылает ответ. Возникает OnRead в клиентском сокете. Я забираю полученные данные и ... не знаю что с ними делать. Т.е. Как их "засунуть" в серверный сокет чтобы отдать браузеру?
т.е. как сделать socket.sendtext(r) для серверного сокета, если я
нахожусь в обработчике событий клиентского сокета?


 
Polevi ©   (2003-08-12 20:10) [16]

в Socket.Data TClientSocket помещай ссылку на акцептируемый TSocket

procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.lines.add("событие OnRead клиентского сокета");
r:=socket.ReceiveText;
memo1.lines.add(r);
//...... <h>Ну и как передать теперь r в serversocket?TCustomWinSocket(Socket.Data).SendText(...
end;


 
SergP ©   (2003-08-12 20:34) [17]

procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.lines.add("событие OnRead клиентского сокета");
r:=socket.ReceiveText;
memo1.lines.add(r);
socket.Data:=serversocket;
TCustomWinSocket(Socket.Data).SendText(r);
end;

Если так то не работает.... Ошибки вылезают



Страницы: 1 вся ветка

Текущий архив: 2003.09.01;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.015 c
1-1364
SIW
2003-08-17 19:37
2003.09.01
Работа с TStringList


1-1372
Эдуард
2003-08-16 11:51
2003.09.01
нужно выдрать иконку из DLL по её имени (не по номеру!)


14-1670
Шишкин Илья
2003-08-12 12:59
2003.09.01
Кто-нибудь разбирается в музыке?


3-1345
Buka
2003-08-05 13:24
2003.09.01
Перенос данных из Excel в Table


1-1481
revo
2003-08-18 12:48
2003.09.01
Как узнать занят ли файл другим приложением?