New test.
[mono.git] / mcs / class / System / System.Net / FtpWebResponse.cs
index 59fc10da1f79044017505e857d0fc7ef4de2b827..e42156efcb053c482a3fa7e92b87a62958a4cfe9 100644 (file)
@@ -10,6 +10,7 @@
 using System;
 using System.IO;
 using System.Runtime.Serialization;
+using System.Net;
 
 #if NET_2_0
 
@@ -17,7 +18,7 @@ namespace System.Net
 {
        public class FtpWebResponse : WebResponse
        {
-               Stream stream = Stream.Null;
+               Stream stream;
                Uri uri;
                FtpStatusCode statusCode;
                DateTime lastModified = DateTime.MinValue;
@@ -28,14 +29,30 @@ namespace System.Net
                string method;
                //bool keepAlive;
                bool disposed;
+               FtpWebRequest request;
                internal long contentLength = -1;
                
-               internal FtpWebResponse (Uri uri, string method, bool keepAlive)
+               internal FtpWebResponse (FtpWebRequest request, Uri uri, string method, bool keepAlive)
                {
+                       this.request = request;
                        this.uri = uri;
                        this.method = method;
                        //this.keepAlive = keepAlive;
                }
+
+               internal FtpWebResponse (FtpWebRequest request, Uri uri, string method, FtpStatusCode statusCode, string statusDescription)
+               {
+                       this.request = request;
+                       this.uri = uri;
+                       this.method = method;
+                       this.statusCode = statusCode;
+                       this.statusDescription = statusDescription;
+               }
+
+               internal FtpWebResponse (FtpWebRequest request, Uri uri, string method, FtpStatus status) :
+                       this (request, uri, method, status.StatusCode, status.StatusDescription)
+               {
+               }
                
                public override long ContentLength {
                        get {
@@ -45,7 +62,7 @@ namespace System.Net
 
                public override WebHeaderCollection Headers {
                        get {
-                               return new WebHeaderCollection (true);
+                               return new WebHeaderCollection ();
                        }
                }
 
@@ -95,7 +112,7 @@ namespace System.Net
                        get {
                                return statusCode;
                        }
-                       internal set {
+                       private set {
                                statusCode = value;
                        }
                }
@@ -104,7 +121,7 @@ namespace System.Net
                        get {
                                return statusDescription;
                        }
-                       internal set {
+                       private set {
                                statusDescription = value;
                        }
                }
@@ -115,12 +132,19 @@ namespace System.Net
                                return;
                        
                        disposed = true;
-                       stream.Close ();
+                       if (stream != null) {
+                               stream.Close ();
+                               if (stream == Stream.Null)
+                                       request.OperationCompleted ();
+                       }
                        stream = null;
                }
 
                public override Stream GetResponseStream ()
                {
+                       if (stream == null)
+                               return Stream.Null; // After a STOR we get this
+                       
                        if (method != WebRequestMethods.Ftp.DownloadFile &&
                                        method != WebRequestMethods.Ftp.ListDirectory)
                                CheckDisposed ();
@@ -132,17 +156,13 @@ namespace System.Net
                        set {
                                stream = value;
                        }
-               }
 
-               internal void UpdateStatus (FtpStatusCode code, string desc)
-               {
-                       statusCode = code;
-                       statusDescription = desc;
+                       get { return stream; }
                }
 
-               ~FtpWebResponse ()
-               {
-                       ((IDisposable) this).Dispose ();
+               internal void UpdateStatus (FtpStatus status) {
+                       statusCode = status.StatusCode;
+                       statusDescription = status.StatusDescription;
                }
 
                void CheckDisposed ()
@@ -150,6 +170,10 @@ namespace System.Net
                        if (disposed)
                                throw new ObjectDisposedException (GetType ().FullName);
                }
+
+               internal bool IsFinal () {
+                       return ((int) statusCode >= 200);
+               }
        }
 }