in src/Microsoft.IIS.Administration.WebServer.UrlRewrite/Helpers/InboundRulesHelper.cs [389:528]
private static void AssignRuleFromModel(dynamic model, InboundRule rule, InboundRulesSection section, AllowedServerVariablesSection serverVariablesSection)
{
if (model == null) {
throw new ApiArgumentException("model");
}
//
// Name, check for already existing name
string name = DynamicHelper.Value(model.name);
if (!string.IsNullOrEmpty(name)) {
if (!name.Equals(rule.Name, StringComparison.OrdinalIgnoreCase) &&
section.InboundRules.Any(r => r.Name.Equals(name, StringComparison.OrdinalIgnoreCase))) {
throw new AlreadyExistsException("name");
}
rule.Name = name;
}
DynamicHelper.If((object)model.pattern, v => rule.Match.Pattern = v);
DynamicHelper.If<bool>((object)model.ignore_case, v => rule.Match.IgnoreCase = v);
DynamicHelper.If<bool>((object)model.negate, v => rule.Match.Negate = v);
DynamicHelper.If<bool>((object)model.stop_processing, v => rule.StopProcessing = v);
DynamicHelper.If((object)model.pattern_syntax, v => rule.PatternSyntax = PatternSyntaxHelper.FromJsonModel(v));
//
// Action
dynamic action = model.action;
if (action != null) {
if (!(action is JObject)) {
throw new ApiArgumentException("action", ApiArgumentException.EXPECTED_OBJECT);
}
DynamicHelper.If((object)action.type, v => rule.Action.Type = ActionTypeHelper.FromJsonModel(v));
DynamicHelper.If((object)action.url, v => rule.Action.Url = v);
DynamicHelper.If<bool>((object)action.append_query_string, v => rule.Action.AppendQueryString = v);
DynamicHelper.If<bool>((object)action.log_rewritten_url, v => rule.Action.LogRewrittenUrl = v);
DynamicHelper.If<long>((object)action.status_code, v => rule.Action.StatusCode = v);
DynamicHelper.If<long>((object)action.sub_status_code, v => rule.Action.SubStatusCode = v);
DynamicHelper.If((object)action.description, v => rule.Action.StatusDescription = v);
DynamicHelper.If((object)action.reason, v => rule.Action.StatusReason = v);
DynamicHelper.If<RedirectType>((object)action.redirect_type, v => rule.Action.RedirectType = v);
}
//
// Server variables
if (model.server_variables != null) {
IEnumerable<dynamic> serverVariables = model.server_variables as IEnumerable<dynamic>;
if (serverVariables == null) {
throw new ApiArgumentException("server_variables", ApiArgumentException.EXPECTED_ARRAY);
}
rule.ServerVariableAssignments.Clear();
foreach (dynamic serverVariable in serverVariables) {
if (!(serverVariable is JObject)) {
throw new ApiArgumentException("server_variables.item");
}
string svName = DynamicHelper.Value(serverVariable.name);
string svValue = DynamicHelper.Value(serverVariable.value);
bool svReplace = DynamicHelper.To<bool>(serverVariable.replace) ?? false;
if (string.IsNullOrEmpty(svName)) {
throw new ApiArgumentException("server_variables.item.name", "Required");
}
if (string.IsNullOrEmpty(svValue)) {
throw new ApiArgumentException("server_variables.item.value", "Required");
}
var svAssignment = rule.ServerVariableAssignments.CreateElement();
svAssignment.Name = svName;
svAssignment.Value = svValue;
svAssignment.Replace = svReplace;
AddAllowedServerVariable(serverVariablesSection, svAssignment.Name);
rule.ServerVariableAssignments.Add(svAssignment);
}
}
DynamicHelper.If((object)model.condition_match_constraints, v => rule.Conditions.LogicalGrouping = LogicalGroupingHelper.FromJsonModel(v));
DynamicHelper.If<bool>((object)model.track_all_captures, v => rule.Conditions.TrackAllCaptures = v);
//
// Conditions
if (model.conditions != null) {
IEnumerable<dynamic> conditions = model.conditions as IEnumerable<dynamic>;
if (conditions == null) {
throw new ApiArgumentException("conditions", ApiArgumentException.EXPECTED_ARRAY);
}
rule.Conditions.Clear();
foreach (dynamic condition in conditions) {
if (!(condition is JObject)) {
throw new ApiArgumentException("conditions.item");
}
string input = DynamicHelper.Value(condition.input);
string rawMatchType = DynamicHelper.Value(condition.match_type);
if (string.IsNullOrEmpty(input)) {
throw new ApiArgumentException("conditions.item.input", "Required");
}
if (string.IsNullOrEmpty(rawMatchType)) {
throw new ApiArgumentException("conditions.item.match_type", "Required");
}
MatchType matchType = MatchTypeHelper.FromJsonModel(rawMatchType);
var con = rule.Conditions.CreateElement();
con.Input = input;
con.MatchType = matchType;
con.Pattern = DynamicHelper.Value(condition.pattern);
con.Negate = DynamicHelper.To<bool>(condition.negate);
con.IgnoreCase = DynamicHelper.To<bool>(condition.ignore_case);
rule.Conditions.Add(con);
}
}
if (rule.Schema.HasAttribute(InboundRule.ResponseCacheDirectiveAttribute)) {
DynamicHelper.If((object)model.response_cache_directive, v => rule.ResponseCacheDirective = ResponseCacheDirectiveHelper.FromJsonModel(v));
}
//
// Check set to valid state
if ((rule.Action.Type == ActionType.Redirect || rule.Action.Type == ActionType.Rewrite) && string.IsNullOrEmpty(rule.Action.Url)) {
throw new ApiArgumentException("action.url");
}
UpdatePriority(model, rule, section);
}