/// <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; }
/// <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; }