Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Web / HttpServerVarsCollection.cs / 1305376 / HttpServerVarsCollection.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- /* * Collection of server variables with callback to HttpRequest for 'dynamic' ones * * Copyright (c) 2000 Microsoft Corporation */ namespace System.Web { using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Text; using System.Collections; using System.Collections.Specialized; using System.Web.Util; using System.Globalization; using System.Security.Permissions; using System.Web.Hosting; internal class HttpServerVarsCollection : HttpValueCollection { private bool _populated; private HttpRequest _request; private IIS7WorkerRequest _iis7workerRequest; // We preallocate the base collection with a size that should be sufficient // to store all server variables w/o having to expand internal HttpServerVarsCollection(HttpWorkerRequest wr, HttpRequest request) : base(59) { // if this is an IIS7WorkerRequest, then the collection will be writeable and we will // call into IIS7 to update the server var block when changes are made. _iis7workerRequest = wr as IIS7WorkerRequest; _request = request; _populated = false; Debug.Assert( _request != null ); } public override void GetObjectData(SerializationInfo info, StreamingContext context) { // this class, while derived from class implementing ISerializable, is not serializable throw new SerializationException(); } internal void Dispose() { _request = null; } [System.Runtime.TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] internal void AddStatic(String name, String value) { if (value == null) value = String.Empty; InvalidateCachedArrays(); BaseAdd(name, new HttpServerVarsCollectionEntry(name, value)); } internal void AddDynamic(String name, DynamicServerVariable var) { InvalidateCachedArrays(); BaseAdd(name, new HttpServerVarsCollectionEntry(name, var)); } [System.Runtime.TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] private String GetServerVar(Object e) { HttpServerVarsCollectionEntry entry = (HttpServerVarsCollectionEntry)e; return (entry != null) ? entry.GetValue(_request) : null; } // // Support for deferred population of the collection // private void Populate() { if (!_populated) { if (_request != null) { MakeReadWrite(); _request.FillInServerVariablesCollection(); if (_iis7workerRequest == null) { MakeReadOnly(); } } _populated = true; } } private String GetSimpleServerVar(String name) { // get server var without population of the collection // only most popular are included if (name != null && name.Length > 1 && _request != null) { switch (name[0]) { case 'A': case 'a': if (StringUtil.EqualsIgnoreCase(name, "AUTH_TYPE")) return _request.CalcDynamicServerVariable(DynamicServerVariable.AUTH_TYPE); else if (StringUtil.EqualsIgnoreCase(name, "AUTH_USER")) return _request.CalcDynamicServerVariable(DynamicServerVariable.AUTH_USER); break; case 'H': case 'h': if (StringUtil.EqualsIgnoreCase(name, "HTTP_USER_AGENT")) return _request.UserAgent; break; case 'Q': case 'q': if (StringUtil.EqualsIgnoreCase(name, "QUERY_STRING")) return _request.QueryStringText; break; case 'P': case 'p': if (StringUtil.EqualsIgnoreCase(name, "PATH_INFO")) return _request.Path; else if (StringUtil.EqualsIgnoreCase(name, "PATH_TRANSLATED")) return _request.PhysicalPath; break; case 'R': case 'r': if (StringUtil.EqualsIgnoreCase(name, "REQUEST_METHOD")) return _request.HttpMethod; else if (StringUtil.EqualsIgnoreCase(name, "REMOTE_USER")) return _request.CalcDynamicServerVariable(DynamicServerVariable.AUTH_USER); else if (StringUtil.EqualsIgnoreCase(name, "REMOTE_HOST")) return _request.UserHostName; else if (StringUtil.EqualsIgnoreCase(name, "REMOTE_ADDRESS")) return _request.UserHostAddress; break; case 'S': case 's': if (StringUtil.EqualsIgnoreCase(name, "SCRIPT_NAME")) return _request.FilePath; break; } } // do the default processing (populate the collection) return null; } // // Enumerator must pre-populate the collection // public override IEnumerator GetEnumerator() { Populate(); return base.GetEnumerator(); } // // NameValueCollection overrides // public override int Count { get { Populate(); return base.Count; } } public override void Add(String name, String value) { // not supported because it appends the value to a comma separated list throw new NotSupportedException(); } public override void Clear() { throw new NotSupportedException(); } public override String Get(String name) { if (!_populated) { String value = GetSimpleServerVar(name); if (value != null) return value; Populate(); } if (_iis7workerRequest != null) { string var = GetServerVar(BaseGet(name)); if (String.IsNullOrEmpty(var)) { var = _request.FetchServerVariable(name); } return var; } else { return GetServerVar(BaseGet(name)); } } public override String[] GetValues(String name) { String s = Get(name); return(s != null) ? new String[1] { s} : null; } [AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.High)] public override void Set(String name, String value) { if (_iis7workerRequest == null) { throw new PlatformNotSupportedException(); } if (name == null) { throw new ArgumentNullException("name"); } SetNoDemand(name, value); } internal void SetNoDemand(String name, String value) { if (value == null) { value = String.Empty; } _iis7workerRequest.SetServerVariable(name, value); SetServerVariableManagedOnly(name, value); SynchronizeHeader(name, value); _request.InvalidateParams(); } private void SynchronizeHeader(String name, String value) { if (StringUtil.StringStartsWith(name, "HTTP_")) { // update managed copy of header string headerName = name.Substring("HTTP_".Length); headerName = headerName.Replace('_', '-'); int knownIndex = HttpWorkerRequest.GetKnownRequestHeaderIndex(headerName); if (knownIndex > -1) { headerName = HttpWorkerRequest.GetKnownRequestHeaderName(knownIndex); } HttpHeaderCollection headers = _request.Headers as HttpHeaderCollection; if (headers != null) { headers.SynchronizeHeader(headerName, value); } } } // updates managed copy of server variable with current value from native header block internal void SynchronizeServerVariable(String name, String value) { if (name == null) { throw new ArgumentNullException("name"); } if (value != null) { SetServerVariableManagedOnly(name, value); } else { base.Remove(name); } _request.InvalidateParams(); } // updates managed copy of server variable with current value from native header block private void SetServerVariableManagedOnly(String name, String value) { Debug.Assert(name != null); Debug.Assert(value != null); // populate in order to identify dynamic variables Populate(); // dynamic server variables cannot be modified HttpServerVarsCollectionEntry entry = (HttpServerVarsCollectionEntry) BaseGet(name); if (entry != null && entry.IsDynamic) { throw new HttpException(SR.GetString(SR.Server_variable_cannot_be_modified)); } InvalidateCachedArrays(); // this will update an existing entry, or create one if it's new BaseSet(name, new HttpServerVarsCollectionEntry(name, value)); } [AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.High)] public override void Remove(String name) { if (_iis7workerRequest == null) { throw new PlatformNotSupportedException(); } if (name == null) { throw new ArgumentNullException("name"); } RemoveNoDemand(name); } internal void RemoveNoDemand(String name) { // delete by sending null value _iis7workerRequest.SetServerVariable(name, null /*value*/); base.Remove(name); SynchronizeHeader(name, null); _request.InvalidateParams(); } [System.Runtime.TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] public override String Get(int index) { Populate(); return GetServerVar(BaseGet(index)); } [System.Runtime.TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] public override String[] GetValues(int index) { String s = Get(index); return(s != null) ? new String[1] { s} : null; } [System.Runtime.TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] public override String GetKey(int index) { Populate(); return base.GetKey(index); } public override string[] AllKeys { get { Populate(); return base.AllKeys; } } // // HttpValueCollection overrides // internal override string ToString(bool urlencoded) { Populate(); StringBuilder s = new StringBuilder(); int n = Count; String key, value; for (int i = 0; i < n; i++) { if (i > 0) s.Append('&'); key = GetKey(i); if (urlencoded) key = HttpUtility.UrlEncodeUnicode(key); s.Append(key); s.Append('='); value = Get(i); if (urlencoded) value = HttpUtility.UrlEncodeUnicode(value); s.Append(value); } return s.ToString(); } } /* * Entry in a server vars colleciton */ internal class HttpServerVarsCollectionEntry { internal readonly String Name; internal readonly bool IsDynamic; internal readonly String Value; internal readonly DynamicServerVariable Var; internal HttpServerVarsCollectionEntry(String name, String value) { Name = name; Value = value; IsDynamic = false; } internal HttpServerVarsCollectionEntry(String name, DynamicServerVariable var) { Name = name; Var = var; IsDynamic = true; } internal String GetValue(HttpRequest request) { String v = null; if (IsDynamic) { if (request != null) v = request.CalcDynamicServerVariable(Var); } else { v = Value; } return v; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- InvokeSchedule.cs
- TypeSystem.cs
- Property.cs
- SecondaryViewProvider.cs
- TransformDescriptor.cs
- StringUtil.cs
- SortExpressionBuilder.cs
- SiteMapProvider.cs
- SafeNativeMethodsCLR.cs
- DiagnosticsConfiguration.cs
- cache.cs
- FileRecordSequenceHelper.cs
- AttributeData.cs
- Converter.cs
- ConfigUtil.cs
- WorkflowWebHostingModule.cs
- InstalledFontCollection.cs
- serverconfig.cs
- TreeViewCancelEvent.cs
- AudioFormatConverter.cs
- ConfigXmlDocument.cs
- BatchWriter.cs
- NotifyParentPropertyAttribute.cs
- RegistryDataKey.cs
- StyleBamlRecordReader.cs
- InfocardInteractiveChannelInitializer.cs
- Int64Converter.cs
- UnsafeNativeMethodsMilCoreApi.cs
- ObjectSet.cs
- MethodToken.cs
- VirtualPath.cs
- ISFClipboardData.cs
- RangeValuePatternIdentifiers.cs
- MultipartContentParser.cs
- PerfService.cs
- CaseInsensitiveOrdinalStringComparer.cs
- ComponentDesigner.cs
- GridViewDeletedEventArgs.cs
- ExceptionUtil.cs
- WindowsListViewGroup.cs
- ObjectFullSpanRewriter.cs
- AuthenticateEventArgs.cs
- DebugHandleTracker.cs
- BulletedList.cs
- TargetInvocationException.cs
- Enlistment.cs
- PropertyChangedEventArgs.cs
- CharStorage.cs
- SemanticResolver.cs
- BridgeDataReader.cs
- serverconfig.cs
- Maps.cs
- SmiEventSink_Default.cs
- ColorAnimationUsingKeyFrames.cs
- KeyManager.cs
- BitmapEffectDrawingContextState.cs
- ProtectedConfigurationProviderCollection.cs
- WindowsRebar.cs
- SelectedCellsCollection.cs
- TableItemStyle.cs
- Listbox.cs
- HtmlTableRowCollection.cs
- UnmanagedMarshal.cs
- ScriptComponentDescriptor.cs
- columnmapkeybuilder.cs
- IconConverter.cs
- UrlPath.cs
- StateFinalizationActivity.cs
- ScriptResourceAttribute.cs
- GeneralTransform2DTo3DTo2D.cs
- SqlDataSourceCommandEventArgs.cs
- LicenseContext.cs
- CategoryNameCollection.cs
- TemplateBindingExtension.cs
- controlskin.cs
- RoleBoolean.cs
- ItemCheckEvent.cs
- QueryResult.cs
- GAC.cs
- TextPatternIdentifiers.cs
- IntegerValidatorAttribute.cs
- UserControl.cs
- ImportContext.cs
- RegexBoyerMoore.cs
- HttpCapabilitiesEvaluator.cs
- WebColorConverter.cs
- DurableTimerExtension.cs
- MSAANativeProvider.cs
- smtppermission.cs
- ResourcePart.cs
- DataMisalignedException.cs
- Encoder.cs
- ConsumerConnectionPointCollection.cs
- DynamicRenderer.cs
- TimeSpanMinutesConverter.cs
- BitmapEncoder.cs
- MetadataArtifactLoaderFile.cs
- arabicshape.cs
- IncrementalCompileAnalyzer.cs
- MailWebEventProvider.cs