* HttpHelper.cs: Removed unused method. Optimized CopyStream method.
* HttpServerChannel.cs: SendResponse does not return a bool any
more, it throws an exception when it fails.
* HttpServer.cs: Improved handling of errors.
svn path=/trunk/mcs/; revision=37874
+2004-12-17 Lluis Sanchez Gual <lluis@ximian.com>
+
+ * HttpHelper.cs: Removed unused method. Optimized CopyStream method.
+ * HttpServerChannel.cs: SendResponse does not return a bool any
+ more, it throws an exception when it fails.
+ * HttpServer.cs: Improved handling of errors.
+
2004-10-22 Lluis Sanchez Gual <lluis@ximian.com>
* HttpClientChannel.cs: In CreateMessageSink, process the remote channel
requestHeaders [CommonTransportKeys.RequestUri] = uri;
CreateUrl(uri,out url);
- HttpWebRequest httpWebRequest = CreateWebRequest(url,requestHeaders,requestStream);
+ HttpWebRequest httpWebRequest = CreateWebRequest (url,requestHeaders,requestStream);
- SendAndRecieve(httpWebRequest,out responseHeaders,out responseStream);
+ SendAndRecieve (httpWebRequest,out responseHeaders,out responseStream);
}
}
Stream reqStream = request.GetRequestStream();
- if (requestStream is MemoryStream)
- {
- MemoryStream memStream = (MemoryStream)requestStream;
- reqStream.Write (memStream.GetBuffer(), 0, (int)memStream.Length);
- }
- else
+ try {
HttpHelper.CopyStream(requestStream, reqStream);
-
- reqStream.Close();
+ } finally {
+ reqStream.Close();
+ }
return request;
}
private void ReceiveResponse (HttpWebResponse httpWebResponse, out ITransportHeaders responseHeaders, out Stream responseStream)
{
responseHeaders = new TransportHeaders();
+ Stream webStream = httpWebResponse.GetResponseStream();
try
{
- Stream webStream = httpWebResponse.GetResponseStream();
-
if (httpWebResponse.ContentLength != -1)
{
byte[] buffer = new byte [httpWebResponse.ContentLength];
int nr = 0;
- while (nr < buffer.Length)
- nr += webStream.Read (buffer, nr, buffer.Length - nr);
+ while (nr < buffer.Length) {
+ int pr = webStream.Read (buffer, nr, buffer.Length - nr);
+ if (pr == 0) throw new RemotingException ("Connection closed");
+ nr += pr;
+ }
responseStream = new MemoryStream (buffer);
}
else
}
finally
{
- if(httpWebResponse!=null)
- httpWebResponse.Close();
+ webStream.Close ();
+ httpWebResponse.Close();
}
}
return false;
}
- public static Stream CopyStream(Stream inStream)
+ public static void CopyStream (Stream inStream, Stream outStream)
{
-
- Stream outStream = new MemoryStream();
-
- int temp;
-
- try
- {
- while(true)
- {
- temp = inStream.ReadByte();
- if(temp==-1)
- break;
- outStream.WriteByte((byte)temp);
- }
- outStream.Flush();
- outStream.Seek(0,SeekOrigin.Begin);
- }
- catch(Exception e)
- {
- Console.WriteLine(e);
- }
-
- return outStream;
- }
+ byte[] buffer = new byte [1024];
- public static bool CopyStream(Stream inStream, Stream outStream)
- {
- int temp;
+ int nr;
+ while ((nr = inStream.Read (buffer, 0, buffer.Length)) > 0)
+ outStream.Write (buffer, 0, nr);
- try
- {
- while(true)
- {
- temp = inStream.ReadByte();
-
- if(temp==-1)
- break;
- outStream.WriteByte((byte)temp);
- }
-
- outStream.Flush();
-
- if(outStream.CanSeek)
- outStream.Seek(0,SeekOrigin.Begin);
- }
- catch(Exception e)
- {
- Console.WriteLine(e);
- return false;
- }
- return true;
-
+ outStream.Flush ();
+
+ if (outStream.CanSeek)
+ outStream.Seek (0,SeekOrigin.Begin);
}
public static String GetHostName()
Sink = sink;
}
- public RequestArguments (Stream inputStream, Stream outputStream, HttpServerTransportSink sink)
- {
- InputStream = inputStream;
- OutputStream = outputStream;
- Sink = sink;
- }
public Stream InputStream;
public Stream OutputStream;
public HttpServerTransportSink Sink;
else
buffer = new byte [0];
-
//Step (5)
- SendRequestForChannel (reqArg, HeaderFields, CustomHeaders, buffer);
+ SendRequestForChannel (reqArg, HeaderFields, CustomHeaders, buffer);
}
private static ArrayList RecieveHeader (RequestArguments reqArg)
SendResponse (reqArg, 408, null, null);
break;
default :
- //<Exception>
- break;
+ throw e;
}
return false;
}
- public static bool SendResponse (RequestArguments reqArg, int httpStatusCode, ITransportHeaders headers, Stream responseStream)
+ public static void SendResponse (RequestArguments reqArg, int httpStatusCode, ITransportHeaders headers, Stream responseStream)
{
byte [] headersBuffer = null;
byte [] entityBuffer = null;
headersBuffer = Encoding.ASCII.GetBytes (responseStr.ToString());
- try
- {
- //send headersBuffer
- reqArg.OutputStream.Write (headersBuffer, 0, headersBuffer.Length);
+ //send headersBuffer
+ reqArg.OutputStream.Write (headersBuffer, 0, headersBuffer.Length);
- if (entityBuffer != null)
- reqArg.OutputStream.Write (entityBuffer, 0, entityBuffer.Length);
- }
- catch
- {
- //<EXCEPTION>
- //may be its the client's fault so just return with false
- return false;
- }
-
- return true;
+ if (entityBuffer != null)
+ reqArg.OutputStream.Write (entityBuffer, 0, entityBuffer.Length);
}
internal static string GetReasonPhrase (int HttpStatusCode)
switch (processing)
{
case ServerProcessing.Complete:
- if (!HttpServer.SendResponse (reqArg, 200, responseHeaders, responseStream))
- {
- //ooops couldnot send response !!!!!! and error occured
- }
+ HttpServer.SendResponse (reqArg, 200, responseHeaders, responseStream);
break;
case ServerProcessing.OneWay:
- if (!HttpServer.SendResponse (reqArg, 200, null, null))
- {
- //ooops couldnot send response !!!!!! and error occured
- }
+ HttpServer.SendResponse (reqArg, 200, null, null);
break;
case ServerProcessing.Async: