Skip to content

Instantly share code, notes, and snippets.

@AymericG
Created December 31, 2015 14:43
Show Gist options
  • Save AymericG/3ed26cca3d931e481ade to your computer and use it in GitHub Desktop.
Save AymericG/3ed26cca3d931e481ade to your computer and use it in GitHub Desktop.
Issue with PATCH and CORS
public class CorsMessageHandler : DelegatingHandler
{
const string Origin = "Origin";
const string AccessControlRequestMethod = "Access-Control-Request-Method";
const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";
const string AccessControlAllowCredentials = "Access-Control-Allow-Credentials";
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
IEnumerable<string> originHeaders;
if (request.Headers.TryGetValues(Origin, out originHeaders))
{
return ProcessCorsRequest(request, ref cancellationToken, originHeaders.First());
}
return base.SendAsync(request, cancellationToken);
}
private Task<HttpResponseMessage> ProcessCorsRequest(HttpRequestMessage request, ref CancellationToken cancellationToken, string originHeader)
{
if (request.Method == HttpMethod.Options)
{
return Task.Factory.StartNew(() =>
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
AddCorsResponseHeaders(request, response, originHeader);
return response;
}, cancellationToken);
}
else
{
return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(task =>
{
HttpResponseMessage resp = task.Result;
resp.Headers.Add(AccessControlAllowOrigin, originHeader);
resp.Headers.Add(AccessControlAllowCredentials, "true");
return resp;
}, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Current);
}
}
private static void AddCorsResponseHeaders(HttpRequestMessage request, HttpResponseMessage response, string originHeader)
{
response.Headers.Add(AccessControlAllowOrigin, originHeader);
response.Headers.Add(AccessControlAllowCredentials, "true");
IEnumerable<string> accessControlRequestMethod;
if (request.Headers.TryGetValues(AccessControlRequestMethod, out accessControlRequestMethod))
{
response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod.First());
}
IEnumerable<string> accessControlRequestHeaders;
if (request.Headers.TryGetValues(AccessControlRequestHeaders, out accessControlRequestHeaders))
{
string requestedHeaders = string.Join(", ", accessControlRequestHeaders);
response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
}
}
}
public class HandlerConfig
{
public static void RegisterHandlers(Collection<DelegatingHandler> handlers)
{
handlers.Add(new CorsMessageHandler());
//...
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment