public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt)
        {
            _logger.Debug("ConnectionTune frame received");
            ConnectionTuneBody frame = (ConnectionTuneBody) evt.Method;
            AMQProtocolSession session = evt.ProtocolSession;

            ConnectionTuneParameters parameters = session.ConnectionTuneParameters;
            if (parameters == null)
            {
                parameters = new ConnectionTuneParameters();
            }

            _logger.Debug(String.Format("ConnectionTune.heartbeat = {0}.", frame.Heartbeat));

            parameters.FrameMax = frame.FrameMax;
            parameters.Heartbeat = frame.Heartbeat;
            session.ConnectionTuneParameters = parameters;

            stateManager.ChangeState(AMQState.CONNECTION_NOT_OPENED);
            session.WriteFrame(ConnectionTuneOkBody.CreateAMQFrame(
                                   evt.ChannelId, frame.ChannelMax, frame.FrameMax, frame.Heartbeat));
            session.WriteFrame(ConnectionOpenBody.CreateAMQFrame(
                                   evt.ChannelId, session.AMQConnection.VirtualHost, null, true));

            if (frame.Heartbeat > 0)
            {
                evt.ProtocolSession.AMQConnection.StartHeartBeatThread(frame.Heartbeat);
            }
        }
        public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt)
        {
            ISaslClient saslClient = evt.ProtocolSession.SaslClient;
            if ( saslClient == null )
            {
               throw new AMQException("No SASL client set up - cannot proceed with authentication");
            }


            ConnectionSecureBody body = (ConnectionSecureBody)evt.Method;

            try
            {
                // Evaluate server challenge
                byte[] response = saslClient.EvaluateChallenge(body.Challenge);
                // AMQP version change: Hardwire the version to 0-8 (major=8, minor=0)
                // TODO: Connect this to the session version obtained from ProtocolInitiation for this session.
                // Be aware of possible changes to parameter order as versions change.
                AMQFrame responseFrame = ConnectionSecureOkBody.CreateAMQFrame(
                    evt.ChannelId, response);
                evt.ProtocolSession.WriteFrame(responseFrame);
            } catch ( SaslException e )
            {
                throw new AMQException("Error processing SASL challenge: " + e, e);
            }
        }
        public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt)
        {
            _logger.Debug("ChannelClose method received");
            ChannelCloseBody method = (ChannelCloseBody) evt.Method;

            int errorCode = method.ReplyCode;
            string reason = method.ReplyText;
            if (_logger.IsDebugEnabled)
            {
                _logger.Debug("Channel close reply code: " + errorCode + ", reason: " + reason);
            }

            AMQFrame frame = ChannelCloseOkBody.CreateAMQFrame(evt.ChannelId);
            evt.ProtocolSession.WriteFrame(frame);

            if ( errorCode != AMQConstant.REPLY_SUCCESS.Code )
            {
               _logger.Debug("Channel close received with errorCode " + errorCode + ", throwing exception");
               if ( errorCode == AMQConstant.NO_CONSUMERS.Code )
                  throw new AMQNoConsumersException(reason);
               if ( errorCode == AMQConstant.NO_ROUTE.Code )
                  throw new AMQNoRouteException(reason);
               if ( errorCode == AMQConstant.INVALID_ARGUMENT.Code )
                  throw new AMQInvalidArgumentException(reason);
               if ( errorCode == AMQConstant.INVALID_ROUTING_KEY.Code )
                  throw new AMQInvalidRoutingKeyException(reason);
               // any other
               throw new AMQChannelClosedException(errorCode, "Error: " + reason);
            }
            evt.ProtocolSession.ChannelClosed(evt.ChannelId, errorCode, reason);
        }
        public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt)
        {
            _logger.Debug("ConnectionClose frame received");
            ConnectionCloseBody method = (ConnectionCloseBody) evt.Method;

            int errorCode = method.ReplyCode;
            String reason = method.ReplyText;

            // send CloseOK
            evt.ProtocolSession.WriteFrame(ConnectionCloseOkBody.CreateAMQFrame(evt.ChannelId));
            
            if ( errorCode != AMQConstant.REPLY_SUCCESS.Code )
            {
               if ( errorCode == AMQConstant.NOT_ALLOWED.Code )
               {
                  _logger.Info("Authentication Error: " + Thread.CurrentThread.Name);
                  evt.ProtocolSession.CloseProtocolSession();

                  //todo this is a bit of a fudge (could be conssidered such as each new connection needs a new state manager or at least a fresh state.
                  stateManager.ChangeState(AMQState.CONNECTION_NOT_STARTED);

                  throw new AMQAuthenticationException(errorCode, reason);
               } else
               {
                  _logger.Info("Connection close received with error code " + errorCode);
                  throw new AMQConnectionClosedException(errorCode, "Error: " + reason);
               }
            }
            // this actually closes the connection in the case where it is not an error.
            evt.ProtocolSession.CloseProtocolSession();
            stateManager.ChangeState(AMQState.CONNECTION_CLOSED);
        }
 public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt)
 {
     QueuePurgeOkBody body = (QueuePurgeOkBody)evt.Method;
     if (body != null)
     {
         _logger.InfoFormat("Received Queue.Purge-Ok message, message count {0}", body.MessageCount);
     }
 }
 public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt)
 {
     UnprocessedMessage msg = new UnprocessedMessage();
     msg.DeliverBody = (BasicDeliverBody) evt.Method;
     msg.ChannelId = evt.ChannelId;
     _logger.Debug("New JmsDeliver method received");
     evt.ProtocolSession.UnprocessedMessageReceived(msg);
 }
        public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt) 
        {
            _logger.Debug("New Basic.Return method received");
            UnprocessedMessage msg = new UnprocessedMessage();
            msg.DeliverBody = null;
            msg.BounceBody = (BasicReturnBody) evt.Method;
            msg.ChannelId = evt.ChannelId;

            evt.ProtocolSession.UnprocessedMessageReceived(msg);
        }
        public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt)
        {
            ConnectionStartBody body = (ConnectionStartBody) evt.Method;
            AMQProtocolSession ps = evt.ProtocolSession;

            try
            {
                if ( body.Mechanisms == null )
                {
                    throw new AMQException("mechanism not specified in ConnectionStart method frame");
                }
                string mechanisms = Encoding.UTF8.GetString(body.Mechanisms);
                string selectedMechanism = ChooseMechanism(mechanisms);
                if ( selectedMechanism == null )
                {
                    throw new AMQException("No supported security mechanism found, passed: " + mechanisms);
                }
               
                byte[] saslResponse = DoAuthentication(selectedMechanism, ps);

                if (body.Locales == null)
                {
                    throw new AMQException("Locales is not defined in Connection Start method");
                }
                string allLocales = Encoding.ASCII.GetString(body.Locales);
                string[] locales = allLocales.Split(' ');
                string selectedLocale;
                if (locales != null && locales.Length > 0)
                {
                    selectedLocale = locales[0];
                }
                else
                {
                    throw new AMQException("No locales sent from server, passed: " + locales);
                }

                stateManager.ChangeState(AMQState.CONNECTION_NOT_TUNED);
                FieldTable clientProperties = new FieldTable();
                clientProperties["product"] = "Apache.Qpid.NET";
                clientProperties["version"] = "1.0";
                clientProperties["platform"] = GetFullSystemInfo();
                clientProperties["instance"] = ps.ClientID;
                AMQFrame frame = ConnectionStartOkBody.CreateAMQFrame(
                   evt.ChannelId, clientProperties, selectedMechanism,
                  saslResponse, selectedLocale);
                ps.WriteFrame(frame);
            }
            catch (Exception e)
            {
                throw new AMQException(_log, "Unable to decode data: " + e, e);
            }
        }
        public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt)
        {
            /*_logger.Info("ConnectionRedirect frame received");
            ConnectionRedirectBody method = (ConnectionRedirectBody) evt.Method;

            // the host is in the form hostname:port with the port being optional
            int portIndex = method.Host.IndexOf(':');
            String host;
            int port;
            if (portIndex == -1)
            {
                host = method.Host;
                port = DEFAULT_REDIRECT_PORT;
            }
            else
            {
                host = method.Host.Substring(0, portIndex);
                port = Int32.Parse(method.Host.Substring(portIndex + 1));
            }
            evt.ProtocolSession.Failover(host, port);*/
        }
        public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt)
        {
            _logger.Debug("ConnectionCloseOk frame received");
//            ConnectionCloseOkBody method = (ConnectionCloseOkBody)evt.Method;
            stateManager.ChangeState(AMQState.CONNECTION_CLOSED);
        }
 public void MethodReceived(AMQStateManager stateManager, AMQMethodEvent evt)
 {
     stateManager.ChangeState(AMQState.CONNECTION_OPEN);
 }
Example #12
0
 public bool MethodReceived(AMQMethodEvent evt)
 {
     _logger.Debug(String.Format("Finding method handler. currentState={0} type={1}", _currentState, evt.Method.GetType()));
     //Console.WriteLine(String.Format("Finding method handler. currentState={0} type={1}", _currentState, evt.Method.GetType())); //KHC
     IStateAwareMethodListener handler = FindStateTransitionHandler(_currentState, evt.Method);
     if (handler != null)
     {
         handler.MethodReceived(this, evt);
         //Console.WriteLine("  MethodReceived return true, newState={0}", _currentState);
         return true;
     }
     //Console.WriteLine("  MethodReceived return false, currentState={0}", _currentState);
     return false;
 }
        public void OnMessage(IDataBlock message)
        {
            // Handle incorrect protocol version.
            if (message is ProtocolInitiation)
            {
                string error = String.Format("Protocol mismatch - {0}", message.ToString());
                AMQException e = new AMQProtocolHeaderException(error);
                _log.Error("Closing connection because of protocol mismatch", e);
                //_protocolSession.CloseProtocolSession();
                _stateManager.Error(e);
                return;
            }

            AMQFrame frame = (AMQFrame)message;
            // Console.WriteLine(">>> AMQFrame frame received: " + frame); //KHC

            if (frame.BodyFrame is AMQMethodBody)
            {
                if (_log.IsDebugEnabled)
                {
                    _log.Debug("Method frame received: " + frame);
                }
                AMQMethodEvent evt = new AMQMethodEvent(frame.Channel, (AMQMethodBody)frame.BodyFrame, _protocolSession);
                try
                {
                    bool wasAnyoneInterested = false;
                    lock (_frameListeners.SyncRoot)
                    {
                        foreach (IAMQMethodListener listener in _frameListeners)
                        {
                            wasAnyoneInterested = listener.MethodReceived(evt) || wasAnyoneInterested;
                        }
                    }
                    if (!wasAnyoneInterested)
                    {
                        throw new AMQException("AMQMethodEvent " + evt + " was not processed by any listener.");
                    }
                }
                catch (Exception e)
                {
                    foreach (IAMQMethodListener listener in _frameListeners)
                    {
                        listener.Error(e);
                    }
                }
            }
            else if (frame.BodyFrame is ContentHeaderBody)
            {
                _protocolSession.MessageContentHeaderReceived(frame.Channel,
                                                              (ContentHeaderBody)frame.BodyFrame);
            }
            else if (frame.BodyFrame is ContentBody)
            {
                _protocolSession.MessageContentBodyReceived(frame.Channel,
                                                            (ContentBody)frame.BodyFrame);
            }
            else if (frame.BodyFrame is HeartbeatBody)
            {
                _log.Debug("HeartBeat received");
            }
            else
            {
                Console.WriteLine("***** UNHANDLED FRAME ******");
            }
        }
Example #14
0
        public void OnMessage(IDataBlock message)
        {
            // Handle incorrect protocol version.
            if (message is ProtocolInitiation)
            {
                string       error = String.Format("Protocol mismatch - {0}", message.ToString());
                AMQException e     = new AMQProtocolHeaderException(error);
                _log.Error("Closing connection because of protocol mismatch", e);
                //_protocolSession.CloseProtocolSession();
                _stateManager.Error(e);
                return;
            }

            AMQFrame frame = (AMQFrame)message;

            // Console.WriteLine(">>> AMQFrame frame received: " + frame); //KHC

            if (frame.BodyFrame is AMQMethodBody)
            {
                if (_log.IsDebugEnabled)
                {
                    _log.Debug("Method frame received: " + frame);
                }
                AMQMethodEvent evt = new AMQMethodEvent(frame.Channel, (AMQMethodBody)frame.BodyFrame, _protocolSession);
                try
                {
                    bool wasAnyoneInterested = false;
                    lock (_frameListeners.SyncRoot)
                    {
                        foreach (IAMQMethodListener listener in _frameListeners)
                        {
                            wasAnyoneInterested = listener.MethodReceived(evt) || wasAnyoneInterested;
                        }
                    }
                    if (!wasAnyoneInterested)
                    {
                        throw new AMQException("AMQMethodEvent " + evt + " was not processed by any listener.");
                    }
                }
                catch (Exception e)
                {
                    foreach (IAMQMethodListener listener in _frameListeners)
                    {
                        listener.Error(e);
                    }
                }
            }
            else if (frame.BodyFrame is ContentHeaderBody)
            {
                _protocolSession.MessageContentHeaderReceived(frame.Channel,
                                                              (ContentHeaderBody)frame.BodyFrame);
            }
            else if (frame.BodyFrame is ContentBody)
            {
                _protocolSession.MessageContentBodyReceived(frame.Channel,
                                                            (ContentBody)frame.BodyFrame);
            }
            else if (frame.BodyFrame is HeartbeatBody)
            {
                _log.Debug("HeartBeat received");
            }
            else
            {
                Console.WriteLine("***** UNHANDLED FRAME ******");
            }
        }