モノトーンの伝説日記

OBS Studio と Blackmagic Design が大好き。

<mini> System.Net.Http.HttpClient [UWP] での HttpOnly Cookie がとれない破壊的仕様変更について

 酢酸先生と Slack でいろいろお話しながら調査してたら、今さっき見つかりました。

 結論から言うと、

HttpOnly 属性の付いた CookieCookieContainer から取得できなくなった

です。

 簡単な経緯を説明しますと、まず従来世の中に回っている System.Net.Http.HttpClientSystem.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) され、そのあとのクッキー処理になっています。

 ということで、取得できなくなってます。バグというより仕様変更というのが適切でしょう。

 以上です。