//
using System.Collections;
+using System.Collections.Specialized;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Web.UI;
using System.Web.Util;
-namespace System.Web {
-
- class CacheabilityUpdatedEventArgs : EventArgs {
-
- public readonly HttpCacheability Cacheability;
-
- public CacheabilityUpdatedEventArgs (HttpCacheability cacheability)
- {
- Cacheability = cacheability;
- }
- }
-
- internal delegate void CacheabilityUpdatedCallback (object sender, CacheabilityUpdatedEventArgs args);
-
+namespace System.Web
+{
// CAS - no InheritanceDemand here as the class is sealed
[AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
- public sealed class HttpCachePolicy {
- static readonly object cacheabilityUpdatedEvent = new object ();
-
+ public sealed class HttpCachePolicy
+ {
internal HttpCachePolicy ()
{
}
-#region Fields
-
-#if NET_2_0
HttpCacheVaryByContentEncodings vary_by_content_encodings = new HttpCacheVaryByContentEncodings ();
-#endif
HttpCacheVaryByHeaders vary_by_headers = new HttpCacheVaryByHeaders ();
HttpCacheVaryByParams vary_by_params = new HttpCacheVaryByParams ();
ArrayList validation_callbacks;
string etag;
bool etag_from_file_dependencies;
bool last_modified_from_file_dependencies;
-
+
//
// Used externally
//
internal DateTime expire_date;
internal bool have_last_modified;
internal DateTime last_modified;
-
+
//bool LastModifiedFromFileDependencies;
HttpCacheRevalidation revalidation;
string vary_by_custom;
bool sliding_expiration;
int duration;
bool allow_response_in_browser_history;
- bool allow_server_caching = true;
- bool set_no_store = false;
- bool set_no_transform = false;
- bool valid_until_expires = false;
-
- // always false in 1.x
- bool omit_vary_star = false;
-
- EventHandlerList events = new EventHandlerList ();
-#endregion
-
- internal event CacheabilityUpdatedCallback CacheabilityUpdated {
- add { events.AddHandler (cacheabilityUpdatedEvent, value); }
- remove { events.RemoveHandler (cacheabilityUpdatedEvent, value); }
- }
+ bool allow_server_caching = true;
+ bool set_no_store;
+ bool set_no_transform;
+ bool valid_until_expires;
+ bool omit_vary_star;
-
-#region Properties
-
-#if NET_2_0
public HttpCacheVaryByContentEncodings VaryByContentEncodings {
get { return vary_by_content_encodings; }
}
-#endif
-
+
public HttpCacheVaryByHeaders VaryByHeaders {
get { return vary_by_headers; }
}
internal bool AllowServerCaching {
get { return allow_server_caching; }
}
-
+
internal int Duration {
get { return duration; }
set { duration = value; }
internal bool Sliding {
get { return sliding_expiration; }
}
-
- internal DateTime Expires {
- get { return expire_date; }
- }
+
+ internal DateTime Expires {
+ get { return expire_date; }
+ }
internal ArrayList ValidationCallbacks {
get { return validation_callbacks; }
}
- // always false in 1.x
internal bool OmitVaryStar {
get { return omit_vary_star; }
}
internal bool ValidUntilExpires {
get { return valid_until_expires; }
}
-
-#endregion // Properties
-
-#region Methods
internal int ExpireMinutes ()
{
if (!have_expire_date)
return 0;
-
+
return (expire_date - DateTime.Now).Minutes;
}
-
+
public void AddValidationCallback (HttpCacheValidateHandler handler, object data)
{
if (handler == null)
if (Cacheability > 0 && cacheability > Cacheability)
return;
-
+
Cacheability = cacheability;
- CacheabilityUpdatedCallback eh = events [cacheabilityUpdatedEvent] as CacheabilityUpdatedCallback;
- if (eh != null)
- eh (this, new CacheabilityUpdatedEventArgs (cacheability));
}
public void SetCacheability (HttpCacheability cacheability, string field)
{
if (date < TimeSpan.Zero)
throw new ArgumentOutOfRangeException ("date");
-
+
if (HaveMaxAge && MaxAge < date)
return;
return;
ProxyMaxAge = delta;
+ HaveProxyMaxAge = true;
}
public void SetRevalidation (HttpCacheRevalidation revalidation)
allow_response_in_browser_history = allow;
}
- internal void SetHeaders (HttpResponse response, ArrayList headers)
+ internal void SetHeaders (HttpResponse response, NameValueCollection headers)
{
bool noCache = false;
string cc = null;
if (noCache) {
response.CacheControl = cc;
if (!allow_response_in_browser_history) {
- headers.Add (new UnknownResponseHeader ("Expires", "-1"));
- headers.Add (new UnknownResponseHeader ("Pragma", "no-cache"));
+ headers.Add ("Expires", "-1");
+ headers.Add ("Pragma", "no-cache");
}
} else {
- if (MaxAge.TotalSeconds != 0)
+ if (HaveMaxAge)
cc = String.Concat (cc, ", max-age=", ((long) MaxAge.TotalSeconds).ToString ());
if (have_expire_date) {
string expires = TimeUtil.ToUtcTimeString (expire_date);
- headers.Add (new UnknownResponseHeader ("Expires", expires));
+ headers.Add ("Expires", expires);
}
}
cc = String.Concat (cc, ", no-store");
if (set_no_transform)
cc = String.Concat (cc, ", no-transform");
+ if (cache_extension != null && cache_extension.Length > 0) {
+ if (!String.IsNullOrEmpty (cc))
+ cc = String.Concat (cc, ", ");
+ cc = String.Concat (cc, cache_extension.ToString ());
+ }
- headers.Add (new UnknownResponseHeader ("Cache-Control", cc));
+ headers.Add ("Cache-Control", cc);
if (last_modified_from_file_dependencies || etag_from_file_dependencies)
HeadersFromFileDependencies (response);
-
+
if (etag != null)
- headers.Add (new UnknownResponseHeader ("ETag", etag));
+ headers.Add ("ETag", etag);
if (have_last_modified)
- headers.Add (new UnknownResponseHeader ("Last-Modified",
- TimeUtil.ToUtcTimeString (last_modified)));
+ headers.Add ("Last-Modified", TimeUtil.ToUtcTimeString (last_modified));
if (!vary_by_params.IgnoreParams) {
- BaseResponseHeader vb = vary_by_params.GetResponseHeader ();
+ string vb = vary_by_params.GetResponseHeaderValue ();
if (vb != null)
- headers.Add (vb);
+ headers.Add ("Vary", vb);
}
-
}
void HeadersFromFileDependencies (HttpResponse response)
{
string [] fileDeps = response.FileDependencies;
-
+
if (fileDeps == null || fileDeps.Length == 0)
return;
if (doEtag && etagsb.Length > 0)
etag = etagsb.ToString ();
}
-
-#if NET_2_0
+
public void SetOmitVaryStar (bool omit)
{
omit_vary_star = omit;
}
-#endif
-
-#endregion // Methods
}
}
-