|
/// <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) |
|
} |
Usage example: