Skip to content

Commit fe7c91c

Browse files
authored
Remove onCreateInitialMetadata and move to supplying initial metadata as (proxy-wasm#6)
part of the call to create the gRPC stream. Signed-off-by: John Plevyak <jplevyak@gmail.com>
1 parent 361eb06 commit fe7c91c

File tree

4 files changed

+31
-55
lines changed

4 files changed

+31
-55
lines changed

docs/wasm_filter.md

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -975,7 +975,7 @@ class CallHandler : public GrpcCallHandler<google::protobuf::Empty> {
975975
/* override onSuccess code */
976976
}
977977
/*
978-
more callbacks such as onFailure, onCreateInitialMetadata
978+
more callbacks such as onFailure
979979
*/
980980
};
981981
```
@@ -1011,15 +1011,6 @@ Called when the async gRPC request fails. No further callbacks will be
10111011
invoked. *status* is returned grpc status. *error\_message* is the gRPC
10121012
status message or empty string if not present.
10131013

1014-
#### onCreateInitialMetadata
1015-
1016-
``` {.sourceCode .cpp}
1017-
void onCreateInitialMetadata()
1018-
```
1019-
1020-
Called when populating the headers to send with initial metadata. TODO:
1021-
how to add metadata?
1022-
10231014
#### cancel
10241015

10251016
``` {.sourceCode .cpp}
@@ -1043,7 +1034,7 @@ class StreamHandler : public GrpcStreamHandler<google::protobuf::Struct, google:
10431034
/* override onReceive code */
10441035
}
10451036
/*
1046-
more callbacks such as onCreateInitialMetadat, onReceiveTrailingMetadata, onReceive, onRemoteClose
1037+
more callbacks such as onReceiveTrailingMetadata, onReceive, onRemoteClose
10471038
*/
10481039
};
10491040
```
@@ -1090,15 +1081,6 @@ Close the stream locally and remotely (as needed). No further methods
10901081
may be invoked on the handler object and no further callbacks will be
10911082
invoked.
10921083

1093-
#### onCreateInitialMetadata
1094-
1095-
``` {.sourceCode .cpp}
1096-
void onCreateInitialMetadata()
1097-
```
1098-
1099-
Called when populating the headers to send with initial metadata. TODO:
1100-
how to add initial metadata?
1101-
11021084
#### onReceiveInitialMetadata
11031085

11041086
``` {.sourceCode .cpp}

proxy_wasm_api.h

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,6 @@ class GrpcCallHandlerBase {
196196

197197
void cancel();
198198

199-
virtual void onCreateInitialMetadata(uint32_t /* headers */) {}
200199
virtual void onSuccess(size_t body_size) = 0;
201200
virtual void onFailure(GrpcStatus status) = 0;
202201

@@ -229,7 +228,6 @@ class GrpcStreamHandlerBase {
229228
// callbacks.
230229
void reset();
231230

232-
virtual void onCreateInitialMetadata(uint32_t /* headers */) {}
233231
virtual void onReceiveInitialMetadata(uint32_t /* headers */) {}
234232
virtual void onReceiveTrailingMetadata(uint32_t /* trailers */) {}
235233
virtual void onReceive(size_t body_size) = 0;
@@ -324,7 +322,6 @@ class RootContext : public ContextBase {
324322
// Low level HTTP/gRPC interface.
325323
virtual void onHttpCallResponse(uint32_t token, uint32_t headers, size_t body_size,
326324
uint32_t trailers);
327-
virtual void onGrpcCreateInitialMetadata(uint32_t token, uint32_t headers);
328325
virtual void onGrpcReceiveInitialMetadata(uint32_t token, uint32_t headers);
329326
virtual void onGrpcReceiveTrailingMetadata(uint32_t token, uint32_t trailers);
330327
virtual void onGrpcReceive(uint32_t token, size_t body_size);
@@ -338,9 +335,11 @@ class RootContext : public ContextBase {
338335
// NB: the message is the response if status == OK and an error message
339336
// otherwise. Returns false on setup error.
340337
WasmResult grpcSimpleCall(StringView service, StringView service_name, StringView method_name,
338+
const HeaderStringPairs &initial_metadata,
341339
const google::protobuf::MessageLite &request,
342340
uint32_t timeout_milliseconds, GrpcSimpleCallCallback callback);
343341
WasmResult grpcSimpleCall(StringView service, StringView service_name, StringView method_name,
342+
const HeaderStringPairs &initial_metadata,
344343
const google::protobuf::MessageLite &request,
345344
uint32_t timeout_milliseconds,
346345
std::function<void(size_t body_size)> success_callback,
@@ -352,16 +351,18 @@ class RootContext : public ContextBase {
352351
failure_callback(status);
353352
}
354353
};
355-
return grpcSimpleCall(service, service_name, method_name, request, timeout_milliseconds,
356-
callback);
354+
return grpcSimpleCall(service, service_name, method_name, initial_metadata, request,
355+
timeout_milliseconds, callback);
357356
}
358357
// Returns false on setup error.
359358
WasmResult grpcCallHandler(StringView service, StringView service_name, StringView method_name,
359+
const HeaderStringPairs &initial_metadata,
360360
const google::protobuf::MessageLite &request,
361361
uint32_t timeout_milliseconds,
362362
std::unique_ptr<GrpcCallHandlerBase> handler);
363363
// Returns false on setup error.
364364
WasmResult grpcStreamHandler(StringView service, StringView service_name, StringView method_name,
365+
const HeaderStringPairs &initial_metadata,
365366
std::unique_ptr<GrpcStreamHandlerBase> handler);
366367

367368
private:
@@ -1174,19 +1175,28 @@ inline Histogram<Tags...> *Histogram<Tags...>::New(StringView name,
11741175
}
11751176

11761177
inline WasmResult grpcCall(StringView service, StringView service_name, StringView method_name,
1178+
const HeaderStringPairs &initial_metadata,
11771179
const google::protobuf::MessageLite &request,
11781180
uint32_t timeout_milliseconds, uint32_t *token_ptr) {
1181+
void *metadata_ptr = nullptr;
1182+
size_t metadata_size = 0;
1183+
MakeHeaderStringPairsBuffer(initial_metadata, &metadata_ptr, &metadata_size);
11791184
std::string serialized_request;
11801185
request.SerializeToString(&serialized_request);
11811186
return proxy_grpc_call(service.data(), service.size(), service_name.data(), service_name.size(),
1182-
method_name.data(), method_name.size(), serialized_request.data(),
1183-
serialized_request.size(), timeout_milliseconds, token_ptr);
1187+
method_name.data(), method_name.size(), metadata_ptr, metadata_size,
1188+
serialized_request.data(), serialized_request.size(), timeout_milliseconds,
1189+
token_ptr);
11841190
}
11851191

11861192
inline WasmResult grpcStream(StringView service, StringView service_name, StringView method_name,
1187-
uint32_t *token_ptr) {
1193+
const HeaderStringPairs &initial_metadata, uint32_t *token_ptr) {
1194+
void *metadata_ptr = nullptr;
1195+
size_t metadata_size = 0;
1196+
MakeHeaderStringPairsBuffer(initial_metadata, &metadata_ptr, &metadata_size);
11881197
return proxy_grpc_stream(service.data(), service.size(), service_name.data(), service_name.size(),
1189-
method_name.data(), method_name.size(), token_ptr);
1198+
method_name.data(), method_name.size(), metadata_ptr, metadata_size,
1199+
token_ptr);
11901200
}
11911201

11921202
inline WasmResult grpcCancel(uint32_t token) { return proxy_grpc_cancel(token); }
@@ -1221,12 +1231,13 @@ inline void RootContext::onHttpCallResponse(uint32_t token, uint32_t headers, si
12211231

12221232
inline WasmResult RootContext::grpcSimpleCall(StringView service, StringView service_name,
12231233
StringView method_name,
1234+
const HeaderStringPairs &initial_metadata,
12241235
const google::protobuf::MessageLite &request,
12251236
uint32_t timeout_milliseconds,
12261237
Context::GrpcSimpleCallCallback callback) {
12271238
uint32_t token = 0;
1228-
WasmResult result =
1229-
grpcCall(service, service_name, method_name, request, timeout_milliseconds, &token);
1239+
WasmResult result = grpcCall(service, service_name, method_name, initial_metadata, request,
1240+
timeout_milliseconds, &token);
12301241
if (result == WasmResult::Ok) {
12311242
asRoot()->simple_grpc_calls_[token] = std::move(callback);
12321243
}
@@ -1263,23 +1274,6 @@ inline void GrpcStreamHandlerBase::send(StringView message, bool end_of_stream)
12631274
}
12641275
}
12651276

1266-
inline void RootContext::onGrpcCreateInitialMetadata(uint32_t token, uint32_t headers) {
1267-
{
1268-
auto it = grpc_calls_.find(token);
1269-
if (it != grpc_calls_.end()) {
1270-
it->second->onCreateInitialMetadata(headers);
1271-
return;
1272-
}
1273-
}
1274-
{
1275-
auto it = grpc_streams_.find(token);
1276-
if (it != grpc_streams_.end()) {
1277-
it->second->onCreateInitialMetadata(headers);
1278-
return;
1279-
}
1280-
}
1281-
}
1282-
12831277
inline void RootContext::onGrpcReceiveInitialMetadata(uint32_t token, uint32_t headers) {
12841278
{
12851279
auto it = grpc_streams_.find(token);
@@ -1370,11 +1364,13 @@ inline void RootContext::onGrpcClose(uint32_t token, GrpcStatus status) {
13701364

13711365
inline WasmResult RootContext::grpcCallHandler(StringView service, StringView service_name,
13721366
StringView method_name,
1367+
const HeaderStringPairs &initial_metadata,
13731368
const google::protobuf::MessageLite &request,
13741369
uint32_t timeout_milliseconds,
13751370
std::unique_ptr<GrpcCallHandlerBase> handler) {
13761371
uint32_t token = 0;
1377-
auto result = grpcCall(service, service_name, method_name, request, timeout_milliseconds, &token);
1372+
auto result = grpcCall(service, service_name, method_name, initial_metadata, request,
1373+
timeout_milliseconds, &token);
13781374
if (result == WasmResult::Ok) {
13791375
handler->token_ = token;
13801376
handler->context_ = this;
@@ -1385,9 +1381,10 @@ inline WasmResult RootContext::grpcCallHandler(StringView service, StringView se
13851381

13861382
inline WasmResult RootContext::grpcStreamHandler(StringView service, StringView service_name,
13871383
StringView method_name,
1384+
const HeaderStringPairs &initial_metadata,
13881385
std::unique_ptr<GrpcStreamHandlerBase> handler) {
13891386
uint32_t token = 0;
1390-
auto result = grpcStream(service, service_name, method_name, &token);
1387+
auto result = grpcStream(service, service_name, method_name, initial_metadata, &token);
13911388
if (result == WasmResult::Ok) {
13921389
handler->token_ = token;
13931390
handler->context_ = this;

proxy_wasm_externs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,13 @@ extern "C" WasmResult proxy_http_call(const char *uri_ptr, size_t uri_size, void
123123
extern "C" WasmResult proxy_grpc_call(const char *service_ptr, size_t service_size,
124124
const char *service_name_ptr, size_t service_name_size,
125125
const char *method_name_ptr, size_t method_name_size,
126+
size_t initial_metadata_pairs_size, const char *request_ptr,
126127
const char *request_ptr, size_t request_size,
127128
uint32_t timeout_milliseconds, uint32_t *token_ptr);
128129
extern "C" WasmResult proxy_grpc_stream(const char *service_ptr, size_t service_size,
129130
const char *service_name_ptr, size_t service_name_size,
130131
const char *method_name_ptr, size_t method_name_size,
132+
size_t initial_metadata_pairs_size, const char *request_ptr,
131133
uint32_t *token_ptr);
132134
extern "C" WasmResult proxy_grpc_cancel(uint32_t token);
133135
extern "C" WasmResult proxy_grpc_close(uint32_t token);

proxy_wasm_intrinsics.cc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,11 +243,6 @@ extern "C" PROXY_WASM_KEEPALIVE void proxy_on_http_call_response(uint32_t contex
243243
->onHttpCallResponse(token, headers, static_cast<size_t>(body_size), trailers);
244244
}
245245

246-
extern "C" PROXY_WASM_KEEPALIVE void
247-
proxy_on_grpc_create_initial_metadata(uint32_t context_id, uint32_t token, uint32_t headers) {
248-
getRootContext(context_id)->onGrpcCreateInitialMetadata(token, headers);
249-
}
250-
251246
extern "C" PROXY_WASM_KEEPALIVE void
252247
proxy_on_grpc_receive_initial_metadata(uint32_t context_id, uint32_t token, uint32_t headers) {
253248
getRootContext(context_id)->onGrpcReceiveInitialMetadata(token, headers);

0 commit comments

Comments
 (0)