25
25
#include " src/shared_data.h"
26
26
#include " src/shared_queue.h"
27
27
28
- #define CHECK_FAIL (_call, _stream_type , _return_open, _return_closed ) \
28
+ #define CHECK_FAIL (_stream_type, _stream_type2 , _return_open, _return_closed ) \
29
29
if (isFailed()) { \
30
30
if (plugin_->fail_open_ ) { \
31
31
return _return_open; \
32
- } else { \
32
+ } else if (!stream_failed_) { \
33
33
failStream (_stream_type); \
34
- return _return_closed; \
35
- } \
36
- } else { \
37
- if (!wasm_->_call ) { \
38
- return _return_open; \
39
- } \
40
- }
41
-
42
- #define CHECK_FAIL2 (_call1, _call2, _stream_type, _return_open, _return_closed ) \
43
- if (isFailed()) { \
44
- if (plugin_->fail_open_ ) { \
45
- return _return_open; \
46
- } else { \
47
- failStream (_stream_type); \
48
- return _return_closed; \
49
- } \
50
- } else { \
51
- if (!wasm_->_call1 && !wasm_->_call2 ) { \
52
- return _return_open; \
34
+ failStream (_stream_type2); \
35
+ stream_failed_ = true ; \
53
36
} \
37
+ return _return_closed; \
54
38
}
55
39
56
- #define CHECK_HTTP (_call, _return_open, _return_closed ) \
57
- CHECK_FAIL (_call, WasmStreamType::Request, _return_open, _return_closed)
58
- #define CHECK_HTTP2 (_call1, _call2, _return_open, _return_closed ) \
59
- CHECK_FAIL2 (_call1, _call2, WasmStreamType::Request, _return_open, _return_closed)
60
- #define CHECK_NET (_call, _return_open, _return_closed ) \
61
- CHECK_FAIL (_call, WasmStreamType::Downstream, _return_open, _return_closed)
40
+ #define CHECK_FAIL_HTTP (_return_open, _return_closed ) \
41
+ CHECK_FAIL (WasmStreamType::Request, WasmStreamType::Response, _return_open, _return_closed)
42
+ #define CHECK_FAIL_NET (_return_open, _return_closed ) \
43
+ CHECK_FAIL (WasmStreamType::Downstream, WasmStreamType::Upstream, _return_open, _return_closed)
62
44
63
45
namespace proxy_wasm {
64
46
@@ -263,30 +245,40 @@ void ContextBase::onForeignFunction(uint32_t foreign_function_id, uint32_t data_
263
245
}
264
246
265
247
FilterStatus ContextBase::onNetworkNewConnection () {
266
- CHECK_NET (on_new_connection_, FilterStatus::Continue, FilterStatus::StopIteration);
267
- DeferAfterCallActions actions (this );
268
- if (wasm_->on_new_connection_ (this , id_).u64_ == 0 ) {
248
+ CHECK_FAIL_NET (FilterStatus::Continue, FilterStatus::StopIteration);
249
+ if (!wasm_->on_new_connection_ ) {
269
250
return FilterStatus::Continue;
270
251
}
271
- return FilterStatus::StopIteration;
252
+ DeferAfterCallActions actions (this );
253
+ const auto result = wasm_->on_new_connection_ (this , id_);
254
+ CHECK_FAIL_NET (FilterStatus::Continue, FilterStatus::StopIteration);
255
+ return result == 0 ? FilterStatus::Continue : FilterStatus::StopIteration;
272
256
}
273
257
274
258
FilterStatus ContextBase::onDownstreamData (uint32_t data_length, bool end_of_stream) {
275
- CHECK_NET (on_downstream_data_, FilterStatus::Continue, FilterStatus::StopIteration);
259
+ CHECK_FAIL_NET (FilterStatus::Continue, FilterStatus::StopIteration);
260
+ if (!wasm_->on_downstream_data_ ) {
261
+ return FilterStatus::Continue;
262
+ }
276
263
DeferAfterCallActions actions (this );
277
264
auto result = wasm_->on_downstream_data_ (this , id_, static_cast <uint32_t >(data_length),
278
265
static_cast <uint32_t >(end_of_stream));
279
266
// TODO(PiotrSikora): pull Proxy-WASM's FilterStatus values.
280
- return result.u64_ == 0 ? FilterStatus::Continue : FilterStatus::StopIteration;
267
+ CHECK_FAIL_NET (FilterStatus::Continue, FilterStatus::StopIteration);
268
+ return result == 0 ? FilterStatus::Continue : FilterStatus::StopIteration;
281
269
}
282
270
283
271
FilterStatus ContextBase::onUpstreamData (uint32_t data_length, bool end_of_stream) {
284
- CHECK_NET (on_upstream_data_, FilterStatus::Continue, FilterStatus::StopIteration);
272
+ CHECK_FAIL_NET (FilterStatus::Continue, FilterStatus::StopIteration);
273
+ if (!wasm_->on_upstream_data_ ) {
274
+ return FilterStatus::Continue;
275
+ }
285
276
DeferAfterCallActions actions (this );
286
277
auto result = wasm_->on_upstream_data_ (this , id_, static_cast <uint32_t >(data_length),
287
278
static_cast <uint32_t >(end_of_stream));
288
279
// TODO(PiotrSikora): pull Proxy-WASM's FilterStatus values.
289
- return result.u64_ == 0 ? FilterStatus::Continue : FilterStatus::StopIteration;
280
+ CHECK_FAIL_NET (FilterStatus::Continue, FilterStatus::StopIteration);
281
+ return result == 0 ? FilterStatus::Continue : FilterStatus::StopIteration;
290
282
}
291
283
292
284
void ContextBase::onDownstreamConnectionClose (CloseType close_type) {
@@ -307,74 +299,99 @@ void ContextBase::onUpstreamConnectionClose(CloseType close_type) {
307
299
template <typename P> static uint32_t headerSize (const P &p) { return p ? p->size () : 0 ; }
308
300
309
301
FilterHeadersStatus ContextBase::onRequestHeaders (uint32_t headers, bool end_of_stream) {
310
- CHECK_HTTP2 (on_request_headers_abi_01_, on_request_headers_abi_02_, FilterHeadersStatus::Continue,
311
- FilterHeadersStatus::StopAllIterationAndWatermark);
302
+ CHECK_FAIL_HTTP (FilterHeadersStatus::Continue, FilterHeadersStatus::StopAllIterationAndWatermark);
303
+ if (!wasm_->on_request_headers_abi_01_ && !wasm_->on_request_headers_abi_02_ ) {
304
+ return FilterHeadersStatus::Continue;
305
+ }
312
306
DeferAfterCallActions actions (this );
313
- return convertVmCallResultToFilterHeadersStatus (
314
- wasm_->on_request_headers_abi_01_
315
- ? wasm_->on_request_headers_abi_01_ (this , id_, headers).u64_
316
- : wasm_
317
- ->on_request_headers_abi_02_ (this , id_, headers,
318
- static_cast <uint32_t >(end_of_stream))
319
- .u64_ );
307
+ const auto result = wasm_->on_request_headers_abi_01_
308
+ ? wasm_->on_request_headers_abi_01_ (this , id_, headers)
309
+ : wasm_->on_request_headers_abi_02_ (this , id_, headers,
310
+ static_cast <uint32_t >(end_of_stream));
311
+ CHECK_FAIL_HTTP (FilterHeadersStatus::Continue, FilterHeadersStatus::StopAllIterationAndWatermark);
312
+ return convertVmCallResultToFilterHeadersStatus (result);
320
313
}
321
314
322
315
FilterDataStatus ContextBase::onRequestBody (uint32_t data_length, bool end_of_stream) {
323
- CHECK_HTTP (on_request_body_, FilterDataStatus::Continue, FilterDataStatus::StopIterationNoBuffer);
316
+ CHECK_FAIL_HTTP (FilterDataStatus::Continue, FilterDataStatus::StopIterationNoBuffer);
317
+ if (!wasm_->on_request_body_ ) {
318
+ return FilterDataStatus::Continue;
319
+ }
324
320
DeferAfterCallActions actions (this );
325
- return convertVmCallResultToFilterDataStatus (
326
- wasm_->on_request_body_ (this , id_, data_length, static_cast <uint32_t >(end_of_stream)).u64_ );
321
+ const auto result =
322
+ wasm_->on_request_body_ (this , id_, data_length, static_cast <uint32_t >(end_of_stream));
323
+ CHECK_FAIL_HTTP (FilterDataStatus::Continue, FilterDataStatus::StopIterationNoBuffer);
324
+ return convertVmCallResultToFilterDataStatus (result);
327
325
}
328
326
329
327
FilterTrailersStatus ContextBase::onRequestTrailers (uint32_t trailers) {
330
- CHECK_HTTP (on_request_trailers_, FilterTrailersStatus::Continue,
331
- FilterTrailersStatus::StopIteration);
328
+ CHECK_FAIL_HTTP (FilterTrailersStatus::Continue, FilterTrailersStatus::StopIteration);
329
+ if (!wasm_->on_request_trailers_ ) {
330
+ return FilterTrailersStatus::Continue;
331
+ }
332
332
DeferAfterCallActions actions (this );
333
- return convertVmCallResultToFilterTrailersStatus (
334
- wasm_->on_request_trailers_ (this , id_, trailers).u64_ );
333
+ const auto result = wasm_->on_request_trailers_ (this , id_, trailers);
334
+ CHECK_FAIL_HTTP (FilterTrailersStatus::Continue, FilterTrailersStatus::StopIteration);
335
+ return convertVmCallResultToFilterTrailersStatus (result);
335
336
}
336
337
337
338
FilterMetadataStatus ContextBase::onRequestMetadata (uint32_t elements) {
338
- CHECK_HTTP (on_request_metadata_, FilterMetadataStatus::Continue, FilterMetadataStatus::Continue);
339
+ CHECK_FAIL_HTTP (FilterMetadataStatus::Continue, FilterMetadataStatus::Continue);
340
+ if (!wasm_->on_request_metadata_ ) {
341
+ return FilterMetadataStatus::Continue;
342
+ }
339
343
DeferAfterCallActions actions (this );
340
- return convertVmCallResultToFilterMetadataStatus (
341
- wasm_->on_request_metadata_ (this , id_, elements).u64_ );
344
+ const auto result = wasm_->on_request_metadata_ (this , id_, elements);
345
+ CHECK_FAIL_HTTP (FilterMetadataStatus::Continue, FilterMetadataStatus::Continue);
346
+ return convertVmCallResultToFilterMetadataStatus (result);
342
347
}
343
348
344
349
FilterHeadersStatus ContextBase::onResponseHeaders (uint32_t headers, bool end_of_stream) {
345
- CHECK_HTTP2 (on_response_headers_abi_01_, on_response_headers_abi_02_,
346
- FilterHeadersStatus::Continue, FilterHeadersStatus::StopAllIterationAndWatermark);
350
+ CHECK_FAIL_HTTP (FilterHeadersStatus::Continue, FilterHeadersStatus::StopAllIterationAndWatermark);
351
+ if (!wasm_->on_response_headers_abi_01_ && !wasm_->on_response_headers_abi_02_ ) {
352
+ return FilterHeadersStatus::Continue;
353
+ }
347
354
DeferAfterCallActions actions (this );
348
- return convertVmCallResultToFilterHeadersStatus (
349
- wasm_->on_response_headers_abi_01_
350
- ? wasm_->on_response_headers_abi_01_ (this , id_, headers).u64_
351
- : wasm_
352
- ->on_response_headers_abi_02_ (this , id_, headers,
353
- static_cast <uint32_t >(end_of_stream))
354
- .u64_ );
355
+ const auto result = wasm_->on_response_headers_abi_01_
356
+ ? wasm_->on_response_headers_abi_01_ (this , id_, headers)
357
+ : wasm_->on_response_headers_abi_02_ (
358
+ this , id_, headers, static_cast <uint32_t >(end_of_stream));
359
+ CHECK_FAIL_HTTP (FilterHeadersStatus::Continue, FilterHeadersStatus::StopAllIterationAndWatermark);
360
+ return convertVmCallResultToFilterHeadersStatus (result);
355
361
}
356
362
357
363
FilterDataStatus ContextBase::onResponseBody (uint32_t body_length, bool end_of_stream) {
358
- CHECK_HTTP (on_response_body_, FilterDataStatus::Continue,
359
- FilterDataStatus::StopIterationNoBuffer);
364
+ CHECK_FAIL_HTTP (FilterDataStatus::Continue, FilterDataStatus::StopIterationNoBuffer);
365
+ if (!wasm_->on_response_body_ ) {
366
+ return FilterDataStatus::Continue;
367
+ }
360
368
DeferAfterCallActions actions (this );
361
- return convertVmCallResultToFilterDataStatus (
362
- wasm_->on_response_body_ (this , id_, body_length, static_cast <uint32_t >(end_of_stream)).u64_ );
369
+ const auto result =
370
+ wasm_->on_response_body_ (this , id_, body_length, static_cast <uint32_t >(end_of_stream));
371
+ CHECK_FAIL_HTTP (FilterDataStatus::Continue, FilterDataStatus::StopIterationNoBuffer);
372
+ return convertVmCallResultToFilterDataStatus (result);
363
373
}
364
374
365
375
FilterTrailersStatus ContextBase::onResponseTrailers (uint32_t trailers) {
366
- CHECK_HTTP (on_response_trailers_, FilterTrailersStatus::Continue,
367
- FilterTrailersStatus::StopIteration);
376
+ CHECK_FAIL_HTTP (FilterTrailersStatus::Continue, FilterTrailersStatus::StopIteration);
377
+ if (!wasm_->on_response_trailers_ ) {
378
+ return FilterTrailersStatus::Continue;
379
+ }
368
380
DeferAfterCallActions actions (this );
369
- return convertVmCallResultToFilterTrailersStatus (
370
- wasm_->on_response_trailers_ (this , id_, trailers).u64_ );
381
+ const auto result = wasm_->on_response_trailers_ (this , id_, trailers);
382
+ CHECK_FAIL_HTTP (FilterTrailersStatus::Continue, FilterTrailersStatus::StopIteration);
383
+ return convertVmCallResultToFilterTrailersStatus (result);
371
384
}
372
385
373
386
FilterMetadataStatus ContextBase::onResponseMetadata (uint32_t elements) {
374
- CHECK_HTTP (on_response_metadata_, FilterMetadataStatus::Continue, FilterMetadataStatus::Continue);
387
+ CHECK_FAIL_HTTP (FilterMetadataStatus::Continue, FilterMetadataStatus::Continue);
388
+ if (!wasm_->on_response_metadata_ ) {
389
+ return FilterMetadataStatus::Continue;
390
+ }
375
391
DeferAfterCallActions actions (this );
376
- return convertVmCallResultToFilterMetadataStatus (
377
- wasm_->on_response_metadata_ (this , id_, elements).u64_ );
392
+ const auto result = wasm_->on_response_metadata_ (this , id_, elements);
393
+ CHECK_FAIL_HTTP (FilterMetadataStatus::Continue, FilterMetadataStatus::Continue);
394
+ return convertVmCallResultToFilterMetadataStatus (result);
378
395
}
379
396
380
397
void ContextBase::onHttpCallResponse (uint32_t token, uint32_t headers, uint32_t body_size,
0 commit comments