@@ -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
367368private:
@@ -1174,19 +1175,28 @@ inline Histogram<Tags...> *Histogram<Tags...>::New(StringView name,
11741175}
11751176
11761177inline 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
11861192inline 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
11921202inline 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
12221232inline 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-
12831277inline 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
13711365inline 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
13861382inline 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 ;
0 commit comments