Guest User

2nd try

a guest
Jun 21st, 2012
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.21 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Http;
  7. using System.Threading.Tasks;
  8. using System.Web.Http;
  9. using System.Web.Http.Controllers;
  10. using System.Web.Http.Filters;
  11.  
  12. namespace Thinktecture.IdentityModel.Http
  13. {
  14.     public class CorsActionSelector : ApiControllerActionSelector
  15.     {
  16.         private const string origin = "Origin";
  17.         private const string accessControlRequestMethod = "Access-Control-Request-Method";
  18.         private const string accessControlRequestHeaders = "Access-Control-Request-Headers";
  19.         private const string accessControlAllowMethods = "Access-Control-Allow-Methods";
  20.         private const string accessControlAllowHeaders = "Access-Control-Allow-Headers";
  21.  
  22.         public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
  23.         {
  24.             var originalRequest = controllerContext.Request;
  25.             var isCorsRequest = originalRequest.Headers.Contains(origin);
  26.  
  27.             if (originalRequest.Method == HttpMethod.Options && isCorsRequest)
  28.             {
  29.                 var currentAccessControlRequestMethod = originalRequest.Headers.GetValues(accessControlRequestMethod).FirstOrDefault();
  30.  
  31.                 if (!string.IsNullOrEmpty(currentAccessControlRequestMethod))
  32.                 {
  33.                     var modifiedRequest = new HttpRequestMessage(
  34.                         new HttpMethod(currentAccessControlRequestMethod),
  35.                         originalRequest.RequestUri);
  36.                     controllerContext.Request = modifiedRequest;
  37.                     var actualDescriptor = base.SelectAction(controllerContext);
  38.                     controllerContext.Request = originalRequest;
  39.  
  40.                     if (actualDescriptor != null)
  41.                     {
  42.                         if (actualDescriptor.GetFilters().OfType<EnableCorsAttribute>().Any())
  43.                         {
  44.                             var descriptor = new PreflightActionDescriptor(actualDescriptor, accessControlRequestMethod);
  45.                             return descriptor;
  46.                         }
  47.                     }
  48.                 }
  49.             }
  50.  
  51.             return base.SelectAction(controllerContext);
  52.         }
  53.  
  54.         class PreflightActionDescriptor : HttpActionDescriptor
  55.         {
  56.             private readonly HttpActionDescriptor originalAction;
  57.             private readonly string prefilghtAccessControlRequestMethod;
  58.  
  59.             public PreflightActionDescriptor(HttpActionDescriptor originalAction, string accessControlRequestMethod)
  60.             {
  61.                 this.originalAction = originalAction;
  62.                 this.prefilghtAccessControlRequestMethod = accessControlRequestMethod;
  63.             }
  64.  
  65.             public override string ActionName
  66.             {
  67.                 get { return originalAction.ActionName; }
  68.             }
  69.  
  70.             public override Task<object> ExecuteAsync(HttpControllerContext controllerContext, IDictionary<string, object> arguments)
  71.             {
  72.                 var response = new HttpResponseMessage(HttpStatusCode.OK);
  73.                 response.Headers.Add(accessControlAllowMethods, prefilghtAccessControlRequestMethod);
  74.  
  75.                 var requestedHeaders = string.Join(", ", controllerContext.Request.Headers.GetValues(accessControlRequestHeaders));
  76.  
  77.                 if (!string.IsNullOrEmpty(requestedHeaders))
  78.                     response.Headers.Add(accessControlAllowHeaders, requestedHeaders);
  79.  
  80.                 var tcs = new TaskCompletionSource<object>();
  81.                 tcs.SetResult(response);
  82.                 return tcs.Task;
  83.             }
  84.  
  85.             public override Collection<HttpParameterDescriptor> GetParameters()
  86.             {
  87.                 var parameters = originalAction.GetParameters();
  88.                 return parameters;
  89.             }
  90.  
  91.             public override Type ReturnType
  92.             {
  93.                 get { return typeof(HttpResponseMessage); }
  94.             }
  95.  
  96.             public override Collection<FilterInfo> GetFilterPipeline()
  97.             {
  98.                 var pipeline = originalAction.GetFilterPipeline();
  99.                 return pipeline;
  100.             }
  101.  
  102.             public override Collection<IFilter> GetFilters()
  103.             {
  104.                 var filters = originalAction.GetFilters();
  105.                 return filters;
  106.             }
  107.  
  108.             public override Collection<T> GetCustomAttributes<T>()
  109.             {
  110.                 if (typeof(T).IsAssignableFrom(typeof(AllowAnonymousAttribute)))
  111.                 {
  112.                     return new Collection<T>
  113.                     {
  114.                         new AllowAnonymousAttribute() as T
  115.                     };
  116.                 }
  117.  
  118.                 var attributes = originalAction.GetCustomAttributes<T>();
  119.                 return attributes;
  120.             }
  121.  
  122.             public override HttpActionBinding ActionBinding
  123.             {
  124.                 get
  125.                 {
  126.                     return originalAction.ActionBinding;
  127.                 }
  128.                 set
  129.                 {
  130.                     originalAction.ActionBinding = value;
  131.                 }
  132.             }
  133.         }
  134.     }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment