public void WriteCharArray_WritesToStream(int byteLength)
    {
        // Arrange
        var stream = new TestMemoryStream();
        var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);

        // Act
        using (writer)
        {
            writer.Write((new string('a', byteLength)).ToCharArray());
        }

        // Assert
        Assert.Equal(byteLength, stream.Length);
    }
        public override void ExecuteResult(ActionContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var response = context.HttpContext.Response;

            response.StatusCode  = (int)_statusCode;
            response.ContentType = "application/json";
            using (TextWriter writer = new HttpResponseStreamWriter(response.Body, Encoding.UTF8))
            {
                writer.Write(_jsonString);
            }
        }
    public void WriteReadOnlySpanChar_WritesToStream(int byteLength)
    {
        // Arrange
        var stream = new TestMemoryStream();
        var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);

        // Act
        using (writer)
        {
            var array = new string('a', byteLength).ToCharArray();
            var span  = new ReadOnlySpan <char>(array);
            writer.Write(span);
        }

        // Assert
        Assert.Equal(byteLength, stream.Length);
    }
    public void WriteChar_WritesToStream(int byteLength)
    {
        // Arrange
        var stream = new TestMemoryStream();
        var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);

        // Act
        using (writer)
        {
            for (var i = 0; i < byteLength; i++)
            {
                writer.Write('a');
            }
        }

        // Assert
        Assert.Equal(byteLength, stream.Length);
    }
    public void FlushesBuffer_ButNotStream_OnFlush(int byteLength)
    {
        // Arrange
        var stream = new TestMemoryStream();
        var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);

        writer.Write(new string('a', byteLength));

        var expectedWriteCount = Math.Ceiling((double)byteLength / HttpResponseStreamWriter.DefaultBufferSize);

        // Act
        writer.Flush();

        // Assert
        Assert.Equal(0, stream.FlushCallCount);
        Assert.Equal(expectedWriteCount, stream.WriteCallCount);
        Assert.Equal(byteLength, stream.Length);
    }
Пример #6
0
        public Task ExecuteResultAsync(ActionContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            HttpResponse response = context.HttpContext.Response;

            response.StatusCode  = 200;
            response.ContentType = "application/json";

            using (TextWriter writer = new HttpResponseStreamWriter(response.Body, Encoding.UTF8))
            {
                writer.Write(_jsonString);
            }

            return(Task.CompletedTask);
        }
    public void HttpResponseStreamWriter_UsingPooledBuffers()
    {
        // Arrange
        var encoding = Encoding.UTF8;
        var stream   = new MemoryStream();

        var expectedBytes = encoding.GetBytes("Hello, World!");

        using (var writer = new HttpResponseStreamWriter(
                   stream,
                   encoding,
                   1024,
                   ArrayPool <byte> .Shared,
                   ArrayPool <char> .Shared))
        {
            // Act
            writer.Write("Hello, World!");
        }

        // Assert
        Assert.Equal(expectedBytes, stream.ToArray());
    }
        private async Task ProcessBodyAsync(HttpContext httpContext, string charSet)
        {
            JsonElement json;

            if (string.Equals(charSet, Encoding.UTF8.WebName, StringComparison.OrdinalIgnoreCase))
            {
                json = await JsonSerializer.DeserializeAsync <JsonElement>(httpContext.Request.Body);
            }
            else
            {
                using (var reader = new HttpRequestStreamReader(httpContext.Request.Body, Encoding.GetEncoding(charSet)))
                {
                    var text = await reader.ReadToEndAsync();

                    json = JsonSerializer.Deserialize <JsonElement>(text);
                }
            }

            Stream originalBody;
            Stream body;

            string originalContentType;
            string contentType;

            // Check whether to use data or data_base64 as per https://github.com/cloudevents/spec/blob/v1.0.1/json-format.md#31-handling-of-data
            var isDataSet       = json.TryGetProperty("data", out var data);
            var isBinaryDataSet = json.TryGetProperty("data_base64", out var binaryData);

            if (isDataSet && isBinaryDataSet)
            {
                httpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return;
            }
            else if (isDataSet)
            {
                contentType = this.GetDataContentType(json, out var isJson);

                // If the value is anything other than a JSON string, treat it as JSON. Cloud Events requires
                // non-JSON text to be enclosed in a JSON string.
                isJson |= data.ValueKind != JsonValueKind.String;

                body = new MemoryStream();
                if (isJson || options.SuppressJsonDecodingOfTextPayloads)
                {
                    // Rehydrate body from JSON payload
                    await JsonSerializer.SerializeAsync <JsonElement>(body, data);
                }
                else
                {
                    // Rehydrate body from contents of the string
                    var text = data.GetString();
                    using var writer = new HttpResponseStreamWriter(body, Encoding.UTF8);
                    writer.Write(text);
                }

                body.Seek(0L, SeekOrigin.Begin);
            }
            else if (isBinaryDataSet)
            {
                // As per the spec, if the implementation determines that the type of data is Binary,
                // the value MUST be represented as a JSON string expression containing the Base64 encoded
                // binary value, and use the member name data_base64 to store it inside the JSON object.
                var decodedBody = binaryData.GetBytesFromBase64();
                body = new MemoryStream(decodedBody);
                body.Seek(0L, SeekOrigin.Begin);
                contentType = this.GetDataContentType(json, out _);
            }
            else
            {
                body        = new MemoryStream();
                contentType = null;
            }

            originalBody        = httpContext.Request.Body;
            originalContentType = httpContext.Request.ContentType;

            try
            {
                httpContext.Request.Body        = body;
                httpContext.Request.ContentType = contentType;

                await this.next(httpContext);
            }
            finally
            {
                httpContext.Request.ContentType = originalContentType;
                httpContext.Request.Body        = originalBody;
            }
        }
        public void HttpResponseStreamWriter_UsingPooledBuffers()
        {
            // Arrange
            var encoding = Encoding.UTF8;
            var stream = new MemoryStream();

            var expectedBytes = encoding.GetBytes("Hello, World!");

            using (var writer = new HttpResponseStreamWriter(
                stream,
                encoding,
                1024,
                ArrayPool<byte>.Shared,
                ArrayPool<char>.Shared))
            {
                // Act
                writer.Write("Hello, World!");
            }

            // Assert
            Assert.Equal(expectedBytes, stream.ToArray());
        }
        public void WriteCharArray_WritesToStream(int byteLength)
        {
            // Arrange
            var stream = new TestMemoryStream();
            var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);

            // Act
            using (writer)
            {
                writer.Write((new string('a', byteLength)).ToCharArray());
            }

            // Assert
            Assert.Equal(byteLength, stream.Length);
        }
        public void WriteChar_WritesToStream(int byteLength)
        {
            // Arrange
            var stream = new TestMemoryStream();
            var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);

            // Act
            using (writer)
            {
                for (var i = 0; i < byteLength; i++)
                {
                    writer.Write('a');
                }
            }

            // Assert
            Assert.Equal(byteLength, stream.Length);
        }
        public void FlushesBuffer_ButNotStream_OnFlush(int byteLength)
        {
            // Arrange
            var stream = new TestMemoryStream();
            var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8);
            writer.Write(new string('a', byteLength));

            var expectedWriteCount = Math.Ceiling((double)byteLength / HttpResponseStreamWriter.DefaultBufferSize);

            // Act
            writer.Flush();

            // Assert
            Assert.Equal(0, stream.FlushCallCount);
            Assert.Equal(expectedWriteCount, stream.WriteCallCount);
            Assert.Equal(byteLength, stream.Length);
        }