public async Task TranscodeStream(RequestDelegate inner) { var requestReader = _httpContextAccessor.HttpContext.Request.BodyReader; var responseWriter = _httpContextAccessor.HttpContext.Response.BodyWriter; var requestPipe = new Pipe(); var responsePipe = new Pipe(); var decode = Base64Pipe.Decode(requestReader, requestPipe.Writer); var encode = Base64Pipe.Encode(responsePipe.Reader, responseWriter); using (new BodyRedirector(_httpContextAccessor.HttpContext, requestPipe, responsePipe)) { var next = inner(_httpContextAccessor.HttpContext); var length = await decode; requestPipe.Writer.Complete(); _logger.LogTrace("Decoded {Length} bytes from base64", length); await next; await responsePipe.Writer.FlushAsync(); // TODO: May be unnecessary responsePipe.Writer.Complete(); } { var length = await encode; responsePipe.Reader.Complete(); _logger.LogTrace("Encoded {Length} bytes to base64", length); } await encode; }
public async Task TranscodeTrailers(IHeaderDictionary trailers) { var pipe = new Pipe(); var stream = GrpcWebTrailers.Stream(trailers, pipe.Writer); var encode = Base64Pipe.Encode(pipe.Reader, _httpContextAccessor.HttpContext.Response.BodyWriter); await stream; pipe.Writer.Complete(); var length = await encode; pipe.Reader.Complete(); _logger.LogTrace("Encoded {Length} bytes to base64", length); }