From f3072339de24621b279694b75cadb4526e14b87d Mon Sep 17 00:00:00 2001
From: David Fowler <davidfowl@gmail.com>
Date: Sat, 2 Feb 2019 06:18:54 -0800
Subject: [PATCH] Handle null attributes in generated delegates (#7210)

---
 .../Builder/EndpointRouteBuilderExtensions.cs | 10 ++++++++--
 ...EndpointDataSourceBuilderExtensionsTest.cs | 20 +++++++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs b/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs
index 6fa6d4db1cb..e3df5c72b6a 100644
--- a/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs
+++ b/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs
@@ -327,9 +327,15 @@ namespace Microsoft.AspNetCore.Builder
             };
 
             // Add delegate attributes as metadata
-            foreach (var attribute in requestDelegate.Method.GetCustomAttributes())
+            var attributes = requestDelegate.Method.GetCustomAttributes();
+
+            // This can be null if the delegate is a dynamic method or compiled from an expression tree
+            if (attributes != null)
             {
-                routeEndpointBuilder.Metadata.Add(attribute);
+                foreach (var attribute in attributes)
+                {
+                    routeEndpointBuilder.Metadata.Add(attribute);
+                }
             }
 
             if (metadata != null)
diff --git a/src/Http/Routing/test/UnitTests/Builder/MapEndpointEndpointDataSourceBuilderExtensionsTest.cs b/src/Http/Routing/test/UnitTests/Builder/MapEndpointEndpointDataSourceBuilderExtensionsTest.cs
index ae53ec0427d..a002a54cec4 100644
--- a/src/Http/Routing/test/UnitTests/Builder/MapEndpointEndpointDataSourceBuilderExtensionsTest.cs
+++ b/src/Http/Routing/test/UnitTests/Builder/MapEndpointEndpointDataSourceBuilderExtensionsTest.cs
@@ -2,6 +2,7 @@
 // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 
 using System;
+using System.Linq.Expressions;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Routing;
@@ -133,6 +134,25 @@ namespace Microsoft.AspNetCore.Builder
             Assert.IsType<Metadata>(endpointBuilder1.Metadata[2]);
         }
 
+        [Fact]
+        public void MapEndpoint_GeneratedDelegateWorks()
+        {
+            // Arrange
+            var builder = new DefaultEndpointRouteBuilder();
+
+            Expression<RequestDelegate> handler = context => Task.CompletedTask;
+
+            // Act
+            var endpointBuilder = builder.Map(RoutePatternFactory.Parse("/"), "Display name!", handler.Compile(), new Metadata());
+
+            // Assert
+            var endpointBuilder1 = GetRouteEndpointBuilder(builder);
+            Assert.Equal("Display name!", endpointBuilder1.DisplayName);
+            Assert.Equal("/", endpointBuilder1.RoutePattern.RawText);
+            Assert.Equal(1, endpointBuilder1.Metadata.Count);
+            Assert.IsType<Metadata>(endpointBuilder1.Metadata[0]);
+        }
+
         [Attribute1]
         [Attribute2]
         private static Task Handle(HttpContext context) => Task.CompletedTask;
-- 
GitLab