Skip to content

Instantly share code, notes, and snippets.

@mt89vein
Last active August 28, 2024 13:08
Show Gist options
  • Save mt89vein/9c9d7291d42dac0d1598f1a61da3117c to your computer and use it in GitHub Desktop.
Save mt89vein/9c9d7291d42dac0d1598f1a61da3117c to your computer and use it in GitHub Desktop.
A cookies helper class to easily read and set cookies on HttpRequest (Asp.Net Core)
/// <summary>
/// Вспомогательные методы для работы с <see cref="Cookie"/>.
/// </summary>
public static class CookiesHelper
{
#region Методы (public)
/// <summary>
/// Получить список куки, которые сервер хочет установить через Set-Cookie.
/// </summary>
/// <param name="response">HTTP ответ.</param>
/// <returns>Список куки.</returns>
public static IEnumerable<Cookie> ExtractCookies(this HttpResponseMessage response)
{
if (!response.Headers.TryGetValues("Set-Cookie", out var cookieEntries))
{
return Enumerable.Empty<Cookie>();
}
var uri = response.RequestMessage.RequestUri;
var cookieContainer = new CookieContainer();
foreach (var cookieEntry in cookieEntries)
{
cookieContainer.SetCookies(uri, cookieEntry);
}
return cookieContainer.GetCookies(uri).Cast<Cookie>();
}
/// <summary>
/// Добавить в запрос <see cref="Cookie"/>.
/// </summary>
/// <param name="request">Модель запроса.</param>
/// <param name="cookies">Список куки для добавления.</param>
public static void PopulateCookies(this HttpRequestMessage request, IEnumerable<Cookie> cookies)
{
request.Headers.Remove("Cookie");
if (cookies.Any())
{
request.Headers.Add("Cookie", cookies.ToHeaderFormat());
}
}
#endregion Методы (public)
#region Методы (private)
/// <summary>
/// Конвертировать список куки в формат для запроса.
/// </summary>
/// <param name="cookies">Список куки для добавления.</param>
/// <returns>Куки в формате name=value; name1=value1;</returns>
private static string ToHeaderFormat(this IEnumerable<Cookie> cookies)
{
var cookieString = string.Empty;
var delimiter = string.Empty;
foreach (var cookie in cookies)
{
cookieString += delimiter + cookie;
delimiter = "; ";
}
return cookieString;
}
#endregion Методы (private)
}
@mt89vein
Copy link
Author

Usage example:

public class SessionModel
{
    public List<Cookie> Cookies { get; set; }

    public void UpdateCookies(IEnumerable<Cookie> cookies)
    {
        // update cookies in session.
    }
}

public async Task<T> GetAsync<T>(string url)
{
    var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, url);
    httpRequestMessage.PopulateCookies(_session.Cookies);
    using (var response = await _httpClient.SendAsync(httpRequestMessage))
    {
        response.EnsureSuccessStatusCode();
        _session.UpdateCookies(response.ExtractCookies());

        return await response.Content.ReadAsAsync<T>();
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment