public static IObserver <ArraySegment <byte> > Body(this HttpResponse httpResponse)
        {
            var feature = httpResponse.HttpContext.Features.Get <HttpReactiveResponseBodyFeature>();

            if (feature == null)
            {
                feature = new HttpReactiveResponseBodyFeature();
                var task = Task.CompletedTask;
                feature.ResponseBody = Observer.Create <ArraySegment <byte> >(async buffer =>
                {
                    // Implicit task queue to make sure we don't do overlappning operations
                    await task;
                    task = httpResponse.Body.WriteAsync(buffer.Array, buffer.Offset, buffer.Count);
                });

                httpResponse.HttpContext.Features.Set(feature);
            }

            return(feature.ResponseBody);
        }
Ejemplo n.º 2
0
        public static IObserver <object> Body(this HttpResponse httpResponse)
        {
            var feature = httpResponse.HttpContext.Features.Get <HttpReactiveResponseBodyFeature>();

            if (feature == null)
            {
                feature = new HttpReactiveResponseBodyFeature();
                var task = Task.CompletedTask;
                feature.ResponseBody = Observer.Create <object>(async data =>
                {
                    // Implicit task queue to make sure we don't do overlappning operations
                    await task;

                    switch (data)
                    {
                    case string value:
                        task = httpResponse.WriteAsync(value);
                        break;

                    case byte[] buffer:
                        task = httpResponse.Body.WriteAsync(buffer, 0, buffer.Length);
                        break;

                    case ArraySegment <byte> buffer:
                        task = httpResponse.Body.WriteAsync(buffer.Array, buffer.Offset, buffer.Count);
                        break;

                    default:
                        break;
                    }
                });

                httpResponse.HttpContext.Features.Set(feature);
            }

            return(feature.ResponseBody);
        }