public SimpleUrl Clone() { SimpleUrl result = new SimpleUrl() { Protocol = this.Protocol, Host = this.Host, Port = Port, Paths = new List <string>(), Parameters = new Dictionary <string, string>() }; foreach (var p in Paths) { result.Paths.Add(p); } foreach (var p in Parameters) { result.Parameters[p.Key] = p.Value; } return(result); }
public static ProxyRule Verificate(MethodInfo method, HttpProxyAttribute classAttr, IEnumerable <ProxyFilterAttribute> classFilters) { ProxyRule rule = new ProxyRule(); HttpProxyContext.Builder contextBuilder = new HttpProxyContext.Builder(); ResquestMappingAttribute methodAttr = method.GetCustomAttribute <ResquestMappingAttribute>(); if (methodAttr == null) { methodAttr = new ResquestMappingAttribute(); } ///TODO;拼接url SimpleUrl url; if (!string.IsNullOrEmpty(classAttr.Prefix)) { url = new SimpleUrl(classAttr.Prefix); url.AppendPath(methodAttr.Path); } else { url = new SimpleUrl(methodAttr.Path); } if (string.IsNullOrEmpty(url.ToUrl())) { rule.IsValid = false; rule.ErrorMessage = $"方法{method.DeclaringType.FullName }.{method.Name}的Url无效"; return(rule); } // if (methodAttr.ContentType != "application/x-www-form-urlencoded" && methodAttr.ContentType != "application/json") { rule.IsValid = false; rule.ErrorMessage = $"方法{method.DeclaringType.FullName }.{method.Name}的ContentType无效"; return(rule); } contextBuilder.SetAccept(methodAttr.Accept) .SetContentType(methodAttr.ContentType) .AddFilters(classFilters) .SetHttpMethod(methodAttr.Method) .SetMethodInfo(method) .SetTimeOut(methodAttr.TimeOut) .SetUrl(url); //Parameter List <ParameterInfo> queryArgs = new List <ParameterInfo>(); List <ParameterInfo> pathArgs = new List <ParameterInfo>(); List <ParameterInfo> bodyArgs = new List <ParameterInfo>(); List <HttpArgument> arguments = new List <HttpArgument>(); var ps = method.GetParameters(); foreach (var p in ps) { HttpArgument argument; HttpArgumentAttribute argAttr = p.GetCustomAttribute <HttpArgumentAttribute>(); if (p.IsOut) { rule.IsValid = false; rule.ErrorMessage = $"方法{method.DeclaringType.FullName }.{method.Name}参数{p.Name}有out"; return(rule); } if (p.ParameterType.IsByRef) { rule.IsValid = false; rule.ErrorMessage = $"方法{method.DeclaringType.FullName }.{method.Name}参数{p.Name}有ref"; return(rule); } if (p.GetCustomAttributes(typeof(ParamArrayAttribute), false).Count() > 0) { rule.IsValid = false; rule.ErrorMessage = $"方法{method.DeclaringType.FullName }.{method.Name}参数{p.Name}有params"; return(rule); } if (argAttr == null) { queryArgs.Add(p); argument = new HttpArgument(p); arguments.Add(argument); continue; } argument = new HttpArgument(p, argAttr); arguments.Add(argument); switch (argAttr.ArgType) { case HttpArgType.QueryString: queryArgs.Add(p); break; case HttpArgType.Path: pathArgs.Add(p); break; case HttpArgType.Body: bodyArgs.Add(p); break; default: queryArgs.Add(p); break; } } if (methodAttr.Method == HttpMethod.POST) { if ("application/x-www-form-urlencoded" == methodAttr.ContentType) { if (bodyArgs.Count > 1) { rule.IsValid = false; rule.ErrorMessage = $"方法{method.DeclaringType.FullName }.{method.Name}无ContentType与参数不匹配"; return(rule); } } } contextBuilder.SetArguments(arguments); //Filter var filters = method.GetCustomAttributes <ProxyFilterAttribute>(); contextBuilder.AddFilters(filters); rule.IsValid = true; rule.ProxyContext = contextBuilder.Build(); return(rule); }