using System;
using System.IO;
using System.Runtime.Serialization;
+using System.Net;
#if NET_2_0
{
public class FtpWebResponse : WebResponse
{
- Stream stream = Stream.Null;
+ Stream stream;
Uri uri;
FtpStatusCode statusCode;
DateTime lastModified = DateTime.MinValue;
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 {
public override WebHeaderCollection Headers {
get {
- return new WebHeaderCollection (true);
+ return new WebHeaderCollection ();
}
}
get {
return statusCode;
}
- internal set {
+ private set {
statusCode = value;
}
}
get {
return statusDescription;
}
- internal set {
+ private set {
statusDescription = value;
}
}
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 ();
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 ()
if (disposed)
throw new ObjectDisposedException (GetType ().FullName);
}
+
+ internal bool IsFinal () {
+ return ((int) statusCode >= 200);
+ }
}
}