酢酸先生と Slack でいろいろお話しながら調査してたら、今さっき見つかりました。
結論から言うと、
HttpOnly 属性の付いた Cookie は CookieContainer
から取得できなくなった、
です。
簡単な経緯を説明しますと、まず従来世の中に回っている System.Net.Http.HttpClient
は System.Net.HttpWebRequest
で実装されていたものでした。しかし、UWP 版からは Windows.Web.Http.HttpClient
での実装に変更されています (HttpClientHandler の実装が今までとは全くの別物になっています)。 ここまでは特に問題がないです。
しかし、新 System.Net.Http.HttpClient
での ProcessResponseCookies
に問題があります。従来挙動と違い、HttpOnly 属性のついたものははじく実装になりました。
// System.Net.Http.HttpClientHandler private void ProcessResponseCookies(HttpResponseMessage response) { IEnumerable<string> enumerable; if (this.UseCookies && response.Headers.TryGetValues("Set-Cookie", out enumerable)) { using (IEnumerator<string> enumerator = enumerable.GetEnumerator()) { while (enumerator.MoveNext()) { string current = enumerator.get_Current(); if (!string.IsNullOrWhiteSpace(current)) { try { CookieContainer expr_42 = new CookieContainer(); expr_42.SetCookies(response.RequestMessage.RequestUri, current); IEnumerator enumerator2 = expr_42.GetCookies(response.RequestMessage.RequestUri).GetEnumerator(); try { while (enumerator2.MoveNext()) { Cookie cookie = (Cookie)enumerator2.get_Current(); if (!cookie.HttpOnly) { this.CookieContainer.Add(response.RequestMessage.RequestUri, cookie); } } (略)
このコードにおける HttpResponseMessage
は内部の HttpHandlerToFilter
にて適切に変換 (Windows.Web.Http.HttpResponseMessage
から System.Net.Http.HttpResponseMessage
) され、そのあとのクッキー処理になっています。
ということで、取得できなくなってます。バグというより仕様変更というのが適切でしょう。
以上です。