Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
Странные дела нынче творятся, в Delphi среде. Я перепробовал разные способы

NetHTTPClient
+
  Client1:= NetHTTPClient1.Get('URL');
  for value in Client1.Cookies do
    ShowMessage(value.ToString);

  for value2 in Client1.Headers do
    ShowMessage(value2.Name + ' : ' + value2.value);


TJCookieManager
+
    t := TJCookieManager.JavaClass.getInstance;
    t.setAcceptCookie(True);
    t.setAcceptThirdPartyCookies(WebBrowser1.GetJWebBrowser, True);

    s := JStringToString(t.getCookie(StringToJString('URL')));
    ShowMessage(s);


WebBrowser2
+
  TScriptCallback = class(TJavaLocal, JValueCallback)
  public
    constructor Create;
    procedure onReceiveValue(value: JObject); cdecl;
  end;

var
 FResultCallback: JValueCallback;
...
FResultCallback := TScriptCallback.Create;


begin
  WebBrowser2.GetJWebBrowser.evaluateJavascript
    (StringToJString('(function() { return document.cookie; })();'), FResultCallback);
end;


procedure TScriptCallback.onReceiveValue(value: JObject);
var
  Str: String;
begin
  try
    Str := TJSONObject.ParseJSONValue(JStringToString(JString(value))).ToString;
  except
    Str := '';
  end;
  if Str <> '' then
  begin

     ShowMessage(Str);
  end;
end;


Но все эти варианты возвращают
- 'PHPSESSID=****************; referal=**; last_visit=******::******; on=0'

Почему?????

....


Если взять тот же PHP с его get_headers То он возвращает полностью Куки
26 дек 18, 01:01    [21773493]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3061
Гирлионайльдо,

смотри заголовки там и там
26 дек 18, 12:45    [21773755]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
makhaon,

Заголовки то смотрел. Они все выдают такое содержимое.

Cache-Control : no-store, no-cache, must-revalidate
Connection : keep-alive
Date : Wed, 26 Dec 2018 10:03:37 GMT
Pragma : no-cache
Transfer-Encoding : chunked
Content-Type : text/html; charset=UTF-8
Expires : Thu, 19 Nov 1981 08:52:00 GMT
Server : nginx/1.12.2
X-Powered-By : PHP/7.0.33



А в PHP вот такое
Array
(
    [0] => HTTP/1.1 200 OK
    [Server] => nginx/1.12.2
    [Date] => Wed, 26 Dec 2018 10:04:56 GMT
    [Content-Type] => text/html; charset=UTF-8
    [Connection] => close
    [X-Powered-By] => PHP/7.0.33
    [Set-Cookie] => Array
        (
            [0] => on=0; expires=Tue, 10-Nov-5187 19:51:35 GMT; Max-Age=99999999999; path=/; domain=.****; secure **********
            [1] => PHPSESSID=***************; path=/
            [2] => p_up2=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.******; secure **********
        )

    [Expires] => Thu, 19 Nov 1981 08:52:00 GMT
    [Cache-Control] => no-store, no-cache, must-revalidate
    [Pragma] => no-cache
)
26 дек 18, 13:06    [21773768]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47063

Гирлионайльдо
Они все выдают такое содержимое.

Значит эта страница не устанавливает никакие куки.

Гирлионайльдо
А в PHP вот такое

Значит это вопрос к документации PHP откуда оно эти куки подтягивает. Скорее всего - из
перманентного хранилища.

Posted via ActualForum NNTP Server 1.5

26 дек 18, 13:23    [21773783]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
Dimitry Sibiryakov,

Значит, Delphi не умеет такого???

В принципе если нажать F12 в браузере, и просмотреть куки страницы. То там все эти же куки и будут, как в PHP
26 дек 18, 13:26    [21773787]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47063

Гирлионайльдо
Значит, Delphi не умеет такого???

Не конечно, это же всего лишь тупой компилятор + текстовый редактор. К нему программист
должен прилагаться.

Posted via ActualForum NNTP Server 1.5

26 дек 18, 13:33    [21773802]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
Штатными способами не получается достать.
26 дек 18, 15:42    [21773941]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
s62
Member

Откуда: Жуковский
Сообщений: 893
Гирлионайльдо,

procedure TForm1.Button8Click(Sender: TObject);
var i: integer;
    s: string;
begin
  Memo.Clear;
  s := idHttp.Get('https://www.rambler.ru');
//  memCookies.Clear;
//  for i := 0 to IdCookieManager.CookieCollection.Count - 1
//  do memCookies.Lines.Add(IdCookieManager.CookieCollection.Cookies[i].CookieText);
  Memo.Lines.CommaText := idHTTP.Response.RawHeaders.CommaText;
end;


Server: nginx
Date: Wed, 26 Dec 2018 14:09:18 GMT
Content-Type: text/html; charset="utf-8"
Content-Length: 346917
Connection: keep-alive
Keep-Alive: timeout=50
X-Powered-By: Express
X-App-Version: 1.27.8
X-Redis-Cache: HIT
ETag: W/"54b25-J2sR/smYgiQlJ7YTb8PWsvMyGuE"
X-Frame-Options: SAMEORIGIN
Set-Cookie: proselytize=1; domain=.rambler.ru; path=/; expires=_Wed, 20-Jul-18 23:55:55 GMT
X-Back: 10.16.36.154:80
Vary: Accept-Encoding, User-Agent
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
X-Request-Id: 0455049f53399758030d634c1dad4a1e
Set-Cookie: ruid=vAsAAI6LI1zqDL9LAR/eEQB=; expires=Thu, 31-Dec-37 23:55:55 GMT; domain=.rambler.ru; path=/
P3P: CP="NON DSP NID ADMa DEVa TAIa PSAa PSDa OUR IND UNI COM NAV"
x-ua-compatible: ie=edge

У IdHTTP есть свойство CookieManager. Можно кинуть соотв. компонент, подключить и получать куки, как в закоментированных строчках. (Есть еще свойства CookieName, CookeValue).
26 дек 18, 17:17    [21774047]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
s62,

Я не могу данный компонент использовать, из за того что он требует библиотеки SSL и тоже самое будет просить на андройде с ошибкой 'Could not load SSL library.'.

А вот компонент TNetHTTPClient сам находит все сертификаты для https
26 дек 18, 18:16    [21774117]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2660
Гирлионайльдо
s62,

Я не могу данный компонент использовать, из за того что он требует библиотеки SSL и тоже самое будет просить на андройде с ошибкой 'Could not load SSL library.'.

А вот компонент TNetHTTPClient сам находит все сертификаты для https


угу
только на винде
26 дек 18, 18:34    [21774141]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
Tactical Nuclear Penguin,

А я данную ошибку на экране телефона наблюдал.
26 дек 18, 18:40    [21774149]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2660
Гирлионайльдо
А вот компонент TNetHTTPClient сам находит все сертификаты для https


Гирлионайльдо
Tactical Nuclear Penguin,

А я данную ошибку на экране телефона наблюдал.


ты уж определись
26 дек 18, 19:19    [21774199]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
Tactical Nuclear Penguin,

Он писал про IdHTTP .
26 дек 18, 19:22    [21774201]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
Я через отладчик ОТЫСКАЛ!!! Свои куки. В файле System.Net.HttpClient Строка 2019

procedure THTTPClient.UpdateCookiesFromResponse(const AResponse: THTTPResponse);
var
  I: Integer;
begin
  for I := 0 to AResponse.FCookies.Count -1 do
    FCookieManager.AddServerCookie(AResponse.FCookies[I], AResponse.FRequest.URL);
end;


Тут куки ещё есть! Веду дальнейшее развитие. Куда же куки пропадают в конечном итоге
26 дек 18, 19:24    [21774204]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
Мои куки не проходят в этой функции
+
procedure TCookieManager.UpdateCookie(const ACookie: TCookie; const AURL: TURI);
var
  I: Integer;
  Found: Boolean;
begin
  TMonitor.Enter(FCookies);
  try
    Found := False;
    DeleteExpiredCookies;
    for I := 0 to FCookies.Count - 1 do
    begin
      if SameText(ACookie.Name, FCookies[I].Name) and
         SameText(ACookie.Domain, FCookies[I].Domain) and
         SameText(ACookie.Path, FCookies[I].Path) then
      begin
        Found := True;
        FCookies[I] := ACookie;
        Break;
      end
    end;
    if not Found and ((ACookie.Expires = 0) or (ACookie.Expires > Now)) then
      FCookies.Add(ACookie);
  finally
    TMonitor.Exit(FCookies);
  end;
end;


 ((ACookie.Expires = 0)


Должен быть 0 что бы куки добавились в базу.!!!. А там стоит текущая дата
26 дек 18, 19:34    [21774212]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
И что с этим делать???
26 дек 18, 19:36    [21774214]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
Не.. Это я протупил. На год не посмотрел

Expires 11.11.5187 5:24:11
26 дек 18, 19:38    [21774216]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
А нет. Ничего не протупил. Просто куки переполняются

К сообщению приложен файл. Размер - 9Kb
26 дек 18, 19:43    [21774219]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1300
Гирлионайльдо
А нет. Ничего не протупил. Просто куки переполняются

Запили в QC
26 дек 18, 22:26    [21774327]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1300
Гирлионайльдо
А нет. Ничего не протупил. Просто куки переполняются

Хотя в System.SysUtils
const
  MinDateTime: TDateTime = -657434.0;      { 01/01/0100 12:00:00.000 AM }
  MaxDateTime: TDateTime =  2958465.99999; { 12/31/9999 11:59:59.999 PM }
26 дек 18, 22:43    [21774342]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 427
X-Cite,

Да. Баг! Можете за меня отправить.

Баг в функции StrExpiresToDateTime в файле System.Net.HttpClient строка 2576

Привожу баг

Функция сама, вне юнита (Так как приват)
+
function StrExpiresToDateTime(const AStrDate: string): TDateTime;
var
  LDate: TDateTime;
  LTime: TDateTime;
  Pos: Integer;
  Len: Integer;
  LFoundTime: Boolean;
  LFoundDayOfMonth: Boolean;
  LFoundMonth: Boolean;
  LFoundYear: Boolean;
  LHours: Integer;
  LMinutes: Integer;
  LSeconds: Integer;
  LYear: Integer;
  LMonth: Integer;
  LDayOfMonth: Integer;
  Token: string;

  function IsDelimiter(C: Char): Boolean;
  // delimiter = %x09 / %x20-2F / %x3B-40 / %x5B-60 / %x7B-7E
  begin
    case C of
      Char($09), Char($20) .. Char($2F), Char($3B) .. Char($40),
        Char($5B) .. Char($60), Char($7B) .. Char($7E):
        Result := True;
    else
      Result := False;
    end;
  end;

  function IsNonDelimiter(C: Char): Boolean;
  // non-delimiter = %x00-08 / %x0A-1F / DIGIT / ":" / ALPHA / %x7F-FF
  begin
    case C of
      Char($00) .. Char($08), Char($0A) .. Char($1F), '0' .. '9', ':',
        'A' .. 'Z', 'a' .. 'z', Char($7F) .. Char($FF):
        Result := True;
    else
      Result := False;
    end;
  end;

  procedure CleanDelimiters;
  begin
    while (Pos < Len) and IsDelimiter(AStrDate.Chars[Pos]) do
      Inc(Pos);
  end;

  function ReadToken: string;
  begin
    Result := '';
    while (Pos < Len) and IsNonDelimiter(AStrDate.Chars[Pos]) do
    begin
      Result := Result + AStrDate.Chars[Pos];
      Inc(Pos);
    end;
  end;

  function CheckTime: Boolean;
  const
    HoursPart = 0;
    MinutesPart = 1;
    SecondsPart = 2;
  var
    Parts: TArray<string>;
  begin
    Result := False;
    if not LFoundTime then
    begin
      Parts := Token.Split([Char(':')]);
      if Length(Parts) = 3 then
      begin
        if (Parts[HoursPart].Length = 1) or (Parts[HoursPart].Length = 2) then
          if not TryStrToInt(Parts[HoursPart], LHours) or (LHours > 23) then
            Exit;

        if (Parts[MinutesPart].Length = 1) or (Parts[MinutesPart].Length = 2)
        then
          if not TryStrToInt(Parts[MinutesPart], LMinutes) or (LMinutes > 59)
          then
            Exit;

        if (Parts[SecondsPart].Length = 1) or (Parts[SecondsPart].Length = 2)
        then
          if not TryStrToInt(Parts[SecondsPart], LSeconds) or (LSeconds > 59)
          then
            Exit;

        LFoundTime := True;
        Result := True;
      end;
    end;
  end;

  function CheckDayOfMonth: Boolean;
  begin
    Result := False;
    if not LFoundDayOfMonth then
    begin
      if (Token.Length = 1) or (Token.Length = 2) then
        if TryStrToInt(Token, LDayOfMonth) and (LDayOfMonth >= 1) and
          (LDayOfMonth <= 31) then
        begin
          LFoundDayOfMonth := True;
          Result := True;
        end;
    end;
  end;

  function CheckMonth: Boolean;
  const
    Months: array [1 .. 12] of string = ('Jan', 'Feb', 'Mar', 'Apr', 'May',
      'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); // do not localize
  var
    I: Integer;
  begin
    Result := False;
    if not LFoundMonth then
    begin
      for I := 1 to 12 do
        if SameText(Token, Months[I]) then
        begin
          LMonth := I;
          LFoundMonth := True;
          Result := True;
          Break;
        end;
    end;
  end;

  function CheckYear: Boolean;
  begin
    Result := False;
    if not LFoundYear then
    begin
      if (Token.Length = 2) or (Token.Length = 4) then
        if TryStrToInt(Token, LYear) then
        begin
          if (LYear >= 70) and (LYear <= 99) then
            LYear := LYear + 1900
          else if (LYear >= 0) and (LYear <= 69) then
            LYear := LYear + 2000;

          if LYear > 1600 then
          begin
            LFoundYear := True;
            Result := True;
          end;
        end;
    end;
  end;

begin
  LFoundTime := False;
  LFoundDayOfMonth := False;
  LFoundMonth := False;
  LFoundYear := False;
  Pos := 0;
  Len := AStrDate.Length;

  while Pos < Len do
  begin
    CleanDelimiters;
    Token := ReadToken;

    if CheckTime then
      Continue;

    if CheckDayOfMonth then
      Continue;

    if CheckMonth then
      Continue;

    if CheckYear then
      Continue;

    if LFoundTime and LFoundDayOfMonth and LFoundMonth and LFoundYear then
      Break;
  end;

  if LFoundTime and LFoundDayOfMonth and LFoundMonth and LFoundYear then
  begin
    if TryEncodeDate(LYear, LMonth, LDayOfMonth, LDate) and
      TryEncodeTime(LHours, LMinutes, LSeconds, 0, LTime) then
    begin
      LDate := LDate + LTime;
      Result := TTimeZone.Local.ToLocalTime(LDate);
      if Result = 0 then
        // To avoid to create a session cookie if the expire date is in the delphi date limit
        Result := 1;
    end
    else
      Result := 0;
  end
  else
    Result := 0;
end;


Вызываем
  LTime := StrExpiresToDateTime('11.11.5187 5:24:11');
  ShowMessage(DateTimeToStr(LTime));


И получаем 30.12.1899

Почему он, мне возвращал текущую дату.. Это уже другой разговор... Этот момент я не отследил...
26 дек 18, 23:30    [21774396]     Ответить | Цитировать Сообщить модератору
 Re: Невозможность получения куков, в том числе NetHTTPClient  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1300
Гирлионайльдо
X-Cite,

Да. Баг! Можете за меня отправить.

Баг в функции StrExpiresToDateTime в файле System.Net.HttpClient строка 2576

Привожу баг

Функция сама, вне юнита (Так как приват)
+
function StrExpiresToDateTime(const AStrDate: string): TDateTime;
var
  LDate: TDateTime;
  LTime: TDateTime;
  Pos: Integer;
  Len: Integer;
  LFoundTime: Boolean;
  LFoundDayOfMonth: Boolean;
  LFoundMonth: Boolean;
  LFoundYear: Boolean;
  LHours: Integer;
  LMinutes: Integer;
  LSeconds: Integer;
  LYear: Integer;
  LMonth: Integer;
  LDayOfMonth: Integer;
  Token: string;

  function IsDelimiter(C: Char): Boolean;
  // delimiter = %x09 / %x20-2F / %x3B-40 / %x5B-60 / %x7B-7E
  begin
    case C of
      Char($09), Char($20) .. Char($2F), Char($3B) .. Char($40),
        Char($5B) .. Char($60), Char($7B) .. Char($7E):
        Result := True;
    else
      Result := False;
    end;
  end;

  function IsNonDelimiter(C: Char): Boolean;
  // non-delimiter = %x00-08 / %x0A-1F / DIGIT / ":" / ALPHA / %x7F-FF
  begin
    case C of
      Char($00) .. Char($08), Char($0A) .. Char($1F), '0' .. '9', ':',
        'A' .. 'Z', 'a' .. 'z', Char($7F) .. Char($FF):
        Result := True;
    else
      Result := False;
    end;
  end;

  procedure CleanDelimiters;
  begin
    while (Pos < Len) and IsDelimiter(AStrDate.Chars[Pos]) do
      Inc(Pos);
  end;

  function ReadToken: string;
  begin
    Result := '';
    while (Pos < Len) and IsNonDelimiter(AStrDate.Chars[Pos]) do
    begin
      Result := Result + AStrDate.Chars[Pos];
      Inc(Pos);
    end;
  end;

  function CheckTime: Boolean;
  const
    HoursPart = 0;
    MinutesPart = 1;
    SecondsPart = 2;
  var
    Parts: TArray<string>;
  begin
    Result := False;
    if not LFoundTime then
    begin
      Parts := Token.Split([Char(':')]);
      if Length(Parts) = 3 then
      begin
        if (Parts[HoursPart].Length = 1) or (Parts[HoursPart].Length = 2) then
          if not TryStrToInt(Parts[HoursPart], LHours) or (LHours > 23) then
            Exit;

        if (Parts[MinutesPart].Length = 1) or (Parts[MinutesPart].Length = 2)
        then
          if not TryStrToInt(Parts[MinutesPart], LMinutes) or (LMinutes > 59)
          then
            Exit;

        if (Parts[SecondsPart].Length = 1) or (Parts[SecondsPart].Length = 2)
        then
          if not TryStrToInt(Parts[SecondsPart], LSeconds) or (LSeconds > 59)
          then
            Exit;

        LFoundTime := True;
        Result := True;
      end;
    end;
  end;

  function CheckDayOfMonth: Boolean;
  begin
    Result := False;
    if not LFoundDayOfMonth then
    begin
      if (Token.Length = 1) or (Token.Length = 2) then
        if TryStrToInt(Token, LDayOfMonth) and (LDayOfMonth >= 1) and
          (LDayOfMonth <= 31) then
        begin
          LFoundDayOfMonth := True;
          Result := True;
        end;
    end;
  end;

  function CheckMonth: Boolean;
  const
    Months: array [1 .. 12] of string = ('Jan', 'Feb', 'Mar', 'Apr', 'May',
      'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); // do not localize
  var
    I: Integer;
  begin
    Result := False;
    if not LFoundMonth then
    begin
      for I := 1 to 12 do
        if SameText(Token, Months[I]) then
        begin
          LMonth := I;
          LFoundMonth := True;
          Result := True;
          Break;
        end;
    end;
  end;

  function CheckYear: Boolean;
  begin
    Result := False;
    if not LFoundYear then
    begin
      if (Token.Length = 2) or (Token.Length = 4) then
        if TryStrToInt(Token, LYear) then
        begin
          if (LYear >= 70) and (LYear <= 99) then
            LYear := LYear + 1900
          else if (LYear >= 0) and (LYear <= 69) then
            LYear := LYear + 2000;

          if LYear > 1600 then
          begin
            LFoundYear := True;
            Result := True;
          end;
        end;
    end;
  end;

begin
  LFoundTime := False;
  LFoundDayOfMonth := False;
  LFoundMonth := False;
  LFoundYear := False;
  Pos := 0;
  Len := AStrDate.Length;

  while Pos < Len do
  begin
    CleanDelimiters;
    Token := ReadToken;

    if CheckTime then
      Continue;

    if CheckDayOfMonth then
      Continue;

    if CheckMonth then
      Continue;

    if CheckYear then
      Continue;

    if LFoundTime and LFoundDayOfMonth and LFoundMonth and LFoundYear then
      Break;
  end;

  if LFoundTime and LFoundDayOfMonth and LFoundMonth and LFoundYear then
  begin
    if TryEncodeDate(LYear, LMonth, LDayOfMonth, LDate) and
      TryEncodeTime(LHours, LMinutes, LSeconds, 0, LTime) then
    begin
      LDate := LDate + LTime;
      Result := TTimeZone.Local.ToLocalTime(LDate);
      if Result = 0 then
        // To avoid to create a session cookie if the expire date is in the delphi date limit
        Result := 1;
    end
    else
      Result := 0;
  end
  else
    Result := 0;
end;


Вызываем
  LTime := StrExpiresToDateTime('11.11.5187 5:24:11');
  ShowMessage(DateTimeToStr(LTime));


И получаем 30.12.1899

Почему он, мне возвращал текущую дату.. Это уже другой разговор... Этот момент я не отследил...

Эта функция работает верно.
Нельзя туда передавать 11.11.5187 5:24:11. У нее формат даты другой, согласно RFC. надо так, как указано в Cookies
a := StrExpiresToDateTime('10-Nov-5187 19:51:35 GMT');

Вернет 10.11.5187
Ищите ошибку в другом.
28 дек 18, 19:58    [21776035]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить