Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
3-1302
n13
2003-08-09 16:27
2003.09.01
Clarion


14-1569
VID
2003-08-08 19:32
2003.09.01
Ищу музыку...


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


1-1454
Still_Swamp
2003-08-19 17:14
2003.09.01
Прочитать в TMemoryStream


3-1350
Weare
2003-08-04 17:12
2003.09.01
Доступ к веделенным записям





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский