Форум: "Потрепаться";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
ВнизИ снова о 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.009 c