The Labs \ Source Viewer \ SSCLI \ System.Net \ FileWebResponse

  1. //------------------------------------------------------------------------------
  2. // <copyright file="filewebresponse.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Net
  16. {
  17.     using System.Runtime.Serialization;
  18.     using System.IO;
  19.     using System.Globalization;
  20.     using System.Security.Permissions;
  21.    
  22.     [Serializable()]
  23.     public class FileWebResponse : WebResponse, ISerializable, ICloseEx
  24.     {
  25.         const int DefaultFileStreamBufferSize = 8192;
  26.         const string DefaultFileContentType = "application/octet-stream";
  27.        
  28.         // fields
  29.        
  30.         bool m_closed;
  31.         long m_contentLength;
  32.         FileAccess m_fileAccess;
  33.         WebHeaderCollection m_headers;
  34.         Stream m_stream;
  35.         Uri m_uri;
  36.        
  37.         // constructors
  38.        
  39.         internal FileWebResponse(FileWebRequest request, Uri uri, FileAccess access, bool asyncHint)
  40.         {
  41.             GlobalLog.Enter("FileWebResponse::FileWebResponse", "uri=" + uri + ", access=" + access + ", asyncHint=" + asyncHint);
  42.             try {
  43.                 m_fileAccess = access;
  44.                 if (access == FileAccess.Write) {
  45.                     m_stream = Stream.Null;
  46.                 }
  47.                 else {
  48.                    
  49.                     //
  50.                     // apparently, specifying async when the stream will be read
  51.                     // synchronously, or vice versa, can lead to a 10x perf hit.
  52.                     // While we don't know how the app will read the stream, we
  53.                     // use the hint from whether the app called BeginGetResponse
  54.                     // or GetResponse to supply the async flag to the stream ctor
  55.                     //
  56.                    
  57.                     m_stream = new FileWebStream(request, uri.LocalPath, FileMode.Open, FileAccess.Read, FileShare.Read, DefaultFileStreamBufferSize, asyncHint);
  58.                     m_contentLength = m_stream.Length;
  59.                 }
  60.                 m_headers = new WebHeaderCollection(WebHeaderCollectionType.FileWebResponse);
  61.                 m_headers.AddInternal(HttpKnownHeaderNames.ContentLength, m_contentLength.ToString(NumberFormatInfo.InvariantInfo));
  62.                 m_headers.AddInternal(HttpKnownHeaderNames.ContentType, DefaultFileContentType);
  63.                 m_uri = uri;
  64.             }
  65.             catch (Exception e) {
  66.                 Exception ex = new WebException(e.Message, e, WebExceptionStatus.ConnectFailure, null);
  67.                 GlobalLog.LeaveException("FileWebResponse::FileWebResponse", ex);
  68.                 throw ex;
  69.             }
  70.             catch {
  71.                 Exception ex = new WebException(string.Empty, new Exception(SR.GetString(SR.net_nonClsCompliantException)), WebExceptionStatus.ConnectFailure, null);
  72.                 GlobalLog.LeaveException("FileWebResponse::FileWebResponse", ex);
  73.                 throw ex;
  74.             }
  75.             GlobalLog.Leave("FileWebResponse::FileWebResponse");
  76.         }
  77.        
  78.         //
  79.         // ISerializable constructor
  80.         //
  81.         [Obsolete("Serialization is obsoleted for this type. http://go.microsoft.com/fwlink/?linkid=14202")]
  82.         protected FileWebResponse(SerializationInfo serializationInfo, StreamingContext streamingContext) : base(serializationInfo, streamingContext)
  83.         {
  84.             m_headers = (WebHeaderCollection)serializationInfo.GetValue("headers", typeof(WebHeaderCollection));
  85.             m_uri = (Uri)serializationInfo.GetValue("uri", typeof(Uri));
  86.             m_contentLength = serializationInfo.GetInt64("contentLength");
  87.             m_fileAccess = (FileAccess)serializationInfo.GetInt32("fileAccess");
  88.         }
  89.        
  90.         //
  91.         // ISerializable method
  92.         //
  93.         /// <internalonly/>
  94.         [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter, SerializationFormatter = true)]
  95.         void ISerializable.GetObjectData(SerializationInfo serializationInfo, StreamingContext streamingContext)
  96.         {
  97.             GetObjectData(serializationInfo, streamingContext);
  98.         }
  99.        
  100.         //
  101.         // FxCop: provide some way for derived classes to access GetObjectData even if the derived class
  102.         // explicitly re-inherits ISerializable.
  103.         //
  104.         [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
  105.         protected override void GetObjectData(SerializationInfo serializationInfo, StreamingContext streamingContext)
  106.         {
  107.             serializationInfo.AddValue("headers", m_headers, typeof(WebHeaderCollection));
  108.             serializationInfo.AddValue("uri", m_uri, typeof(Uri));
  109.             serializationInfo.AddValue("contentLength", m_contentLength);
  110.             serializationInfo.AddValue("fileAccess", m_fileAccess);
  111.             base.GetObjectData(serializationInfo, streamingContext);
  112.         }
  113.        
  114.         // properties
  115.        
  116.         public override long ContentLength {
  117.             get {
  118.                 CheckDisposed();
  119.                 return m_contentLength;
  120.             }
  121.         }
  122.        
  123.         public override string ContentType {
  124.             get {
  125.                 CheckDisposed();
  126.                 return DefaultFileContentType;
  127.             }
  128.         }
  129.        
  130.         public override WebHeaderCollection Headers {
  131.             get {
  132.                 CheckDisposed();
  133.                 return m_headers;
  134.             }
  135.         }
  136.        
  137.         public override Uri ResponseUri {
  138.             get {
  139.                 CheckDisposed();
  140.                 return m_uri;
  141.             }
  142.         }
  143.        
  144.         // methods
  145.        
  146.         private void CheckDisposed()
  147.         {
  148.             if (m_closed) {
  149.                 throw new ObjectDisposedException(this.GetType().FullName);
  150.             }
  151.         }
  152.        
  153.         public override void Close()
  154.         {
  155.             ((ICloseEx)this).CloseEx(CloseExState.Normal);
  156.         }
  157.        
  158.         void ICloseEx.CloseEx(CloseExState closeState)
  159.         {
  160.             GlobalLog.Enter("FileWebResponse::Close()");
  161.             try {
  162.                 if (!m_closed) {
  163.                     m_closed = true;
  164.                    
  165.                     Stream chkStream = m_stream;
  166.                     if (chkStream != null) {
  167.                         if (chkStream is ICloseEx)
  168.                             ((ICloseEx)chkStream).CloseEx(closeState);
  169.                         else
  170.                             chkStream.Close();
  171.                         m_stream = null;
  172.                     }
  173.                 }
  174.             }
  175.             finally {
  176.                 GlobalLog.Leave("FileWebResponse::Close()");
  177.             }
  178.         }
  179.        
  180.         public override Stream GetResponseStream()
  181.         {
  182.             GlobalLog.Enter("FileWebResponse::GetResponseStream()");
  183.             try {
  184.                 CheckDisposed();
  185.             }
  186.             finally {
  187.                 GlobalLog.Leave("FileWebResponse::GetResponseStream()");
  188.             }
  189.             return m_stream;
  190.         }
  191.     }
  192. }

Developer Fusion