Einzelnen Beitrag anzeigen

Rolf Frei

Registriert seit: 19. Jun 2006
650 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TWebResponse.SetCookieField fehlt Support für "SameSite"

  Alt 7. Dez 2020, 19:48
Du kannst das so mache wie ich im Report gemeldet habe, nur ist das keine schöne Lösung, weil man da an den Originalsourcen herumbasteln muss. Leider ist der TCookie Code so unsauber programmiert, dass da garnichts virtual ist. Wäre da GetHeaderValue virtual, wäre es relativ einfach zu lösen gewesen, aber so wie es aktuell ist, kommt man nicht drummherum in den Quellsourcen von Delphi Anpassungen zu machen und eine eigegne TCookie Klasse zu verrweden. Direkt im TCookie kann man auch nichts anpasen, da das sonst zu inkompatiblen (Interface) Units führt.

Delphi-Quellcode:
unit RFWebAppCookie;

interface

uses
  HTTPApp;
  
type
  TRFCookie = class(HTTPApp.TCookie)
  private
    FSameSite: String;
  protected
    function GetNewHeaderValue: string;
  public
    property SameSite: String read FSameSite write FSameSite;
    property HeaderValue: string read GetNewHeaderValue;
  end;


implementation

uses
  SysUtils;

{ TRFCookie }

function TRFCookie.GetNewHeaderValue: string;
begin
  Result := Format('%s=%s; ', [HTTPEncode(Name), HTTPEncode(Value)]);
  if Domain <> 'then
    Result := Result + Format('domain=%s; ', [Domain]); { do not localize }
  if Path <> 'then
    Result := Result + Format('path=%s; ', [Path]); { do not localize }
  if Expires > -1 then
    Result := Result +
      Format(FormatDateTime('"expires="' + sDateFormat + ' "GMT; "', Expires), { do not localize }
        [DayOfWeekStr(Expires), MonthStr(Expires)]);
  if SameSite <> 'then
    Result := Result + 'SameSite=' + SameSite + '; ';
  if Secure then Result := Result + 'secure'; { do not localize }
  if Copy(Result, Length(Result) - 1, MaxInt) = '; then
    SetLength(Result, Length(Result) - 2);
end;

end.
An den Stellen in der Orignalsource wo TCookie verwendet wird muss nun diese neue Klasse benutzen. Weiss akteull nciht mehr genau wo und was ich da genau geändert habe. Müsste das zuerst neu zusammen suchen.
  Mit Zitat antworten Zitat