+2010-03-18 Gonzalo Paniagua Javier <gonzalo@novell.com>
+
+ * FtpWebResponse.cs:
+ * FtpWebRequest.cs: for non-data operations, make sure we send the
+ QUIT command upon completion when KeepAlive is false.
+ Fixes bug #589305.
+
2010-03-16 Jb Evain <jbevain@novell.com>
* Dns.cs, HttpRequestCreator.cs, ServicePoint.cs: use MOONLIGHT
}
}
+ [MonoTODO ("We don't support KeepAlive = true")]
public bool KeepAlive {
get {
return keepAlive;
}
set {
CheckRequestStarted ();
- keepAlive = value;
+ //keepAlive = value;
}
}
if (!InFinalState ()) {
State = RequestState.Aborted;
- ftpResponse = new FtpWebResponse (requestUri, method, FtpStatusCode.FileActionAborted, "Aborted by request");
+ ftpResponse = new FtpWebResponse (this, requestUri, method, FtpStatusCode.FileActionAborted, "Aborted by request");
}
}
}
void ProcessRequest () {
if (State == RequestState.Scheduled) {
- ftpResponse = new FtpWebResponse (requestUri, method, keepAlive);
+ ftpResponse = new FtpWebResponse (this, requestUri, method, keepAlive);
try {
ProcessMethod ();
status = SendCommand (method, file_name);
- ftpResponse.Stream = new EmptyStream ();
+ ftpResponse.Stream = Stream.Null;
string desc = status.StatusDescription;
Exception CreateExceptionFromResponse (FtpStatus status)
{
- FtpWebResponse ftpResponse = new FtpWebResponse (requestUri, method, status);
+ FtpWebResponse ftpResponse = new FtpWebResponse (this, requestUri, method, status);
WebException exc = new WebException ("Server returned an error: " + status.StatusDescription,
null, WebExceptionStatus.ProtocolError, ftpResponse);
CloseConnection ();
}
+ internal void OperationCompleted ()
+ {
+ if(!keepAlive)
+ CloseConnection ();
+ }
+
void SetCompleteWithError (Exception exc)
{
if (asyncResult != null) {
if (InFinalState ())
throw new InvalidOperationException ("Cannot change final state");
}
-
- class EmptyStream : MemoryStream
- {
- internal EmptyStream ()
- : base (new byte [0], false) {
- }
- }
}
}
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 (Uri uri, string method, FtpStatusCode statusCode, string statusDescription) {
+ 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 (Uri uri, string method, FtpStatus status) :
- this (uri, method, status.StatusCode, status.StatusDescription)
+ internal FtpWebResponse (FtpWebRequest request, Uri uri, string method, FtpStatus status) :
+ this (request, uri, method, status.StatusCode, status.StatusDescription)
{
}
return;
disposed = true;
- if (stream != null)
+ if (stream != null) {
stream.Close ();
+ if (stream == Stream.Null)
+ request.OperationCompleted ();
+ }
stream = null;
}