Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.036 c
8-41764
Ig
2003-07-03 21:55
2003.11.13
Как сделать скин для проги


4-42228
DillerXX
2003-09-16 21:53
2003.11.13
Dll


14-42058
ananimious
2003-10-15 21:03
2003.11.13
Как защититься от спама?


14-41956
mrcat
2003-10-20 10:29
2003.11.13
Implib.exe


3-41036
Fantom_
2003-10-08 13:13
2003.11.13
Сортировка по Lookup-полю





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский