13
13
// See the License for the specific language governing permissions and
14
14
// limitations under the License.
15
15
16
+ #include " include/proxy-wasm/context.h"
17
+ #include " include/proxy-wasm/wasm.h"
18
+ #include < cassert>
16
19
#include < deque>
17
20
#include < map>
18
21
#include < memory>
19
22
#include < mutex>
20
23
#include < unordered_map>
21
24
#include < unordered_set>
22
25
23
- #include " include/proxy-wasm/context.h"
24
- #include " include/proxy-wasm/wasm.h"
25
-
26
26
#define CHECK_FAIL (_call, _stream_type, _return_open, _return_closed ) \
27
27
if (isFailed()) { \
28
28
if (plugin_->fail_open_ ) { \
@@ -469,44 +469,62 @@ template <typename P> static uint32_t headerSize(const P &p) { return p ? p->siz
469
469
FilterHeadersStatus ContextBase::onRequestHeaders (uint32_t headers, bool end_of_stream) {
470
470
CHECK_HTTP2 (on_request_headers_abi_01_, on_request_headers_abi_02_, FilterHeadersStatus::Continue,
471
471
FilterHeadersStatus::StopIteration);
472
- DeferAfterCallActions actions (this );
473
- auto result = wasm_->on_request_headers_abi_01_
474
- ? wasm_->on_request_headers_abi_01_ (this , id_, headers).u64_
475
- : wasm_
476
- ->on_request_headers_abi_02_ (this , id_, headers,
477
- static_cast <uint32_t >(end_of_stream))
478
- .u64_ ;
479
- if (result > static_cast <uint64_t >(FilterHeadersStatus::StopAllIterationAndWatermark))
472
+ uint64_t result;
473
+ {
474
+ DeferAfterCallActions actions (this );
475
+ result = wasm_->on_request_headers_abi_01_
476
+ ? wasm_->on_request_headers_abi_01_ (this , id_, headers).u64_
477
+ : wasm_
478
+ ->on_request_headers_abi_02_ (this , id_, headers,
479
+ static_cast <uint32_t >(end_of_stream))
480
+ .u64_ ;
481
+ }
482
+
483
+ if (stop_iteration_) {
484
+ return FilterHeadersStatus::StopIteration;
485
+ } else if (result > static_cast <uint64_t >(FilterHeadersStatus::StopAllIterationAndWatermark)) {
480
486
return FilterHeadersStatus::StopAllIterationAndWatermark;
487
+ }
481
488
return static_cast <FilterHeadersStatus>(result);
482
489
}
483
490
484
491
FilterDataStatus ContextBase::onRequestBody (uint32_t data_length, bool end_of_stream) {
485
492
CHECK_HTTP (on_request_body_, FilterDataStatus::Continue, FilterDataStatus::StopIterationNoBuffer);
486
- DeferAfterCallActions actions (this );
487
- auto result =
488
- wasm_->on_request_body_ (this , id_, data_length, static_cast <uint32_t >(end_of_stream)).u64_ ;
489
- if (result > static_cast <uint64_t >(FilterDataStatus::StopIterationNoBuffer))
493
+ uint64_t result;
494
+ {
495
+ DeferAfterCallActions actions (this );
496
+ result =
497
+ wasm_->on_request_body_ (this , id_, data_length, static_cast <uint32_t >(end_of_stream)).u64_ ;
498
+ }
499
+ if (stop_iteration_ || result > static_cast <uint64_t >(FilterDataStatus::StopIterationNoBuffer))
490
500
return FilterDataStatus::StopIterationNoBuffer;
491
501
return static_cast <FilterDataStatus>(result);
492
502
}
493
503
494
504
FilterTrailersStatus ContextBase::onRequestTrailers (uint32_t trailers) {
495
505
CHECK_HTTP (on_request_trailers_, FilterTrailersStatus::Continue,
496
506
FilterTrailersStatus::StopIteration);
497
- DeferAfterCallActions actions (this );
498
- if (static_cast <FilterTrailersStatus>(wasm_->on_request_trailers_ (this , id_, trailers).u64_ ) ==
499
- FilterTrailersStatus::Continue) {
507
+
508
+ uint64_t result;
509
+ {
510
+ DeferAfterCallActions actions (this );
511
+ result = wasm_->on_request_trailers_ (this , id_, trailers).u64_ ;
512
+ }
513
+ if (!stop_iteration_ &&
514
+ static_cast <FilterTrailersStatus>(result) == FilterTrailersStatus::Continue) {
500
515
return FilterTrailersStatus::Continue;
501
516
}
502
517
return FilterTrailersStatus::StopIteration;
503
518
}
504
519
505
520
FilterMetadataStatus ContextBase::onRequestMetadata (uint32_t elements) {
506
521
CHECK_HTTP (on_request_metadata_, FilterMetadataStatus::Continue, FilterMetadataStatus::Continue);
507
- DeferAfterCallActions actions (this );
508
- if (static_cast <FilterMetadataStatus>(wasm_->on_request_metadata_ (this , id_, elements).u64_ ) ==
509
- FilterMetadataStatus::Continue) {
522
+ uint64_t result;
523
+ {
524
+ DeferAfterCallActions actions (this );
525
+ result = wasm_->on_request_metadata_ (this , id_, elements).u64_ ;
526
+ }
527
+ if (static_cast <FilterMetadataStatus>(result) == FilterMetadataStatus::Continue) {
510
528
return FilterMetadataStatus::Continue;
511
529
}
512
530
return FilterMetadataStatus::Continue; // This is currently the only return code.
@@ -515,35 +533,53 @@ FilterMetadataStatus ContextBase::onRequestMetadata(uint32_t elements) {
515
533
FilterHeadersStatus ContextBase::onResponseHeaders (uint32_t headers, bool end_of_stream) {
516
534
CHECK_HTTP2 (on_response_headers_abi_01_, on_response_headers_abi_02_,
517
535
FilterHeadersStatus::Continue, FilterHeadersStatus::StopIteration);
518
- DeferAfterCallActions actions (this );
519
- auto result = wasm_->on_response_headers_abi_01_
520
- ? wasm_->on_response_headers_abi_01_ (this , id_, headers).u64_
521
- : wasm_
522
- ->on_response_headers_abi_02_ (this , id_, headers,
523
- static_cast <uint32_t >(end_of_stream))
524
- .u64_ ;
525
- if (result > static_cast <uint64_t >(FilterHeadersStatus::StopAllIterationAndWatermark))
536
+
537
+ uint64_t result;
538
+ {
539
+ DeferAfterCallActions actions (this );
540
+ result = wasm_->on_response_headers_abi_01_
541
+ ? wasm_->on_response_headers_abi_01_ (this , id_, headers).u64_
542
+ : wasm_
543
+ ->on_response_headers_abi_02_ (this , id_, headers,
544
+ static_cast <uint32_t >(end_of_stream))
545
+ .u64_ ;
546
+ }
547
+
548
+ if (stop_iteration_) {
549
+ return FilterHeadersStatus::StopIteration;
550
+ } else if (result > static_cast <uint64_t >(FilterHeadersStatus::StopAllIterationAndWatermark)) {
526
551
return FilterHeadersStatus::StopAllIterationAndWatermark;
552
+ }
527
553
return static_cast <FilterHeadersStatus>(result);
528
554
}
529
555
530
556
FilterDataStatus ContextBase::onResponseBody (uint32_t body_length, bool end_of_stream) {
531
557
CHECK_HTTP (on_response_body_, FilterDataStatus::Continue,
532
558
FilterDataStatus::StopIterationNoBuffer);
533
- DeferAfterCallActions actions (this );
534
- auto result =
535
- wasm_->on_response_body_ (this , id_, body_length, static_cast <uint32_t >(end_of_stream)).u64_ ;
536
- if (result > static_cast <uint64_t >(FilterDataStatus::StopIterationNoBuffer))
559
+
560
+ uint64_t result;
561
+ {
562
+
563
+ DeferAfterCallActions actions (this );
564
+ result =
565
+ wasm_->on_response_body_ (this , id_, body_length, static_cast <uint32_t >(end_of_stream)).u64_ ;
566
+ }
567
+
568
+ if (stop_iteration_ || result > static_cast <uint64_t >(FilterDataStatus::StopIterationNoBuffer))
537
569
return FilterDataStatus::StopIterationNoBuffer;
538
570
return static_cast <FilterDataStatus>(result);
539
571
}
540
572
541
573
FilterTrailersStatus ContextBase::onResponseTrailers (uint32_t trailers) {
542
574
CHECK_HTTP (on_response_trailers_, FilterTrailersStatus::Continue,
543
575
FilterTrailersStatus::StopIteration);
544
- DeferAfterCallActions actions (this );
545
- if (static_cast <FilterTrailersStatus>(wasm_->on_response_trailers_ (this , id_, trailers).u64_ ) ==
546
- FilterTrailersStatus::Continue) {
576
+ uint64_t result;
577
+ {
578
+ DeferAfterCallActions actions (this );
579
+ result = wasm_->on_response_trailers_ (this , id_, trailers).u64_ ;
580
+ }
581
+ if (!stop_iteration_ &&
582
+ static_cast <FilterTrailersStatus>(result) == FilterTrailersStatus::Continue) {
547
583
return FilterTrailersStatus::Continue;
548
584
}
549
585
return FilterTrailersStatus::StopIteration;
0 commit comments