You've already forked linux-packaging-mono
102 lines
3.6 KiB
C#
102 lines
3.6 KiB
C#
// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Runtime.Serialization.Formatters.Binary;
|
|
using System.Web;
|
|
using System.Web.Mvc;
|
|
|
|
namespace Microsoft.Web.Mvc
|
|
{
|
|
public class CookieTempDataProvider : ITempDataProvider
|
|
{
|
|
internal const string TempDataCookieKey = "__ControllerTempData";
|
|
private HttpContextBase _httpContext;
|
|
|
|
public CookieTempDataProvider(HttpContextBase httpContext)
|
|
{
|
|
if (httpContext == null)
|
|
{
|
|
throw new ArgumentNullException("httpContext");
|
|
}
|
|
_httpContext = httpContext;
|
|
}
|
|
|
|
public HttpContextBase HttpContext
|
|
{
|
|
get { return _httpContext; }
|
|
}
|
|
|
|
protected virtual IDictionary<string, object> LoadTempData(ControllerContext controllerContext)
|
|
{
|
|
HttpCookie cookie = _httpContext.Request.Cookies[TempDataCookieKey];
|
|
if (cookie != null && !String.IsNullOrEmpty(cookie.Value))
|
|
{
|
|
IDictionary<string, object> deserializedDictionary = Base64StringToDictionary(cookie.Value);
|
|
|
|
cookie.Expires = DateTime.MinValue;
|
|
cookie.Value = String.Empty;
|
|
|
|
if (_httpContext.Response != null && _httpContext.Response.Cookies != null)
|
|
{
|
|
HttpCookie responseCookie = _httpContext.Response.Cookies[TempDataCookieKey];
|
|
if (responseCookie != null)
|
|
{
|
|
cookie.Expires = DateTime.MinValue;
|
|
cookie.Value = String.Empty;
|
|
}
|
|
}
|
|
|
|
return deserializedDictionary;
|
|
}
|
|
|
|
return new Dictionary<string, object>();
|
|
}
|
|
|
|
protected virtual void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
|
|
{
|
|
string cookieValue = DictionaryToBase64String(values);
|
|
|
|
var cookie = new HttpCookie(TempDataCookieKey);
|
|
cookie.HttpOnly = true;
|
|
cookie.Value = cookieValue;
|
|
|
|
_httpContext.Response.Cookies.Add(cookie);
|
|
}
|
|
|
|
public static IDictionary<string, object> Base64StringToDictionary(string base64EncodedSerializedTempData)
|
|
{
|
|
byte[] bytes = Convert.FromBase64String(base64EncodedSerializedTempData);
|
|
using (var memStream = new MemoryStream(bytes))
|
|
{
|
|
var binFormatter = new BinaryFormatter();
|
|
return binFormatter.Deserialize(memStream, null) as IDictionary<string, object>;
|
|
}
|
|
}
|
|
|
|
public static string DictionaryToBase64String(IDictionary<string, object> values)
|
|
{
|
|
using (MemoryStream memStream = new MemoryStream())
|
|
{
|
|
memStream.Seek(0, SeekOrigin.Begin);
|
|
var binFormatter = new BinaryFormatter();
|
|
binFormatter.Serialize(memStream, values);
|
|
memStream.Seek(0, SeekOrigin.Begin);
|
|
byte[] bytes = memStream.ToArray();
|
|
return Convert.ToBase64String(bytes);
|
|
}
|
|
}
|
|
|
|
IDictionary<string, object> ITempDataProvider.LoadTempData(ControllerContext controllerContext)
|
|
{
|
|
return LoadTempData(controllerContext);
|
|
}
|
|
|
|
void ITempDataProvider.SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
|
|
{
|
|
SaveTempData(controllerContext, values);
|
|
}
|
|
}
|
|
}
|