user1889268
user1889268

Reputation:

Save Cookies inside TIDCookieManager to file

How can I save cookies inside TIdCookieManager to a file so that they can be used later? Like browser cookies.

Upvotes: 4

Views: 3963

Answers (1)

Remy Lebeau
Remy Lebeau

Reputation: 597941

TIdCookieManager does not have any native support for persisting cookie data in files. You have to implement that manually. Use the TIdCookieManager.CookieCollection property to access the list of cookie objects. For example:

uses
  ..., IdCookie, IdCookieManager;

var
  Cookies: TIdCookieList;
  Cookie: TIdCookie;
  I: Integer;
begin
  Cookies := IdCookieManager.CookieCollection.LockCookieList(caRead);
  try
    for I := 0 to Cookies.Count-1 do
    begin
      Cookie := Cookies[I];
      // save Cookie properties as needed...
    end;
  finally
    IdCookieManager.CookieCollection.UnlockCookieList(caRead);
  end;
end;

.

uses
  ..., IdCookie, IdCookieManager;

var
  Cookies: TIdCookies;
  Cookie: TIdCookie;
begin
  Cookies := IdCookieManager.CookieCollection.LockCookieList(caReadWrite);
  try
    for (each saved cookie) do
    begin
      Cookie := IdCookieManager.CookieCollection.Add;
      try
        // read Cookie properties as needed...
        Cookies.Add(Cookie);
      except
        Cookie.Free;
        raise;
      end;
    end;
  finally
    IdCookieManager.CookieCollection.UnlockCookieList(caReadWrite);
  end;
end;

Alternatively:

uses
  ..., IdCookie, IdCookieManager;

var
  Cookies: TIdCookieList;
  Cookie: TIdCookie;
  I: Integer;
  S: string;
begin
  Cookies := IdCookieManager.CookieCollection.LockCookieList(caRead);
  try
    for I := 0 to Cookies.Count-1 do
    begin
      Cookie := Cookies[I];
      S := Cookie.ServerCookie;
      // save S as needed...
    end;
  finally
    IdCookieManager.CookieCollection.UnlockCookieList(caRead);
  end;
end;

.

uses
  ..., IdCookie, IdCookieManager, IdURI;

var
  S: string;
  Cookies: TIdCookies;
  Cookie: TIdCookie;
  Uri: TIdURI;
begin
  Cookies := IdCookieManager.CookieCollection.LockCookieList(caReadWrite);
  try
    for (each saved cookie) do
    begin
      // read S as needed
      S := ...;
      Uri := TIdURI.Create(URL where cookie came from);
      try
        Cookie := IdCookieManager.CookieCollection.Add;
        try
          Cookie.ParseServerCookie(S, Uri);
          Cookies.Add(Cookie);
        except
          Cookie.Free;
          raise;
        end;
    finally
      Uri.Free;
    end;
  finally
    IdCookieManager.CookieCollection.UnlockCookieList(caReadWrite);
  end;
end;

Upvotes: 9

Related Questions