in src/Core/Compiling/Policy/CorsCompiler.cs [18:121]
public void Handle(ICompilationContext context, InvocationExpressionSyntax node)
{
if (!node.TryExtractingConfigParameter<CorsConfig>(context, "cors", out var values))
{
return;
}
var element = new XElement("cors");
element.AddAttribute(values, nameof(CorsConfig.AllowCredentials), "allow-credentials");
element.AddAttribute(values, nameof(CorsConfig.TerminateUnmatchedRequest), "terminate-unmatched-request");
if (!values.TryGetValue(nameof(CorsConfig.AllowedOrigins), out var allowedOrigins))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
"cors",
nameof(CorsConfig.AllowedOrigins)
));
return;
}
var origins = (allowedOrigins.UnnamedValues ?? [])
.Select(origin => new XElement("origin", origin.Value!))
.ToArray<object>();
if (origins.Length == 0)
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterIsEmpty,
allowedOrigins.Node.GetLocation(),
"cors",
nameof(CorsConfig.AllowedOrigins)
));
return;
}
element.Add(new XElement("allowed-origins", origins));
if (!values.TryGetValue(nameof(CorsConfig.AllowedHeaders), out var allowedHeaders))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
"cors",
nameof(CorsConfig.AllowedHeaders)
));
return;
}
var headers = (allowedHeaders.UnnamedValues ?? [])
.Select(origin => new XElement("header", origin.Value!))
.ToArray<object>();
if (headers.Length == 0)
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterIsEmpty,
allowedHeaders.Node.GetLocation(),
"cors",
nameof(CorsConfig.AllowedHeaders)
));
return;
}
element.Add(new XElement("allowed-headers", headers));
if (values.TryGetValue(nameof(CorsConfig.AllowedMethods), out var allowedMethods))
{
var allowedMethodsElement = new XElement("allowed-methods");
allowedMethodsElement.AddAttribute(values, nameof(CorsConfig.PreflightResultMaxAge),
"preflight-result-max-age");
var methods = (allowedMethods.UnnamedValues ?? [])
.Select(m => new XElement("method", m.Value!))
.ToArray<object>();
if (methods.Length == 0)
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterIsEmpty,
allowedMethods.Node.GetLocation(),
"cors",
nameof(CorsConfig.AllowedMethods)
));
}
allowedMethodsElement.Add(methods);
element.Add(allowedMethodsElement);
}
if (values.TryGetValue(nameof(CorsConfig.ExposeHeaders), out var exposeHeaders))
{
var exposeHeadersElements = (exposeHeaders.UnnamedValues ?? [])
.Select(h => new XElement("header", h.Value!))
.ToArray<object>();
if (exposeHeadersElements.Length == 0)
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterIsEmpty,
exposeHeaders.Node.GetLocation(),
"cors",
nameof(CorsConfig.ExposeHeaders)
));
}
element.Add(new XElement("expose-headers", exposeHeadersElements));
}
context.AddPolicy(element);
}