/// <summary> /// Detrmines the body match based on the rules in the contract. /// </summary> /// <param name="contract">The contract.</param> /// <returns>A member of the <see cref="T:Stumps.Web.Models.BodyMatch"/> enumeration.</returns> private BodyMatch DetrmineBodyMatch(StumpContract contract) { var rules = contract.Rules.FindRuleContractByName(typeof(BodyLengthRule).Name); if (rules.Count > 0) { var blr = ContractBindings.CreateRuleFromContract <BodyLengthRule>(rules[0]); if (blr.MinimumBodyLength == 0 && blr.MaximumBodyLength == 0) { return(BodyMatch.IsBlank); } if (blr.MinimumBodyLength == 1 && blr.MaximumBodyLength == int.MaxValue) { return(BodyMatch.IsNotBlank); } } if (contract.Rules.FindRuleContractByName(typeof(BodyContentRule).Name).Count > 0) { return(BodyMatch.ContainsText); } if (contract.Rules.FindRuleContractByName(typeof(BodyMatchRule).Name).Count > 0) { return(BodyMatch.ExactMatch); } return(BodyMatch.IsAnything); }
/// <summary> /// Creates a <see cref="T:Stumps.Web.Models.StumpModel"/> from an existing Stump. /// </summary> /// <param name="stump">The <see cref="T:Stumps.Server.StumpContract"/> used to create the model.</param> /// <param name="serverId">The unique identifier for the proxy the Stump belongs to.</param> /// <param name="stumpId">The unique identifier of the Stump.</param> /// <returns> /// A new <see cref="T:Stumps.Web.Models.StumpModel"/> object. /// </returns> private StumpModel CreateStumpModel(StumpContract stump, string serverId, string stumpId) { var bodyMatch = DetrmineBodyMatch(stump); var model = new StumpModel { Name = stump.StumpName, Origin = StumpOrigin.ExistingStump, RecordId = -1, RequestBody = stump.OriginalRequest.BodyType == HttpBodyClassification.Text ? stump.OriginalRequest.GetBodyAsString() : string.Empty, RequestBodyIsImage = stump.OriginalRequest.BodyType == HttpBodyClassification.Image, RequestBodyIsText = stump.OriginalRequest.BodyType == HttpBodyClassification.Text, RequestBodyLength = stump.OriginalRequest.BodyLength, RequestBodyMatch = bodyMatch, RequestBodyMatchValues = stump.Rules.FindRuleContractByName(typeof(BodyContentRule).Name).Count > 0 ? ContractBindings.CreateRuleFromContract <BodyContentRule>(stump.Rules.FindRuleContractByName(typeof(BodyContentRule).Name)[0]).GetTextEvaluators() : new string[0], RequestBodyUrl = "/api/proxy/" + serverId + "/stumps/" + stumpId + "/request", RequestHeaderMatch = CreateHeadersFromRules(stump), RequestHttpMethod = stump.OriginalRequest.HttpMethod, RequestHttpMethodMatch = stump.Rules.FindRuleContractByName(typeof(HttpMethodRule).Name).Count > 0, RequestUrl = stump.OriginalRequest.RawUrl, RequestUrlMatch = stump.Rules.FindRuleContractByName(typeof(UrlRule).Name).Count > 0, ResponseBody = stump.Response.BodyType == HttpBodyClassification.Text ? stump.Response.GetBodyAsString() : string.Empty, ResponseBodyIsImage = stump.Response.BodyType == HttpBodyClassification.Image, ResponseBodyIsText = stump.Response.BodyType == HttpBodyClassification.Text, ResponseBodyLength = stump.Response.BodyLength, ResponseBodyModification = string.Empty, ResponseBodySource = BodySource.Origin, ResponseBodyUrl = "/api/proxy/" + serverId + "/stumps/" + stumpId + "/response", ResponseHeaders = CreateHeaderModel(stump.Response.Headers), ResponseStatusCode = stump.Response.StatusCode, ResponseStatusDescription = stump.Response.StatusDescription, StumpId = stump.StumpId }; return(model); }
private HeaderModel[] CreateHeadersFromRules(StumpContract contract) { var models = new List <HeaderModel>(); var rules = contract.Rules.FindRuleContractByName(typeof(HeaderRule).Name); foreach (var rule in rules) { var headerRule = ContractBindings.CreateRuleFromContract <HeaderRule>(rule); var model = new HeaderModel { Name = headerRule.HeaderNameTextMatch, Value = headerRule.HeaderValueTextMatch }; models.Add(model); } return(models.ToArray()); }
/// <summary> /// Creates a Stump contract from an existing Stump. /// </summary> /// <param name="model">The <see cref="T:Stumps.Web.Models.StumpModel"/> used to create the contract.</param> /// <param name="server">The <see cref="T:Stumps.Server.StumpsServerInstance" /> that contains the Stump.</param> /// <returns>A <see cref="T:Stumps.Server.StumpContract" /> created from an existing Stump.</returns> private StumpContract CreateContractFromStump(StumpModel model, StumpsServerInstance server) { var originalContract = server.FindStump(model.StumpId); var contract = new StumpContract { OriginalRequest = new RecordedRequest(originalContract.OriginalRequest, ContentDecoderHandling.DecodeNotRequired), OriginalResponse = new RecordedResponse(originalContract.OriginalResponse, ContentDecoderHandling.DecodeNotRequired), Response = new RecordedResponse(originalContract.Response, ContentDecoderHandling.DecodeNotRequired), StumpId = model.StumpId, StumpName = model.Name, StumpCategory = "Uncategorized" }; if (model.RequestUrlMatch) { contract.Rules.Add(new RuleContract(new UrlRule(model.RequestUrl))); } if (model.RequestHttpMethodMatch) { contract.Rules.Add(new RuleContract(new HttpMethodRule(model.RequestHttpMethod))); } foreach (var h in model.RequestHeaderMatch) { contract.Rules.Add(new RuleContract(new HeaderRule(h.Name, h.Value))); } switch (model.RequestBodyMatch) { case BodyMatch.ContainsText: contract.Rules.Add(new RuleContract(new BodyContentRule(model.RequestBodyMatchValues))); break; case BodyMatch.ExactMatch: contract.Rules.Add( new RuleContract(new BodyMatchRule(contract.OriginalRequest.BodyLength, contract.OriginalRequest.BodyMd5Hash))); break; case BodyMatch.IsBlank: contract.Rules.Add(new RuleContract(new BodyLengthRule(0, 0))); break; case BodyMatch.IsNotBlank: contract.Rules.Add(new RuleContract(new BodyLengthRule(1, int.MaxValue))); break; } switch (model.ResponseBodySource) { case BodySource.Modified: contract.Response.ClearBody(); contract.Response.AppendToBody(Encoding.UTF8.GetBytes(model.ResponseBodyModification)); break; case BodySource.EmptyBody: contract.Response.ClearBody(); break; case BodySource.Origin: contract.Response.ClearBody(); contract.Response.AppendToBody(originalContract.Response.GetBody()); break; } CopyHeaderModelToDictionary(model.ResponseHeaders, contract.Response.Headers); contract.Response.StatusCode = model.ResponseStatusCode; contract.Response.StatusDescription = model.ResponseStatusDescription; contract.Response.ExamineBody(); return(contract); }