Exemple #1
0
 private IDriverDataEnumerator CreatePseudoEnumeratorForInsertValues(RequestExecutionContext context)
 {
     // generate a single logical entry and break
     // actual values are computed as part of universal insert/update routine
     return(new SourcedEnumerator(
                DriverRowData.DeriveRepresentationType(context.ParsedRequest.TargetEntityPkField.DbType)));
 }
 public void CompressionCheck(RequestExecutionContext context)
 {
     if (context.Result is IList list)
     {
         context.CanCompress = list.Count > _min;
     }
 }
        /// <inheritdoc />
        public override Task HandleRequest(HttpContext context)
        {
            var requestContext = new RequestExecutionContext(context, this, Configuration.SuccessStatusCode)
            {
                Parameters = EmptyParameters.Instance
            };

            if (ActivationFunc == null)
            {
                SetupMethod();
            }

            try
            {
                requestContext.ServiceInstance = ActivationFunc(requestContext);
            }
            catch (Exception e)
            {
                return(Services.ErrorHandler.HandleException(requestContext, e));
            }

            var state = _startingState;

            return(NextStep(ref state, ref requestContext));
        }
Exemple #4
0
            public void BeforeExecute(RequestExecutionContext context)
            {
                Assert.Equal(3, context.Parameters.ParameterCount);
                Assert.Equal(3, context.Parameters.ParameterInfos.Count);

                var count = 0;

                foreach (var rpcParameterInfo in context.Parameters.ParameterInfos)
                {
                    if (context.Parameters.TryGetParameter(rpcParameterInfo.Name, out var value))
                    {
                        if (value is int intValue)
                        {
                            if (!context.Parameters.TrySetParameter(rpcParameterInfo.Name, intValue + 5))
                            {
                                throw new Exception("TrySetParameter returned false");
                            }
                        }
                        else
                        {
                            throw new Exception($"Value was not int rather some other type {value.GetType().FullName}");
                        }

                        count++;
                    }
                    else
                    {
                        throw new Exception($"Could not find parameter {rpcParameterInfo.Name} in parameters");
                    }
                }

                Assert.Equal(3, count);
            }
        /// <inheritdoc />
        public override async ValueTask <T> DeserializeFromRequest <T>(RequestExecutionContext context)
        {
            var fileReader = new FileBufferingReadStream(context.HttpContext.Request.Body, _memoryThreshold);

            context.HttpContext.Response.RegisterForDispose(fileReader);

            try
            {
                await fileReader.DrainAsync(context.HttpContext.RequestAborted);

                fileReader.Seek(0L, SeekOrigin.Begin);

                using var textReader = new StreamReader(fileReader);

                using var xmlReader = new XmlTextReader(textReader);

                var serializer = GetSerializer(typeof(T));

                return((T)serializer.Deserialize(xmlReader));
            }
            finally
            {
                await fileReader.DisposeAsync();
            }
        }
Exemple #6
0
        public async Task Execute(RequestExecutionContext context)
        {
            var validators = context.HttpContext.RequestServices.GetServices <IValidator <T> >();

            var value = (T)context.Parameters[_position];

            foreach (var validator in validators)
            {
                var validationContext = new ValidationContext <T>(value);

                ValidationResult result;

                if (ShouldValidateAsynchronously(validator, validationContext))
                {
                    result = await validator.ValidateAsync(validationContext, context.HttpContext.RequestAborted);
                }
                else
                {
                    result = validator.Validate(validationContext);
                }

                if (!result.IsValid)
                {
                    SetErrorMessage(context, result);
                }
            }
        }
            public void BeforeExecute(RequestExecutionContext context)
            {
                Assert.Equal(3, context.Parameters.ParameterCount);
                Assert.Equal(3, context.Parameters.ParameterInfos.Count);

                var count = 0;

                foreach (var rpcParameterInfo in context.Parameters.ParameterInfos)
                {
                    var value = context.Parameters[rpcParameterInfo.Position];

                    switch (rpcParameterInfo.Name)
                    {
                    case nameof(x):
                        Assert.Equal(x, value);
                        break;

                    case nameof(y):
                        Assert.Equal(y, value);
                        break;

                    case nameof(z):
                        Assert.Equal(z, value);
                        break;

                    default:
                        throw new Exception($"Unknown parameter {rpcParameterInfo.Name}");
                    }

                    count++;
                }

                Assert.Equal(3, count);
            }
Exemple #8
0
 protected virtual Task NobodyResponseHandler(RequestExecutionContext context)
 {
     if (context.Result == null ||
         (context.Result is bool boolResult && !boolResult))
     {
         context.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
     }
Exemple #9
0
        /// <inheritdoc />
        public void AfterExecute(RequestExecutionContext context)
        {
            var viewActionResult = new ViewActionResult(_executor, _modelMetadataProvider, _tempDataProvider, _viewName, _isMainPage, _contentType, context.Result, context.HttpStatusCode);

            // swap the result and it will be executed later in the pipeline if all filters succeed
            context.Result = viewActionResult;
        }
Exemple #10
0
        /// <inheritdoc />
        public Task HandleMatchedPath(HttpContext httpContext, RequestDelegate next, IEndPointMethodHandler[] methods)
        {
            var response = new StringBuilder("OPTIONS");

            foreach (var endPointMethodHandler in methods)
            {
                response.Append(", ");

                response.Append(endPointMethodHandler.HttpMethod);
            }

            var headers = httpContext.Response.Headers;

            headers.TryAdd(_optionsConfig.AllowHeader, response.ToString());

            httpContext.Response.StatusCode = (int)HttpStatusCode.NoContent;

            if (_optionsConfig.Headers.Count > 0)
            {
                var requestContext = new RequestExecutionContext(httpContext, methods[0], 204);

                foreach (var optionsConfigHeader in _optionsConfig.Headers)
                {
                    optionsConfigHeader.ApplyHeader(requestContext, headers);
                }
            }

            return(Task.CompletedTask);
        }
Exemple #11
0
            public void BeforeExecute(RequestExecutionContext context)
            {
                Assert.Equal(3, context.Parameters.ParameterCount);
                Assert.Equal(3, context.Parameters.ParameterInfos.Count);

                var count = 0;

                foreach (var rpcParameterInfo in context.Parameters.ParameterInfos)
                {
                    var value = context.Parameters[rpcParameterInfo.Name];

                    if (value is int intValue)
                    {
                        context.Parameters[rpcParameterInfo.Name] = intValue + 5;
                    }
                    else
                    {
                        throw new Exception($"Value should be int but is {value.GetType().FullName}");
                    }


                    count++;
                }

                Assert.Equal(3, count);
            }
Exemple #12
0
        public void BeginExecution(RequestExecutionContext context)
        {
            CheckDisposed();

            m_utcLastUsedAt = DateTime.UtcNow;

            if (m_activeProcessors.ContainsKey(context))
            {
                throw new InvalidOperationException("This context is marked as being executed now");
            }

            var task = new Task(
                () => ProducerThreadMethod(context),
                TaskCreationOptions.LongRunning);

            if (!m_activeProcessors.TryAdd(context, task))
            {
                throw new Exception("Could not register executing task for this context");
            }

            try
            {
                task.Start();
            }
            catch
            {
                m_activeProcessors.TryRemove(context, out task);
                throw;
            }
        }
        private Task CreateFilters(ref RequestState state, ref RequestExecutionContext requestContext)
        {
            try
            {
                var filterFuncList = Configuration.Filters;

                var filterList = new List <IRequestFilter> {
                    Capacity = filterFuncList.Count
                };

                foreach (var filterFunc in filterFuncList)
                {
                    var filter = filterFunc(requestContext);

                    if (filter != null)
                    {
                        filterList.Add(filter);
                    }
                }

                if (filterFuncList.Count > 0)
                {
                    requestContext.CallFilters = filterList;
                }

                return(NextStep(ref state, ref requestContext));
            }
            catch (Exception e)
            {
                return(Services.ErrorHandler.HandleException(requestContext, e));
            }
        }
Exemple #14
0
 public async Task BeforeExecuteAsync(RequestExecutionContext context)
 {
     foreach (var validator in _validators)
     {
         await validator.Execute(context);
     }
 }
        /// <inheritdoc />
        public Task SerializeToResponse(RequestExecutionContext context)
        {
            if (context.Result is IActionResult actionResult)
            {
                return(_actionResultExecutor.Execute(context, actionResult));
            }

            if (context.Result != null &&
                context.ContentSerializer != null)
            {
                return(context.ContentSerializer.SerializeToResponse(context));
            }

            if (context.Result == null)
            {
                return(NullResult(context));
            }

            if (_serializer != null &&
                _serializer.IsDefault)
            {
                return(_serializer.SerializeToResponse(context));
            }

            return(NegotiateSerialization(context));
        }
        /// <inheritdoc />
        public override async Task SerializeToResponse(RequestExecutionContext context)
        {
            var fileWriteStream = new FileBufferingWriteStream();

            SetStatusAndContent(context, _contentType);

            try
            {
                using var textWriter = new StreamWriter(fileWriteStream);

                using var xmlWriter = new XmlTextWriter(textWriter);

                var serializer = GetSerializer(context.Result.GetType());

                serializer.Serialize(xmlWriter, context.Result);

                xmlWriter.Flush();

                textWriter.Flush();

                await fileWriteStream.DrainBufferAsync(context.HttpContext.Response.Body, context.HttpContext.RequestAborted);
            }
            finally
            {
                await fileWriteStream.DisposeAsync();
            }
        }
Exemple #17
0
        /// <summary>
        /// Enumerates through data for a particular SELECT query.
        /// Inside MoveNext() imlementation, MUST populate the same instance of row data, pointed to by <see cref="RequestExecutionContext.DriverOutputBuffer"/>.
        /// Yields dummy true value, its value and data type are reserved for future use.
        /// </summary>
        public IDriverDataEnumerator GetData(RequestExecutionContext context)
        {
            CheckInitialized();

            var data = m_dataContainer.RequireDocumentContainer(context.ParsedRequest.TargetEntity.DocumentType);

            if (context.ParsedRequest.IsBulk)
            {
                // engine expects us to use the bulk input data iterator to fetch data rows
                return(data.GetBulkUpdateEnumerator(
                           context.ParsedRequest.BaseDataset.BaseFields,
                           context.DriverOutputBuffer,
                           context.InputDataEnumerator));
            }

            if (context.ParsedRequest.BaseDataset.OrderClauseFields.Count == 0)
            {
                return(data.GetUnorderedEnumerator(
                           context.ParsedRequest.BaseDataset.BaseFields,
                           context.ParsedRequest.BaseDataset.BaseFieldsMainCount,
                           context.DriverOutputBuffer));
            }

            if (context.ParsedRequest.BaseDataset.OrderClauseFields.Count > 1)
            {
                throw new InvalidOperationException("Sorting by more than one field is not supported yet");
            }

            return(data.GetOrderedEnumerator(
                       context.ParsedRequest.BaseDataset.BaseFields,
                       context.ParsedRequest.BaseDataset.BaseFieldsMainCount,
                       context.DriverOutputBuffer,
                       context.ParsedRequest.BaseDataset.OrderClauseFields[0].Item1,
                       context.ParsedRequest.BaseDataset.OrderClauseFields[0].Item2));
        }
Exemple #18
0
        /// <inheritdoc />
        public async Task <bool> AsyncAuthorize(RequestExecutionContext context)
        {
            var authService = context.HttpContext.RequestServices.GetRequiredService <IAuthorizationService>();

            var result = await authService.AuthorizeAsync(context.HttpContext.User, _policy);

            return(result.Succeeded);
        }
Exemple #19
0
        /// <summary>
        /// Generate an action context for execution
        /// </summary>
        /// <param name="context"></param>
        /// <param name="actionResult"></param>
        /// <returns></returns>
        protected virtual ActionContext GenerateActionContext(RequestExecutionContext context, IActionResult actionResult)
        {
            var routeData = GenerateRouteData(context, actionResult);

            var actionDescription = GenerateActionDescriptor(context, actionResult);

            return(new ActionContext(context.HttpContext, routeData, actionDescription));
        }
Exemple #20
0
 /// <inheritdoc />
 public void BeforeExecute(RequestExecutionContext context)
 {
     if (context.Parameters.ParameterCount > 0 &&
         context.Parameters[0] is SomeClass someClass)
     {
         someClass.TestValue = 20;
     }
 }
 public static void StringCompressionCheck(RequestExecutionContext context)
 {
     if (context.Result is string stringResult &&
         stringResult.Length > 1400)
     {
         context.CanCompress = true;
     }
 }
Exemple #22
0
        /// <inheritdoc />
        public override async ValueTask <T> DeserializeFromRequest <T>(RequestExecutionContext context)
        {
            if (!context.HttpContext.Request.Headers.TryGetValue("Content-Encoding", out var encoding))
            {
                return(await DeserializeStream <T>(context, context.HttpContext.Request.Body));
            }

            return(await HandleContentEncoding <T>(context, encoding));
        }
        /// <inheritdoc />
        public Task SerializeToResponse(RequestExecutionContext context)
        {
            var response = context.HttpContext.Response;

            response.ContentType = ContentType;
            response.StatusCode  = context.HttpStatusCode;

            return(MsgPack.MessagePackSerializer.SerializeAsync(response.Body, context.Result, _options, context.HttpContext.RequestAborted));
        }
Exemple #24
0
        private void ReadRequest(RequestExecutionContext context)
        {
            Serializer.MergeWithLengthPrefix(context.RequestMessage.Stream, context.Request, PrefixStyle.Base128);

            if (context.Request.PrepareOnly)
            {
                // prevent any ambiguities
                context.Request.ReturnDataset = false;
            }

            if (context.Request.HaveParameters)
            {
                context.ParsedRequest.HaveParametersDataInput = true;
                Serializer.MergeWithLengthPrefix(context.RequestMessage.Stream, context.RequestParameters, PrefixStyle.Base128);
                ReadParametersDataInput(context);
            }

            if (context.Request.HaveRequestBulk)
            {
                context.ParsedRequest.IsBulk = true;
                Serializer.MergeWithLengthPrefix(context.RequestMessage.Stream, context.RequestBulk, PrefixStyle.Base128);

                // after this point in stream, bulk input data will be read by instance of InputDataStreamEnumerator
                // e.g. we're not yet done reading the request stream here
            }

            if (m_tracer.IsInfoEnabled)
            {
                var cmdText = context.Request.CommandText;
                if (string.IsNullOrEmpty(cmdText) && context.Request.HaveRequestBulk)
                {
                    cmdText = string.Format("Bulk {0} with {2} items on {1}", context.RequestBulk.DbStatementType, context.RequestBulk.EntityName, context.RequestBulk.InputItemsCount);
                }

                m_tracer.Info("Received command: " + cmdText);
            }

            // bring up cache record
            var cacheKey  = ParsedRequestCache.GetRequestHash(context.Request, context.RequestBulk, context.RequestParameters);
            var cacheInfo = m_parsedRequestCache.AddOrGetExisting(cacheKey, context.Request.HaveParameters);

            context.AttachCachedInfo(cacheInfo);

            // populate cache record
            if (!cacheInfo.HaveRequestHeaders)
            {
                lock (cacheInfo)
                {
                    cacheInfo.CheckIsError();
                    if (!cacheInfo.HaveRequestHeaders)
                    {
                        cacheInfo.ReadRequestHeaders(context.Request, context.RequestParameters, context.RequestBulk, context.ParsedRequest);
                    }
                }
            }
        }
        private Task BindParameters(ref RequestState state, ref RequestExecutionContext requestContext)
        {
            var bindResult = BindParametersDelegate(requestContext);

            if (bindResult.IsCompletedSuccessfully)
            {
                return(NextStep(ref state, ref requestContext));
            }

            return(AsyncBindParameter(this, state, requestContext, bindResult, Services.ErrorHandler));
Exemple #26
0
        /// <inheritdoc />
        public object WrapError(RequestExecutionContext context, Exception e)
        {
            _errorWrapperCreator ??= CreateWrapperFunction();

            var wrapper = _errorWrapperCreator();

            wrapper.Message = e.Message;

            return(wrapper);
        }
Exemple #27
0
        /// <inheritdoc />
        public override ValueTask <T> DeserializeFromRequest <T>(RequestExecutionContext context)
        {
            if (!context.HttpContext.Request.Headers.TryGetValue("Content-Encoding", out var encoding))
            {
                return(JsonSerializer.DeserializeAsync <T>(context.HttpContext.Request.Body, _serializerOptions,
                                                           context.HttpContext.RequestAborted));
            }

            return(HandleContentEncoding <T>(context, encoding));
        }
Exemple #28
0
        private Stream GetOutputStream(RequestExecutionContext context)
        {
            if (!context.CanCompress ||
                !context.HttpContext.Request.Headers.TryGetValue("Accept-Encoding", out var encoding))
            {
                return(context.HttpContext.Response.Body);
            }

            return(EncodeOutputStream(context, encoding));
        }
Exemple #29
0
        private static void AssertSerializationResult(LgoLeagueGameRetrievalConfiguration retrievalConfiguration, string expectedJson)
        {
            var requestContext = new RequestExecutionContext.Builder().With(retrievalConfiguration).Build();

            RequestExecutionContext.ExecuteWith(requestContext, () =>
            {
                var actualJson = JsonConvert.SerializeObject(Game, Formatting.Indented);
                Assert.AreEqual(expectedJson, actualJson);
            });
        }
Exemple #30
0
        private void SetErrorMessage(RequestExecutionContext requestExecutionContext, ValidationResult result)
        {
            requestExecutionContext.Result ??= _errorWrappingService.GetErrorWrapper();

            if (requestExecutionContext.Result is IErrorWrapper errorWrapper)
            {
                errorWrapper.Message += result.ToString();
                requestExecutionContext.HttpStatusCode = (int)HttpStatusCode.UnprocessableEntity;
            }
        }