Форум: "Сети";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизWebBrowser и Socks прокси Найти похожие ветки
← →
Maxim Volobuev (2003-09-06 18:38) [0]Подскажите, где можно посмотреть примеры или описание работы WebBrowser через Socks прокси. Что то никакой информации найти не могу.
← →
nikkie (2003-09-07 17:22) [1]по умолчанию WebBrowser использует настройки IE. в чем, собственно, вопрос? как заставить IE работать через Socks или как заставить WebBrowser использовать другие настройки?
← →
Maxim Volobuev (2003-09-07 20:19) [2]Хм..., интересный вопрос. По-моему IE не умеет самостоятельно работать с Socks-прокси, его можно заставить это делать только с помощью сторонних программ.
А вообще, хотелось бы конечно работать со своими настройками, не трогая общие системные.
← →
nikkie (2003-09-07 22:04) [3]то есть на самом деле оба вопроса интересует :)
я и сам думал, что IE не поддерживает SOCKS, но перед тем как отвечать залез в настройки IE6 - там можно указать socks-сервер. но будет ли работать - не знаю, не проверял. проверишь, расскажи.
есть разные варианты, как изменять настройки WebBrowser.
вариант 1. используя тот факт, что WebBrowser использует WinInet API для скачивания данных, некоторые настройки (например, прокси или user agent) можно поменять с помощью UrlMkSetSessionOption.
два других способа, которые я знаю, легче реализовать используя компоненту EmbeddedWB - http://www.euromind.com/iedelphi/
вариант 2. IE хранит все настройки в реестре, можно изменить их там. для того, чтобы эти изменения касались WebBrowser, но не IE, эти настройки можно записывать в другой ветке реестра. указать этот путь можно в событии OnGetOptionKeyPath (событие есть только у EmbeddedWB).
вариант 3. WebBrowser запрашивает своего хоста на предмет некоторых свойств (так называемых ambient properties). для этого надо написать обработчик OnInvoke (опять-таки есть только у EmbeddedWB). например, вот код изменения user agent:
const
USER_AGENT: WideString = "takoi vot hitryi browser";
function TForm1.EmbeddedWB1Invoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var Params: tagDISPPARAMS; VarResult,
ExcepInfo, ArgErr: Pointer): HRESULT;
begin
if (Flags and DISPATCH_PROPERTYGET <> 0) and (VarResult <> nil) and
(DispId = DISPID_AMBIENT_USERAGENT) then
begin
PVariant(VarResult)^ := USER_AGENT;
Result := S_OK;
end else begin
Result := DISP_E_MEMBERNOTFOUND;
end;
end;
← →
Maxim Volobuev (2003-09-08 16:56) [4]IE действительно не поддерживает SOCKS и в настройках можно указать только HTTP прокси, а уж никак не SOCKS.
И из-за этого отпадают все перечисленные варианты.
← →
Reindeer Moss Eater (2003-09-08 17:12) [5]IE действительно поддерживает SOCKS.
По крайней мере 6 версия.
← →
Maxim Volobuev (2003-09-09 12:28) [6]Прописал в ИЕ SOCKS-прокси - не работает.
Ладно, я поставлю вопрос по другому - как заставить все свое приложение работать через SOCKS-прокси?
← →
nikkie (2003-09-09 17:45) [7]написать свой http прокси, который будет переадресовывать запрос через socks
← →
Maxim Volobuev (2003-09-10 15:04) [8]А где нибудь можно посмотреть пример, как это по проще сделать?
← →
nikkie (2003-09-10 19:06) [9]говорят в библиотечке ICS есть какая-то компонента-прокси, но я не смотрел, к тому же не знаю как там дела с поддержкой socks. как-то я делал на коленках пример, как написать прокси с использованием IdMappedPortTCP из indy.
в принципе, код рабочий (я проверял с indy 8), только надо поаккуратнее написать код разбора строки запроса (по крайней мере, порт оттуда тоже брать надо). к сожалению, в этом примере невозможно добавить поддержку socks, поскольку создание OutboundClient и вызов Connect происходит в TIdMappedPortTCP.DoConnect. наверное, лучше всего скопировать код IdMappedPortTCP.pas и сделать свою компоненту, не наследуясь от него.
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.
← →
nikkie (2003-09-10 19:06) [10]говорят в библиотечке ICS есть какая-то компонента-прокси, но я не смотрел, к тому же не знаю как там дела с поддержкой socks. как-то я делал на коленках пример, как написать прокси с использованием IdMappedPortTCP из indy.
в принципе, код рабочий (я проверял с indy 8), только надо поаккуратнее написать код разбора строки запроса (по крайней мере, порт оттуда тоже брать надо). к сожалению, в этом примере невозможно добавить поддержку socks, поскольку создание OutboundClient и вызов Connect происходит в TIdMappedPortTCP.DoConnect. наверное, лучше всего скопировать код IdMappedPortTCP.pas и сделать свою компоненту, не наследуясь от него.
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.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c