From 5ffc3860d76a3f88123af4ab355151511c60eec0 Mon Sep 17 00:00:00 2001 From: Lizan Zhou Date: Mon, 15 May 2017 11:32:03 -0700 Subject: [PATCH] Support streaming response - Comply with lyft/envoy#959 --- WORKSPACE | 2 +- src/envoy/transcoding/filter.cc | 36 ++++++++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 19e2872d0a9..4886065d8f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -68,7 +68,7 @@ bind( git_repository( name = "envoy", remote = "https://github.com/lyft/envoy.git", - commit = "14e1f10e3c4f17a9d4579f6711d0c03b7d2647c4", + commit = "8f9d56fb92b68ad157bd55d9003ddd433720c7e1", ) load("@envoy//bazel:repositories.bzl", "envoy_dependencies") diff --git a/src/envoy/transcoding/filter.cc b/src/envoy/transcoding/filter.cc index 167b58537cf..cee2d41ae8e 100644 --- a/src/envoy/transcoding/filter.cc +++ b/src/envoy/transcoding/filter.cc @@ -56,13 +56,14 @@ Http::FilterHeadersStatus Instance::decodeHeaders(Http::HeaderMap& headers, if (end_stream) { log().debug("header only request"); - auto& data = decoder_callbacks_->decodingBuffer(); - ASSERT(!data); - data.reset(new Buffer::OwnedImpl("")); - request_in_.Finish(); - ReadToBuffer(transcoder_->RequestOutput(), *data); + Buffer::OwnedImpl data; + ReadToBuffer(transcoder_->RequestOutput(), data); + + if (data.length()) { + decoder_callbacks_->addDecodedData(data); + } } } else { log().debug("No transcoding" + status.ToString()); @@ -86,6 +87,18 @@ Http::FilterDataStatus Instance::decodeData(Buffer::Instance& data, } Http::FilterTrailersStatus Instance::decodeTrailers(Http::HeaderMap& trailers) { + log().debug("Transcoding::Instance::decodeTrailers"); + if (transcoder_) { + request_in_.Finish(); + + Buffer::OwnedImpl data; + ReadToBuffer(transcoder_->RequestOutput(), data); + + if (data.length()) { + decoder_callbacks_->addDecodedData(data); + } + } + return Http::FilterTrailersStatus::Continue; } @@ -96,6 +109,7 @@ void Instance::setDecoderFilterCallbacks( Http::FilterHeadersStatus Instance::encodeHeaders(Http::HeaderMap& headers, bool end_stream) { + log().debug("Transcoding::Instance::encodeHeaders"); if (transcoder_) { headers.insertContentType().value(kJsonContentType); } @@ -104,6 +118,7 @@ Http::FilterHeadersStatus Instance::encodeHeaders(Http::HeaderMap& headers, Http::FilterDataStatus Instance::encodeData(Buffer::Instance& data, bool end_stream) { + log().debug("Transcoding::Instance::encodeData"); if (transcoder_) { response_in_.Move(data); @@ -120,6 +135,17 @@ Http::FilterDataStatus Instance::encodeData(Buffer::Instance& data, } Http::FilterTrailersStatus Instance::encodeTrailers(Http::HeaderMap& trailers) { + log().debug("Transcoding::Instance::encodeTrailers"); + if (transcoder_) { + response_in_.Finish(); + + Buffer::OwnedImpl data; + ReadToBuffer(transcoder_->ResponseOutput(), data); + + if (data.length()) { + encoder_callbacks_->addEncodedData(data); + } + } return Http::FilterTrailersStatus::Continue; }