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); } }
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); }
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 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; }
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; } }