示例#1
0
        public async Task BindAsync_Poco_FromRouteParameters()
        {
            ParameterInfo parameterInfo = GetType().GetMethod("TestPocoFunction").GetParameters()[0];

            HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, true);

            HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions/myfunc");

            Dictionary <string, object> routeData = new Dictionary <string, object>
            {
                { "Name", "Mathew Charles" },
                { "Location", "Seattle" }
            };

            request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, routeData);

            FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None);
            ValueBindingContext    context         = new ValueBindingContext(functionContext, CancellationToken.None);
            ITriggerData           triggerData     = await binding.BindAsync(request, context);

            Assert.Equal(5, triggerData.BindingData.Count);
            Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]);
            Assert.Equal("Seattle", triggerData.BindingData["Location"]);

            TestPoco testPoco = (TestPoco)(await triggerData.ValueProvider.GetValueAsync());

            Assert.Equal("Mathew Charles", testPoco.Name);
            Assert.Equal("Seattle", testPoco.Location);
        }
示例#2
0
        public async Task BindAsync_Poco_MergedBindingData()
        {
            ParameterInfo parameterInfo = GetType().GetMethod("TestPocoFunctionEx").GetParameters()[0];

            HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, true);

            JObject requestBody = new JObject
            {
                { "Name", "Mathew Charles" },
                { "Phone", "(425) 555-6666" }
            };

            var headers = new HeaderDictionary();

            headers.Add("Content-Type", "application/json");

            HttpRequest request  = HttpTestHelpers.CreateHttpRequest("GET", "http://functions/myfunc?code=abc123&Age=25", headers, requestBody.ToString());
            var         services = new ServiceCollection();

            services.AddOptions();
            services.AddSingleton(Options.Create(new MvcOptions()));
            var formatter = new Mock <IInputFormatter>();

            formatter.Setup(f => f.ReadAsync(It.IsAny <InputFormatterContext>()))
            .ReturnsAsync((InputFormatterContext c) =>
            {
                TextReader reader         = c.ReaderFactory(c.HttpContext.Request.Body, Encoding.UTF8);
                JsonSerializer serializer = new JsonSerializer();
                object result             = serializer.Deserialize(reader, c.Metadata.ModelType);

                return(InputFormatterResult.Success(result));
            });

            services.AddMvcCore(o => o.InputFormatters.Add(formatter.Object));
            request.HttpContext.RequestServices = services.BuildServiceProvider();

            Dictionary <string, object> routeData = new Dictionary <string, object>
            {
                { "Location", "Seattle" }
            };

            request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, routeData);

            FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None);
            ValueBindingContext    context         = new ValueBindingContext(functionContext, CancellationToken.None);
            ITriggerData           triggerData     = await binding.BindAsync(request, context);

            Assert.Equal(9, triggerData.BindingData.Count);
            Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]);
            Assert.Equal("Seattle", triggerData.BindingData["Location"]);
            Assert.Equal("(425) 555-6666", triggerData.BindingData["Phone"]);
            Assert.Equal("25", triggerData.BindingData["Age"]);

            TestPocoEx testPoco = (TestPocoEx)(await triggerData.ValueProvider.GetValueAsync());

            Assert.Equal("Mathew Charles", testPoco.Name);
            Assert.Equal("Seattle", testPoco.Location);
            Assert.Equal("(425) 555-6666", testPoco.Phone);
            Assert.Equal(25, testPoco.Age);
        }
示例#3
0
        public void GetRequestBindingData_ReadsFromRoute_BindsAllTypes(Type type, object value, string stringValue)
        {
            HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/test");

            Dictionary <string, object> routeData = new Dictionary <string, object>
            {
                { "test", stringValue }
            };

            request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, routeData);

            Dictionary <string, Type> bindingDataContract = new Dictionary <string, Type>
            {
                { "test", type }
            };

            var bindingData = HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingData(request, bindingDataContract: bindingDataContract);

            Assert.Equal(3, bindingData.Count);
            Assert.Equal(value, bindingData["test"]);

            // Can only compare types if something was passed in
            if (value != null)
            {
                // Data is bound by underlying type if nullable
                Assert.Equal(Nullable.GetUnderlyingType(type) ?? type, bindingData["test"].GetType());
            }
        }
示例#4
0
        public async Task BindAsync_HttpRequestMessage_FromRequestBody()
        {
            ParameterInfo parameterInfo = GetType().GetMethod("TestHttpRequestMessageFunction").GetParameters()[0];

            HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, false);

            // we intentionally do not send a content type on the request
            // to ensure that we can still extract binding data in such cases
            JObject requestBody = new JObject
            {
                { "Name", "Mathew Charles" },
                { "Location", "Seattle" }
            };

            HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/myfunc?code=abc123", null, requestBody.ToString());

            request.ContentType = "application/json";

            FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None);
            ValueBindingContext    context         = new ValueBindingContext(functionContext, CancellationToken.None);
            ITriggerData           triggerData     = await binding.BindAsync(request, context);

            Assert.Equal(5, triggerData.BindingData.Count);
            Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]);
            Assert.Equal("Seattle", triggerData.BindingData["Location"]);

            HttpRequestMessage result = (HttpRequestMessage)(await triggerData.ValueProvider.GetValueAsync());

            Assert.NotNull(result);

            var contentResult = await result.Content.ReadAsAsync <JObject>();

            Assert.Equal("Mathew Charles", contentResult["Name"]);
        }
示例#5
0
        public async Task BindAsync_Poco_WebHookData()
        {
            ParameterInfo parameterInfo = GetType().GetMethod("TestPocoFunction").GetParameters()[0];

            HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, true);

            HttpRequest request  = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/myfunc?code=abc123");
            TestPoco    testPoco = new TestPoco
            {
                Name     = "Mathew Charles",
                Location = "Seattle"
            };

            request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsWebHookDataKey, testPoco);

            FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None);
            ValueBindingContext    context         = new ValueBindingContext(functionContext, CancellationToken.None);
            ITriggerData           triggerData     = await binding.BindAsync(request, context);

            Assert.Equal(5, triggerData.BindingData.Count);
            Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]);
            Assert.Equal("Seattle", triggerData.BindingData["Location"]);

            TestPoco result = (TestPoco)(await triggerData.ValueProvider.GetValueAsync());

            Assert.Same(testPoco, result);
        }
示例#6
0
        public async Task BasicResponse()
        {
            HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions.com/api/abc");
            var         method  = typeof(TestFunctions).GetMethod(nameof(TestFunctions.TestResponse));
            await _host.CallAsync(method, new { req = request });

            Assert.Equal("test-response", request.HttpContext.Items["$ret"]); // Verify resposne was set
        }
示例#7
0
        public async Task HttpTrigger_WithNoIdentities_ClaimsPrincipalIsNotAuthenticated()
        {
            var request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions.com/api/TestIdentityBindings");
            var method  = typeof(TestFunctions).GetMethod(nameof(TestFunctions.HttpRequest));

            await GetJobHost().CallAsync(method, new { req = request });

            var principal = GetResult(request);

            Assert.False(principal.Identity.IsAuthenticated);
        }
        public void HttpTriggerBinding_ToInvokeString_ReturnsExpectedResult()
        {
            var headers = new HeaderDictionary
            {
                { "Custom1", "Testing" }
            };

            HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "https://functions.azurewebsites.net/api/httptrigger?code=123&name=Mathew");

            string result = HttpTriggerAttributeBindingProvider.HttpTriggerBinding.ToInvokeString(request);

            Assert.Equal("Method: GET, Uri: https://functions.azurewebsites.net/api/httptrigger", result);
        }
示例#9
0
        public async Task HttpTrigger_WithClaimsPrincipal_BindsClaimsPrincipalSuccessfully()
        {
            var request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions.com/api/TestIdentityBindings");

            request.HttpContext.User = GetSamplePrincipal();

            var method = typeof(TestFunctions).GetMethod(nameof(TestFunctions.HttpRequest));

            await GetJobHost().CallAsync(method, new { req = request });

            var principal = GetResult(request);

            Assert.Equal(request.HttpContext.User, principal);
        }
示例#10
0
        public async Task GetRequestBindingDataAsync_ReadsFromBody()
        {
            string      input       = "{ test: 'testing', baz: 123, nestedArray: [ { nesting: 'yes' } ], nestedObject: { a: 123, b: 456 } }";
            HttpRequest request     = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/test", null, input);
            var         bindingData = await HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingDataAsync(request);

            Assert.Equal(5, bindingData.Count);
            Assert.Equal("testing", bindingData["test"]);
            Assert.Equal("123", bindingData["baz"]);

            JObject nestedObject = (JObject)bindingData["nestedObject"];

            Assert.Equal(123, (int)nestedObject["a"]);
        }
示例#11
0
        public async Task GetRequestBindingDataAsync_Auth_Header()
        {
            var headers = new HeaderDictionary();

            headers.Add("Authorization", "Bearer ey123");
            headers.Add("x-ms-id-aad", "ey456");

            HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/test", headers);

            var bindingData = await HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingDataAsync(request);

            TestBindingData(bindingData,
                            "{headers.authorization}", "Bearer ey123",
                            "{headers.x-ms-id-aad}", "ey456");
        }
示例#12
0
        public async Task BindAsync_Poco_FromRequestBody(bool isChunked)
        {
            ParameterInfo parameterInfo = GetType().GetMethod("TestPocoFunction").GetParameters()[0];
            var           httpOptions   = Options.Create <HttpOptions>(new HttpOptions()
            {
                EnableChunkedRequestBinding = isChunked
            });

            HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, true, httpOptions);

            JObject requestBody = new JObject
            {
                { "Name", "Mathew Charles" },
                { "Location", "Seattle" }
            };

            var headers = new HeaderDictionary();

            headers.Add("Content-Type", "application/json");
            HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/myfunc?code=abc123", headers, requestBody.ToString());

            if (isChunked)
            {
                request.ContentLength = null;
                request.Headers.Add(HeaderNames.TransferEncoding, "chunked");
            }

            IServiceCollection services = new ServiceCollection();

            services.AddMvc();
            services.AddSingleton <ObjectPoolProvider, DefaultObjectPoolProvider>();
            services.AddSingleton <ILoggerFactory, NullLoggerFactory>();

            request.HttpContext.RequestServices = services.BuildServiceProvider();

            FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None);
            ValueBindingContext    context         = new ValueBindingContext(functionContext, CancellationToken.None);
            ITriggerData           triggerData     = await binding.BindAsync(request, context);

            Assert.Equal(5, triggerData.BindingData.Count);
            Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]);
            Assert.Equal("Seattle", triggerData.BindingData["Location"]);

            TestPoco testPoco = (TestPoco)(await triggerData.ValueProvider.GetValueAsync());

            Assert.Equal("Mathew Charles", testPoco.Name);
            Assert.Equal("Seattle", testPoco.Location);
        }
示例#13
0
        public async Task GetRequestBindingDataAsync_ReadsFromQueryString()
        {
            HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/test?name=Mathew%20Charles&location=Seattle");

            var bindingData = await HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingDataAsync(request);

            Assert.Equal(4, bindingData.Count);
            Assert.Equal("Mathew Charles", bindingData["name"]);
            Assert.Equal("Seattle", bindingData["location"]);

            TestBindingData(bindingData,
                            "{name}", "Mathew Charles",
                            "{location}", "Seattle",
                            "{query.name}", "Mathew Charles",
                            "{query.location}", "Seattle");
        }
示例#14
0
        public async Task BasicInvoke()
        {
            HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions.com/api/123/two/test?q1=123&q2=two");

            request.Headers.Add("h1", "value1");
            request.Headers.Add("h2", "value2");
            var routeDataValues = new Dictionary <string, object>
            {
                { "r1", 123 },
                { "r2", "two" }
            };

            request.HttpContext.Items[HttpExtensionConstants.AzureWebJobsHttpRouteDataKey] = routeDataValues;

            var method = typeof(TestFunctions).GetMethod("TestFunction1");
            await _host.CallAsync(method, new { req = request });
        }
示例#15
0
        public async Task QueryHeaderBindingParameters()
        {
            string      testId     = Guid.NewGuid().ToString();
            string      testValue  = Guid.NewGuid().ToString();
            string      testSuffix = Guid.NewGuid().ToString();
            HttpRequest request    = HttpTestHelpers.CreateHttpRequest("GET", $"http://functions.com/api/test?testId={testId}");

            request.Headers.Add("h1", "value1");
            request.Headers.Add("h2", "value2");
            request.Headers.Add("testSuffix", testSuffix);
            request.Headers.Add("testValue", testValue);
            var routeDataValues = new Dictionary <string, object>
            {
                { "r1", 123 },
                { "r2", "two" }
            };

            request.HttpContext.Items[HttpExtensionConstants.AzureWebJobsHttpRouteDataKey] = routeDataValues;

            var method = typeof(TestFunctions).GetMethod(nameof(TestFunctions.TestFunction2));
            await _host.CallAsync(method, new { req = request });

            // verify blob was written
            string             blobName  = $"test-{testId}-{testSuffix}";
            var                account   = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("AzureWebJobsStorage"));
            CloudBlobClient    client    = account.CreateCloudBlobClient();
            CloudBlobContainer container = client.GetContainerReference("test-output");
            var                blobRef   = await container.GetBlobReferenceFromServerAsync(blobName);

            await TestHelpers.Await(() => blobRef.ExistsAsync());

            MemoryStream stream = new MemoryStream();
            await blobRef.DownloadToStreamAsync(stream);

            stream.Seek(0, SeekOrigin.Begin);

            string result;

            using (var streamReader = new StreamReader(stream))
            {
                result = await streamReader.ReadToEndAsync();
            }

            Assert.Equal(testValue, result);
        }
示例#16
0
        public async Task GetRequestBindingDataAsync_ReadsFromRoute()
        {
            HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/test");

            Dictionary <string, object> routeData = new Dictionary <string, object>
            {
                { "Name", "Mathew Charles" },
                { "Location", "Seattle" }
            };

            request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, routeData);

            var bindingData = await HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingDataAsync(request);

            Assert.Equal(4, bindingData.Count);
            Assert.Equal("Mathew Charles", bindingData["Name"]);
            Assert.Equal("Seattle", bindingData["Location"]);
        }
示例#17
0
        public async Task BindAsync_HttpRequestMessage_FromQueryParameters()
        {
            ParameterInfo parameterInfo = GetType().GetMethod("TestHttpRequestMessageFunction").GetParameters()[0];

            HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, false);

            HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions/myfunc?code=abc123&Name=Mathew%20Charles&location=Hawaii&Location=Ohio&Location=Seattle");

            FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None);
            ValueBindingContext    context         = new ValueBindingContext(functionContext, CancellationToken.None);
            ITriggerData           triggerData     = await binding.BindAsync(request, context);

            Assert.Equal(5, triggerData.BindingData.Count);
            Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]);
            Assert.Equal("Seattle", triggerData.BindingData["Location"]);

            HttpRequestMessage result = (HttpRequestMessage)(await triggerData.ValueProvider.GetValueAsync());

            Assert.NotNull(result);
        }
示例#18
0
        public async Task BindAsync_Dynamic()
        {
            ParameterInfo parameterInfo = GetType().GetMethod(nameof(TestDynamicFunction)).GetParameters()[0];

            HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, false);

            var headers = new HeaderDictionary();

            headers.Add("Content-Type", "application/json");
            HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/myfunc?code=abc123", headers, "{ \"value\" : \"This is a test\" }");

            FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None);
            ValueBindingContext    context         = new ValueBindingContext(functionContext, CancellationToken.None);
            ITriggerData           triggerData     = await binding.BindAsync(request, context);

            Assert.Equal(4, triggerData.BindingData.Count);

            var result = (JObject)(await triggerData.ValueProvider.GetValueAsync());

            Assert.Equal("This is a test", result["value"].ToString());
        }
        public async Task BindAsync_Poco_FromQueryParameters()
        {
            ParameterInfo parameterInfo = GetType().GetMethod("TestPocoFunction").GetParameters()[0];

            HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, true);

            HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions/myfunc?code=abc123&Name=Mathew%20Charles&Location=Seattle");

            FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None, new TestTraceWriter(Level.Verbose));
            ValueBindingContext    context         = new ValueBindingContext(functionContext, CancellationToken.None);
            ITriggerData           triggerData     = await binding.BindAsync(request, context);

            Assert.Equal(4, triggerData.BindingData.Count);
            Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]);
            Assert.Equal("Seattle", triggerData.BindingData["Location"]);

            TestPoco testPoco = (TestPoco)(await triggerData.ValueProvider.GetValueAsync());

            Assert.Equal("Mathew Charles", testPoco.Name);
            Assert.Equal("Seattle", testPoco.Location);
        }
        public async Task BindAsync_String()
        {
            ParameterInfo parameterInfo = GetType().GetMethod("TestStringFunction").GetParameters()[0];

            HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, false);

            var headers = new HeaderDictionary();

            headers.Add("Content-Type", "application/text");
            HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/myfunc?code=abc123", headers, "This is a test");

            FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None, new TestTraceWriter(Level.Verbose));
            ValueBindingContext    context         = new ValueBindingContext(functionContext, CancellationToken.None);
            ITriggerData           triggerData     = await binding.BindAsync(request, context);

            Assert.Equal(2, triggerData.BindingData.Count);

            string result = (string)(await triggerData.ValueProvider.GetValueAsync());

            Assert.Equal("This is a test", result);
        }
示例#21
0
        public async Task GetRequestBindingDataAsync_ReadsFrom_Duplicates()
        {
            string input   = "{ name: 'body1', nestedObject: { name: 'body2' } }";
            var    headers = new HeaderDictionary();

            headers.Add("name", "Mathew");

            HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/{test:alpha}/test?name=Amy", headers, input);

            var routeData = new Dictionary <string, object>
            {
                { "test", "path1" }
            };

            request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, routeData);

            var bindingData = await HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingDataAsync(request);

            TestBindingData(bindingData,
                            "{headers.name}", "Mathew",
                            "{test}", "path1",
                            "{query.name}", "Amy");
        }
示例#22
0
        public async Task BindToPoco()
        {
            JObject jo = new JObject
            {
                { "b1", "bodyvalue1" }
            };
            string json = jo.ToString();

            HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions.com/api/123/two/test?q1=one&q2=two", body: json);

            request.Headers.Add("h1", "value1");
            request.Headers.Add("h2", "value2");
            var routeDataValues = new Dictionary <string, object>
            {
                { "r1", 123 },
                { "r2", "two" }
            };

            request.HttpContext.Items[HttpExtensionConstants.AzureWebJobsHttpRouteDataKey] = routeDataValues;

            var method = typeof(TestFunctions).GetMethod("TestFunction3");
            await _jobHost.CallAsync(method, new { poco = request });
        }