Пример #1
0
        public ServerProcessing ProcessMessage(
            IServerChannelSinkStack stack,
            IMessage requestMsg,
            ITransportHeaders requestHeaders,
            Stream requestStream,
            out IMessage responseMsg,
            out ITransportHeaders responseHeaders,
            out Stream responseStream
            )
        {
            stack.Push(this, null);

            #region Check request stream header hash
            string hash = requestHeaders[HashHelper.C_HASH_ITEM] as String;
            //Debug.WriteLine("Server Side : request stream hash is " + hash);
            bool check = HashHelper.CheckHash(ref requestStream, hash);
            if (!check)
            {
                throw new Exception("Server Side : request stream header checksum error");
            }
            #endregion

            ServerProcessing result = _nextSink.ProcessMessage(stack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);

            #region Add hash to response stream heaer
            hash = HashHelper.GetHash(ref responseStream);
            responseHeaders[HashHelper.C_HASH_ITEM] = hash;
            //Debug.WriteLine("Server Side : response stream hash is " + hash);
            #endregion

            return(result);
        }
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
                                               IMessage requestMsg,
                                               ITransportHeaders requestHeaders,
                                               Stream requestStream,
                                               out IMessage responseMsg,
                                               out ITransportHeaders responseHeaders,
                                               out Stream responseStream)
        {
            // uncompressing the request
            requestStream =
                CompressionHelper.getUncompressedStreamCopy(requestStream);

            // pushing onto stack and forwarding the call
            sinkStack.Push(this, null);

            ServerProcessing srvProc = _nextSink.ProcessMessage(sinkStack,
                                                                requestMsg,
                                                                requestHeaders,
                                                                requestStream,
                                                                out responseMsg,
                                                                out responseHeaders,
                                                                out responseStream);

            // compressing the response
            responseStream =
                CompressionHelper.getCompressedStreamCopy(responseStream);

            // returning status information
            return(srvProc);
        }
Пример #3
0
 public ServerProcessing ProcessMessage(
     IServerChannelSinkStack sinkStack,
     IMessage requestMsg,
     ITransportHeaders requestHeaders,
     Stream requestStream,
     out IMessage responseMsg,
     out ITransportHeaders responseHeaders,
     out Stream responseStream)
 {
     if (NextChannelSink != null)
     {
         IPAddress ip =
             requestHeaders[CommonTransportKeys.IPAddress] as IPAddress;
         CallContext.SetData("ClientIPAddress", ip);
         ServerProcessing spres = NextChannelSink.ProcessMessage(
             sinkStack,
             requestMsg,
             requestHeaders,
             requestStream,
             out responseMsg,
             out responseHeaders,
             out responseStream);
         return(spres);
     }
     else
     {
         responseMsg     = null;
         responseHeaders = null;
         responseStream  = null;
         return(new ServerProcessing());
     }
 }
Пример #4
0
    public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
                                           IMessage requestMessage,
                                           ITransportHeaders requestHeaders,
                                           Stream requestStream,
                                           out IMessage responseMessage,
                                           out ITransportHeaders responseHeaders,
                                           out Stream responseStream)
    {
        // Hand off to the next sink for processing.
        sinkStack.Push(this, null);
        ServerProcessing status = nextSink.ProcessMessage(
            sinkStack, requestMessage, requestHeaders, requestStream,
            out responseMessage, out responseHeaders, out responseStream
            );

        // Print the response message properties.
        Console.WriteLine("---- Message from the server ----");
        IDictionary dictionary = responseMessage.Properties;

        foreach (Object key in dictionary.Keys)
        {
            Console.WriteLine("{0} = {1}", key, dictionary[key]);
        }
        Console.WriteLine("---------------------------------");

        return(status);
    }
    public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg,
                                           ITransportHeaders requestHeaders, Stream requestStream,
                                           out IMessage msg, out ITransportHeaders responseHeaders,
                                           out Stream responseStream)
    {
        sinkStack.Push(this, null);
        ServerProcessing processing =
            nextServerSink.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out msg,
                                          out responseHeaders, out responseStream);

        switch (processing)
        {
        case ServerProcessing.Complete:
        {
            sinkStack.Pop(this);
            break;
        }

        case ServerProcessing.OneWay:
        {
            sinkStack.Pop(this);
            break;
        }

        case ServerProcessing.Async:
        {
            sinkStack.Store(this, null);
            break;
        }
        }
        return(processing);
    }
Пример #6
0
        ServerProcessing IServerChannelSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            long   startTicks  = TimeUtil.NOW();
            string uri         = null;
            long   inputLength = 0L;

            if (requestStream != null && requestHeaders != null)
            {
                uri = requestHeaders["__RequestUri"].ToString();
            }
            ServerProcessing process = this.nextSink.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);

            if (null != responseMsg)
            {
                object methodName = responseMsg.Properties["__MethodName"];
                if (uri != null && methodName != null)
                {
                    string cmdName = uri.ToString() + methodName.ToString();
                    CmdMonitor.RecordCmdDetail(cmdName, TimeUtil.NOW() - startTicks, inputLength, responseStream.Length, TCPProcessCmdResults.RESULT_OK);
                }
                else
                {
                    LogManager.WriteExceptionUseCache(string.Format("IServerChannelSink.ProcessMessage#uri={0},methodName={1}", uri, methodName));
                }
            }
            else
            {
                LogManager.WriteExceptionUseCache(string.Format("IServerChannelSink.ProcessMessage#uri={0},responseMsg=null", uri));
            }
            return(process);
        }
Пример #7
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
Пример #8
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;
            }
        }
Пример #9
0
 public System.Runtime.Remoting.Channels.ServerProcessing ProcessMessage(System.Runtime.Remoting.Channels.IServerChannelSinkStack sinkStack, System.Runtime.Remoting.Messaging.IMessage requestMsg, System.Runtime.Remoting.Channels.ITransportHeaders requestHeaders, System.IO.Stream requestStream, out System.Runtime.Remoting.Messaging.IMessage responseMsg, out System.Runtime.Remoting.Channels.ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
 {
     if (_next != null)
     {
         try
         {
             Thread.Sleep(1);
             IPAddress ip = requestHeaders[CommonTransportKeys.IPAddress] as IPAddress;
             CallContext.SetData("ClientIPAddress", ip);
             ServerProcessing spres = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
             return(spres);
         }
         catch
         {
             responseMsg     = null;
             responseHeaders = null;
             responseStream  = null;
             return(new ServerProcessing());
         }
     }
     else
     {
         responseMsg     = null;
         responseHeaders = null;
         responseStream  = null;
         return(new ServerProcessing());
     }
 }
Пример #10
0
        /// <summary></summary>
        public ServerProcessing ProcessMessage(
            IServerChannelSinkStack sinkStack,
            IMessage requestMsg,
            ITransportHeaders requestHeaders,
            Stream requestStream,
            out IMessage responseMsg,
            out ITransportHeaders responseHeaders,
            out Stream responseStream)
        {
            if (NextChannelSink != null)
            {
                SetClientIpAddressDataHelper(requestHeaders);
                ServerProcessing spres = NextChannelSink.ProcessMessage(
                    sinkStack,
                    requestMsg,
                    requestHeaders,
                    requestStream,
                    out responseMsg,
                    out responseHeaders,
                    out responseStream);
                return(spres);
            }

            responseMsg     = null;
            responseHeaders = null;
            responseStream  = null;
            return(new ServerProcessing());
        }
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg,
                                               ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg,
                                               out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            // проверяем, задано ли имя серверного хоста или его адрес
            _serverHostNameOrIp = requestHeaders["serverHostNameOrIp"];
            if (_serverHostNameOrIp != null)
            {
                // помещаем его в контекст вызова
                CallContext.SetData("serverHostNameOrIp", _serverHostNameOrIp);
                // протоколируем
                if (_eventLink != null)
                {
                    _eventLink.Post(_eventSource, string.Format("Имя или IP-адрес сервера ЗАДАНО: [{0}]",
                                                                _serverHostNameOrIp));
                }
            }
            else
            {
                // очишаем значение, оставшееся от предыдущих вызовов
                CallContext.FreeNamedDataSlot("serverHostNameOrIp");
                // протоколируем
                if (_eventLink != null)
                {
                    _eventLink.Post(_eventSource, EventType.Warning, "Имя или IP-адрес сервера НЕ задано");
                }
            }

            // перенаправляем обработку сообщения следующему приемнику в цепи
            sinkStack.Push(this, null);
            ServerProcessing status = _nextSink.ProcessMessage(sinkStack, requestMsg, requestHeaders,
                                                               requestStream, out responseMsg, out responseHeaders, out responseStream);

            return(status);
        }
        public ServerProcessing ProcessEncryptedMessage(Guid transactID, IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            ClientConnectionInfo cci;

            lock (_connections.SyncRoot)
            {
                cci = (ClientConnectionInfo)_connections[transactID.ToString()];
            }

            if (cci == null)
            {
                throw new SecureRemotingException("No connection information about client.");
            }

            cci.UpdateLastUsed();

            Stream decryptedStream = CryptoHelper.GetDecryptedStream(requestStream, cci.Provider);

            requestStream.Close();

            ServerProcessing processingResult = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, decryptedStream, out responseMsg, out responseHeaders, out responseStream);


            responseHeaders[CommonHeaders.Transaction] = ((int)SecureTransaction.SendingEncryptedResult).ToString();
            Stream encryptedStream = CryptoHelper.GetEncryptedStream(responseStream, cci.Provider);

            responseStream.Close(); // close the plaintext stream now that we're done with it
            responseStream = encryptedStream;

            return(processingResult);
        }
Пример #13
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);
            }
        }
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
                                               IMessage requestMsg,
                                               ITransportHeaders requestHeaders,
                                               Stream requestStream,
                                               out IMessage responseMsg,
                                               out ITransportHeaders responseHeaders,
                                               out Stream responseStream)
        {
            bool isEncrypted = false;

            //checking the headers
            if (requestHeaders["X-Encrypt"] != null &&
                requestHeaders["X-Encrypt"].Equals("yes"))
            {
                isEncrypted = true;

                byte[] IV = Convert.FromBase64String(
                    (String)requestHeaders["X-EncryptIV"]);

                // decrypt the request
                requestStream = EncryptionHelper.ProcessInboundStream(
                    requestStream,
                    _encryptionAlgorithm,
                    _encryptionKey,
                    IV);
            }


            // pushing onto stack and forwarding the call,
            // the flag "isEncrypted" will be used as state
            sinkStack.Push(this, isEncrypted);

            ServerProcessing srvProc = _nextSink.ProcessMessage(sinkStack,
                                                                requestMsg,
                                                                requestHeaders,
                                                                requestStream,
                                                                out responseMsg,
                                                                out responseHeaders,
                                                                out responseStream);

            if (isEncrypted)
            {
                // encrypting the response if necessary
                byte[] IV;

                responseStream = EncryptionHelper.ProcessOutboundStream(responseStream,
                                                                        _encryptionAlgorithm, _encryptionKey, out IV);

                responseHeaders["X-Encrypt"]   = "yes";
                responseHeaders["X-EncryptIV"] = Convert.ToBase64String(IV);
            }

            // returning status information
            return(srvProc);
        }
Пример #15
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;
            }
        }
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg,
                                               ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg,
                                               out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            sinkStack.Push(this, null);

            ServerProcessing res = _nextSink.ProcessMessage(sinkStack, requestMsg, requestHeaders,
                                                            requestStream, out responseMsg, out responseHeaders, out responseStream);

            responseHeaders["X-Cache"] = "60";
            return(res);
        }
Пример #17
0
        /// <summary>
        /// Creates an empty response message.
        /// </summary>
        /// <param name="sinkStack">The sink stack.</param>
        /// <param name="requestMsg">Request message.</param>
        /// <param name="requestHeaders">Request transport headers.</param>
        /// <param name="requestStream">Request stream.</param>
        /// <param name="transactionStage">Current secure transaction stage.</param>
        /// <param name="responseMsg">Response message.</param>
        /// <param name="responseHeaders">Response transport headers.</param>
        /// <param name="responseStream">Response stream.</param>
        /// <returns></returns>
        private ServerProcessing SendEmptyToClient(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, SecureTransactionStage transactionStage, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            responseMsg = null;
            requestStream = new MemoryStream();
            responseStream = new MemoryStream();

            responseHeaders = new TransportHeaders();
            responseHeaders[CommonHeaderNames.SECURE_TRANSACTION_STATE] = ((int)transactionStage).ToString();

            ServerProcessing processingResult = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
            return processingResult;
        }
Пример #18
0
        internal void InternalProcessMessage(Stream network_stream)
        {
            try {
                string uri;
                SimpleMessageFormat.MessageType msg_type;
                MemoryStream msg_stream;

                msg_stream = SimpleMessageFormat.ReceiveMessageStream(network_stream,
                                                                      out msg_type, out uri);
                if (msg_type != SimpleMessageFormat.MessageType.Request)
                {
                    throw new RemotingException("received wrong message type");
                }

                TransportHeaders headers = new TransportHeaders();
                headers ["_requestUri"] = uri;

                IMessage          resp_message;
                ITransportHeaders resp_headers;
                Stream            resp_stream;
                ServerProcessing  res = next_sink.ProcessMessage(null, null, headers, msg_stream,
                                                                 out resp_message, out resp_headers,
                                                                 out resp_stream);

                switch (res)
                {
                case ServerProcessing.Complete:

                    Exception e = ((IMethodReturnMessage)resp_message).Exception;
                    if (e != null)
                    {
                        // we handle exceptions in the transport channel
                        SimpleMessageFormat.SendExceptionMessage(network_stream, e.ToString());
                    }
                    else
                    {
                        // send the response
                        SimpleMessageFormat.SendMessageStream(network_stream,
                                                              (MemoryStream)resp_stream,
                                                              SimpleMessageFormat.MessageType.Response,
                                                              null);
                    }
                    break;

                case ServerProcessing.Async:
                case ServerProcessing.OneWay:
                    throw new NotImplementedException();
                }
            } catch (Exception e) {
                SimpleMessageFormat.SendExceptionMessage(network_stream, e.ToString());
            }
        }
Пример #19
0
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
                                               IMessage requestMsg,
                                               ITransportHeaders requestHeaders,
                                               Stream requestStream,
                                               out IMessage responseMsg,
                                               out ITransportHeaders responseHeaders,
                                               out Stream responseStream
                                               )
        {
            if (bEnabled2)
            {
                Console.WriteLine("----------Request Headers-----------");
// <Snippet2>
                Console.WriteLine(CommonTransportKeys.IPAddress + ":" +
                                  requestHeaders[CommonTransportKeys.IPAddress]);
// </Snippet2>
// <Snippet3>
                Console.WriteLine(CommonTransportKeys.ConnectionId + ":" +
                                  requestHeaders[CommonTransportKeys.ConnectionId]);
// </Snippet3>
// <Snippet4>
                Console.WriteLine(CommonTransportKeys.RequestUri + ":" +
                                  requestHeaders[CommonTransportKeys.RequestUri]);
// </Snippet4>
            }
            sinkStack.Push(this, null);
            ServerProcessing processing =
                nextSink2.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg,
                                         out responseHeaders, out responseStream);

            switch (processing)
            {
            case ServerProcessing.Complete:
            {
                sinkStack.Pop(this);
                break;
            }

            case ServerProcessing.OneWay:
            {
                sinkStack.Pop(this);
                break;
            }

            case ServerProcessing.Async:
            {
                sinkStack.Store(this, null);
                break;
            }
            }
            return(processing);
        }
Пример #20
0
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            if (requestMsg != null)
            {
                return(_next.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream));
            }

            try
            {
                IPAddress IPAddr = (IPAddress)requestHeaders[CommonTransportKeys.IPAddress];
                //===================================
                //Console.WriteLine(IPAddr.ToString());
                //====================================
                CallContext.SetData("ClientIP", IPAddr);
                //IPHostEntry hostInfo = Dns.Resolve("");
                //string _hs = requestHeaders[CommonTransportKeys.RequestUri].ToString() ;
                //CallContext.SetData("ClientHost",_hs);
            }
            catch (Exception ex)
            {
                string errmsg = ex.Message;
            }

            requestStream = CompressSinkHelper.DecompressStream(requestHeaders, requestStream);
            sinkStack.Push(this, null);
            ServerProcessing processing = _next.ProcessMessage(sinkStack, null, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);

            //	这样写是否有效还未验证, ???
            //			if (CompressSinkHelper.IsClientSupportCompress(requestHeaders))
            //				CompressSinkHelper.SetClientSupportCompressFlag(responseHeaders);

            switch (processing)
            {
            case ServerProcessing.Complete:
                sinkStack.Pop(this);
                if (CompressSinkHelper.IsClientSupportCompress(requestHeaders))
                {
                    responseStream = CompressSinkHelper.CompressStream(responseHeaders, responseStream);
                }
                break;

            case ServerProcessing.OneWay:
                sinkStack.Pop(this);
                break;

            case ServerProcessing.Async:
                sinkStack.Store(this, null);
                break;
            }
            return(processing);
        }
Пример #21
0
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            bool clientCompressed = false;

            // decompress the shits
            Stream decompressedStream;

            if (object.Equals(requestHeaders[CompressionHelper.CompressKey], CompressionHelper.CompressedFlag))
            {
                //Debug.WriteLine("client compressed");
                clientCompressed   = true;
                decompressedStream = CompressionHelper.DecompressStream(requestStream);
                // close the request stream
                requestStream.Close();
            }
            else
            {
                if (object.Equals(requestHeaders[CompressionHelper.CompressKey], CompressionHelper.CompressRequest))
                {
                    //Debug.WriteLine("client requesting compress");
                    clientCompressed = true;
                }

                decompressedStream = requestStream;
            }

            sinkStack.Push(this, new ClientState(clientCompressed));

            // send the decompressed message on through the sink chain
            ServerProcessing processingResult = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, decompressedStream, out responseMsg, out responseHeaders, out responseStream);

            // get the compressed stream
            if (clientCompressed && processingResult == ServerProcessing.Complete)
            {
                Stream compressedStream = CompressionHelper.CompressStream(responseStream);
                responseStream.Close();
                responseStream = compressedStream;
                responseHeaders[CompressionHelper.CompressKey] = CompressionHelper.CompressedFlag;
            }

            // Take us off the stack and return the result.
            if (processingResult == ServerProcessing.Async)
            {
                sinkStack.Store(this, new ClientState(clientCompressed));
            }
            else
            {
                sinkStack.Pop(this);
            }
            return(processingResult);
        }
// <Snippet3>
        public ServerProcessing ProcessMessage(IServerChannelSinkStack myServerChannelSinkStack,
                                               IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream,
                                               out IMessage msg, out ITransportHeaders responseHeaders,
                                               out Stream responseStream)
        {
            if (myBoolEnabled)
            {
                LoggingHelper.PrintRequest(myTextWriterOutput, requestHeaders, ref requestStream);
            }

            myServerChannelSinkStack.Push(this, null);
// <Snippet4>
// <Snippet5>
// <Snippet6>
            ServerProcessing myServerProcessing =
                myNewNextSink.ProcessMessage(myServerChannelSinkStack, requestMsg, requestHeaders, requestStream, out msg,
                                             out responseHeaders, out responseStream);

            Console.WriteLine("ServerProcessing.Complete value is:   " + ServerProcessing.Complete);
            Console.WriteLine("ServerProcessing.OneWay Value is:     " + ServerProcessing.OneWay);
            Console.WriteLine("ServerProcessing.Async value is:      " + ServerProcessing.Async);

            switch (myServerProcessing)
            {
            case ServerProcessing.Complete:
            {
                myServerChannelSinkStack.Pop(this);
                if (myBoolEnabled)
                {
                    LoggingHelper.PrintResponse(myTextWriterOutput, responseHeaders, ref responseStream);
                }
                break;
            }

            case ServerProcessing.OneWay:
            {
                myServerChannelSinkStack.Pop(this);
                break;
            }

            case ServerProcessing.Async:
            {
                myServerChannelSinkStack.Store(this, null);
                break;
            }
            }
            return(myServerProcessing);
// </Snippet6>
// </Snippet5>
// </Snippet4>
        }
Пример #23
0
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
                                               IMessage requestMsg,
                                               ITransportHeaders requestHeaders,
                                               Stream requestStream,
                                               out IMessage responseMsg,
                                               out ITransportHeaders responseHeaders,
                                               out Stream responseStream)
        {
            LogicalCallContext lcc =
                (LogicalCallContext)requestMsg.Properties["__CallContext"];

            // storing the current priority
            ThreadPriority oldprio = Thread.CurrentThread.Priority;

            // check if the logical call context contains "priority"
            if (lcc != null && lcc.GetData("priority") != null)
            {
                // fetch the priorty from the call context
                ThreadPriority priority =
                    (ThreadPriority)lcc.GetData("priority");

                Console.WriteLine("  -> Pre-execution priority change {0} to {1}",
                                  oldprio.ToString(), priority.ToString());

                // set the priority
                Thread.CurrentThread.Priority = priority;
            }



            // push on the stack and pass the call to the next sink
            // the old priority will be used as "state" for the response
            sinkStack.Push(this, oldprio);
            ServerProcessing spres = _next.ProcessMessage(sinkStack,
                                                          requestMsg, requestHeaders, requestStream,
                                                          out responseMsg, out responseHeaders, out responseStream);

            //restore priority if call is not asynchronous

            if (spres != ServerProcessing.Async)
            {
                if (lcc != null && lcc.GetData("priority") != null)
                {
                    Console.WriteLine("  -> Post-execution change back to {0}", oldprio);
                    Thread.CurrentThread.Priority = oldprio;
                }
            }

            return(spres);
        }
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
                                               IMessage requestMsg,
                                               ITransportHeaders requestHeaders,
                                               Stream requestStream,
                                               out IMessage responseMsg,
                                               out ITransportHeaders responseHeaders,
                                               out Stream responseStream)
        {
            bool isCompressed = false;


            // decompress the stream if necessary
            String xcompress = (String)requestHeaders["X-Compress"];

            if (xcompress != null && xcompress == "yes")
            {
                requestStream = CompressionHelper.GetUncompressedStreamCopy(requestStream);
                isCompressed  = true;
            }


            // Pushing onto stack and forwarding the call.
            // The state object contains true if the request has been compressed,
            // else false.
            sinkStack.Push(this, isCompressed);

            ServerProcessing srvProc = _nextSink.ProcessMessage(sinkStack,
                                                                requestMsg,
                                                                requestHeaders,
                                                                requestStream,
                                                                out responseMsg,
                                                                out responseHeaders,
                                                                out responseStream);

            if (srvProc == ServerProcessing.Complete)
            {
                // compressing the response if necessary
                if (isCompressed)
                {
                    responseStream = CompressionHelper.GetCompressedStreamCopy(responseStream);
                    responseHeaders["X-Compress"] = "yes";
                }
            }
            // returning status information
            return(srvProc);
        }
Пример #25
0
 public ServerProcessing ProcessMessage(
     IServerChannelSinkStack sinkStack,
     IMessage requestMsg,
     ITransportHeaders requestHeaders,
     Stream requestStream,
     out IMessage responseMsg,
     out ITransportHeaders responseHeaders,
     out Stream responseStream)
 {
     try
     {
         if (_next != null)
         {
             ip = (IPAddress)requestHeaders[CommonTransportKeys.IPAddress];
             if (ip != null && (ip.ToString().Trim() == "127.0.0.1" || CheckAuthorizedIP(ip.ToString())))
             {
                 Common.CurrentStatus(ip.ToString().Trim());
                 ServerProcessing spres = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
                 return(spres);
             }
             else
             {
                 Common.Log("Unauthorized Remoting IP: " + ip.ToString().Trim());
                 responseMsg     = null;
                 responseHeaders = null;
                 responseStream  = null;
                 return(new ServerProcessing());
             }
         }
         else
         {
             responseMsg     = null;
             responseHeaders = null;
             responseStream  = null;
             return(new ServerProcessing());
         }
     }
     catch (Exception err)
     {
         Common.Log(err);
         responseMsg     = null;
         responseHeaders = null;
         responseStream  = null;
         return(new ServerProcessing());
     }
 }
Пример #26
0
        /// <summary>
        /// Processes the encrypted message.
        /// </summary>
        /// <param name="transactID">Secure transaction identifier.</param>
        /// <param name="sinkStack">The sink stack.</param>
        /// <param name="requestMsg">Request message.</param>
        /// <param name="requestHeaders">Request transport headers.</param>
        /// <param name="requestStream">Request stream.</param>
        /// <param name="responseMsg">Response message.</param>
        /// <param name="responseHeaders">Response transport headers.</param>
        /// <param name="responseStream">Response stream.</param>
        public ServerProcessing ProcessEncryptedMessage(Guid transactID, IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            // Get the client connection data
            ClientConnectionData connectionData;

            lock (_connections.SyncRoot)
            {
                connectionData = (ClientConnectionData)_connections[transactID.ToString()];
            }

            if (connectionData == null)
            {
                throw new CryptoRemotingException(LanguageResource.CryptoRemotingException_ClientConnectionInfoMissing);
            }

            // Update the timestamp and indicate that method call is in progress
            connectionData.UpdateTimestamp();
            connectionData.BeginMethodCall();

            try
            {
                // Decrypt the data stream
                Stream decryptedStream = CryptoTools.GetDecryptedStream(requestStream, connectionData.CryptoProvider);
                requestStream.Close();

                // Pass decrypted message for further processing to the next channel sink
                ServerProcessing processingResult = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, decryptedStream, out responseMsg, out responseHeaders, out responseStream);

                // Update secure transaction state
                responseHeaders[CommonHeaderNames.SECURE_TRANSACTION_STATE] = ((int)SecureTransactionStage.SendingEncryptedResult).ToString();

                // Encrypt the response stream and close the original response stream now that we're done with it
                Stream encryptedStream = CryptoTools.GetEncryptedStream(responseStream, connectionData.CryptoProvider);
                responseStream.Close();                 //

                // Use encrypted data stream as a response stream
                responseStream = encryptedStream;
                return(processingResult);
            }
            finally
            {
                // Method call is finished, so the connection data can be swept
                connectionData.EndMethodCall();
                connectionData.UpdateTimestamp();
            }
        }
Пример #27
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;
            }
        }
Пример #28
0
        public ServerProcessing ProcessMessage(
            IServerChannelSinkStack sinkStack,
            IMessage requestMsg,
            ITransportHeaders requestHeaders,
            Stream requestStream,
            out IMessage responseMsg,
            out ITransportHeaders responseHeaders,
            out Stream responseStream)
        {
            // Push this onto the sink stack
            sinkStack.Push(this, null);

            // If the request has the compression flag, decompress the stream.
            if (requestHeaders[CommonHeaders.CompressionEnabled] != null)
            {
                // Process the message and decompress it.
                requestStream = CompressHelper.Decompress(requestStream);
            }

            // Retrieve the response from the server.
            ServerProcessing processingResult = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders,
                                                                     requestStream, out responseMsg, out responseHeaders,
                                                                     out responseStream);

            // If the response stream length is greater than the threshold,
            // message is not exempt from compression, and client supports compression,
            // compress the stream.
            if (processingResult == ServerProcessing.Complete &&
                _compressionThreshold > 0 &&
                responseStream.Length > _compressionThreshold &&
                !IsCompressionExempt(responseMsg) &&
                requestHeaders[CommonHeaders.CompressionSupported] != null)
            {
                // Process the message and compress it.
                responseStream = CompressHelper.Compress(responseStream);

                // Send the compression flag to the client.
                responseHeaders[CommonHeaders.CompressionEnabled] = true;
            }

            // Take off the stack and return the result.
            sinkStack.Pop(this);
            return(processingResult);
        }
Пример #29
0
        /// <summary>
        /// Entschlüsselt die eingehende Nachricht vom Client.
        /// </summary>
        /// <param name="transactID">Sicherheitstransaktionskennung</param>
        /// <param name="sinkStack">Senkenstapel</param>
        /// <param name="requestMsg">Anfrage-Nachricht vom Client</param>
        /// <param name="requestHeaders">Anfrage-Header vom Cient</param>
        /// <param name="requestStream">Anfrage-Datenstrom</param>
        /// <param name="responseMsg">Antwort-Nachricht</param>
        /// <param name="responseHeaders">Antwort-Header</param>
        /// <param name="responseStream">Antwort-Datenstrom</param>
        /// <returns>Verarbeitungsstatus</returns>
        public ServerProcessing ProcessEncryptedMessage(Guid transactID, IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            // Variable für Client-Verbindungsinformationen
            ClientConnectionData connectionData;

            lock (_connections.SyncRoot)
            {
                // Client-Verbindungsdaten über die angegebene Sicherheitstransaktionskennung abrufen
                connectionData = (ClientConnectionData)_connections[transactID.ToString()];
            }
            // Wenn keine Verbindungsdaten zu dieser Sicherheitstransaktionskennung gefunden wurden ...
            if (connectionData == null)
            {
                // Ausnahme werfen
                throw new CryptoRemotingException(LanguageResource.CryptoRemotingException_ClientConnectionInfoMissing);
            }

            // Zeitstempel aktualisieren
            connectionData.UpdateTimestamp();

            // Datenstrom entschlüsseln
            Stream decryptedStream = CryptoTools.GetDecryptedStream(requestStream, connectionData.CryptoProvider);

            // Verschlüsselten-Quelldatenstrom schließen
            requestStream.Close();

            // Entschlüsselte Nachricht zur Weiterverarbeitung an die nächste Kanalsenke weitergeben
            ServerProcessing processingResult = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, decryptedStream, out responseMsg, out responseHeaders, out responseStream);

            // Status der Sicherheitstransaktion auf "verschlüsselte Atwortnachricht senden" einstellen
            responseHeaders[CommonHeaderNames.SECURE_TRANSACTION_STATE] = ((int)SecureTransactionStage.SendingEncryptedResult).ToString();

            // Antwortnachricht verschlüsseln
            Stream encryptedStream = CryptoTools.GetEncryptedStream(responseStream, connectionData.CryptoProvider);

            // Unverschlüsselten Quell-Datenstrom schließen
            responseStream.Close();             // close the plaintext stream now that we're done with it

            // Verschlüsselten Datenstrom als Antwort-Datenstrom verwenden
            responseStream = encryptedStream;

            // Verarbeitungsstatus zurückgeben
            return(processingResult);
        }
Пример #30
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();
                }
            }
        }
Пример #31
0
 public override void Process()
 {
     ServerProcessing = _serverSink.ProcessMessage(_sinkStack, _requestMsg, _requestHeaders, _requestStream, out ResponseMsg, out ResponseHeaders, out ResponseStream);
 }