Search code examples
c#cookies.net-corehttpwebresponsecookiecontainer

HttpWebResponse.Cookies different behavior in .net framework and .net core


I am in migration process from .net framework to .net core and find some strange situation with HttpWebRequest/HttpWebResponse: Task: Need to send HttpWebRequest to some address with cookie A with value “fail” and get cookie A from response (but expects that cookie A has value “Ok” in response header). If you trying to get cookie from response by name (e.g. response.Cookies[“A”]) you get “Ok” for .net framework and “fail” for .net core.

Here is example (1p_JAR is contains in request and response):

CookieContainer cookieContainer = new CookieContainer();
Uri uri = new Uri("https://google.com");
cookieContainer.SetCookies(uri, "k1=1111,k2=2222,k3=3333,1P_JAR=zzz");

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.CookieContainer = cookieContainer;
request.Method = "GET";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Console.WriteLine("Cookies from response: ");
foreach (Cookie cookie in response.Cookies)
{
    Console.WriteLine("    " + cookie.Name + ": " + cookie.Value);
}

Console.WriteLine("Get cookie by name: " + response.Cookies["1P_JAR"]);

Result for .net framework:

Cookies from response:
    1P_JAR: 2018-10-26-13
    NID: bla-bla-bla
Get cookie by name: 1P_JAR=2018-10-26-13

Result from .net core:

Cookies from response:
    k1: 1111
    k2: 2222
    k3: 3333
    1P_JAR: zzz
    1P_JAR: 2018-10-26-13
    NID: bla-bla-bla
Get cookie by name: 1P_JAR=zzz

How can I repeat behavior of .net framework implementation of HttpWebRequest/HttpWebResponse in .net core?


Solution

  • There is issue was created in github: https://github.com/dotnet/corefx/issues/33122

    Solution that works for .net core and .net framework:

    public static class HttpWebResponseGetCookiesExtension
    {
        public static CookieCollection GetResponseCookies(this HttpWebResponse response)
        {
    #if NETCOREAPP
            var cookieContainer = new CookieContainer();
            string cookieHeader = response.Headers[HttpResponseHeader.SetCookie] ?? string.Empty;
            cookieContainer.SetCookies(response.ResponseUri, cookieHeader);
            return cookieContainer.GetCookies(response.ResponseUri);
    #else
            return response.Cookies;
    #endif
        }
    }