diff --git a/src/envoy/http/mixer/filter.cc b/src/envoy/http/mixer/filter.cc index f06b99062f1..788e7b228ac 100644 --- a/src/envoy/http/mixer/filter.cc +++ b/src/envoy/http/mixer/filter.cc @@ -155,26 +155,21 @@ void Filter::completeCheck(const CheckResponseInfo& info) { return; } + route_directive_ = info.route_directive; + + // set UAEX access log flag if (!status.ok()) { - state_ = Responded; - int status_code = ::istio::utils::StatusHttpCode(status.error_code()); - decoder_callbacks_->sendLocalReply(Code(status_code), status.ToString(), - nullptr, absl::nullopt); decoder_callbacks_->streamInfo().setResponseFlag( StreamInfo::ResponseFlag::UnauthorizedExternalService); - return; } - state_ = Complete; - route_directive_ = info.route_directive; - // handle direct response from the route directive - if (status.ok() && route_directive_.direct_response_code() != 0) { - ENVOY_LOG(debug, "Mixer::Filter direct response"); + if (route_directive_.direct_response_code() != 0) { + int status_code = route_directive_.direct_response_code(); + ENVOY_LOG(debug, "Mixer::Filter direct response {}", status_code); state_ = Responded; decoder_callbacks_->sendLocalReply( - Code(route_directive_.direct_response_code()), - route_directive_.direct_response_body(), + Code(status_code), route_directive_.direct_response_body(), [this](HeaderMap& headers) { UpdateHeaders(headers, route_directive_.response_header_operations()); }, @@ -182,6 +177,18 @@ void Filter::completeCheck(const CheckResponseInfo& info) { return; } + // create a local reply for status not OK even if there is no direct response + if (!status.ok()) { + state_ = Responded; + + int status_code = ::istio::utils::StatusHttpCode(status.error_code()); + decoder_callbacks_->sendLocalReply(Code(status_code), status.ToString(), + nullptr, absl::nullopt); + return; + } + + state_ = Complete; + // handle request header operations if (nullptr != headers_) { UpdateHeaders(*headers_, route_directive_.request_header_operations()); diff --git a/src/istio/mixerclient/check_cache.h b/src/istio/mixerclient/check_cache.h index e5aa7ea934d..9e2d6d3fc2d 100644 --- a/src/istio/mixerclient/check_cache.h +++ b/src/istio/mixerclient/check_cache.h @@ -76,7 +76,7 @@ class CheckCache { // Check status. ::google::protobuf::util::Status status_; - // Route directive (if status is OK). + // Route directive ::istio::mixer::v1::RouteDirective route_directive_; // The function to set check response.