예제 #1
0
        public static T Resolve <T>(this IProtocolConverter protocolConverter, byte[] source, ref int index, DataFlag checkDataFlag)
        {
            var dataContext = protocolConverter.Resolve(source, ref index);

            if (dataContext.DataFlag != checkDataFlag)
            {
                throw new ProtocolException($"Data flag should be '{checkDataFlag}' bus is ''{dataContext.DataFlag}", ErrorCode.BadRequest);
            }

            return((T)dataContext.Data);
        }
예제 #2
0
        protected virtual void HandlePacket(byte[] readBuffer, int length, CancellationTokenSource cancellationTokenSource)
        {
            ThrowClosed();

            var stop = ProtocolWatch.Start("rp-receive-request");

            var index = 0;

            var converterHeader = protocolConverter.Resolve <ConverterHeader>(readBuffer, ref index);
            var requestHeader   = protocolConverter.Resolve <RequestHeader>(readBuffer, ref index);

            if (converterHeader.VersionMajor != 1)
            {
                throw new ProtocolException(ErrorCode.VersionNotSupported);
            }


            if (SecurityInject != null)
            {
                var securityContext = new SecurityInjectContext()
                {
                    ConverterHeader = converterHeader,
                    RequestHeader   = requestHeader,
                    HeaderEndIndex  = index,
                    Data            = sendBuffer,
                    Length          = length
                };

                SecurityInject?.ReceiveSecurity(ResolverSession, securityContext);
                length = securityContext.Length;
            }

            var resolvedContexts = protocolConverter.Resolve(readBuffer, ref index, length);
            var resolvedContent  = new DataContent(resolvedContexts);

            if (DataInject != null)
            {
                var injectContext = new DataInjectContext()
                {
                    ConverterHeader = converterHeader,
                    RequestHeader   = requestHeader,
                    DataContent     = resolvedContent,
                };

                DataInject.ReceiveData(ResolverSession, injectContext);
            }

            stop();


            var requestId = requestHeader.RequestId;

            if (requestHeader.RequestType == RequestType.Response)
            {
                HandleResponse(resolvedContent, requestId, requestHeader.CanBeCached, index);
            }
            else if (requestHeader.RequestType == RequestType.Request)
            {
                HandleRequest(resolvedContent, requestId, index, cancellationTokenSource);
            }
            else
            {
                throw new ProtocolException(ErrorCode.BadRequest);
            }
        }
예제 #3
0
        public static T Resolve <T>(this IProtocolConverter protocolConverter, byte[] source, ref int index)
        {
            var dataContext = protocolConverter.Resolve(source, ref index);

            return((T)dataContext.Data);
        }