public SecureChannelMessage <string> Invoke(string className, string methodName, string jsonParams) { SecureChannelMessage <string> result = new SecureChannelMessage <string>(); HttpArgs args = new HttpArgs(); args.ParseJson(jsonParams); string parameters = args["jsonParams"]; SecureExecutionRequest request = new SecureExecutionRequest(HttpContext, className, methodName, parameters) { ApiKeyResolver = ApiKeyResolver, ServiceProvider = ServiceProvider }; bool success = request.Execute(); string data = request.Result as string; if (string.IsNullOrEmpty(data)) { throw new SecureChannelInvokeException(className, methodName, jsonParams); } result.Data = data; result.Success = success; return(result); }
/// <summary> /// validates if the arguments are correct. eg: the url is a required argument. /// </summary> /// <param name="args">the specified list of arguments.</param> /// <returns>a boolean indicating if the arguments are correct.</returns> private static bool AreArgsValid(HttpArgs args) { if (args == null) { Console.WriteLine("No values have been supplied"); return(false); } if (args.Help) { HttpHelp(); return(false); } if (string.IsNullOrEmpty(args.Url)) { Console.WriteLine("Url must be supplied."); return(false); } if (!string.IsNullOrEmpty(args.ProxyCredentialUsername) && !string.IsNullOrEmpty(args.ProxyCredentialPassword)) { args.Proxy.Credentials = !string.IsNullOrEmpty(args.ProxyCredentialDomain) ? new NetworkCredential(args.ProxyCredentialUsername, args.ProxyCredentialPassword, args.ProxyCredentialDomain) : new NetworkCredential(args.ProxyCredentialUsername, args.ProxyCredentialPassword); } if (args.ProxyAddBypassRule != null && args.ProxyAddBypassRule.Count > 0) { foreach (var bypass in args.ProxyAddBypassRule) { args.Proxy.BypassArrayList.Add(bypass); } } return(true); }
protected override string Post(ServiceProxyInvokeEventArgs invokeArgs, HttpWebRequest request) { string baseAddress = invokeArgs.BaseAddress; string className = invokeArgs.ClassName; string methodName = invokeArgs.MethodName; object[] parameters = invokeArgs.PostParameters; if (className.Equals("securechannel", StringComparison.InvariantCultureIgnoreCase) && methodName.Equals("invoke", StringComparison.InvariantCultureIgnoreCase)) { // the target is the SecureChannel.Invoke method but we // need the actual className and method that is in the parameters // object string actualClassName = (string)parameters[0]; string actualMethodName = (string)parameters[1]; string jsonParams = (string)parameters[2]; HttpArgs args = new HttpArgs(); args.ParseJson(jsonParams); if (TypeRequiresApiKey || MethodRequiresApiKey(actualMethodName)) { ApiKeyResolver.SetKeyToken(request, ApiParameters.GetStringToHash(actualClassName, actualMethodName, args["jsonParams"])); } } return(base.Post(invokeArgs, request)); }
protected internal virtual void Initialize() { lock (_initLock) { if (!IsInitialized) { OnInitializing(); if (HttpMethod.Equals("POST") && string.IsNullOrEmpty(Path.GetExtension(Request.Url.AbsolutePath))) { HttpArgs args = HttpArgs; string jsonParams; if (args.Has("jsonParams", out jsonParams)) { JsonParams = jsonParams; } } else if (InputString.StartsWith("{")) // TODO: this should be reviewed for validity, check Content/Type { JsonParams = InputString; } ParseRequestUrl(); IsInitialized = true; OnInitialized(); } } }
public HttpResponseArgs Handle(HttpArgs args) { return(ApiReturn.Return(new ApiReturn { Code = HttpCode.Success, Message = "获取提交记录成功", Data = new Model().Select(null) })); }
public HttpResponseArgs Handle(HttpArgs args) { return(ApiReturn.Return(new ApiReturn() { Code = HttpCode.Success, Message = "获取题目信息成功", Data = Data.Problems })); }
public static HttpResponseArgs Handle(HttpArgs args) { if (!appTypes.ContainsKey(args.GetArgValue(appKey))) { return(null); } var construct = appTypes[args.GetArgValue(appKey)].GetConstructor(new Type[0]); var app = (IApplication)construct.Invoke(null); return(app.Handle(args)); }
/// <summary> /// Decrypt the input string of the specified ExecutionRequest /// if it is intended for the SecureChannel /// </summary> /// <param name="execRequest"></param> public static void DecryptSecureChannelInvoke(ExecutionRequest execRequest) { if (execRequest.Instance != null && execRequest.Instance.GetType() == typeof(SecureChannel) && execRequest.MethodName.Equals(nameof(SecureChannel.Invoke))) { execRequest.InputString = SecureSession.Get(execRequest.Context).Decrypt(execRequest.InputString); HttpArgs args = new HttpArgs(); args.ParseJson(execRequest.InputString); execRequest.JsonParams = args["jsonParams"]; } }
public HttpResponseArgs Handle(HttpArgs args) { var model = new JudgeModel(); var code = args.GetPostValue()["code"].ToString(); var session = args.GetPostValue()["session"].ToString(); var id = args.GetArgValue("id"); //题目ID var language = args.GetArgValue("lan"); //语言 var sno = Data.GetSno(session); if (sno == string.Empty) { return(ApiReturn.Return(new ApiReturn() { Code = HttpCode.Success, Message = "session验证失败", Data = null })); } var source = Handler.SaveAsFile(code, id, sno, language); var exe = Handler.Compiler(source, language); if (!exe.Exists) { model.Insert(new Dictionary <string, object> { { "problem", id }, { "language", language }, { "runtime", 0 }, { "result", JudgeResult.EA }, { "sno", sno }, { "time", DateTime.Now } }); } var reslut = Handler.Judge(id, exe, language); model.Insert(new Dictionary <string, object> { { "problem", id }, { "language", language }, { "runtime", reslut.Time }, { "result", reslut.Result }, { "sno", sno }, { "time", DateTime.Now } }); Console.WriteLine(Program.TimeLabel() + "用户{0}提交了问题{1}的答案,运行结果{2},用时{3}ms.", sno, id, reslut.Result.ToString(), reslut.Time); return(ApiReturn.Return(new ApiReturn() { Code = HttpCode.Success, Message = reslut.Pass ? "运行通过" : "答案错误", Data = reslut })); }
public HttpResponseArgs Handle(HttpArgs args) { var model = new RegisterModel(); var sno = args.GetPostValue()["sno"].ToString(); var pw = args.GetPostValue()["pw"].ToString(); var register = model.Register(sno, pw); Console.WriteLine(Program.TimeLabel() + "用户{0}已注册.", sno); return(ApiReturn.Return(new ApiReturn() { Code = HttpCode.Success, Message = register ? "注册成功" : "账号已存在", Data = register })); }
private static ExecutionRequest CreateExecutionRequest(string path) { Uri uri = new Uri("http://blah.com" + path); HttpArgs query = new HttpArgs(uri.Query); NameValueCollection nvc = new NameValueCollection(); query.Keys.Each(k => { nvc.Add(k, query[k]); }); RequestWrapper req = new RequestWrapper(new { Headers = new NameValueCollection(), Url = uri, HttpMethod = "GET", ContentLength = 0, QueryString = nvc }); ResponseWrapper res = new ResponseWrapper(new object()); ExecutionRequest execRequest = new ExecutionRequest(req, res); return(execRequest); }
public SecureChannelMessage <string> Invoke(string className, string methodName, string jsonParams) { SecureChannelMessage <string> result = new SecureChannelMessage <string>(); HttpArgs args = new HttpArgs(); args.ParseJson(jsonParams); string parameters = args["jsonParams"]; SecureExecutionRequest request = new SecureExecutionRequest(HttpContext, className, methodName, parameters) { ApiKeyResolver = ApiKeyResolver, ServiceProvider = ServiceProvider }; bool success = request.Execute(); if (request.Result is ValidationResult validationResult) { result.Data = "validation failed"; result.Message = validationResult.Message; result.Success = false; Logger.AddEntry("Validation failed for SecureChannel.Invoke for {0}.{1}:\r\n\tMessage={2}\r\n\tFailures: {3}:\r\n *** jsonParams were ***\r\n{4}", LogEventType.Warning, className, methodName, validationResult.Message, string.Join(",", validationResult.ValidationFailures), jsonParams); } else { string data = request.Result as string; if (string.IsNullOrEmpty(data)) { throw new SecureChannelInvokeException(className, methodName, jsonParams); } result.Data = data; result.Success = success; } return(result); }
public SecureChannelMessage <string> Invoke(string className, string methodName, string jsonParams) { SecureChannelMessage <string> result = new SecureChannelMessage <string>(); HttpArgs args = new HttpArgs(); args.ParseJson(jsonParams); string parameters = args["jsonParams"]; SecureExecutionRequest request = new SecureExecutionRequest(HttpContext, className, methodName, parameters); request.ApiKeyResolver = ApiKeyResolver; request.ServiceProvider = ServiceProvider; bool success = request.Execute(); ValidationResult validationResult = request.Result as ValidationResult; if (Debug && validationResult != null) { result.Data = "validation failed"; result.Message = validationResult.Message; result.Success = false; } else { if (validationResult != null) { Logger.AddEntry("Validation failed for SecureChannel.Invoke for {0}.{1}:\r\n *** jsonParams were ***\r\n{2}", LogEventType.Warning, className, methodName, jsonParams); } result.Data = (string)request.Result; //this will throw an exception if validation failed causing 404 not found to be sent back which is what we want for security if debug is off result.Success = success; } return(result); }
public override bool TryRespond(IHttpContext context) { if (!this.IsInitialized) { Initialize(); } IRequest request = context.Request; IResponse response = context.Response; bool handled = false; string path = request.Url.AbsolutePath; string appName = AppConf.AppNameFromUri(request.Url, BamConf.AppConfigs); string[] chunks = path.DelimitSplit("/"); HttpArgs queryString = new HttpArgs(request.Url.Query); bool min = !string.IsNullOrEmpty(queryString["min"]); if (chunks[0].ToLowerInvariant().Equals("dao") && chunks.Length > 1) { string method = chunks[1]; if (_dynamicResponders.ContainsKey(method)) { response.ContentType = GetContentTypeForExtension(".js"); string script = _dynamicResponders[method](appName, min); SendResponse(response, script); handled = true; OnResponded(context); } else { handled = TryExecuteCrudRequest(chunks, context, handled, appName); OnNotResponded(context); } } return(handled); }
public string GetTemplateName(object toRender) { HttpArgs args = HttpArgs;//new HttpArgs(ExecutionRequest.Request.Url.Query); string result; args.Has("view", out result); if (string.IsNullOrEmpty(result)) { string prefix = string.Empty; if (toRender != null) { Type typeToRender = toRender.GetType(); prefix = "{0}_"._Format(typeToRender.Name); ITemplateRenderer dustRenderer = ContentResponder.AppContentResponders[AppName].AppTemplateRenderer; dustRenderer.EnsureDefaultTemplate(typeToRender); } AppContentResponder appContentResponder = ContentResponder.AppContentResponders[AppName]; string domAppName = AppConf.DomApplicationIdFromAppName(appContentResponder.AppConf.Name); result = "{0}.{1}default"._Format(domAppName, prefix); } return(result); }
public HttpResponseArgs Handle(HttpArgs args) { var model = new LoginModel(); var sno = args.GetPostValue()["sno"].ToString(); var pw = args.GetPostValue()["pw"].ToString(); var session = model.Login(sno, pw); if (session == string.Empty) { return(ApiReturn.Return(new ApiReturn() { Code = HttpCode.Success, Message = "登陆失败", Data = string.Empty })); } Console.WriteLine(Program.TimeLabel() + "用户{0}已登录.", sno); return(ApiReturn.Return(new ApiReturn() { Code = HttpCode.Success, Message = "登陆成功", Data = session })); }
/// <summary> /// does the actual http request. /// </summary> /// <param name="args">the list of parsed arguments.</param> private static void DoRequest(HttpArgs args) { Console.ForegroundColor = ConsoleColor.Green; //Console.WriteLine("--- BEGIN"); Console.ForegroundColor = ConsoleColor.DarkGreen; // display help if no arguments where provided or if arguments where invalid if (args == null || !AreArgsValid(args)) { HttpHelp(); return; } var http = new Global.Http.Http(args.Url); // for some reason if we set the value after it will not recognize it // we have to set before the other values if (args.KeepAlive != null) { http.KeepAlive = (bool)args.KeepAlive; } http = http.SetMethod(args.Method) .SetContentType(args.ContentType) .SetUserAgent(args.UserAgent) .SetPayload(args.Payload) .SetRequestEncoding(args.PayloadEncoding) .SetResponseEncoding(args.ResponseEncoding); if (args.Timeout != null) { http.Timeout = (int)args.Timeout; } if (args.Header != null && args.Header.Count > 0) { http.Headers = args.Header; } if (!string.IsNullOrEmpty(args.Accept)) { http.Accept = args.Accept; } if (args.Credential != null) { http.Credentials = args.Credential; } if (args.Proxy != null) { http.Proxy = args.Proxy; } // track how long the request took to show in the output console var started = DateTime.Now; var response = http.DoRequest(); var ended = DateTime.Now; if (http.Response != null) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("\n{0} {1} | {2} {3}", (int)http.Response.StatusCode, http.Response.StatusCode, args.Method, args.Url); if (http.Response.Headers != null) { foreach (var h in http.Response.Headers) { Console.WriteLine("{0}: {1}", h.Key, string.Join(", ", h.Value)); } } Console.ForegroundColor = ConsoleColor.DarkGreen; if (http.Response.IsSuccessStatusCode) { if (!string.IsNullOrEmpty(args.Regex)) { var m = new Regex(args.Regex, RegexOptions.IgnoreCase | RegexOptions.Singleline).Matches(response); if (m.Count > 0) { var builder = new StringBuilder(""); for (var i = 0; i < m.Count; i++) { builder.AppendFormat("Match {0}: {1}", i + 1, !string.IsNullOrEmpty(args.RegexGroup) ? m[i].Groups[args.RegexGroup] : m[i]); builder.Append(i < m.Count - 1 ? "\n" : ""); } response = builder.ToString(); } else { response = "No matches were found!"; } } } } else { Console.WriteLine("N/A (Failed unexpectadly)."); } if (!string.IsNullOrEmpty(args.OutputPath) && !string.IsNullOrEmpty(response)) { using (var writer = new StreamWriter(args.OutputPath)) writer.WriteLine(response); } else if (args.OutputToConsole && !string.IsNullOrEmpty(response)) { Console.WriteLine(""); Console.WriteLine(response); } Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(""); Console.WriteLine("{0}", new TimeSpan((ended - started).Ticks).ToString("c")); }
protected virtual object[] GetArguments() { // TODO: consider extracting this functionality into an ExecutionResponse class that takes the request and resolves the // relevant bits using an IExecutionRequestTargetResolver stated in ResolveExecutionTargetInfo. // AND/OR // TODO: consider breaking this class up into specific ExecutionRequest implementations that encapsulate the style of intput parameters/arguments // JsonParamsExecutionRequest, OrderedHttpArgsExecutionRequest, FormEncodedPostExecutionRequest, QueryStringParametersExecutionRequest. // The type of the request should be resolved by examining the ContentType // see ExecutionRequestResolver.ResolveExecutionRequest // This method is becoming a little bloated // due to accomodating too many input paths. // This will need to be refactored IF // changes continue to be necessary // 07/29/2018 - +1 added notes -BA // see commit 2526558ea460852c033d1151dc190308a9feaefd object[] result = new object[] { };; if (HttpArgs.Has("jsonParams", out string jsonParams)) { string[] jsonStrings = jsonParams.FromJson <string[]>(); result = GetJsonArguments(jsonStrings); } else if (!string.IsNullOrEmpty(JsonParams)) { // POST: bam.invoke string[] jsonStrings = JsonParams.FromJson <string[]>(); result = GetJsonArguments(jsonStrings); } else if (Request != null && InputString.Length > 0) { // POST: probably from a form Queue <string> inputValues = new Queue <string>(InputString.Split('&')); result = GetFormArguments(inputValues); } else if (Request != null) { // GET: parse the querystring ViewName = Request.QueryString["view"]; if (string.IsNullOrEmpty(ViewName)) { ViewName = "Default"; } jsonParams = Request.QueryString["jsonParams"]; bool numbered = !string.IsNullOrEmpty(Request.QueryString["numbered"]) ? true : false; bool named = !numbered; if (!string.IsNullOrEmpty(jsonParams)) { dynamic o = JsonConvert.DeserializeObject <dynamic>(jsonParams); string[] jsonStrings = ((string)(o["jsonParams"])).FromJson <string[]>(); result = GetJsonArguments(jsonStrings); } else if (named) { result = GetNamedQueryStringArguments(); } else { result = GetNumberedQueryStringArguments(); } } return(result); }
/// <summary> /// parses the arguments input by the user. /// </summary> /// <param name="args">the list of arguments input by the user.</param> /// <returns></returns> private static HttpArgs ParseCommand(string[] args) { if (args != null && args.Length > 0) { var argsObj = new HttpArgs(); for (var i = 0; i < args.Length; i++) { switch (args[i]) { #region help case "-h": argsObj.Help = true; break; #endregion #region url case "-u": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -u."); return null; } argsObj.Url = args[i + 1]; if (!argsObj.Url.StartsWith("http")) argsObj.Url = string.Concat("http://", argsObj.Url); break; #endregion #region output to console case "-oc": argsObj.OutputToConsole = true; break; #endregion #region output path case "-op": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -op."); return null; } argsObj.OutputPath = args[i + 1]; break; #endregion #region method case "-m": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -m."); return null; } argsObj.Method = args[i + 1].ToUpper(); break; #endregion #region accept case "-a": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -a."); return null; } argsObj.Accept = args[i + 1].ToUpper(); break; #endregion #region content type case "-ct": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ct."); return null; } argsObj.ContentType = args[i + 1]; break; #endregion #region timeout case "-t": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -t."); return null; } argsObj.Timeout = int.Parse(args[i + 1]); break; #endregion #region user agent case "-ua": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ua."); return null; } argsObj.UserAgent = args[i + 1]; break; #endregion #region keep alive case "-ka": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ka."); return null; } argsObj.KeepAlive = bool.Parse(args[i + 1]); break; #endregion #region response encoding case "-re": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -re."); return null; } argsObj.ResponseEncoding = Common.StringToEnum<Encoding>(args[i + 1]); break; #endregion #region payload encoding case "-pe": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -pde."); return null; } argsObj.PayloadEncoding = Common.StringToEnum<Encoding>(args[i + 1]); break; #endregion #region payload case "-p": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -p."); return null; } argsObj.Payload = args[i + 1]; break; #endregion #region payload path case "-pp": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -pp."); return null; } argsObj.Payload = IOHelper.GetFileContent(args[i + 1]); break; #endregion #region credentials #region username case "-c:u": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -c:u."); return null; } argsObj.CredentialUsername = args[i + 1]; break; #endregion #region password case "-c:p": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -c:p."); return null; } argsObj.CredentialPassword = args[i + 1]; break; #endregion #region domain case "-c:d": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -o:d."); return null; } argsObj.CredentialDomain = args[i + 1]; break; #endregion #endregion #region proxy #region bypass case "-ps:bl": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps:bl."); return null; } argsObj.ProxyBypassLocally = bool.Parse(args[i + 1]); break; #endregion #region address case "-ps:a": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps:a."); return null; } argsObj.ProxyAddress = args[i + 1]; break; #endregion #region credentials #region username case "-ps:c:u": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps:c:u."); return null; } argsObj.ProxyCredentialUsername = args[i + 1]; break; #endregion #region password case "-ps:c:p": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps.c.p."); return null; } argsObj.ProxyCredentialPassword = args[i + 1]; break; #endregion #region domain case "-ps:c:d": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps:c:d."); return null; } argsObj.ProxyCredentialDomain = args[i + 1]; break; #endregion #endregion #region add bypass rule case "-ps:ab": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps:ab."); return null; } if (argsObj.ProxyAddBypassRule == null) argsObj.ProxyAddBypassRule = new ArrayList(); argsObj.ProxyAddBypassRule.Add(args[i + 1]); break; #endregion #endregion #region headers case "-hd": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -hd."); return null; } if (argsObj.Header == null) argsObj.Header = new WebHeaderCollection(); argsObj.Header.Add(args[i + 1]); break; #endregion #region regex case "-rx": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -rx."); return null; } argsObj.Regex = args[i + 1]; break; #endregion #region regex group case "-rxg": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -rxg."); return null; } argsObj.RegexGroup = args[i + 1]; break; #endregion } } return argsObj; } return null; //Console.WriteLine("Must call http command with valid arguments."); //HttpHelp(); }
protected object[] GetParameters() { // TODO: consider breaking this class up into specific ExecutionRequest implementations that encapsulate the style of parameters // JsonParamsExecutionRequest, OrderedHttpArgsExecutionRequest, FormEncodedPostExecutionRequest, QueryStringParametersExecutionRequest // This method is becoming a little bloated // due to accomodating too many input paths. // This will need to be refactored IF // changes continue to be necessary object[] result = new object[] { };; string jsonParams; if (HttpArgs.Has("jsonParams", out jsonParams)) { string[] jsonStrings = jsonParams.FromJson <string[]>(); result = GetJsonParameters(jsonStrings); } else if (HttpArgs.Ordered.Length > 0) { result = new object[HttpArgs.Ordered.Length]; HttpArgs.Ordered.Each((val, i) => { result[i] = val; }); } else if (!string.IsNullOrEmpty(JsonParams)) { // POST: bam.invoke string[] jsonStrings = JsonParams.FromJson <string[]>(); result = GetJsonParameters(jsonStrings); } else if (Request != null && InputString.Length > 0) { // POST: probably from a form Queue <string> inputValues = new Queue <string>(InputString.Split('&')); result = GetFormParameters(inputValues); } else if (Request != null) { // GET: parse the querystring ViewName = Request.QueryString["view"]; if (string.IsNullOrEmpty(ViewName)) { ViewName = "Default"; } jsonParams = Request.QueryString["jsonParams"]; bool numbered = !string.IsNullOrEmpty(Request.QueryString["numbered"]) ? true : false; bool named = !numbered; if (!string.IsNullOrEmpty(jsonParams)) { dynamic o = JsonConvert.DeserializeObject <dynamic>(jsonParams); string[] jsonStrings = ((string)(o["jsonParams"])).FromJson <string[]>(); result = GetJsonParameters(jsonStrings); } else if (named) { result = GetNamedQueryStringParameters(); } else { result = GetNumberedParameters(); } } return(result); }
/// <summary> /// parses the arguments input by the user. /// </summary> /// <param name="args">the list of arguments input by the user.</param> /// <returns></returns> private static HttpArgs ParseCommand(string[] args) { if (args != null && args.Length > 0) { var argsObj = new HttpArgs(); for (var i = 0; i < args.Length; i++) { switch (args[i]) { #region help case "-h": argsObj.Help = true; break; #endregion #region url case "-u": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -u."); return(null); } argsObj.Url = args[i + 1]; if (!argsObj.Url.StartsWith("http")) { argsObj.Url = string.Concat("http://", argsObj.Url); } break; #endregion #region output to console case "-oc": argsObj.OutputToConsole = true; break; #endregion #region output path case "-op": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -op."); return(null); } argsObj.OutputPath = args[i + 1]; break; #endregion #region method case "-m": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -m."); return(null); } argsObj.Method = args[i + 1].ToUpper(); break; #endregion #region accept case "-a": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -a."); return(null); } argsObj.Accept = args[i + 1].ToUpper(); break; #endregion #region content type case "-ct": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ct."); return(null); } argsObj.ContentType = args[i + 1]; break; #endregion #region timeout case "-t": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -t."); return(null); } argsObj.Timeout = int.Parse(args[i + 1]); break; #endregion #region user agent case "-ua": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ua."); return(null); } argsObj.UserAgent = args[i + 1]; break; #endregion #region keep alive case "-ka": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ka."); return(null); } argsObj.KeepAlive = bool.Parse(args[i + 1]); break; #endregion #region response encoding case "-re": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -re."); return(null); } argsObj.ResponseEncoding = Common.StringToEnum <Encoding>(args[i + 1]); break; #endregion #region payload encoding case "-pe": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -pde."); return(null); } argsObj.PayloadEncoding = Common.StringToEnum <Encoding>(args[i + 1]); break; #endregion #region payload case "-p": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -p."); return(null); } argsObj.Payload = args[i + 1]; break; #endregion #region payload path case "-pp": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -pp."); return(null); } argsObj.Payload = IOHelper.GetFileContent(args[i + 1]); break; #endregion #region credentials #region username case "-c:u": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -c:u."); return(null); } argsObj.CredentialUsername = args[i + 1]; break; #endregion #region password case "-c:p": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -c:p."); return(null); } argsObj.CredentialPassword = args[i + 1]; break; #endregion #region domain case "-c:d": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -o:d."); return(null); } argsObj.CredentialDomain = args[i + 1]; break; #endregion #endregion #region proxy #region bypass case "-ps:bl": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps:bl."); return(null); } argsObj.ProxyBypassLocally = bool.Parse(args[i + 1]); break; #endregion #region address case "-ps:a": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps:a."); return(null); } argsObj.ProxyAddress = args[i + 1]; break; #endregion #region credentials #region username case "-ps:c:u": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps:c:u."); return(null); } argsObj.ProxyCredentialUsername = args[i + 1]; break; #endregion #region password case "-ps:c:p": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps.c.p."); return(null); } argsObj.ProxyCredentialPassword = args[i + 1]; break; #endregion #region domain case "-ps:c:d": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps:c:d."); return(null); } argsObj.ProxyCredentialDomain = args[i + 1]; break; #endregion #endregion #region add bypass rule case "-ps:ab": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -ps:ab."); return(null); } if (argsObj.ProxyAddBypassRule == null) { argsObj.ProxyAddBypassRule = new ArrayList(); } argsObj.ProxyAddBypassRule.Add(args[i + 1]); break; #endregion #endregion #region headers case "-hd": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -hd."); return(null); } if (argsObj.Header == null) { argsObj.Header = new WebHeaderCollection(); } argsObj.Header.Add(args[i + 1]); break; #endregion #region regex case "-rx": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -rx."); return(null); } argsObj.Regex = args[i + 1]; break; #endregion #region regex group case "-rxg": if (string.IsNullOrEmpty(args[i + 1])) { Console.WriteLine("Must supply value for -rxg."); return(null); } argsObj.RegexGroup = args[i + 1]; break; #endregion } } return(argsObj); } return(null); //Console.WriteLine("Must call http command with valid arguments."); //HttpHelp(); }
/// <summary> /// does the actual http request. /// </summary> /// <param name="args">the list of parsed arguments.</param> private static void DoRequest(HttpArgs args) { Console.ForegroundColor = ConsoleColor.Green; //Console.WriteLine("--- BEGIN"); Console.ForegroundColor = ConsoleColor.DarkGreen; // display help if no arguments where provided or if arguments where invalid if (args == null || !AreArgsValid(args)) { HttpHelp(); return; } var http = new Global.Http.Http(args.Url); // for some reason if we set the value after it will not recognize it // we have to set before the other values if (args.KeepAlive != null) http.KeepAlive = (bool)args.KeepAlive; http = http.SetMethod(args.Method) .SetContentType(args.ContentType) .SetUserAgent(args.UserAgent) .SetPayload(args.Payload) .SetRequestEncoding(args.PayloadEncoding) .SetResponseEncoding(args.ResponseEncoding); if (args.Timeout != null) http.Timeout = (int)args.Timeout; if (args.Header != null && args.Header.Count > 0) http.Headers = args.Header; if (!string.IsNullOrEmpty(args.Accept)) http.Accept = args.Accept; if (args.Credential != null) http.Credentials = args.Credential; if (args.Proxy != null) http.Proxy = args.Proxy; // track how long the request took to show in the output console var started = DateTime.Now; var response = http.DoRequest(); var ended = DateTime.Now; if (http.Response != null) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("\n{0} {1} | {2} {3}", (int)http.Response.StatusCode, http.Response.StatusCode, args.Method, args.Url); if (http.Response.Headers != null) { foreach (var h in http.Response.Headers) Console.WriteLine("{0}: {1}", h.Key, string.Join(", ", h.Value)); } Console.ForegroundColor = ConsoleColor.DarkGreen; if (http.Response.IsSuccessStatusCode) { if (!string.IsNullOrEmpty(args.Regex)) { var m = new Regex(args.Regex, RegexOptions.IgnoreCase | RegexOptions.Singleline).Matches(response); if (m.Count > 0) { var builder = new StringBuilder(""); for (var i = 0; i < m.Count; i++) { builder.AppendFormat("Match {0}: {1}", i + 1, !string.IsNullOrEmpty(args.RegexGroup) ? m[i].Groups[args.RegexGroup] : m[i]); builder.Append(i < m.Count - 1 ? "\n" : ""); } response = builder.ToString(); } else { response = "No matches were found!"; } } } } else { Console.WriteLine("N/A (Failed unexpectadly)."); } if (!string.IsNullOrEmpty(args.OutputPath) && !string.IsNullOrEmpty(response)) { using (var writer = new StreamWriter(args.OutputPath)) writer.WriteLine(response); } else if (args.OutputToConsole && !string.IsNullOrEmpty(response)) { Console.WriteLine(""); Console.WriteLine(response); } Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(""); Console.WriteLine("{0}", new TimeSpan((ended - started).Ticks).ToString("c")); }
/// <summary> /// validates if the arguments are correct. eg: the url is a required argument. /// </summary> /// <param name="args">the specified list of arguments.</param> /// <returns>a boolean indicating if the arguments are correct.</returns> private static bool AreArgsValid(HttpArgs args) { if (args == null) { Console.WriteLine("No values have been supplied"); return false; } if (args.Help) { HttpHelp(); return false; } if (string.IsNullOrEmpty(args.Url)) { Console.WriteLine("Url must be supplied."); return false; } if (!string.IsNullOrEmpty(args.ProxyCredentialUsername) && !string.IsNullOrEmpty(args.ProxyCredentialPassword)) { args.Proxy.Credentials = !string.IsNullOrEmpty(args.ProxyCredentialDomain) ? new NetworkCredential(args.ProxyCredentialUsername, args.ProxyCredentialPassword, args.ProxyCredentialDomain) : new NetworkCredential(args.ProxyCredentialUsername, args.ProxyCredentialPassword); } if (args.ProxyAddBypassRule != null && args.ProxyAddBypassRule.Count > 0) { foreach (var bypass in args.ProxyAddBypassRule) args.Proxy.BypassArrayList.Add(bypass); } return true; }