From 29397612b24b2c06a7ab5515bd617dbc716e7ef5 Mon Sep 17 00:00:00 2001 From: Lluis Sanchez Date: Thu, 3 Apr 2003 15:32:16 +0000 Subject: =?UTF-8?q?=09*=20TcpMessageIO.cs:=20Changed=20header=20format=20t?= =?UTF-8?q?o=20match=20MS.NET.=20Based=20on=20the=20patch=20=09=20=20sent?= =?UTF-8?q?=20by=20Jose=20Lu=EF=BF=BDs=20Mart=EF=BF=BDn.=20=09*=20TcpClien?= =?UTF-8?q?tTransportSink.cs:=20Added=20Content-Type=20header.=20Improved?= =?UTF-8?q?=20support=20=09=20=20for=20OneWay=20messages.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/mcs/; revision=13060 --- .../TcpClientTransportSink.cs | 24 +++--- .../TcpMessageIO.cs | 94 +++++++++++++++++----- 2 files changed, 83 insertions(+), 35 deletions(-) (limited to 'mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp') diff --git a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpClientTransportSink.cs b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpClientTransportSink.cs index 227486606fb..07143d3f9cc 100644 --- a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpClientTransportSink.cs +++ b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpClientTransportSink.cs @@ -48,6 +48,8 @@ namespace System.Runtime.Remoting.Channels.Tcp ITransportHeaders headers, Stream requestStream) { TcpConnection connection = null; + bool isOneWay = RemotingServices.IsOneWay (((IMethodMessage)msg).MethodBase); + try { // Sends the stream using a connection from the pool @@ -57,7 +59,7 @@ namespace System.Runtime.Remoting.Channels.Tcp connection = TcpConnectionPool.GetConnection (_host, _port); TcpMessageIO.SendMessageStream (connection.Stream, requestStream, headers, connection.Buffer); - if (!RemotingServices.IsOneWay (((IMethodMessage)msg).MethodBase)) + if (!isOneWay) { sinkStack.Push (this, connection); ThreadPool.QueueUserWorkItem (new WaitCallback(ReadAsyncTcpMessage), sinkStack); @@ -66,7 +68,7 @@ namespace System.Runtime.Remoting.Channels.Tcp catch { if (connection != null) connection.Release(); - throw; + if (!isOneWay) throw; } } @@ -135,21 +137,13 @@ namespace System.Runtime.Remoting.Channels.Tcp connection = TcpConnectionPool.GetConnection (_host, _port); TcpMessageIO.SendMessageStream (connection.Stream, requestStream, requestHeaders, connection.Buffer); - if (!RemotingServices.IsOneWay (((IMethodMessage)msg).MethodBase)) - { - // Reads the response - MessageStatus status = TcpMessageIO.ReceiveMessageStatus (connection.Stream); + // Reads the response + MessageStatus status = TcpMessageIO.ReceiveMessageStatus (connection.Stream); - if (status != MessageStatus.MethodMessage) - throw new RemotingException ("Unknown response message from server"); + if (status != MessageStatus.MethodMessage) + throw new RemotingException ("Unknown response message from server"); - responseStream = TcpMessageIO.ReceiveMessageStream (connection.Stream, out responseHeaders, connection.Buffer); - } - else - { - responseHeaders = null; - responseStream = null; - } + responseStream = TcpMessageIO.ReceiveMessageStream (connection.Stream, out responseHeaders, connection.Buffer); } finally { diff --git a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpMessageIO.cs b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpMessageIO.cs index 0e3592835a2..4768ce45425 100644 --- a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpMessageIO.cs +++ b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpMessageIO.cs @@ -4,7 +4,9 @@ // // (C) 2002 Lluis Sanchez Gual +using System; using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; using System.Collections; using System.IO; using System.Text; @@ -17,9 +19,9 @@ namespace System.Runtime.Remoting.Channels.Tcp internal class TcpMessageIO { static byte[][] _msgHeaders = - { - new byte[] { (byte)'.', (byte)'N', (byte)'E', (byte)'T', 0 }, - new byte[] { 255, 255, 255, 255, 255 } + { + new byte[] { (byte)'.', (byte)'N', (byte)'E', (byte)'T', 1, 0 }, + new byte[] { 255, 255, 255, 255, 255, 255 } }; public static int DefaultStreamBufferSize = 1000; @@ -64,14 +66,25 @@ namespace System.Runtime.Remoting.Channels.Tcp byte[] dotnetHeader = _msgHeaders[(int) MessageStatus.MethodMessage]; networkStream.Write(dotnetHeader, 0, dotnetHeader.Length); + // Writes header tag (0x0000 if request stream, 0x0002 if response stream) + if(requestHeaders[CommonTransportKeys.RequestUri]!=null) buffer [0] = (byte) 0; + else buffer[0] = (byte) 2; + buffer [1] = (byte) 0 ; + + // Writes ID + buffer [2] = (byte) 0; + + // Writes assemblyID???? + buffer [3] = (byte) 0; + // Writes the length of the stream being sent (not including the headers) int num = (int)data.Length; - buffer [0] = (byte) num; - buffer [1] = (byte) (num >> 8); - buffer [2] = (byte) (num >> 16); - buffer [3] = (byte) (num >> 24); - networkStream.Write(buffer, 0, 4); - + buffer [4] = (byte) num; + buffer [5] = (byte) (num >> 8); + buffer [6] = (byte) (num >> 16); + buffer [7] = (byte) (num >> 24); + networkStream.Write(buffer, 0, 8); + // Writes the message headers SendHeaders (networkStream, requestHeaders, buffer); @@ -96,39 +109,79 @@ namespace System.Runtime.Remoting.Channels.Tcp private static void SendHeaders(Stream networkStream, ITransportHeaders requestHeaders, byte[] buffer) { - if (requestHeaders == null) - SendString (networkStream, "", buffer); - else + // Writes the headers as a sequence of strings + if (networkStream != null) { - // Writes the headers as a sequence of strings IEnumerator e = requestHeaders.GetEnumerator(); while (e.MoveNext()) { DictionaryEntry hdr = (DictionaryEntry)e.Current; - SendString (networkStream, hdr.Key.ToString(), buffer); + switch (hdr.Key.ToString()) + { + case CommonTransportKeys.RequestUri: + buffer[0] = 4; buffer[1] = 0; buffer[2] = 1; + networkStream.Write(buffer, 0, 3); + break; + case "Content-Type": + buffer[0] = 6; buffer[1] = 0; buffer[2] = 1; + networkStream.Write(buffer, 0, 3); + break; + default: + buffer[0] = 1; buffer[1] = 0; buffer[2] = 1; + networkStream.Write(buffer, 0, 3); + SendString (networkStream, hdr.Key.ToString(), buffer); + break; + } + networkStream.WriteByte (1); SendString (networkStream, hdr.Value.ToString(), buffer); } - SendString (networkStream, "", buffer); } + networkStream.WriteByte (0); // End of headers + networkStream.WriteByte (0); } public static ITransportHeaders ReceiveHeaders (Stream networkStream, byte[] buffer) { - TransportHeaders headers = new TransportHeaders(); + byte headerType; + headerType = (byte) networkStream.ReadByte (); + networkStream.ReadByte (); - string key = ReceiveString (networkStream, buffer); - while (key != string.Empty) + TransportHeaders headers = new TransportHeaders (); + + while (headerType != 0) { + string key; + networkStream.ReadByte (); // byte 1 + switch (headerType) + { + case 4: key = CommonTransportKeys.RequestUri; break; + case 6: key = "Content-Type"; break; + case 1: key = ReceiveString (networkStream, buffer); break; + default: throw new NotSupportedException ("Unknown header code: " + headerType); + } + networkStream.ReadByte (); // byte 1 headers[key] = ReceiveString (networkStream, buffer); - key = ReceiveString (networkStream, buffer); + + headerType = (byte) networkStream.ReadByte (); + networkStream.ReadByte (); } + return headers; } public static Stream ReceiveMessageStream (Stream networkStream, out ITransportHeaders headers, byte[] buffer) { + headers = null; + if (buffer == null) buffer = new byte[DefaultStreamBufferSize]; + // Reads header tag: 0 -> Stream with headers or 2 -> Response Stream + byte head = (byte)networkStream.ReadByte(); + byte c = (byte)networkStream.ReadByte(); + + c = (byte)networkStream.ReadByte(); + c = (byte)networkStream.ReadByte(); + // Gets the length of the data stream int nr = 0; while (nr < 4) @@ -138,7 +191,6 @@ namespace System.Runtime.Remoting.Channels.Tcp (buffer [2] << 16) | (buffer [3] << 24)); // Reads the headers - headers = ReceiveHeaders (networkStream, buffer); byte[] resultBuffer = new byte[byteCount]; @@ -146,6 +198,7 @@ namespace System.Runtime.Remoting.Channels.Tcp nr = 0; while (nr < byteCount) nr += networkStream.Read (resultBuffer, nr, byteCount - nr); + return new MemoryStream(resultBuffer); } @@ -198,6 +251,7 @@ namespace System.Runtime.Remoting.Channels.Tcp nr += networkStream.Read (buffer, nr, byteCount - nr); char[] chars = Encoding.UTF8.GetChars(buffer, 0, byteCount); + return new string(chars); } -- cgit v1.2.3