internal static ClassifyState TransitionExpectProtocolError(
            ClassifyState state, Frame frame, ref ProtocolError error, ref FrameDisposition disposition, Logger logger)
        {
            if (state != ClassifyState.ExpectProtocolError || frame == null || frame.Count == 0 ||
                frame.Framelets[0].Type != FrameletType.ProtocolError)
            {
                return(ClassifyState.InternalStateError);
            }

            if (frame.Count > 1)
            {
                logger.Site().Error("Protocol error frame had trailing framelets.");
                return(ClassifyState.ErrorInErrorFrame);
            }

            var framelet = frame.Framelets[0];

            var inputBuffer      = new InputBuffer(framelet.Contents);
            var fastBinaryReader = new FastBinaryReader <InputBuffer>(inputBuffer, version: 1);

            switch (errorDeserializer.TryDeserialize(fastBinaryReader, out error))
            {
            case Deserialize.Result.Success:
                break;

            default:
                logger.Site().Error("Didn't get a valid {0}.", nameof(ProtocolError));
                return(ClassifyState.ErrorInErrorFrame);
            }

            logger.Site().Debug("Deserialized {0} with code {1}.", nameof(ProtocolError), error.error_code);
            disposition = FrameDisposition.HandleProtocolError;
            return(ClassifyState.ClassifiedValidFrame);
        }
        internal static ClassifyState TransitionValidFrame(
            ClassifyState state, EpoxyHeaders headers, ref FrameDisposition disposition)
        {
            if (state != ClassifyState.ValidFrame || headers == null)
            {
                return(ClassifyState.InternalStateError);
            }

            switch (headers.message_type)
            {
            case EpoxyMessageType.REQUEST:
                disposition = FrameDisposition.DeliverRequestToService;
                return(ClassifyState.ClassifiedValidFrame);

            case EpoxyMessageType.RESPONSE:
                disposition = FrameDisposition.DeliverResponseToProxy;
                return(ClassifyState.ClassifiedValidFrame);

            case EpoxyMessageType.EVENT:
                disposition = FrameDisposition.DeliverEventToService;
                return(ClassifyState.ClassifiedValidFrame);

            default:
                return(ClassifyState.InternalStateError);
            }
        }
Ejemplo n.º 3
0
        internal static ClassifyState TransitionValidFrame(
            ClassifyState state, EpoxyHeaders headers, ref FrameDisposition disposition)
        {
            if (state != ClassifyState.ValidFrame || headers == null)
            {
                return(ClassifyState.InternalStateError);
            }

            switch (headers.payload_type)
            {
            case PayloadType.Request:
                disposition = FrameDisposition.DeliverRequestToService;
                return(ClassifyState.ClassifiedValidFrame);

            case PayloadType.Response:
                disposition = FrameDisposition.DeliverResponseToProxy;
                return(ClassifyState.ClassifiedValidFrame);

            case PayloadType.Event:
                disposition = FrameDisposition.DeliverEventToService;
                return(ClassifyState.ClassifiedValidFrame);

            default:
                return(ClassifyState.InternalStateError);
            }
        }
        internal static ClassifyState TransitionExpectConfig(
            ClassifyState state,
            Frame frame,
            ref ProtocolErrorCode?errorCode,
            ref FrameDisposition disposition,
            Logger logger)
        {
            Debug.Assert(state == ClassifyState.ExpectConfig);
            Debug.Assert(frame != null);

            if (frame.Count == 0 || frame.Framelets[0].Type != FrameletType.EpoxyConfig)
            {
                return(ClassifyState.InternalStateError);
            }

            if (frame.Count != 1)
            {
                logger.Site().Error("Config frame had trailing framelets.");
                errorCode = ProtocolErrorCode.MALFORMED_DATA;
                return(ClassifyState.MalformedFrame);
            }

            var framelet = frame.Framelets[0];

            var inputBuffer      = new InputBuffer(framelet.Contents);
            var fastBinaryReader = new FastBinaryReader <InputBuffer>(inputBuffer, 1);

            // We don't currently do anything with the config aside from try to deserialize it.
            EpoxyConfig config;

            switch (configDeserializer.TryDeserialize(fastBinaryReader, out config))
            {
            case Deserialize.Result.Success:
                break;

            default:
                logger.Site().Error("Didn't get a valid {0}.", nameof(EpoxyConfig));
                errorCode = ProtocolErrorCode.MALFORMED_DATA;
                return(ClassifyState.MalformedFrame);
            }

            disposition = FrameDisposition.ProcessConfig;
            return(ClassifyState.ClassifiedValidFrame);
        }
Ejemplo n.º 5
0
        internal static ClassifyState TransitionExpectProtocolError(
            ClassifyState state, Frame frame, ref ProtocolError error, ref FrameDisposition disposition, Logger logger)
        {
            if (state != ClassifyState.ExpectProtocolError || frame == null || frame.Count == 0
                || frame.Framelets[0].Type != FrameletType.ProtocolError)
            {
                return ClassifyState.InternalStateError;
            }

            if (frame.Count > 1)
            {
                logger.Site().Error("Protocol error frame had trailing framelets.");
                return ClassifyState.ErrorInErrorFrame;
            }

            var framelet = frame.Framelets[0];

            var inputBuffer = new InputBuffer(framelet.Contents);
            var fastBinaryReader = new FastBinaryReader<InputBuffer>(inputBuffer, version: 1);
            switch (errorDeserializer.TryDeserialize(fastBinaryReader, out error))
            {
                case Deserialize.Result.Success:
                    break;

                default:
                    logger.Site().Error("Didn't get a valid {0}.", nameof(ProtocolError));
                    return ClassifyState.ErrorInErrorFrame;
            }

            logger.Site().Debug("Deserialized {0} with code {1}.", nameof(ProtocolError), error.error_code);
            disposition = FrameDisposition.HandleProtocolError;
            return ClassifyState.ClassifiedValidFrame;
        }
Ejemplo n.º 6
0
        internal static ClassifyState TransitionExpectConfig(
            ClassifyState state, Frame frame, ref ProtocolErrorCode? errorCode, ref FrameDisposition disposition,
            Logger logger)
        {
            Debug.Assert(state == ClassifyState.ExpectConfig);
            Debug.Assert(frame != null);

            if (frame.Count == 0 || frame.Framelets[0].Type != FrameletType.EpoxyConfig)
            {
                return ClassifyState.InternalStateError;
            }

            if (frame.Count != 1)
            {
                logger.Site().Error("Config frame had trailing framelets.");
                errorCode = ProtocolErrorCode.MALFORMED_DATA;
                return ClassifyState.MalformedFrame;
            }

            var framelet = frame.Framelets[0];

            var inputBuffer = new InputBuffer(framelet.Contents);
            var fastBinaryReader = new FastBinaryReader<InputBuffer>(inputBuffer, version: 1);

            // We don't currently do anything with the config aside from try to deserialize it.
            EpoxyConfig config;
            switch (configDeserializer.TryDeserialize(fastBinaryReader, out config))
            {
                case Deserialize.Result.Success:
                    break;

                default:
                    logger.Site().Error("Didn't get a valid {0}.", nameof(EpoxyConfig));
                    errorCode = ProtocolErrorCode.MALFORMED_DATA;
                    return ClassifyState.MalformedFrame;
            }

            disposition = FrameDisposition.ProcessConfig;
            return ClassifyState.ClassifiedValidFrame;
        }
Ejemplo n.º 7
0
        internal static ClassifyState TransitionValidFrame(
            ClassifyState state, EpoxyHeaders headers, ref FrameDisposition disposition)
        {
            if (state != ClassifyState.ValidFrame || headers == null)
            {
                return ClassifyState.InternalStateError;
            }

            switch (headers.message_type)
            {
                case EpoxyMessageType.REQUEST:
                    disposition = FrameDisposition.DeliverRequestToService;
                    return ClassifyState.ClassifiedValidFrame;

                case EpoxyMessageType.RESPONSE:
                    disposition = FrameDisposition.DeliverResponseToProxy;
                    return ClassifyState.ClassifiedValidFrame;

                case EpoxyMessageType.EVENT:
                    disposition = FrameDisposition.DeliverEventToService;
                    return ClassifyState.ClassifiedValidFrame;

                default:
                    return ClassifyState.InternalStateError;
            }
        }