private async Task CreateUserTypeValueProvider()

in src/WebJobs.Extensions.Http/HttpTriggerAttributeBindingProvider.cs [380:432]


            private async Task<IValueProvider> CreateUserTypeValueProvider(HttpRequest request, string invokeString)
            {
                // First check to see if the WebHook data has already been deserialized,
                // otherwise read from the request body if present
                if (!request.HttpContext.Items.TryGetValue(HttpExtensionConstants.AzureWebJobsWebHookDataKey, out object value))
                {
                    if (IsRequestPayloadReadable(request))
                    {
                        IServiceProvider requestServices = request.HttpContext.RequestServices;
                        var metadata = requestServices
                            .GetService<ModelBinding.IModelMetadataProvider>()?
                            .GetMetadataForType(_parameter.ParameterType);

                        if (metadata != null)
                        {
                            var mvcOptions = requestServices.GetService<IOptions<MvcOptions>>()?.Value;
                            var streamReaderFactory = requestServices.GetService<IHttpRequestStreamReaderFactory>();

                            Func<Stream, Encoding, TextReader> readerFactory = null;
                            if (streamReaderFactory != null)
                            {
                                readerFactory = streamReaderFactory.CreateReader;
                            }
                            else
                            {
                                readerFactory = (s, e) => new HttpRequestStreamReader(s, e);
                            }

                            var context = new InputFormatterContext(request.HttpContext,
                                modelName: string.Empty,
                                modelState: new ModelBinding.ModelStateDictionary(),
                                metadata: metadata,
                                readerFactory: readerFactory);

                            var formatter = mvcOptions.InputFormatters.FirstOrDefault(f => f.CanRead(context));

                            if (formatter != null)
                            {
                                var result = await formatter.ReadAsync(context);

                                value = result.Model;
                            }
                        }
                    }
                }

                if (value == null)
                {
                    value = Activator.CreateInstance(_parameter.ParameterType);
                }

                return new SimpleValueProvider(_parameter.ParameterType, value, invokeString);
            }