예제 #1
0
        private async Task WriteToAsync(Stream responseStream, int paddingLength, CancellationToken token)
        {
            var response = RequestContext?.Response;

            if (this.FileInfo != null)
            {
                response?.SetContentLength(FileInfo.Length + paddingLength);

                using (var fs = this.FileInfo.OpenRead())
                {
                    await fs.CopyToAsync(responseStream, token);

                    return;
                }
            }

            if (this.ResponseStream != null)
            {
                try
                {
                    if (response != null)
                    {
                        if (ResponseStream is MemoryStream ms)
                        {
                            var bytes = ms.ToArray();
                            response.SetContentLength(bytes.Length + paddingLength);

                            await responseStream.WriteAsync(bytes, 0, bytes.Length, token); //Write Sync to MemoryStream

                            return;
                        }
                    }

                    await ResponseStream.CopyToAsync(responseStream, token);
                }
                finally
                {
                    DisposeStream();
                }
                return;
            }

            if (this.ResponseText != null)
            {
                var bytes = Encoding.UTF8.GetBytes(this.ResponseText);
                response?.SetContentLength(bytes.Length + paddingLength);

                await responseStream.WriteAsync(bytes, token);

                return;
            }

            if (this.ResponseFilter == null)
            {
                throw new ArgumentNullException(nameof(ResponseFilter));
            }
            if (this.RequestContext == null)
            {
                throw new ArgumentNullException(nameof(RequestContext));
            }

            if (this.Response is byte[] bytesResponse)
            {
                response?.SetContentLength(bytesResponse.Length + paddingLength);

                await responseStream.WriteAsync(bytesResponse, token);

                return;
            }

            if (View != null)
            {
                RequestContext.SetItem("View", View);
            }
            if (Template != null)
            {
                RequestContext.SetItem("Template", Template);
            }

            RequestContext.SetItem("HttpResult", this);

            if (Response != null)
            {
                ResponseFilter.SerializeToStream(this.RequestContext, this.Response, responseStream);
            }
        }