SRL Archive - Development

Proxy support


Cazax

2010-06-09 12:27:32

I added proxy support for HTTP clients but since I cannot commit I'll post it here:

internets.pas:
unit internets;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils,httpsend,MufasaTypes;

function GetPage(URL: String): String;

type

{ THTTPClient }

THTTPClient = class(TObject)
private
HTTPSend : THTTPSend;
fHandleCookies : boolean;
PostVariables : TStringList;
Client : TObject;
public
OpenConnectionEvent : TOpenConnectionEvent;
procedure SetHTTPUserAgent(agent : string);
function GetHTTPPage(url : string ) : string;
function PostHTTPPage(Url: string; PostData: string): string;overload;
function PostHTTPPage(Url: string): string;overload;
function GetRawHeaders: string;
procedure ClearPostData;
procedure AddPostVariable(VarName, VarValue: string);
procedure SetProxy(pHost, pPort : String);
constructor Create(Owner : TObject; HandleCookies : boolean = true);
destructor Destroy;override;
end;
{ TMInternet }
TMInternet = class(TObject)
protected
Client : TObject;
Connections : TList;
HTTPClients : TList;
public
OpenConnectionEvent : TOpenConnectionEvent;
function GetPage(URL: String): String;
function CreateHTTPClient(HandleCookies : boolean = true) : integer;
function GetHTTPClient(Index : integer) : THTTPClient;
procedure FreeHTTPClient(Index: Integer);
constructor Create(Owner : TObject);
destructor Destroy;override;
end;

var
ProxyHost, ProxyPort : String;
implementation

uses
Client;
{ OTHER }
function GetPage(URL: String): String;
var
HTTP : THTTPSend;
begin;
HTTP := THTTPSend.Create;
Result := '';
try
if HTTP.HTTPMethod('GET', URL) then
begin
SetLength(result,HTTP.Document.Size);
HTTP.Document.Read(result[1],length(result));
end;
finally
HTTP.Free;
end;
end;

function TMInternet.GetPage(URL: String): String;
var
Continue : boolean = true;
begin
Result := '';
if Assigned(OpenConnectionEvent) then
begin;
OpenConnectionEvent(Self,url,continue);
if not Continue then
exit;
end;
Result := Internets.GetPage(url);
end;

{ TMInternet }

function TMInternet.CreateHTTPClient(HandleCookies: boolean = true): integer;
begin;
Result := HTTPClients.Add(THTTPClient.Create(Client,HandleCookies));
THttpClient(HTTPClients[result]).OpenConnectionEvent:= OpenConnectionEvent;
end;

function TMInternet.GetHTTPClient(Index: integer): THTTPClient;
begin
if (index < 0) or (index >= HTTPClients.Count) then
raise exception.CreateFmt('GetHTTPClient: Trying to acces an index(%d) that is out of range',[index]);
if HTTPClients[index] = nil then
raise exception.CreateFmt('GetHTTPClient: Trying to acces an index(%d) that is freed',[index]);
result := THTTPClient(httpclients[index]);
end;

procedure TMInternet.FreeHTTPClient(Index: Integer);
begin
if (index < 0) or (index >= HTTPClients.Count) then
raise exception.CreateFmt('FreeHTTPClient: Trying to free an index(%d) that is out of range',[index]);
if HTTPClients[index] = nil then
raise exception.CreateFmt('FreeHTTPClient: Trying to free an index(%d) that is already freed',[index]);
THTTPClient(HTTPClients[index]).Free;
HTTPClients[index] := nil;
end;

constructor TMInternet.Create(Owner: TObject);
begin
inherited Create;
client := Owner;
Connections := TList.Create;
HTTPClients := TList.Create;
end;

destructor TMInternet.Destroy;
var
i : integer;
begin
for i := Connections.Count -1 downto 0 do
if Connections[i] <> nil then
begin
TObject(Connections[i]).Free;
TClient(Client).Writeln(Format('Connection[%d] has not been freed in the script, freeing it now.',[i]));
end;
for i := HTTPClients.Count -1 downto 0 do
if HTTPClients[i] <> nil then
begin
THTTPClient(HTTPClients[i]).Free;
TClient(Client).Writeln(Format('HTTPClient[%d] has not been freed in the script, freeing it now.',[i]));
end;
Connections.Free;
HTTPClients.Free;
inherited Destroy;
end;

{ THTTPClient }

procedure THTTPClient.SetHTTPUserAgent(agent: string);
begin
HTTPSend.UserAgent := agent;
end;

function THTTPClient.GetHTTPPage(url: string): string;
var
Continue : boolean = true;
begin
Result := '';
if Assigned(OpenConnectionEvent) then
begin;
OpenConnectionEvent(Self,url,continue);
if not Continue then
exit;
end;
if not fHandleCookies then
HTTPSend.Cookies.Clear;
if (ProxyHost <> '') and (ProxyPort <> '') then
begin
HTTPSend.ProxyHost := ProxyHost;
HTTPSend.ProxyPort := ProxyPort;
end;
HTTPSend.MimeType := 'text/html';
try
if HTTPSend.HTTPMethod('GET',url) then
begin;
SetLength(result,HTTPSend.Document.Size);
HTTPSend.Document.Read(result[1],length(result));
end else
result := '';
except
on e : exception do
TClient(Client).Writeln('THTTPClient error: ' + e.message);
end;
end;

function THTTPClient.PostHTTPPage(Url: string; PostData: string): string;
begin
if (ProxyHost <> '') and (ProxyPort <> '') then
begin
HTTPSend.ProxyHost := ProxyHost;
HTTPSend.ProxyPort := ProxyPort;
end;
HTTPSend.MimeType := 'application/x-www-form-urlencoded';
HTTPSend.Document.Clear;
HTTPSend.Document.Write(Postdata[1],length(postdata));
try
if HTTPSend.HTTPMethod('POST',url) then
begin;
SetLength(result,HTTPSend.Document.Size);
HTTPSend.Document.Read(result[1],Length(result));
end else
result := '';
except
on e : exception do
TClient(Client).Writeln('THTTPClient error: ' + e.message);
end;
end;

function THTTPClient.PostHTTPPage(Url: string): string;
var
PostData : string;
i : integer;
Continue : boolean = true;
begin
Result := '';
if Assigned(OpenConnectionEvent) then
begin;
OpenConnectionEvent(Self,url,continue);
if not Continue then
exit;
end;
PostData := '';
for i := 0 to PostVariables.Count - 1 do
PostData := PostData + PostVariables[i] +'&';
if Length(PostData) > 1 then
setlength(postdata,length(postdata) - 1); //Wipe away that last &
result := PostHTTPPage(url,postdata);
end;

function THTTPClient.GetRawHeaders: string;
begin
Result := HTTPSend.Headers.Text;
end;

procedure THTTPClient.ClearPostData;
begin
PostVariables.Clear;
end;

procedure THTTPClient.AddPostVariable(VarName, VarValue: string);
begin
PostVariables.Add(Varname + '=' + VarValue);
end;

procedure THTTPClient.SetProxy(pHost, pPort : String);
begin
ProxyHost := pHost;
ProxyPort := pPort;
end;

constructor THTTPClient.Create(Owner : TObject; HandleCookies : boolean = true);
begin
inherited Create;
Client := Owner;
HTTPSend := THTTPSend.Create;
fHandleCookies:= HandleCookies;
PostVariables := TStringList.Create;
end;

destructor THTTPClient.Destroy;
begin
HTTPSend.Free;
PostVariables.Free;
inherited Destroy;
end;

end.

internets.inc (add at the bottom):
procedure ps_SetProxy(Client : Integer; pHost, pPort : String); extdecl;
begin
CurrThread.MInternet.GetHTTPClient(client).SetProx y(pHost, pPort);
end;

psexportedmethods.inc(add after GetRawHeaders):
AddFunction(@ps_SetProxy,'procedure SetProxy(Client : Integer; pHost, pPort : String);');

Test:
program new;
var
a : integer;
begin
a := InitializeHTTPClient(False);
SetProxy(a, '174.142.24.201', '3128');
writeln(GetHTTPPage(a, 'http://whatismyipaddress.com/'));
FreeHTTPClient(a);
end.

result:
...
<h2 style="margin:0;">IP Information: <span class="ip blue">174.142.104.57<!-- contact us before using a script to get your IP address --></span></h2>
<table>
<tr><th>ISP:</th> <td>iWeb Technologies</td></tr>
<tr><th>Organization:</th> <td>iWeb Dedicated CL2</td></tr>
<tr><th>Connection:</th> <td></td></tr>
<tr><th>Assignment:</th> <td><a href="/dynamic-static">Static</a></td></tr>
<tr><th>Proxy:</th> <td><span class="red">Network Sharing Device</span></td></tr>
<tr><th>City:</th> <td>Montreal</td></tr>
<tr><th>Region:</th> <td>Quebec</td></tr>
<tr><th>Country:</th> <td>Canada <img src="/images/flags/ca.png" alt="canada flag" width="16" height="11"></td></tr>
...

I hope this can be added to Simba :)

EDIT: Now that I look at the result the IP address is different… idk why

EDIT2: New test:
program new;
var
a : integer;
begin
a := InitializeHTTPClient(False);
SetProxy(a, '151.97.110.121', '3128');
writeln(GetHTTPPage(a, 'http://whatismyipaddress.com/'));
FreeHTTPClient(a);
end.

<h2 style="margin:0;">IP Information: <span class="ip blue">151.97.110.121<!-- contact us before using a script to get your IP address --></span></h2>
<table>
<tr><th>ISP:</th> <td>Universita' degli Studi di Catania</td></tr>
<tr><th>Organization:</th> <td>Universita' degli Studi di Catania</td></tr>
<tr><th>Connection:</th> <td></td></tr>
<tr><th>Assignment:</th> <td><a href="/dynamic-static">Static</a></td></tr>
<tr><th>Proxy:</th> <td><span class="red">Network Sharing Device</span></td></tr>
<tr><th>City:</th> <td>Catania</td></tr>
<tr><th>Region:</th> <td>Sicilia</td></tr>
<tr><th>Country:</th> <td>Italy <img src="/images/flags/it.png" alt="italy flag" width="16" height="11"></td></tr>
Now that works.

Wizzup?

2010-06-09 13:34:02

Can you post a diff / patch?

Cazax

2010-06-09 15:10:41

*** internets.pas	Wed Jun  9 15:08:12 2010
--- new_internets.pas Wed Jun 9 15:00:16 2010
***************
*** 28,33 ****
--- 28,34 ----
function GetRawHeaders: string;
procedure ClearPostData;
procedure AddPostVariable(VarName, VarValue: string);
+ procedure SetProxy(pHost, pPort : String);
constructor Create(Owner : TObject; HandleCookies : boolean = true);
destructor Destroy;override;
end;
***************
*** 47,52 ****
--- 48,55 ----
destructor Destroy;override;
end;

+ var
+ ProxyHost, ProxyPort : String;
implementation

uses
***************
*** 159,164 ****
--- 162,172 ----
end;
if not fHandleCookies then
HTTPSend.Cookies.Clear;
+ if (ProxyHost <> '') and (ProxyPort <> '') then
+ begin
+ HTTPSend.ProxyHost := ProxyHost;
+ HTTPSend.ProxyPort := ProxyPort;
+ end;
HTTPSend.MimeType := 'text/html';
try
if HTTPSend.HTTPMethod('GET',url) then
***************
*** 175,180 ****
--- 183,193 ----

function THTTPClient.PostHTTPPage(Url: string; PostData: string): string;
begin
+ if (ProxyHost <> '') and (ProxyPort <> '') then
+ begin
+ HTTPSend.ProxyHost := ProxyHost;
+ HTTPSend.ProxyPort := ProxyPort;
+ end;
HTTPSend.MimeType := 'application/x-www-form-urlencoded';
HTTPSend.Document.Clear;
HTTPSend.Document.Write(Postdata[1],length(postdata));
***************
*** 227,232 ****
--- 240,251 ----
PostVariables.Add(Varname + '=' + VarValue);
end;

+ procedure THTTPClient.SetProxy(pHost, pPort : String);
+ begin
+ ProxyHost := pHost;
+ ProxyPort := pPort;
+ end;
+
constructor THTTPClient.Create(Owner : TObject; HandleCookies : boolean = true);
begin
inherited Create;
***************
*** 243,246 ****
inherited Destroy;
end;

! end.
\ No newline at end of file
--- 262,265 ----
inherited Destroy;
end;

! end.
\ No newline at end of file

Cazax

2010-06-10 12:39:06

I commited this -> http://git.villavu.com/?p=simba.git;a=commit;h=2647cf14c53a558078e3db9735d5525c345d92cb

EDIT: Fixed internets.inc in newest revision

mastaraymond

2010-06-15 08:16:49

Vewy nice :).

Dynamite

2010-07-28 19:19:08

Wait, sorry I am a bit silly :P
How can I make it so that every say 10 seconds it will change the IP to something random?
Or do I have to get a set list of IP's?

Cheers

Frement

2010-07-28 20:02:22

From: The Man
Wait, sorry I am a bit silly :P
How can I make it so that every say 10 seconds it will change the IP to something random?
Or do I have to get a set list of IP's?

Cheers


Yes, you have to, check a site my friend made: http://myproxylists.com/

There you can find various HTTP/SOCKS4/SOCKS4a/SOCKS5 proxies.