Ejemplo n.º 1
0
        public void HandleIncomingMessage(ChannelMessage msg)
        {
            ITransportHeaders responseHeaders;
            Stream            responseStream;
            IMessage          responseMsg;

            ServerChannelSinkStack stack = new ServerChannelSinkStack();

            stack.Push(this, msg);
            ServerProcessing proc = _nextSink.ProcessMessage(stack, null, msg.Headers, msg.Body, out responseMsg, out responseHeaders, out responseStream);

            // check the return value.
            switch (proc)
            {
            // this message has been handled synchronously
            case ServerProcessing.Complete:
                // send a response message

                ChannelMessage reply = new ChannelMessage(msg.From, msg.ID, responseHeaders, responseStream);
                ConnectionManager.SendMessage(reply);
                break;

            // this message has been handled asynchronously
            case ServerProcessing.Async:
                // nothing needs to be done yet
                break;

            // it's been a one way message
            case ServerProcessing.OneWay:
                // nothing needs to be done yet
                break;
            }
        }
Ejemplo n.º 2
0
        } // IServerChannelSink

        internal void ServiceRequest(Object state)
        {
            HttpServerSocketHandler streamManager = (HttpServerSocketHandler)state;

            ITransportHeaders headers       = streamManager.ReadHeaders();
            Stream            requestStream = streamManager.GetRequestStream();

            // process request
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, streamManager);

            IMessage          responseMessage;
            ITransportHeaders responseHeaders;
            Stream            responseStream;

            ServerProcessing processing =
                _nextSink.ProcessMessage(sinkStack, null, headers, requestStream,
                                         out responseMessage,
                                         out responseHeaders, out responseStream);

            // handle response
            switch (processing)
            {
            case ServerProcessing.Complete:
            {
                // Send the response. Call completed synchronously.
                sinkStack.Pop(this);
                streamManager.SendResponse(responseStream, "200", "OK", responseHeaders);
                break;
            } // case ServerProcessing.Complete

            case ServerProcessing.OneWay:
            {
                // Just send back a 200 OK
                streamManager.SendResponse(null, "202", "Accepted", responseHeaders);
                break;
            } // case ServerProcessing.OneWay

            case ServerProcessing.Async:
            {
                sinkStack.StoreAndDispatch(this, streamManager);
                break;
            } // case ServerProcessing.Async
            } // switch (processing)


            // async processing will take care if handling this later
            if (processing != ServerProcessing.Async)
            {
                if (streamManager.CanServiceAnotherRequest())
                {
                    streamManager.BeginReadMessage();
                }
                else
                {
                    streamManager.Close();
                }
            }
        } // ServiceRequest
Ejemplo n.º 3
0
        private void ProcessRequestInternal(Stream requestStream, GiopServerConnection serverCon)
        {
#if DEBUG
            OutputHelper.LogStream(requestStream);
#endif
            requestStream.Seek(0, SeekOrigin.Begin); // assure stream is read from beginning in formatter
            // the out params returned form later sinks
            IMessage          responseMsg;
            ITransportHeaders responseHeaders;
            Stream            responseStream;

            // create the sink stack for async processing of message
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();
            sinkStack.Push(this, serverCon);
            // empty transport headers for this protocol
            ITransportHeaders requestHeaders = new TransportHeaders();
            requestHeaders[GiopServerConnection.SERVER_TR_HEADER_KEY] = serverCon;
            requestHeaders[CommonTransportKeys.IPAddress]             = serverCon.TransportHandler.GetPeerAddress();

            // next sink will process the request-message
            ServerProcessing result =
                NextChannelSink.ProcessMessage(sinkStack, null, /* no RequestMessage in transport handler */
                                               requestHeaders, requestStream,
                                               out responseMsg, out responseHeaders,
                                               out responseStream);
            switch (result)
            {
            case ServerProcessing.Complete:
                try {
                    sinkStack.Pop(this);
                } catch (Exception) { }
#if DEBUG
                Debug.WriteLine("Send response sync");
                OutputHelper.LogStream(responseStream);
#endif
                serverCon.TransportHandler.SendResponse(responseStream);
                break;

            case ServerProcessing.Async:
                sinkStack.StoreAndDispatch(this, serverCon);     // this sink wants to handle response
                // no reply, async
                break;

            case ServerProcessing.OneWay:
                try {
                    sinkStack.Pop(this);
                } catch (Exception) { }
                // no message to send
                break;

            default:
                // should not arrive here
                Trace.WriteLine("internal problem, invalid processing state: " + result);
                throw new omg.org.CORBA.INTERNAL(568, omg.org.CORBA.CompletionStatus.Completed_MayBe);
            }
        }
Ejemplo n.º 4
0
        internal void HandleRequest(HttpListenerContext context)
        {
            //build the headers
            ITransportHeaders requestHeaders = new TransportHeaders();

            System.Collections.Specialized.NameValueCollection httpHeaders = context.Request.Headers;
            foreach (string key in httpHeaders.Keys)
            {
                requestHeaders[key] = httpHeaders[key];
            }

            //get an ID for this connection
            ContextWithId identitiedContext = new ContextWithId(context);

            requestHeaders[CommonTransportKeys.RequestUri]   = context.Request.Url.PathAndQuery;
            requestHeaders[CommonTransportKeys.IPAddress]    = context.Request.RemoteEndPoint.Address;
            requestHeaders[CommonTransportKeys.ConnectionId] = identitiedContext.ID;
            requestHeaders["__RequestVerb"] = context.Request.HttpMethod;
            requestHeaders["__HttpVersion"] = string.Format("HTTP/{0}.{1}",
                                                            context.Request.ProtocolVersion.Major, context.Request.ProtocolVersion.Minor);

            if (RemotingConfiguration.CustomErrorsEnabled(context.Request.IsLocal))
            {
                requestHeaders["__CustomErrorsEnabled"] = false;
            }

            IMessage          responseMsg;
            Stream            responseStream;
            ITransportHeaders responseHeaders;

            // attach the context as state so that our async handler can use it to send the response
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, identitiedContext);

            // NOTE: if we copy the InputStream before passing it so the sinks, the .NET formatters have
            // unspecified internal errors. Let's hope they don't need to seek the stream!
            ServerProcessing proc = nextSink.ProcessMessage(sinkStack, null, requestHeaders, context.Request.InputStream,
                                                            out responseMsg, out responseHeaders, out responseStream);

            switch (proc)
            {
            case ServerProcessing.Complete:
                WriteOut(context, responseHeaders, responseStream);
                context.Response.Close();
                break;

            case ServerProcessing.Async:
                break;

            case ServerProcessing.OneWay:
                context.Response.Close();
                break;
            }
        }
Ejemplo n.º 5
0
        internal ServerProcessing SynchronousDispatch(ITransportHeaders requestHeaders, Stream requestStream,
                                                      out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            IMessage      responseMsg;
            ContextWithId identitiedContext = new ContextWithId(null);

            // attach the context as state so that our async handler can use it to send the response
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, identitiedContext);

            return(nextSink.ProcessMessage(sinkStack, null, requestHeaders, requestStream,
                                           out responseMsg, out responseHeaders, out responseStream));
        }
Ejemplo n.º 6
0
        internal void InternalProcessMessage(ClientConnection connection, Stream stream)
        {
            // Reads the headers and the request stream

            Stream            requestStream;
            ITransportHeaders requestHeaders;

            requestStream = TcpMessageIO.ReceiveMessageStream(stream, out requestHeaders, connection.Buffer);
            requestHeaders [CommonTransportKeys.IPAddress]    = connection.ClientAddress;
            requestHeaders [CommonTransportKeys.ConnectionId] = connection.Id;

            string uri = (string)requestHeaders [CommonTransportKeys.RequestUri];

            TcpChannel.ParseChannelUrl(uri, out uri);

            if (uri != null)
            {
                requestHeaders [CommonTransportKeys.RequestUri] = uri;
            }

            // Pushes the connection object together with the sink. This information
            // will be used for sending the response in an async call.

            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, connection);

            ITransportHeaders responseHeaders;
            Stream            responseStream;
            IMessage          responseMsg;

            ServerProcessing proc = next_sink.ProcessMessage(sinkStack, null, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);

            switch (proc)
            {
            case ServerProcessing.Complete:
                TcpMessageIO.SendMessageStream(stream, responseStream, responseHeaders, connection.Buffer);
                stream.Flush();
                break;

            case ServerProcessing.Async:
            case ServerProcessing.OneWay:
                break;
            }
        }
Ejemplo n.º 7
0
        internal void ServiceRequest(object state)
        {
            IMessage                message;
            ITransportHeaders       headers2;
            Stream                  stream2;
            HttpServerSocketHandler handler        = (HttpServerSocketHandler)state;
            ITransportHeaders       requestHeaders = handler.ReadHeaders();
            Stream                  requestStream  = handler.GetRequestStream();

            requestHeaders["__CustomErrorsEnabled"] = handler.CustomErrorsEnabled();
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, handler);
            ServerProcessing processing = this._nextSink.ProcessMessage(sinkStack, null, requestHeaders, requestStream, out message, out headers2, out stream2);

            switch (processing)
            {
            case ServerProcessing.Complete:
                sinkStack.Pop(this);
                handler.SendResponse(stream2, "200", "OK", headers2);
                break;

            case ServerProcessing.OneWay:
                handler.SendResponse(null, "202", "Accepted", headers2);
                break;

            case ServerProcessing.Async:
                sinkStack.StoreAndDispatch(this, handler);
                break;
            }
            if (processing != ServerProcessing.Async)
            {
                if (handler.CanServiceAnotherRequest())
                {
                    handler.BeginReadMessage();
                }
                else
                {
                    handler.Close();
                }
            }
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Sends request into infrastructure, then passes back result.
        /// </summary>
        /// <param name="hdr">Header contain request.</param>
        private void handleRemotingRequest(StackHeader hdr)
        {
            IMessage          responseMsg;
            ITransportHeaders responseHeaders;
            Stream            responseStream;
            IMessage          req = hdr.Message;

            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            ProcessMessage(sinkStack, req, null, null, out responseMsg, out responseHeaders, out responseStream);

            //send response back down the stack
            Address     dest        = hdr.Source;
            Message     remotingMsg = new Message(dest, local_addr, null);
            StackHeader rspHdr      = new StackHeader(StackHeader.REMOTE_RSP, responseMsg, "");

            remotingMsg.putHeader(name, rspHdr);

            down(new Event(Event.MSG, remotingMsg));
        }
        internal void InternalProcessMessage(ClientConnection connection, Stream stream)
        {
            ITransportHeaders      transportHeader;
            ITransportHeaders      transportHeader1;
            Stream                 stream1;
            IMessage               message;
            Stream                 stream2 = UnixMessageIO.ReceiveMessageStream(stream, out transportHeader, connection.Buffer);
            ServerChannelSinkStack serverChannelSinkStack = new ServerChannelSinkStack();

            serverChannelSinkStack.Push(this, connection);
            switch (this.next_sink.ProcessMessage(serverChannelSinkStack, null, transportHeader, stream2, out message, out transportHeader1, out stream1))
            {
            case ServerProcessing.Complete:
            {
                UnixMessageIO.SendMessageStream(stream, stream1, transportHeader1, connection.Buffer);
                stream.Flush();
                break;
            }
            }
        }
        public void HandleRequest(HttpContext context)
        {
            IMessage             message;
            ITransportHeaders    headers2;
            Stream               stream2;
            HttpRequest          request        = context.Request;
            HttpResponse         httpResponse   = context.Response;
            BaseTransportHeaders requestHeaders = new BaseTransportHeaders();

            requestHeaders["__RequestVerb"]         = request.HttpMethod;
            requestHeaders["__CustomErrorsEnabled"] = HttpRemotingHandler.CustomErrorsEnabled(context);
            requestHeaders.RequestUri = (string)context.Items["__requestUri"];
            NameValueCollection headers = request.Headers;

            foreach (string str in headers.AllKeys)
            {
                string str2 = headers[str];
                requestHeaders[str] = str2;
            }
            requestHeaders.IPAddress = IPAddress.Parse(request.UserHostAddress);
            Stream inputStream = request.InputStream;
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, null);
            switch (this._nextSink.ProcessMessage(sinkStack, null, requestHeaders, inputStream, out message, out headers2, out stream2))
            {
            case ServerProcessing.Complete:
                this.SendResponse(httpResponse, 200, headers2, stream2);
                return;

            case ServerProcessing.OneWay:
                this.SendResponse(httpResponse, 0xca, headers2, stream2);
                break;

            case ServerProcessing.Async:
                break;

            default:
                return;
            }
        }
Ejemplo n.º 11
0
        internal void InternalProcessMessage(ClientConnection connection, Stream stream)
        {
            // Reads the headers and the request stream

            Stream            requestStream;
            ITransportHeaders requestHeaders;

            requestStream = UnixMessageIO.ReceiveMessageStream(stream, out requestHeaders, connection.Buffer);

/*            try {
 *            PeerCred cred = connection.Client.PeerCredential;
 *            requestHeaders["__uid"] = cred.UserID;
 *            } catch (Exception e) {
 *            Console.WriteLine ("Couldn't get the peer cred: " + e);
 *            }
 */
            // Pushes the connection object together with the sink. This information
            // will be used for sending the response in an async call.

            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, connection);

            ITransportHeaders responseHeaders;
            Stream            responseStream;
            IMessage          responseMsg;

            ServerProcessing proc = next_sink.ProcessMessage(sinkStack, null, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);

            switch (proc)
            {
            case ServerProcessing.Complete:
                UnixMessageIO.SendMessageStream(stream, responseStream, responseHeaders, connection.Buffer);
                stream.Flush();
                break;

            case ServerProcessing.Async:
            case ServerProcessing.OneWay:
                break;
            }
        }
Ejemplo n.º 12
0
        void ProcessMessage(IPEndPoint remote, ITransportHeaders requestHeaders, Stream requestStream)
        {
            // parse request uri
            var    url = requestHeaders[CommonTransportKeys.RequestUri].ToString();
            string objectUri;

            UdpChannelHelper.Parse(url, out objectUri);
            objectUri = objectUri ?? url;
            requestHeaders[CommonTransportKeys.RequestUri] = objectUri;

            IMessage          responseMsg;
            ITransportHeaders responseHeaders;
            Stream            responseStream;

            // process message
            var stack = new ServerChannelSinkStack();

            stack.Push(this, null);
            var operation = NextChannelSink.ProcessMessage(stack, null, requestHeaders, requestStream,
                                                           out responseMsg, out responseHeaders, out responseStream);

            switch (operation)
            {
            case ServerProcessing.Complete:
                stack.Pop(this);
                var transport = new UdpTransport(new UdpClient());
                transport.Write(responseHeaders, responseStream, remote);
                break;

            case ServerProcessing.Async:
                stack.StoreAndDispatch(NextChannelSink, null);
                break;

            case ServerProcessing.OneWay:
                break;
            }
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Handles incoming message (message, response or event).
        /// </summary>
        /// <param name="message">The message to handle.</param>
        public void HandleIncomingMessage(Message message)
        {
            BinaryLogWriter binaryLogWriter = message.ITransportContext.BinaryLogWriter;

            try
            {
                ServerChannelSinkStack stack = new ServerChannelSinkStack();
                stack.Push(this, message);

                ITransportHeaders responseHeaders;
                Stream            responseStream;
                IMessage          responseMsg;

                // FIX: 2.5.8 removing the application name from the object URI
                string applicationName = RemotingConfiguration.ApplicationName;
                if (applicationName != null)
                {
                    string uri = (string)message.ITransportHeaders["__RequestUri"];
                    if (uri.Length > applicationName.Length && uri.StartsWith(applicationName))
                    {
                        int sizeToBeCut = applicationName.Length + (uri[applicationName.Length] == '/' ? 1 : 0);
                        uri = uri.Substring(sizeToBeCut);
                        message.ITransportHeaders["__RequestUri"] = uri;
                    }
                }

                message.ITransportHeaders["__CustomErrorsEnabled"]       = false;
                message.ITransportHeaders[CommonTransportKeys.IPAddress] = message.Sender.PhysicalAddress is IPEndPoint ? ((IPEndPoint)message.Sender.PhysicalAddress).Address : message.Sender.PhysicalAddress;

                // LOG: put down the log record
                if (binaryLogWriter != null && binaryLogWriter[LogCategory.MessageProcessing] > 0)
                {
                    binaryLogWriter.WriteEvent(LogCategory.MessageProcessing, "GenuineUniversalServerTransportSink.HandleIncomingMessage",
                                               LogMessageType.MessageRequestInvoking, null, message, message.Sender,
                                               null,
                                               GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                               null, null, -1, GenuineUtility.TickCount, 0, 0, null, null, null, null,
                                               "The .NET Remoting request is being invoked.");
                }

                ServerProcessing serverProcessing = this._nextChannelSink.ProcessMessage(stack, null, message.ITransportHeaders, message.Stream, out responseMsg, out responseHeaders, out responseStream);

                switch (serverProcessing)
                {
                case ServerProcessing.Complete:
                    Message reply = new Message(message, responseHeaders, responseStream);

                    // LOG: put down the log record
                    if (binaryLogWriter != null && binaryLogWriter[LogCategory.MessageProcessing] > 0)
                    {
                        string invocationTarget = responseMsg.Properties["__Uri"] as string;
                        string methodName       = BinaryLogWriter.ParseInvocationMethod(responseMsg.Properties["__MethodName"] as string, responseMsg.Properties["__TypeName"] as string);
                        binaryLogWriter.WriteMessageCreatedEvent("GenuineUniversalServerTransportSink.HandleIncomingMessage",
                                                                 LogMessageType.MessageCreated, null, reply, false, reply.Recipient,
                                                                 this.ITransportContext.BinaryLogWriter[LogCategory.MessageProcessing] > 1 ? reply.Stream : null,
                                                                 invocationTarget, methodName,
                                                                 GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name, null, -1, -1, null, -1, null,
                                                                 "The response message has been created.");

                        reply.ITransportHeaders[Message.TransportHeadersInvocationTarget] = invocationTarget;
                        reply.ITransportHeaders[Message.TransportHeadersMethodName]       = methodName;

                        binaryLogWriter.WriteEvent(LogCategory.MessageProcessing, "GenuineUniversalServerTransportSink.HandleIncomingMessage",
                                                   LogMessageType.MessageRequestInvoked, null, reply, message.Sender,
                                                   null,
                                                   GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                                   null, null, -1, GenuineUtility.TickCount, 0, message.SeqNo, null, null, null, null,
                                                   "The .NET Remoting invocation has been performed.");
                    }

                    message.ITransportContext.ConnectionManager.Send(reply);
                    break;

                case ServerProcessing.Async:
                    // asyncProcessResponse will be called later
                    break;

                case ServerProcessing.OneWay:
                    // LOG: put down the log record
                    if (binaryLogWriter != null && binaryLogWriter[LogCategory.MessageProcessing] > 0)
                    {
                        binaryLogWriter.WriteEvent(LogCategory.MessageProcessing, "GenuineUniversalServerTransportSink.HandleIncomingMessage",
                                                   LogMessageType.MessageRequestInvoked, null, null, message.Sender,
                                                   null,
                                                   GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                                   null, null, -1, GenuineUtility.TickCount, 0, message.SeqNo, null, null, null, null,
                                                   "One-way .NET Remoting invocation has been performed. No response is available.");
                    }
                    break;
                }
            }
            catch (Exception ex)
            {
                try
                {
                    // LOG: put down the log record
                    if (binaryLogWriter != null && binaryLogWriter[LogCategory.MessageProcessing] > 0)
                    {
                        binaryLogWriter.WriteEvent(LogCategory.MessageProcessing, "GenuineUniversalServerTransportSink.HandleIncomingMessage",
                                                   LogMessageType.MessageRequestInvoking, ex, message, message.Sender,
                                                   null,
                                                   GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                                   null, null, -1, 0, 0, 0, null, null, null, null,
                                                   "The .NET Remoting request resulted in exception. The exception is being sent back.");
                    }

                    // return this exception as a result
                    BinaryFormatter      binaryFormatter     = new BinaryFormatter();
                    GenuineChunkedStream serializedException = new GenuineChunkedStream(false);
                    binaryFormatter.Serialize(serializedException, ex);

                    Message reply = new Message(message, new TransportHeaders(), serializedException);
                    reply.ContainsSerializedException = true;
                    this.ITransportContext.ConnectionManager.Send(reply);
                }
                catch (Exception internalEx)
                {
                    // It's a destiny not to deliver an exception back to the caller

                    // LOG: put down the log record
                    if (binaryLogWriter != null && binaryLogWriter[LogCategory.MessageProcessing] > 0)
                    {
                        binaryLogWriter.WriteEvent(LogCategory.MessageProcessing, "GenuineUniversalServerTransportSink.HandleIncomingMessage",
                                                   LogMessageType.MessageRequestInvoking, internalEx, message, message.Sender,
                                                   null,
                                                   GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                                   null, null, -1, 0, 0, 0, null, null, null, null,
                                                   "The source exception cannot be sent over the network. Both exceptions are ignored.");
                    }
                }
            }
        }
Ejemplo n.º 14
0
        private void ProcessMessage(object waitCallbackState)
        {
            var requestMessage = (NullMessages.RequestMessage)waitCallbackState;

            // replace full url with object url
            var    url = requestMessage.RequestHeaders[CommonTransportKeys.RequestUri].ToString();
            string objectUri;

            NullChannel.ParseUrl(url, out objectUri);
            objectUri = objectUri ?? url;
            requestMessage.RequestHeaders[CommonTransportKeys.RequestUri] = objectUri;
            requestMessage.Message.Properties["__Uri"] = objectUri;

            // add client address property for compatibility
            var callContext = requestMessage.Message.Properties["__CallContext"] as LogicalCallContext;

            callContext.SetData(ClientAddressSink.CallContextSlotName, IPAddress.Loopback);

            IMessage          responseMsg;
            ITransportHeaders responseHeaders;
            Stream            responseStream;

            // create sink stack to process request message
            var stack = new ServerChannelSinkStack();

            stack.Push(this, null);

            // process request message
            ServerProcessing serverProcessing;

            if (NextChannelSink != null)
            {
                // full processing mode, with deserialization
                serverProcessing = NextChannelSink.ProcessMessage(stack, null,
                                                                  requestMessage.RequestHeaders, requestMessage.RequestStream,
                                                                  out responseMsg, out responseHeaders, out responseStream);
            }
            else
            {
                // fast processing mode, bypassing deserialization
                serverProcessing = ChannelServices.DispatchMessage(stack, requestMessage.Message, out responseMsg);
                responseHeaders  = null;
                responseStream   = null;
            }

            // send back the reply
            switch (serverProcessing)
            {
            case ServerProcessing.Complete:
                stack.Pop(this);
                NullMessages.AddResponse(requestMessage, new NullMessages.ResponseMessage
                {
                    Message         = responseMsg,
                    ResponseHeaders = responseHeaders,
                    ResponseStream  = responseStream
                });
                break;

            case ServerProcessing.Async:
                stack.StoreAndDispatch(NextChannelSink, null);
                break;

            case ServerProcessing.OneWay:
                stack.Pop(this);
                break;
            }
        }
Ejemplo n.º 15
0
		internal ServerProcessing SynchronousDispatch (ITransportHeaders requestHeaders, Stream requestStream,
			out ITransportHeaders responseHeaders, out Stream responseStream)
		{
			IMessage responseMsg;
			ContextWithId identitiedContext = new ContextWithId (null);
			
			// attach the context as state so that our async handler can use it to send the response
			ServerChannelSinkStack sinkStack = new ServerChannelSinkStack ();
			sinkStack.Push (this, identitiedContext);
			
			return nextSink.ProcessMessage (sinkStack, null, requestHeaders, requestStream, 
				out responseMsg, out responseHeaders, out responseStream);
		}
        } // TcpServerTransportSink

        internal void ServiceRequest(Object state)
        {
            TcpServerSocketHandler streamManager = (TcpServerSocketHandler)state;

            ITransportHeaders headers       = streamManager.ReadHeaders();
            Stream            requestStream = streamManager.GetRequestStream();

            headers["__CustomErrorsEnabled"] = streamManager.CustomErrorsEnabled();

            // process request
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, streamManager);

            IMessage          responseMessage;
            ITransportHeaders responseHeaders;
            Stream            responseStream;

#if !FEATURE_PAL
            // If Impersonation was requested impersonate the client identity
            WindowsIdentity             identity = streamManager.ImpersonationIdentity;
            WindowsImpersonationContext context  = null;
            IPrincipal oldPrincipal     = null;
            bool       principalChanged = false;
            if (identity != null)
            {
                oldPrincipal     = Thread.CurrentPrincipal;
                principalChanged = true;
                if (_impersonate)
                {
                    Thread.CurrentPrincipal = new WindowsPrincipal(identity);
                    context = identity.Impersonate();
                }
                else
                {
                    Thread.CurrentPrincipal = new GenericPrincipal(identity, null);
                }
            }
#endif // !FEATURE_PAL
            ServerProcessing processing;
            // wrap Undo in an outer try block
            try{
                try{
                    processing =
                        _nextSink.ProcessMessage(sinkStack, null, headers, requestStream,
                                                 out responseMessage,
                                                 out responseHeaders, out responseStream);
                }
                finally{
    #if !FEATURE_PAL
                    // Revert the principal if we had changed the principal
                    if (principalChanged)
                    {
                        Thread.CurrentPrincipal = oldPrincipal;
                    }
                    // Revert the impersonation if we had impersonated
                    if (_impersonate)
                    {
                        context.Undo();
                    }
    #endif // !FEATURE_PAL
                }
            }
            catch { throw; }

            // handle response
            switch (processing)
            {
            case ServerProcessing.Complete:
            {
                // Send the response. Call completed synchronously.
                sinkStack.Pop(this);
                streamManager.SendResponse(responseHeaders, responseStream);
                break;
            } // case ServerProcessing.Complete

            case ServerProcessing.OneWay:
            {
                // No response needed, but the following method will make sure that
                //   we send at least a skeleton reply if the incoming request was
                //   not marked OneWayRequest (client/server metadata could be out of
                //   [....]).
                streamManager.SendResponse(responseHeaders, responseStream);
                break;
            } // case ServerProcessing.OneWay

            case ServerProcessing.Async:
            {
                sinkStack.StoreAndDispatch(this, streamManager);
                break;
            } // case ServerProcessing.Async
            } // switch (processing)


            // async processing will take care if handling this later
            if (processing != ServerProcessing.Async)
            {
                if (streamManager.CanServiceAnotherRequest())
                {
                    streamManager.BeginReadMessage();
                }
                else
                {
                    streamManager.Close();
                }
            }
        } // ServiceRequest
        internal void ServiceRequest(object state)
        {
            ITransportHeaders      headers2;
            Stream                 stream2;
            ServerProcessing       processing;
            TcpServerSocketHandler handler        = (TcpServerSocketHandler)state;
            ITransportHeaders      requestHeaders = handler.ReadHeaders();
            Stream                 requestStream  = handler.GetRequestStream();

            requestHeaders["__CustomErrorsEnabled"] = handler.CustomErrorsEnabled();
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, handler);
            WindowsIdentity             impersonationIdentity = handler.ImpersonationIdentity;
            WindowsImpersonationContext context = null;
            IPrincipal currentPrincipal         = null;
            bool       flag = false;

            if (impersonationIdentity != null)
            {
                currentPrincipal = Thread.CurrentPrincipal;
                flag             = true;
                if (this._impersonate)
                {
                    Thread.CurrentPrincipal = new WindowsPrincipal(impersonationIdentity);
                    context = impersonationIdentity.Impersonate();
                }
                else
                {
                    Thread.CurrentPrincipal = new GenericPrincipal(impersonationIdentity, null);
                }
            }
            try
            {
                try
                {
                    IMessage message;
                    processing = this._nextSink.ProcessMessage(sinkStack, null, requestHeaders, requestStream, out message, out headers2, out stream2);
                }
                finally
                {
                    if (flag)
                    {
                        Thread.CurrentPrincipal = currentPrincipal;
                    }
                    if (this._impersonate)
                    {
                        context.Undo();
                    }
                }
            }
            catch
            {
                throw;
            }
            switch (processing)
            {
            case ServerProcessing.Complete:
                sinkStack.Pop(this);
                handler.SendResponse(headers2, stream2);
                break;

            case ServerProcessing.OneWay:
                handler.SendResponse(headers2, stream2);
                break;

            case ServerProcessing.Async:
                sinkStack.StoreAndDispatch(this, handler);
                break;
            }
            if (processing != ServerProcessing.Async)
            {
                if (handler.CanServiceAnotherRequest())
                {
                    handler.BeginReadMessage();
                }
                else
                {
                    handler.Close();
                }
            }
        }
Ejemplo n.º 18
0
        internal void ServiceRequest(Object state)
        {
            IpcServerHandler ipcServerHandler = (IpcServerHandler)state;

            // Read the headers from the stream, using the header size in the message
            ITransportHeaders headers = ipcServerHandler.ReadHeaders();

            // Get the request Stream
            Stream requestStream = ipcServerHandler.GetRequestStream();

            // customErrors should be disabled, since we are on the same machine
            headers["__CustomErrorsEnabled"] = false;

            // process request
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, ipcServerHandler);

            IMessage          responseMessage = null;
            ITransportHeaders responseHeaders = null;
            Stream            responseStream  = null;
            WindowsIdentity   identity        = null;
            IPrincipal        oldPrincipal    = null;
            bool             impersonated     = false;
            bool             principalChanged = false;
            ServerProcessing processing       = ServerProcessing.Complete;

            try{
                if (_secure)
                {
                    IpcPort port = ipcServerHandler.Port;
                    port.ImpersonateClient();
                    oldPrincipal     = Thread.CurrentPrincipal;
                    principalChanged = true;
                    impersonated     = true;
                    identity         = WindowsIdentity.GetCurrent();
                    // If the authentication mode is to identify callers only revert the impersonation immediately
                    if (!_impersonate)
                    {
                        NativePipe.RevertToSelf();
                        Thread.CurrentPrincipal = new GenericPrincipal(identity, null);
                        impersonated            = false;
                    }
                    else
                    {
                        if (identity.ImpersonationLevel == TokenImpersonationLevel.Impersonation ||
                            identity.ImpersonationLevel == TokenImpersonationLevel.Delegation)
                        {
                            // Set the current principal
                            Thread.CurrentPrincipal = new WindowsPrincipal(identity);
                        }
                        else
                        {
                            throw new RemotingException(CoreChannel.GetResourceString(
                                                            "Remoting_Ipc_TokenImpersonationFailure"));
                        }
                    }
                }

                processing =
                    _nextSink.ProcessMessage(sinkStack, null, headers, requestStream,
                                             out responseMessage,
                                             out responseHeaders, out responseStream);
            }
            catch (Exception e) {
                ipcServerHandler.CloseOnFatalError(e);
            }
            finally{
                // Revert the principal if we had changed the principal
                if (principalChanged)
                {
                    Thread.CurrentPrincipal = oldPrincipal;
                }
                // Revert the impersonation if we had impersonated
                if (impersonated)
                {
                    NativePipe.RevertToSelf();
                    impersonated = false;
                }
            }

            // handle response
            switch (processing)
            {
            case ServerProcessing.Complete:
            {
                // Send the response. Call completed synchronously.
                sinkStack.Pop(this);
                // Send the response back to the client
                ipcServerHandler.SendResponse(responseHeaders, responseStream);
                break;
            } // case ServerProcessing.Complete

            case ServerProcessing.OneWay:
            {
                // No response needed, but the following method will make sure that
                //   we send at least a skeleton reply if the incoming request was
                //   not marked OneWayRequest (client/server metadata could be out of
                //   [....]).
                ipcServerHandler.SendResponse(responseHeaders, responseStream);
                break;
            } // case ServerProcessing.OneWay

            case ServerProcessing.Async:
            {
                sinkStack.StoreAndDispatch(this, ipcServerHandler);
                break;
            } // case ServerProcessing.Async
            } // switch (processing)

            // Start waiting for the next request
            if (processing != ServerProcessing.Async)
            {
                ipcServerHandler.BeginReadMessage();
            }
        } // ServiceRequest
Ejemplo n.º 19
0
		internal void HandleRequest (HttpListenerContext context)
		{
			//build the headers
			ITransportHeaders requestHeaders = new TransportHeaders ();
			System.Collections.Specialized.NameValueCollection httpHeaders = context.Request.Headers;
			foreach (string key in httpHeaders.Keys) {
				requestHeaders[key] = httpHeaders[key];
			}

			//get an ID for this connection
			ContextWithId identitiedContext = new ContextWithId (context);

			requestHeaders[CommonTransportKeys.RequestUri] = context.Request.Url.PathAndQuery;
			requestHeaders[CommonTransportKeys.IPAddress] = context.Request.RemoteEndPoint.Address;
			requestHeaders[CommonTransportKeys.ConnectionId] = identitiedContext.ID;
			requestHeaders["__RequestVerb"] = context.Request.HttpMethod;
			requestHeaders["__HttpVersion"] = string.Format ("HTTP/{0}.{1}",
				context.Request.ProtocolVersion.Major, context.Request.ProtocolVersion.Minor);

			if (RemotingConfiguration.CustomErrorsEnabled (context.Request.IsLocal))
				requestHeaders["__CustomErrorsEnabled"] = false;

			IMessage responseMsg;
			Stream responseStream;
			ITransportHeaders responseHeaders;
			
			// attach the context as state so that our async handler can use it to send the response
			ServerChannelSinkStack sinkStack = new ServerChannelSinkStack ();
			sinkStack.Push (this, identitiedContext);

			// NOTE: if we copy the InputStream before passing it so the sinks, the .NET formatters have 
			// unspecified internal errors. Let's hope they don't need to seek the stream!
			ServerProcessing proc = nextSink.ProcessMessage (sinkStack, null, requestHeaders, context.Request.InputStream, 
				out responseMsg, out responseHeaders, out responseStream);
			
			switch (proc) {
			case ServerProcessing.Complete:
				WriteOut (context, responseHeaders, responseStream);
				context.Response.Close ();
				break;

			case ServerProcessing.Async:
				break;

			case ServerProcessing.OneWay:
				context.Response.Close ();
				break;
			}

		}
Ejemplo n.º 20
0
        public virtual IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
        {
            IMethodCallMessage mcm1        = (IMethodCallMessage)msg;
            IMessageCtrl       messageCtrl = (IMessageCtrl)null;
            IMessage           msg1        = (IMessage)null;
            LogicalCallContext callCtx1    = (LogicalCallContext)null;
            bool flag = false;

            try
            {
                try
                {
                    LogicalCallContext logicalCallContext1 = (LogicalCallContext)mcm1.Properties[(object)Message.CallContextKey];
                    object             server = this._server;
                    StackBuilderSink.VerifyIsOkToCallMethod(server, (IMethodMessage)mcm1);
                    callCtx1 = CallContext.SetLogicalCallContext(logicalCallContext1);
                    flag     = true;
                    IMessage msg2 = msg;
                    logicalCallContext1.PropagateIncomingHeadersToCallContext(msg2);
                    LogicalCallContext threadCallContext = callCtx1;
                    StackBuilderSink.PreserveThreadPrincipalIfNecessary(logicalCallContext1, threadCallContext);
                    ServerChannelSinkStack channelSinkStack = msg.Properties[(object)"__SinkStack"] as ServerChannelSinkStack;
                    if (channelSinkStack != null)
                    {
                        channelSinkStack.ServerObject = server;
                    }
                    MethodBase methodBase = StackBuilderSink.GetMethodBase((IMethodMessage)mcm1);
                    object[]   outArgs1   = (object[])null;
                    RemotingMethodCachedData reflectionCachedData = InternalRemotingServices.GetReflectionCachedData(methodBase);
                    object[] args = Message.CoerceArgs((IMethodMessage)mcm1, reflectionCachedData.Parameters);
                    object   obj  = this.PrivateProcessMessage(methodBase.MethodHandle, args, server, out outArgs1);
                    this.CopyNonByrefOutArgsFromOriginalArgs(reflectionCachedData, args, ref outArgs1);
                    if (replySink != null)
                    {
                        LogicalCallContext logicalCallContext2 = Thread.CurrentThread.GetMutableExecutionContext().LogicalCallContext;
                        if (logicalCallContext2 != null)
                        {
                            logicalCallContext2.RemovePrincipalIfNotSerializable();
                        }
                        object             ret          = obj;
                        object[]           outArgs2     = outArgs1;
                        int                outArgsCount = outArgs2 == null ? 0 : outArgs1.Length;
                        LogicalCallContext callCtx2     = logicalCallContext2;
                        IMethodCallMessage mcm2         = mcm1;
                        msg1 = (IMessage) new ReturnMessage(ret, outArgs2, outArgsCount, callCtx2, mcm2);
                        logicalCallContext2.PropagateOutgoingHeadersToMessage(msg1);
                    }
                }
                catch (Exception ex)
                {
                    if (replySink != null)
                    {
                        msg1 = (IMessage) new ReturnMessage(ex, mcm1);
                        ((ReturnMessage)msg1).SetLogicalCallContext((LogicalCallContext)mcm1.Properties[(object)Message.CallContextKey]);
                    }
                }
                finally
                {
                    if (replySink != null)
                    {
                        replySink.SyncProcessMessage(msg1);
                    }
                }
            }
            finally
            {
                if (flag)
                {
                    CallContext.SetLogicalCallContext(callCtx1);
                }
            }
            return(messageCtrl);
        }
        public virtual IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
        {
            IMethodCallMessage message           = (IMethodCallMessage)msg;
            IMessageCtrl       ctrl              = null;
            IMessage           message2          = null;
            LogicalCallContext threadCallContext = null;
            bool flag = false;

            try
            {
                try
                {
                    try
                    {
                        LogicalCallContext callCtx = (LogicalCallContext)message.Properties[Message.CallContextKey];
                        object             server  = this._server;
                        VerifyIsOkToCallMethod(server, message);
                        threadCallContext = CallContext.SetLogicalCallContext(callCtx);
                        flag = true;
                        callCtx.PropagateIncomingHeadersToCallContext(msg);
                        PreserveThreadPrincipalIfNecessary(callCtx, threadCallContext);
                        ServerChannelSinkStack stack = msg.Properties["__SinkStack"] as ServerChannelSinkStack;
                        if (stack != null)
                        {
                            stack.ServerObject = server;
                        }
                        MethodBase methodBase = GetMethodBase(message);
                        object[]   outArgs    = null;
                        object     ret        = null;
                        RemotingMethodCachedData reflectionCachedData = InternalRemotingServices.GetReflectionCachedData(methodBase);
                        object[] args = Message.CoerceArgs(message, reflectionCachedData.Parameters);
                        ret = this.PrivateProcessMessage(methodBase.MethodHandle, args, server, 0, false, out outArgs);
                        this.CopyNonByrefOutArgsFromOriginalArgs(reflectionCachedData, args, ref outArgs);
                        if (replySink != null)
                        {
                            LogicalCallContext logicalCallContext = CallContext.GetLogicalCallContext();
                            if (logicalCallContext != null)
                            {
                                logicalCallContext.RemovePrincipalIfNotSerializable();
                            }
                            message2 = new ReturnMessage(ret, outArgs, (outArgs == null) ? 0 : outArgs.Length, logicalCallContext, message);
                            logicalCallContext.PropagateOutgoingHeadersToMessage(message2);
                        }
                        return(ctrl);
                    }
                    catch (Exception exception)
                    {
                        if (replySink != null)
                        {
                            message2 = new ReturnMessage(exception, message);
                            ((ReturnMessage)message2).SetLogicalCallContext((LogicalCallContext)message.Properties[Message.CallContextKey]);
                        }
                    }
                    return(ctrl);
                }
                finally
                {
                    if (replySink != null)
                    {
                        replySink.SyncProcessMessage(message2);
                    }
                }
            }
            finally
            {
                if (flag)
                {
                    CallContext.SetLogicalCallContext(threadCallContext);
                }
            }
            return(ctrl);
        }
        public virtual IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
        {
            IMethodCallMessage methodCallMessage  = (IMethodCallMessage)msg;
            IMessageCtrl       result             = null;
            IMessage           message            = null;
            LogicalCallContext logicalCallContext = null;
            bool flag = false;

            try
            {
                try
                {
                    LogicalCallContext logicalCallContext2 = (LogicalCallContext)methodCallMessage.Properties[Message.CallContextKey];
                    object             server = this._server;
                    StackBuilderSink.VerifyIsOkToCallMethod(server, methodCallMessage);
                    logicalCallContext = CallContext.SetLogicalCallContext(logicalCallContext2);
                    flag = true;
                    logicalCallContext2.PropagateIncomingHeadersToCallContext(msg);
                    StackBuilderSink.PreserveThreadPrincipalIfNecessary(logicalCallContext2, logicalCallContext);
                    ServerChannelSinkStack serverChannelSinkStack = msg.Properties["__SinkStack"] as ServerChannelSinkStack;
                    if (serverChannelSinkStack != null)
                    {
                        serverChannelSinkStack.ServerObject = server;
                    }
                    MethodBase methodBase = StackBuilderSink.GetMethodBase(methodCallMessage);
                    object[]   array      = null;
                    RemotingMethodCachedData reflectionCachedData = InternalRemotingServices.GetReflectionCachedData(methodBase);
                    object[] args = Message.CoerceArgs(methodCallMessage, reflectionCachedData.Parameters);
                    object   ret  = this.PrivateProcessMessage(methodBase.MethodHandle, args, server, out array);
                    this.CopyNonByrefOutArgsFromOriginalArgs(reflectionCachedData, args, ref array);
                    if (replySink != null)
                    {
                        LogicalCallContext logicalCallContext3 = Thread.CurrentThread.GetMutableExecutionContext().LogicalCallContext;
                        if (logicalCallContext3 != null)
                        {
                            logicalCallContext3.RemovePrincipalIfNotSerializable();
                        }
                        message = new ReturnMessage(ret, array, (array == null) ? 0 : array.Length, logicalCallContext3, methodCallMessage);
                        logicalCallContext3.PropagateOutgoingHeadersToMessage(message);
                    }
                }
                catch (Exception e)
                {
                    if (replySink != null)
                    {
                        message = new ReturnMessage(e, methodCallMessage);
                        ((ReturnMessage)message).SetLogicalCallContext((LogicalCallContext)methodCallMessage.Properties[Message.CallContextKey]);
                    }
                }
                finally
                {
                    if (replySink != null)
                    {
                        replySink.SyncProcessMessage(message);
                    }
                }
            }
            finally
            {
                if (flag)
                {
                    CallContext.SetLogicalCallContext(logicalCallContext);
                }
            }
            return(result);
        }
Ejemplo n.º 23
0
        private IMessage MessageDispatcher(IMessage iMsgReq, Stream requestStream)
        {
            IMessage iMsgRsp = null;

            if (iMsgReq.Properties["__Uri"] != null)
            {
                // parse url address
                string   strObjectUrl = iMsgReq.Properties["__Uri"].ToString();
                string[] urlpath      = strObjectUrl.Split(';');
                string[] s            = urlpath[0].Split('/');

                // check endpoint
                if (urlpath.Length == 1 && s.Length == 1)
                {
                    //this is an end channel
                    Trace.WriteLine(string.Format("[{0}]MSMQChannel.Receiver.MessageDispatcher: Local endpoint={1}",
                                                  ChannelName, strObjectUrl));

                    // channel
                    Receiver rcv = this as Receiver;

                    // stack
                    ServerChannelSinkStack stack = new ServerChannelSinkStack();
                    stack.Push(rcv.TransportSink, null);

                    // request (workaround)
                    ITransportHeaders requestHeaders = null;
                    if (iMsgReq.Properties.Contains("__RequestHeaders"))
                    {
                        requestHeaders = iMsgReq.Properties["__RequestHeaders"] as ITransportHeaders;
                    }
                    else
                    {
                        requestHeaders = new TransportHeaders();
                        requestHeaders["__ContentType"] = "application/octet-stream";
                    }
                    requestHeaders["__RequestUri"] = "/" + strObjectUrl;
                    requestStream.Position         = 0;

                    // response
                    Stream            responseStream  = null;
                    ITransportHeaders responseHeaders = null;

                    // skip the transport sink
                    rcv.TransportSink.NextChannelSink.ProcessMessage(stack, null, requestHeaders, requestStream,
                                                                     out iMsgRsp, out responseHeaders, out responseStream);
                }
                else
                {
                    // chaining channel
                    string       strDummy = null;
                    IMessageSink sink     = null;

                    // find a properly channel
                    foreach (IChannel ch in ChannelServices.RegisteredChannels)
                    {
                        if (ch is IChannelSender)
                        {
                            IChannelSender iChannelSender = ch as IChannelSender;
                            sink = iChannelSender.CreateMessageSink(strObjectUrl, null, out strDummy);
                            if (sink != null)
                            {
                                //this is a next channel
                                Trace.WriteLine(string.Format("[{0}]MSMQChannel.Receiver.MessageDispatcher: Chained channel is url={1}",
                                                              ChannelName, strObjectUrl));
                                break;
                            }
                        }
                    }

                    if (sink == null)
                    {
                        //no channel found it
                        string strError = string.Format("[{0}]MSMQChannel.Receiver.MessageDispatcher: A supported channel could not be found for {1}",
                                                        ChannelName, strObjectUrl);
                        iMsgRsp = new ReturnMessage(new Exception(strError), (IMethodCallMessage)iMsgReq);
                        Trace.WriteLine(strError);
                    }
                    else
                    {
                        //check for an oneway attribute
                        IMethodCallMessage mcm = iMsgReq as IMethodCallMessage;

                        if (RemotingServices.IsOneWay(mcm.MethodBase) == true)
                        {
                            iMsgRsp = (IMessage)sink.AsyncProcessMessage(iMsgReq, null);
                        }
                        else
                        {
                            iMsgRsp = sink.SyncProcessMessage(iMsgReq);
                        }
                    }
                }
            }
            else
            {
                //exception
                Exception ex = new Exception(string.Format("[{0}]MSMQChannel.Receiver.MessageDispatcher: The Uri address is null", ChannelName));
                iMsgRsp = new ReturnMessage(ex, (IMethodCallMessage)iMsgReq);
            }

            // check the response message
            if (iMsgRsp != null)
            {
                IMethodReturnMessage mrm = iMsgRsp as IMethodReturnMessage;
                if (mrm.Exception != null)
                {
                    throw mrm.Exception;
                }
            }

            return(iMsgRsp);
        }
Ejemplo n.º 24
0
        void ProcessClient(object state)
        {
            try
            {
                NamedPipeSocket socket = (NamedPipeSocket)state;

                ITransportHeaders requestHeaders;
                Stream            requestStream;

                IpcTransport t = new IpcTransport(socket);
                t.Read(out requestHeaders, out requestStream);

                // parse the RequestUri
                string objectUri;
                string uri = (string)requestHeaders[CommonTransportKeys.RequestUri];
                IpcChannelHelper.Parse(uri, out objectUri);
                if (objectUri == null)
                {
                    objectUri = uri;
                }
                requestHeaders[CommonTransportKeys.RequestUri] = objectUri;

                ServerChannelSinkStack stack = new ServerChannelSinkStack();
                stack.Push(this, null);

                IMessage          responseMsg;
                ITransportHeaders responseHeaders;
                Stream            responseStream;

                requestHeaders["__CustomErrorsEnabled"] = false;

                if (impersonate)
                {
                    // TODO: Impersonate might throw exceptions. What to do with them?
                    socket.Impersonate();
                }

                ServerProcessing op = nextSink.ProcessMessage(
                    stack,
                    null,
                    requestHeaders,
                    requestStream,
                    out responseMsg,
                    out responseHeaders,
                    out responseStream
                    );

                if (impersonate)
                {
                    NamedPipeSocket.RevertToSelf();
                }

                switch (op)
                {
                case ServerProcessing.Complete:
                    stack.Pop(this);
                    // send the response headers and the response data to the client
                    t.Write(responseHeaders, responseStream);
                    break;

                case ServerProcessing.Async:
                    stack.StoreAndDispatch(nextSink, null);
                    break;

                case ServerProcessing.OneWay:
                    break;
                }
            }
            catch (Exception)
            {
                // Console.WriteLine(ex);
            }
        }
Ejemplo n.º 25
0
        public void ProcessRequest(IConnection connection)
        {
            // parameters validation
            if (connection == null)
            {
                throw new ArgumentNullException("connection");
            }

            // receive request
            ITransportHeaders requestHeaders;
            Stream            requestStream;

            connection.ReceiveRequest(out requestHeaders, out requestStream);

            // create sink stack for request processing
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, connection);                   // save connection as state

            // process request
            ServerProcessing     processing;
            IMethodReturnMessage methodReturn    = null;
            ITransportHeaders    responseHeaders = null;
            Stream responseStream = null;

            try
            {
                // call next sink to dispatch method call
                IMessage responseMsg;
                processing = _nextSink.ProcessMessage(sinkStack,
                                                      null, requestHeaders, requestStream,
                                                      out responseMsg, out responseHeaders, out responseStream);

                if (processing == ServerProcessing.Complete)
                {
                    // response headers and stream can not be null at this point!
                    if (responseHeaders == null)
                    {
                        throw new ArgumentNullException("responseHeaders");
                    }
                    if (responseStream == null)
                    {
                        throw new ArgumentNullException("responseStream");
                    }

                    // check response
                    methodReturn = responseMsg as IMethodReturnMessage;
                    if (methodReturn == null)
                    {
                        throw new NotSupportedException();
                    }
                }
            }
            catch (Exception ex)
            {
                processing   = ServerProcessing.Complete;
                methodReturn = new ReturnMessage(ex, null);
            }

            // handle response
            switch (processing)
            {
            case ServerProcessing.Complete:
            {
                // call completed synchronously - send response
                sinkStack.Pop(this);
                connection.SendResponse(methodReturn, responseHeaders, responseStream);
                break;
            }

            case ServerProcessing.OneWay:
            {
                // no response needed
                sinkStack.Pop(this);
                break;
            }

            case ServerProcessing.Async:
            {
                // call proceeded asynchronously
                sinkStack.StoreAndDispatch(this, connection);
                break;
            }

            default:
                throw new NotSupportedException();
            }
        }
        private void ServerMain()
        {
            PipeConnection pipe = _pipe;

            _pipe = null;

            // Signal the guy to start waiting again... (w/ new event and endpoint)
            _event.Set();

            try
            {
                //TODO close the connection on a timeout
                //TODO if no activity for Nnnn milliseconds
                while (true)
                {
                    pipe.BeginReadMessage();
                    ITransportHeaders headers = pipe.ReadHeaders();
                    headers["__CustomErrorsEnabled"] = false;

                    Stream request = pipe.ReadStream();
                    pipe.EndReadMessage();

                    ServerChannelSinkStack stack = new ServerChannelSinkStack();
                    stack.Push(_transportSink, null);

                    IMessage          responseMsg;
                    ITransportHeaders responseHeaders;
                    Stream            responseStream;

                    ServerProcessing processing = _transportSink.NextChannelSink.ProcessMessage(stack,
                                                                                                null,
                                                                                                headers,
                                                                                                request,
                                                                                                out responseMsg,
                                                                                                out responseHeaders,
                                                                                                out responseStream);

                    // handle response
                    switch (processing)
                    {
                    case ServerProcessing.Complete:
                        // Send the response. Call completed synchronously.
                        stack.Pop(_transportSink);
                        WriteClientResponse(pipe, responseHeaders, responseStream);
                        break;

                    case ServerProcessing.OneWay:
                        break;

                    case ServerProcessing.Async:
                        stack.StoreAndDispatch(_transportSink, null);
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                DBG.Info(null, "Terminating client connection: " + e.Message);
                WriteExceptionResponse(pipe, e.ToString());
            }
            finally
            {
                if (pipe != null)
                {
                    pipe.Dispose();
                }
            }
        }
Ejemplo n.º 27
0
        public virtual IMessageCtrl AsyncProcessMessage(
            IMessage msg, IMessageSink replySink)
        {
            IMethodCallMessage mcMsg = (IMethodCallMessage)msg;

            IMessageCtrl       retCtrl    = null;
            IMessage           retMessage = null;
            LogicalCallContext oldCallCtx = null;

            try
            {
                LogicalCallContext callCtx = (LogicalCallContext)
                                             mcMsg.Properties[Message.CallContextKey];

                Object server = _server;

                // validate the method base if necessary
                VerifyIsOkToCallMethod(server, mcMsg);

                // install call context onto the thread, holding onto
                // the one that is currently on the thread

                oldCallCtx = CallContext.SetLogicalCallContext(callCtx);
                // retrieve incoming headers
                callCtx.PropagateIncomingHeadersToCallContext(msg);

                PreserveThreadPrincipalIfNecessary(callCtx, oldCallCtx);

                // see if this is a server message that was dispatched asynchronously
                ServerChannelSinkStack sinkStack =
                    msg.Properties["__SinkStack"] as ServerChannelSinkStack;
                if (sinkStack != null)
                {
                    sinkStack.ServerObject = server;
                }

                BCLDebug.Assert((server != null) == (!_bStatic),
                                "Invalid state in stackbuilder sink?");

                MethodBase mb      = GetMethodBase(mcMsg);
                Object[]   outArgs = null;
                Object     ret     = null;
                RemotingMethodCachedData methodCache =
                    InternalRemotingServices.GetReflectionCachedData(mb);
                Object[] args = Message.CoerceArgs(mcMsg, methodCache.Parameters);

                ret = PrivateProcessMessage(mb,
                                            args,
                                            server,
                                            0,
                                            false,
                                            out outArgs);
                CopyNonByrefOutArgsFromOriginalArgs(methodCache, args, ref outArgs);

                if (replySink != null)
                {
                    // call context could be different then the one from before the call.
                    LogicalCallContext latestCallContext = CallContext.GetLogicalCallContext();

                    retMessage = new ReturnMessage(
                        ret,
                        outArgs,
                        (outArgs == null ? 0 : outArgs.Length),
                        latestCallContext,
                        mcMsg);

                    // retrieve outgoing response headers
                    latestCallContext.PropagateOutgoingHeadersToMessage(retMessage);

                    replySink.SyncProcessMessage(retMessage);
                }
            }
            catch (Exception e)
            {
                try
                {
                    if (replySink != null)
                    {
                        retMessage = new ReturnMessage(e, mcMsg);
                        ((ReturnMessage)retMessage).SetLogicalCallContext(
                            (LogicalCallContext)
                            mcMsg.Properties[Message.CallContextKey]);

                        replySink.SyncProcessMessage(retMessage);
                    }
                }
                catch (Exception)
                {
                    // Fatal error..  can't do anything ..
                    // bail out silently.
                }
            }
            finally
            {
                // restore the call context on the thread
                if (oldCallCtx != null)
                {
                    CallContext.SetLogicalCallContext(oldCallCtx);
                }
            }

            return(retCtrl);
        } // AsyncProcessMessage
		internal void InternalProcessMessage (ClientConnection connection)
		{
			// Reads the headers and the request stream

			Stream requestStream;
			ITransportHeaders requestHeaders;

			requestStream = TcpMessageIO.ReceiveMessageStream (connection.Stream, out requestHeaders, connection.Buffer);
			requestHeaders [CommonTransportKeys.IPAddress] = connection.ClientAddress;
			requestHeaders [CommonTransportKeys.ConnectionId] = connection.Id;

			string uri = (string) requestHeaders [CommonTransportKeys.RequestUri];
			TcpChannel.ParseChannelUrl (uri, out uri);
			
			if (uri != null)
				requestHeaders [CommonTransportKeys.RequestUri] = uri;
			
			// Pushes the connection object together with the sink. This information
			// will be used for sending the response in an async call.

			ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();
			sinkStack.Push(this, connection);

			ITransportHeaders responseHeaders;
			Stream responseStream;
			IMessage responseMsg;

			ServerProcessing proc = next_sink.ProcessMessage(sinkStack, null, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);

			switch (proc)
			{
				case ServerProcessing.Complete:
					TcpMessageIO.SendMessageStream (connection.Stream, responseStream, responseHeaders, connection.Buffer);
					break;

				case ServerProcessing.Async:
				case ServerProcessing.OneWay:
					break;
			}
		}
        } // HttpHandlerTransportSink

        public void HandleRequest(HttpContext context)
        {
            HttpRequest  httpRequest  = context.Request;
            HttpResponse httpResponse = context.Response;

            // get headers
            BaseTransportHeaders requestHeaders = new BaseTransportHeaders();

            requestHeaders["__RequestVerb"]         = httpRequest.HttpMethod;
            requestHeaders["__CustomErrorsEnabled"] = HttpRemotingHandler.CustomErrorsEnabled(context);
            requestHeaders.RequestUri = (string)context.Items["__requestUri"];

            NameValueCollection headers = httpRequest.Headers;

            String[] allKeys = headers.AllKeys;

            for (int httpKeyCount = 0; httpKeyCount < allKeys.Length; httpKeyCount++)
            {
                String headerName  = allKeys[httpKeyCount];
                String headerValue = headers[headerName];
                requestHeaders[headerName] = headerValue;
            }

            // add ip address to headers list
            requestHeaders.IPAddress = IPAddress.Parse(httpRequest.UserHostAddress);

            // get request stream
            Stream requestStream = httpRequest.InputStream;

            // process message
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, null);

            IMessage          responseMessage;
            ITransportHeaders responseHeaders;
            Stream            responseStream;

            ServerProcessing processing =
                _nextSink.ProcessMessage(sinkStack, null, requestHeaders, requestStream,
                                         out responseMessage,
                                         out responseHeaders, out responseStream);

            // handle response
            switch (processing)
            {
            case ServerProcessing.Complete:
            {
                // Send the response. Call completed synchronously.
                SendResponse(httpResponse, 200, responseHeaders, responseStream);
                break;
            } // case ServerProcessing.Complete

            case ServerProcessing.OneWay:
            {
                // Just send back a 202 Accepted
                SendResponse(httpResponse, 202, responseHeaders, responseStream);
                break;
            } // case ServerProcessing.OneWay

            case ServerProcessing.Async:
            {
                // Async dispatching was cut from V.1.
                //sinkStack.StoreAndDispatch(this, streamManager);
                break;
            } // case ServerProcessing.Async
            } // switch (processing)
        }     // HandleRequest
Ejemplo n.º 30
0
        [System.Security.SecurityCritical]  // auto-generated
        public virtual IMessageCtrl AsyncProcessMessage(
            IMessage msg, IMessageSink replySink)
        {
            IMethodCallMessage mcMsg = (IMethodCallMessage)msg;

            IMessageCtrl       retCtrl    = null;
            IMessage           retMessage = null;
            LogicalCallContext oldCallCtx = null;
            bool isCallContextSet         = false;

            try{
                try
                {
                    LogicalCallContext callCtx = (LogicalCallContext)
                                                 mcMsg.Properties[Message.CallContextKey];

                    Object server = _server;

                    // validate the method base if necessary
                    VerifyIsOkToCallMethod(server, mcMsg);

                    // install call context onto the thread, holding onto
                    // the one that is currently on the thread

                    oldCallCtx       = CallContext.SetLogicalCallContext(callCtx);
                    isCallContextSet = true;
                    // retrieve incoming headers
                    callCtx.PropagateIncomingHeadersToCallContext(msg);

                    PreserveThreadPrincipalIfNecessary(callCtx, oldCallCtx);

                    // see if this is a server message that was dispatched asynchronously
                    ServerChannelSinkStack sinkStack =
                        msg.Properties["__SinkStack"] as ServerChannelSinkStack;
                    if (sinkStack != null)
                    {
                        sinkStack.ServerObject = server;
                    }

                    BCLDebug.Assert((server != null) == (!_bStatic),
                                    "Invalid state in stackbuilder sink?");

                    MethodBase mb      = GetMethodBase(mcMsg);
                    Object[]   outArgs = null;
                    Object     ret     = null;
                    RemotingMethodCachedData methodCache =
                        InternalRemotingServices.GetReflectionCachedData(mb);
                    Object[] args = Message.CoerceArgs(mcMsg, methodCache.Parameters);

                    ret = PrivateProcessMessage(mb.MethodHandle,
                                                args,
                                                server,
                                                0,
                                                false,
                                                out outArgs);
                    CopyNonByrefOutArgsFromOriginalArgs(methodCache, args, ref outArgs);

                    if (replySink != null)
                    {
                        // call context could be different then the one from before the call.
                        LogicalCallContext latestCallContext = CallContext.GetLogicalCallContext();

                        if (latestCallContext != null)
                        {
                            // Special case Principal since if might not be serializable before returning
                            // ReturnMessage
                            latestCallContext.RemovePrincipalIfNotSerializable();
                        }

                        retMessage = new ReturnMessage(
                            ret,
                            outArgs,
                            (outArgs == null ? 0 : outArgs.Length),
                            latestCallContext,
                            mcMsg);

                        // retrieve outgoing response headers
                        latestCallContext.PropagateOutgoingHeadersToMessage(retMessage);
                    }
                }
                catch (Exception e)
                {
                    if (replySink != null)
                    {
                        retMessage = new ReturnMessage(e, mcMsg);
                        ((ReturnMessage)retMessage).SetLogicalCallContext(
                            (LogicalCallContext)
                            mcMsg.Properties[Message.CallContextKey]);
                    }
                }
                finally
                {
                    if (replySink != null)
                    {
                        // Call the reply sink without catching the exceptions
                        // in it. In v2.0 any exceptions in the callback for example
                        // would probably bring down the process
                        replySink.SyncProcessMessage(retMessage);
                    }
                }
            }
            finally {
                // restore the call context on the thread
                if (isCallContextSet)
                {
                    CallContext.SetLogicalCallContext(oldCallCtx);
                }
            }

            return(retCtrl);
        } // AsyncProcessMessage
        internal void ServiceRequest(object state)
        {
            IpcServerHandler  handler        = (IpcServerHandler)state;
            ITransportHeaders requestHeaders = handler.ReadHeaders();
            Stream            requestStream  = handler.GetRequestStream();

            requestHeaders["__CustomErrorsEnabled"] = false;
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, handler);
            IMessage          responseMsg      = null;
            ITransportHeaders responseHeaders  = null;
            Stream            responseStream   = null;
            WindowsIdentity   current          = null;
            IPrincipal        currentPrincipal = null;
            bool             flag     = false;
            bool             flag2    = false;
            ServerProcessing complete = ServerProcessing.Complete;

            try
            {
                if (this._secure)
                {
                    handler.Port.ImpersonateClient();
                    currentPrincipal = Thread.CurrentPrincipal;
                    flag2            = true;
                    flag             = true;
                    current          = WindowsIdentity.GetCurrent();
                    if (!this._impersonate)
                    {
                        NativePipe.RevertToSelf();
                        Thread.CurrentPrincipal = new GenericPrincipal(current, null);
                        flag = false;
                    }
                    else
                    {
                        if ((current.ImpersonationLevel != TokenImpersonationLevel.Impersonation) && (current.ImpersonationLevel != TokenImpersonationLevel.Delegation))
                        {
                            throw new RemotingException(CoreChannel.GetResourceString("Remoting_Ipc_TokenImpersonationFailure"));
                        }
                        Thread.CurrentPrincipal = new WindowsPrincipal(current);
                    }
                }
                complete = this._nextSink.ProcessMessage(sinkStack, null, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
            }
            catch (Exception exception)
            {
                handler.CloseOnFatalError(exception);
            }
            finally
            {
                if (flag2)
                {
                    Thread.CurrentPrincipal = currentPrincipal;
                }
                if (flag)
                {
                    NativePipe.RevertToSelf();
                    flag = false;
                }
            }
            switch (complete)
            {
            case ServerProcessing.Complete:
                sinkStack.Pop(this);
                handler.SendResponse(responseHeaders, responseStream);
                break;

            case ServerProcessing.OneWay:
                handler.SendResponse(responseHeaders, responseStream);
                break;

            case ServerProcessing.Async:
                sinkStack.StoreAndDispatch(this, handler);
                break;
            }
            if (complete != ServerProcessing.Async)
            {
                handler.BeginReadMessage();
            }
        }
        } // TcpServerTransportSink

        internal void ServiceRequest(Object state)
        {
            TcpServerSocketHandler streamManager = (TcpServerSocketHandler)state;

            ITransportHeaders headers       = streamManager.ReadHeaders();
            Stream            requestStream = streamManager.GetRequestStream();

            headers["__CustomErrorsEnabled"] = streamManager.CustomErrorsEnabled();

            // process request
            ServerChannelSinkStack sinkStack = new ServerChannelSinkStack();

            sinkStack.Push(this, streamManager);

            IMessage          responseMessage;
            ITransportHeaders responseHeaders;
            Stream            responseStream;

            ServerProcessing processing;

            // wrap Undo in an outer try block
            try{
                try{
                    processing =
                        _nextSink.ProcessMessage(sinkStack, null, headers, requestStream,
                                                 out responseMessage,
                                                 out responseHeaders, out responseStream);
                }
                finally{
                }
            }
            catch { throw; }

            // handle response
            switch (processing)
            {
            case ServerProcessing.Complete:
            {
                // Send the response. Call completed synchronously.
                sinkStack.Pop(this);
                streamManager.SendResponse(responseHeaders, responseStream);
                break;
            } // case ServerProcessing.Complete

            case ServerProcessing.OneWay:
            {
                // No response needed, but the following method will make sure that
                //   we send at least a skeleton reply if the incoming request was
                //   not marked OneWayRequest (client/server metadata could be out of
                //   sync).
                streamManager.SendResponse(responseHeaders, responseStream);
                break;
            } // case ServerProcessing.OneWay

            case ServerProcessing.Async:
            {
                sinkStack.StoreAndDispatch(this, streamManager);
                break;
            } // case ServerProcessing.Async
            } // switch (processing)


            // async processing will take care if handling this later
            if (processing != ServerProcessing.Async)
            {
                if (streamManager.CanServiceAnotherRequest())
                {
                    streamManager.BeginReadMessage();
                }
                else
                {
                    streamManager.Close();
                }
            }
        } // ServiceRequest