Merge pull request #249 from pcc/xgetinputfocus
[mono.git] / mcs / class / System.Web.Mvc3 / Mvc / UrlRewriterHelper.cs
1 namespace System.Web.Mvc {
2     using System.Collections.Specialized;
3
4     internal class UrlRewriterHelper {
5         private const string _urlWasRewrittenServerVar = "IIS_WasUrlRewritten";
6         private const string _urlRewriterEnabledServerVar = "IIS_UrlRewriteModule";
7
8         private object _lockObject = new object();
9         private bool _urlRewriterIsTurnedOnValue;
10         private bool _urlRewriterIsTurnedOnCalculated = false;
11
12         private static bool WasThisRequestRewritten(HttpContextBase httpContext) {
13             NameValueCollection serverVars = httpContext.Request.ServerVariables;
14             bool requestWasRewritten = (serverVars != null && serverVars[_urlWasRewrittenServerVar] != null);
15             return requestWasRewritten;
16         }
17
18         private bool IsUrlRewriterTurnedOn(HttpContextBase httpContext) {
19             // Need to do double-check locking because a single instance of this class is shared in the entire app domain (see PathHelpers)
20             if (!_urlRewriterIsTurnedOnCalculated) {
21                 lock (_lockObject) {
22                     if (!_urlRewriterIsTurnedOnCalculated) {
23                         NameValueCollection serverVars = httpContext.Request.ServerVariables;
24                         bool urlRewriterIsEnabled = (serverVars != null && serverVars[_urlRewriterEnabledServerVar] != null);
25                         _urlRewriterIsTurnedOnValue = urlRewriterIsEnabled;
26                         _urlRewriterIsTurnedOnCalculated = true;
27                     }
28                 }
29             }
30             return _urlRewriterIsTurnedOnValue;
31         }
32
33         public virtual bool WasRequestRewritten(HttpContextBase httpContext) {
34             return IsUrlRewriterTurnedOn(httpContext) && WasThisRequestRewritten(httpContext);
35         }
36     }
37 }