I get cookie from InternetGetCookieEx on DownloadComplete WebBrwoser. When trying to login to hotmail it get’s through but then get’s redirected. Even though Gmail works.
I am trying to figure out a universal solution to transfer Authenication from WebBrowser to IdCookieManager for Web Parsing.
Test Project = http://www.megafileupload.com/en/file/373536/Cookie-Tester-rar.html
Cookies aswell as redirects are enabled on IdHTPP.
Cookies must be allowed Your browser is currently set to block
cookies. Your browser must allow cookies before you can use Windows
Live ID.
function GetCookie(host: string): string;
const
INTERNET_COOKIE_HTTPONLY = 8192;
var
hModule: THandle;
lp: Pointer;
InternetGetCookieEx: function(lpszUrl, lpszCookieName, lpszCookieData
: PAnsiChar; var lpdwSize: DWORD; dwFlags: DWORD; lpReserved: pointer)
: BOOL; stdCall;
CookieSize: DWORD;
CookieData: PAnsiChar;
begin
LoadLibrary('wininet.dll');
hModule := GetModuleHandle('wininet.dll');
if hModule <> 0 then
begin
@InternetGetCookieEx := GetProcAddress(hModule, 'InternetGetCookieExA');
if @InternetGetCookieEx <> nil then
begin
CookieSize := 1024;
Cookiedata := AllocMem(CookieSize);
if InternetGetCookieEx(PAnsiChar(AnsiString(host)), nil, Cookiedata, CookieSize, INTERNET_COOKIE_HTTPONLY, nil) then
result:=cookiedata;
FreeMem(Cookiedata);
end;
end;
end;
procedure EmbeddedWB1DocumentComplete(ASender: TObject; const pDisp: IDispatch;
var URL: OleVariant);
var
document: IHTMLDocument2;
cookies: TStringList;
uri: TIdURI;
begin
document := EmbeddedWB1.Document as IHTMLDocument2;
cookies := TStringList.Create;
try
cookies.Delimiter:=';';
//cookies.DelimitedText:=GetCookie(document.url);
cookies.DelimitedText:=document.cookie;
uri := TIdURI.Create(document.url);
try
IdCookieManager1.AddServerCookies(cookies,uri);
EmbeddedWB1.LoadFromString(http.Get(document.url));
finally
uri.Free;
end;
finally
cookies.Free;
end;
As I mentioned in your other question, you need to pre-parse the cookies you are extracting from the web browser. It is not enough to simply split the cookie string as-is on
;characters, since that delimiter is used to both delimit individual cookies from each other as well as delimitname=valuedata fromparameterdata within a single cookie. If you just split the entire string without taking that into account, yourTStringListis not going to end up with correct cookie data, so you end up passing bad data toTIdCookieManager.You might also consider using the
NavigateComplete/2events, as theDocumentCompleteevent might be too late when redirects are involved.