Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }