Cookie heisst Cookie
„Keks", „Keksglas", „Kekse" — eingedeutscht, wo es nichts zu verdeutschen gibt. Ein Cookie ist ein Cookie; wer danach sucht, sucht nicht nach Keksen, und wer den Quelltext liest, liest daneben die Schnittstelle, in der es `HTTPCookieStorage` heisst. Betrifft Kommentare und Prüfungsnamen, kein Verhalten. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
f789c40594
commit
693a6cc867
@@ -50,11 +50,11 @@ public sealed class WebInterfaceTests
|
||||
var client = server.OhneGedaechtnis();
|
||||
var angemeldet = await client.PostAsJsonAsync("/api/v1/auth/login",
|
||||
new LoginRequest("guido", "ein-langes-passwort", "Browser", "browser-1"));
|
||||
var keks = Keks(angemeldet);
|
||||
var cookie = Cookie(angemeldet);
|
||||
|
||||
// Ohne Kopfzeile — genau so, wie ein <img> fragt.
|
||||
var anfrage = new HttpRequestMessage(HttpMethod.Get, "/api/v1/movies");
|
||||
anfrage.Headers.Add("Cookie", keks);
|
||||
anfrage.Headers.Add("Cookie", cookie);
|
||||
var antwort = await client.SendAsync(anfrage);
|
||||
|
||||
Assert.That(antwort.StatusCode, Is.EqualTo(HttpStatusCode.OK));
|
||||
@@ -80,17 +80,17 @@ public sealed class WebInterfaceTests
|
||||
var client = server.OhneGedaechtnis();
|
||||
var angemeldet = await client.PostAsJsonAsync("/api/v1/auth/login",
|
||||
new LoginRequest("guido", "ein-langes-passwort", "Browser", "browser-1"));
|
||||
var keks = Keks(angemeldet);
|
||||
var cookie = Cookie(angemeldet);
|
||||
|
||||
var abmelden = new HttpRequestMessage(HttpMethod.Post, "/api/v1/auth/logout");
|
||||
abmelden.Headers.Add("Cookie", keks);
|
||||
abmelden.Headers.Add("Cookie", cookie);
|
||||
(await client.SendAsync(abmelden)).EnsureSuccessStatusCode();
|
||||
|
||||
// **Das Token muss serverseitig weg sein, nicht nur das Cookie im
|
||||
// Browser.** Ein gelöschtes Cookie schützt niemanden, der den Wert
|
||||
// vorher mitgeschrieben hat.
|
||||
var danach = new HttpRequestMessage(HttpMethod.Get, "/api/v1/movies");
|
||||
danach.Headers.Add("Cookie", keks);
|
||||
danach.Headers.Add("Cookie", cookie);
|
||||
|
||||
Assert.That((await client.SendAsync(danach)).StatusCode,
|
||||
Is.EqualTo(HttpStatusCode.Unauthorized));
|
||||
@@ -236,8 +236,8 @@ public sealed class WebInterfaceTests
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(GanzerKeks(dauerhaft), Does.Contain("max-age=31536000").IgnoreCase);
|
||||
Assert.That(GanzerKeks(nurJetzt), Does.Not.Contain("max-age").IgnoreCase);
|
||||
Assert.That(GanzesCookie(dauerhaft), Does.Contain("max-age=31536000").IgnoreCase);
|
||||
Assert.That(GanzesCookie(nurJetzt), Does.Not.Contain("max-age").IgnoreCase);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -251,7 +251,7 @@ public sealed class WebInterfaceTests
|
||||
var antwort = await server.OhneGedaechtnis().PostAsJsonAsync("/api/v1/auth/login",
|
||||
new LoginRequest("guido", "ein-langes-passwort", "Browser", "b1"));
|
||||
|
||||
Assert.That(GanzerKeks(antwort), Does.Contain("max-age=31536000").IgnoreCase);
|
||||
Assert.That(GanzesCookie(antwort), Does.Contain("max-age=31536000").IgnoreCase);
|
||||
}
|
||||
|
||||
/// <summary>Abmelden scheitert nie — auch nicht ohne gültiges Token.</summary>
|
||||
@@ -300,10 +300,10 @@ public sealed class WebInterfaceTests
|
||||
}
|
||||
|
||||
/// <summary>Nimmt den Namen und den Wert aus der Set-Cookie-Kopfzeile.</summary>
|
||||
private static string Keks(HttpResponseMessage antwort) =>
|
||||
GanzerKeks(antwort).Split(';')[0];
|
||||
private static string Cookie(HttpResponseMessage antwort) =>
|
||||
GanzesCookie(antwort).Split(';')[0];
|
||||
|
||||
/// <summary>Die ganze Kopfzeile — samt Lebensdauer und Schutzangaben.</summary>
|
||||
private static string GanzerKeks(HttpResponseMessage antwort) =>
|
||||
private static string GanzesCookie(HttpResponseMessage antwort) =>
|
||||
antwort.Headers.GetValues("Set-Cookie").Single();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user