Пример #1
0
        private async Task WriteResponseBodyImplAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            var response = context.HttpContext.Response;

            FieldsParserResult fieldsParserResult = default;

            if (!this.ShouldBypassPartialResponse(context.HttpContext))
            {
                fieldsParserResult = this.fieldsParser.Parse(context.HttpContext.Request);

                if (fieldsParserResult.HasError && !this.options.IgnoreParseErrors)
                {
                    response.StatusCode = 400;

                    return;
                }
            }

            using (var writer = context.WriterFactory(response.Body, selectedEncoding))
            {
                this.WriteObject(writer, context.Object, fieldsParserResult);

                // Perf: call FlushAsync to call WriteAsync on the stream with any content left in the TextWriter's
                // buffers. This is better than just letting dispose handle it (which would result in a synchronous
                // write).
                await writer.FlushAsync();
            }
        }
Пример #2
0
        public async Task TheWriteResponseBodyAsyncMethodShouldReturnStatusCode400IfFieldsMalformed()
        {
            // Arrange
            Mock.Get(this.httpResponse)
            .SetupGet(httpResponse => httpResponse.StatusCode)
            .Returns(200);

            Mock.Get(this.fieldsParser)
            .Setup(fieldsParser => fieldsParser.Parse(this.httpRequest))
            .Returns(FieldsParserResult.Failed());

            this.mvcPartialJsonOptions.IgnoreParseErrors = false;
            this.mvcPartialJsonOptions.IgnoreCase        = false;

            var writeContext = this.CreateWriteContext(new { });

            // Act
            await this.formatter.WriteResponseBodyAsync(writeContext, Encoding.UTF8);

            // Assert
            Mock.Get(this.httpResponse)
            .VerifySet(httpResponse => httpResponse.StatusCode = 400);

            Assert.Equal(0, this.body.Length);
        }
Пример #3
0
        public async Task TheWriteResponseBodyAsyncMethodShouldNotReturnStatusCode400IfFieldsMalformedButParseErrorsIgnored()
        {
            // Arrange
            Mock.Get(this.httpResponse)
            .SetupGet(httpResponse => httpResponse.StatusCode)
            .Returns(200);

            Mock.Get(this.fieldsParser)
            .Setup(fieldsParser => fieldsParser.Parse(this.httpRequest))
            .Returns(FieldsParserResult.Failed());

            this.mvcPartialJsonOptions.IgnoreParseErrors = true;
            this.mvcPartialJsonOptions.IgnoreCase        = false;

            var writeContext = this.CreateWriteContext(new { foo = "bar" });

            // Act
            await this.formatter.WriteResponseBodyAsync(writeContext, Encoding.UTF8);

            // Assert
            Mock.Get(this.httpResponse)
            .VerifySet(httpResponse => httpResponse.StatusCode = 400, Times.Never);

            Assert.Equal("{\"foo\":\"bar\"}", this.body.ToString());
        }
Пример #4
0
        public void TheNoValueMethodShouldSetIsFieldsSetToFalse()
        {
            // Act
            var result = FieldsParserResult.NoValue();

            // Assert
            Assert.False(result.IsFieldsSet);
        }
Пример #5
0
        public void TheNoValueMethodShouldSetHasErrorToFalse()
        {
            // Act
            var result = FieldsParserResult.NoValue();

            // Assert
            Assert.False(result.HasError);
        }
Пример #6
0
        public void TheFailedMethodShouldSetHasErrorToTrue()
        {
            // Act
            var result = FieldsParserResult.Failed();

            // Assert
            Assert.True(result.HasError);
        }
Пример #7
0
        public void TheSuccessMethodShouldSetIsFieldsSetToTrue()
        {
            // Arrange
            Fields.TryParse("foo", out var fields);

            // Act
            var result = FieldsParserResult.Success(fields);

            // Assert
            Assert.True(result.IsFieldsSet);
        }
Пример #8
0
        public void TheSuccessMethodShouldSetHasErrorToFalse()
        {
            // Arrange
            Fields.TryParse("foo", out var fields);

            // Act
            var result = FieldsParserResult.Success(fields);

            // Assert
            Assert.False(result.HasError);
        }
Пример #9
0
        public void TheSuccessMethodShouldSetFields()
        {
            // Arrange
            Fields.TryParse("foo", out var fields);

            // Act
            var result = FieldsParserResult.Success(fields);

            // Assert
            var field = result.Fields.Values.First();
            var part  = field.Parts.First();

            Assert.Equal("foo", part.ToString());
        }
Пример #10
0
        public async Task TheExecuteAsyncMethodShouldNotApplyFieldsIfNotSupplied()
        {
            // Arrange
            Mock.Get(this.fieldsParser)
            .Setup(fieldsParser => fieldsParser.Parse(this.httpRequest))
            .Returns(FieldsParserResult.NoValue());

            var partialJsonResult = new PartialJsonResult(new { foo = "bar" }, new JsonSerializerSettings());

            // Act
            await this.executor.ExecuteAsync(this.actionContext, partialJsonResult);

            // Assert
            Assert.Equal("{\"foo\":\"bar\"}", this.body.ToString());
        }
Пример #11
0
        private async Task WriteResponseBodyImplAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            var response = context.HttpContext.Response;

            FieldsParserResult fieldsParserResult = default;

            if (!this.ShouldBypassPartialResponse(context.HttpContext))
            {
                fieldsParserResult = this.fieldsParser.Parse(context.HttpContext.Request);

                if (fieldsParserResult.HasError && !this.options.IgnoreParseErrors)
                {
                    response.StatusCode = 400;

                    return;
                }
            }

            var responseStream = response.Body;
            FileBufferingWriteStream fileBufferingWriteStream = null;

            if (!this.mvcOptions.SuppressOutputFormatterBuffering)
            {
                fileBufferingWriteStream = new FileBufferingWriteStream();
                responseStream           = fileBufferingWriteStream;
            }

            try
            {
                await using (var writer = context.WriterFactory(responseStream, selectedEncoding))
                {
                    this.WriteObject(writer, context.Object, fieldsParserResult);
                }

                if (fileBufferingWriteStream != null)
                {
                    response.ContentLength = fileBufferingWriteStream.Length;
                    await fileBufferingWriteStream.DrainBufferAsync(response.Body);
                }
            }
            finally
            {
                if (fileBufferingWriteStream != null)
                {
                    await fileBufferingWriteStream.DisposeAsync();
                }
            }
        }
Пример #12
0
        private void WriteObject(TextWriter writer, object value, FieldsParserResult fieldsParserResult)
        {
            using (var jsonWriter = this.CreateJsonWriter(writer))
            {
                var jsonSerializer = this.CreateJsonSerializer();

                if (fieldsParserResult.IsFieldsSet && !fieldsParserResult.HasError)
                {
                    jsonSerializer.Serialize(jsonWriter, value, path => fieldsParserResult.Fields.Matches(path, this.options.IgnoreCase));
                }
                else
                {
                    jsonSerializer.Serialize(jsonWriter, value);
                }
            }
        }
Пример #13
0
        public async Task TheExecuteAsyncMethodShouldReturnStatusCode400IfFieldsMalformed()
        {
            // Arrange
            Mock.Get(this.fieldsParser)
            .Setup(fieldsParser => fieldsParser.Parse(this.httpRequest))
            .Returns(FieldsParserResult.Failed());

            var partialJsonResult = new PartialJsonResult(new { });

            // Act
            await this.executor.ExecuteAsync(this.actionContext, partialJsonResult);

            // Assert
            Mock.Get(this.httpResponse)
            .VerifySet(httpResponse => httpResponse.StatusCode = 400);

            Assert.Equal(0, this.body.Length);
        }
Пример #14
0
        public async Task TheWriteResponseBodyAsyncMethodShouldNotApplyFieldsIfNotSupplied()
        {
            // Arrange
            Mock.Get(this.httpResponse)
            .SetupGet(httpResponse => httpResponse.StatusCode)
            .Returns(200);

            Mock.Get(this.fieldsParser)
            .Setup(fieldsParser => fieldsParser.Parse(this.httpRequest))
            .Returns(FieldsParserResult.NoValue());

            var writeContext = this.CreateWriteContext(new { foo = "bar" });

            // Act
            await this.formatter.WriteResponseBodyAsync(writeContext, Encoding.UTF8);

            // Assert
            Assert.Equal("{\"foo\":\"bar\"}", this.body.ToString());
        }
Пример #15
0
        public async Task TheExecuteAsyncMethodShouldNotIgnoreCase()
        {
            // Arrange
            Fields.TryParse("FOO", out var fields);

            Mock.Get(this.fieldsParser)
            .Setup(fieldsParser => fieldsParser.Parse(this.httpRequest))
            .Returns(FieldsParserResult.Success(fields));

            this.mvcPartialJsonOptions.IgnoreCase = false;

            var partialJsonResult = new PartialJsonResult(new { foo = "bar", baz = "qux" }, new JsonSerializerSettings());

            // Act
            await this.executor.ExecuteAsync(this.actionContext, partialJsonResult);

            // Assert
            Assert.Equal("{}", this.body.ToString());
        }
Пример #16
0
        public async Task TheExecuteAsyncMethodShouldNotReturnStatusCode400IfFieldsMalformedButParseErrorsIgnored()
        {
            // Arrange
            Mock.Get(this.fieldsParser)
            .Setup(fieldsParser => fieldsParser.Parse(this.httpRequest))
            .Returns(FieldsParserResult.Failed());

            var partialJsonResult = new PartialJsonResult(new { foo = "bar" });

            this.mvcPartialJsonOptions.IgnoreParseErrors = true;

            // Act
            await this.executor.ExecuteAsync(this.actionContext, partialJsonResult);

            // Assert
            Mock.Get(this.httpResponse)
            .VerifySet(httpResponse => httpResponse.StatusCode = 400, Times.Never);

            Assert.Equal("{\"foo\":\"bar\"}", this.body.ToString());
        }
Пример #17
0
        public async Task TheWriteResponseBodyAsyncMethodShouldBypassPartialResponseIfStatusCodeIsNot200()
        {
            // Arrange
            Mock.Get(this.httpResponse)
            .SetupGet(httpResponse => httpResponse.StatusCode)
            .Returns(500);

            Fields.TryParse(string.Empty, out var fields);

            Mock.Get(this.fieldsParser)
            .Setup(fieldsParser => fieldsParser.Parse(this.httpRequest))
            .Returns(FieldsParserResult.Success(fields));

            var writeContext = this.CreateWriteContext(new { foo = "bar" });

            // Act
            await this.formatter.WriteResponseBodyAsync(writeContext, Encoding.UTF8);

            // Assert
            Assert.Equal("{\"foo\":\"bar\"}", this.body.ToString());
        }
Пример #18
0
        public async Task TheWriteResponseBodyAsyncMethodShouldNotIgnoreCase()
        {
            // Arrange
            Mock.Get(this.httpResponse)
            .SetupGet(httpResponse => httpResponse.StatusCode)
            .Returns(200);

            Fields.TryParse("FOO", out var fields);

            Mock.Get(this.fieldsParser)
            .Setup(fieldsParser => fieldsParser.Parse(this.httpRequest))
            .Returns(FieldsParserResult.Success(fields));

            this.mvcPartialJsonOptions.IgnoreCase = false;

            var writeContext = this.CreateWriteContext(new { foo = "bar" });

            // Act
            await this.formatter.WriteResponseBodyAsync(writeContext, Encoding.UTF8);

            // Assert
            Assert.Equal("{}", this.body.ToString());
        }