Remove grpc_mdelem (#28267)

* Automated change: Fix sanity tests

* content-type

* Automated change: Fix sanity tests

* clang-format

* fix

* Move colon prefixed metadata

* Automated change: Fix sanity tests

* Automated change: Fix sanity tests

* try to fix windows failure

* try and scale sizes better

* ambiguity fix?

* wip metadatavalueasslice

* Fix status code for resource exhaustion

* Revert "Revert "Move a bunch of slice typed metadata to new system (#28107)" (#28208)"

This reverts commit 7717587063.

* fix test

* Automated change: Fix sanity tests

* Automated change: Fix sanity tests

* slice helper

* x

* noinline

* try and scale sizes better

* Automated change: Fix sanity tests

* fixes

* fix

* fix

* fixes

* fix build

* fix overflow

* progress

* Automated change: Fix sanity tests

* fix

* initial work

* progress

* fix

* fix

* Automated change: Fix sanity tests

* progress

* fix

* fix

* fix

* Automated change: Fix sanity tests

* fix

* compressor for path/authority

* Automated change: Fix sanity tests

* Automated change: Fix sanity tests

* legalize

* legalize

* status-enc

* fmt

* fix

* fix

* fix

* fix

* fix/opt

* fix

* fix

* fix

* fix

* Automated change: Fix sanity tests

* fix

* comment

* fmt

* remove arg

* Automated change: Fix sanity tests

* remove name

* Automated change: Fix sanity tests

* sketch

* Automated change: Fix sanity tests

* progress

* add specialized encoders for compression metadata

* progress

* review feedback

* fix

* missoing files

* remove crud

* xxxxx

* more

* Small improvement in memory usage and performance

* Automated change: Fix sanity tests

* Automated change: Fix sanity tests

* Fix caching

* Automated change: Fix sanity tests

* omg

* fix crash in alts

* default everything

* Automated change: Fix sanity tests

* review feedback

* fixes

* fixes

* fixes

* Automated change: Fix sanity tests

* speedup

* fix

* fix

* clang-format

* fixes

* progress

* fixes

* fixes

* Automated change: Fix sanity tests

* fix

* fix

* progress

* update timeout encoding algorithm

* Automated change: Fix sanity tests

* fix

* fix

* review feedback

* progress

* progress

* progress

* progress

* builds

* Automated change: Fix sanity tests

* remove debug code

* fix ub

* unname things

* coax compilers

* reduce failures

* fix

* fix

* fix

* fix

* cleanup

* compile fix

* preserve concatenation rule

* spew

* fix

* fix

* postfix operator++ for msvc

* fix

* fix

* remove unused code

* lower cost of hpack table construction

* fix refcounting

* review feedback

* fixes

* fixes

* support multivalued traits

* Automated change: Fix sanity tests

* fix

* clearer clear

* appeasing 4.9

Co-authored-by: ctiller <ctiller@users.noreply.github.com>
pull/28496/head
Craig Tiller 3 years ago committed by GitHub
parent 75ede8df91
commit 4b881c5947
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 37
      BUILD
  2. 156
      CMakeLists.txt
  3. 12
      Makefile
  4. 79
      build_autogenerated.yaml
  5. 6
      config.m4
  6. 6
      config.w32
  7. 12
      gRPC-C++.podspec
  8. 18
      gRPC-Core.podspec
  9. 12
      grpc.gemspec
  10. 11
      grpc.gyp
  11. 12
      package.xml
  12. 45
      src/core/ext/filters/client_channel/client_channel.cc
  13. 2
      src/core/ext/filters/client_channel/client_channel.h
  14. 4
      src/core/ext/filters/client_channel/health/health_check_client.cc
  15. 10
      src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc
  16. 10
      src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc
  17. 7
      src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h
  18. 1
      src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc
  19. 1
      src/core/ext/filters/client_channel/lb_policy/rls/rls.cc
  20. 1
      src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
  21. 14
      src/core/ext/filters/client_channel/retry_filter.cc
  22. 16
      src/core/ext/filters/client_channel/subchannel.cc
  23. 3
      src/core/ext/filters/client_channel/subchannel.h
  24. 83
      src/core/ext/filters/fault_injection/fault_injection_filter.cc
  25. 1
      src/core/ext/filters/http/client/http_client_filter.cc
  26. 1
      src/core/ext/filters/http/client_authority_filter.cc
  27. 1
      src/core/ext/filters/http/message_compress/message_compress_filter.cc
  28. 1
      src/core/ext/filters/http/server/http_server_filter.cc
  29. 75
      src/core/ext/filters/load_reporting/server_load_reporting_filter.cc
  30. 9
      src/core/ext/filters/load_reporting/server_load_reporting_filter.h
  31. 12
      src/core/ext/transport/binder/transport/binder_transport.cc
  32. 1
      src/core/ext/transport/chttp2/transport/chttp2_plugin.cc
  33. 12
      src/core/ext/transport/chttp2/transport/chttp2_transport.cc
  34. 454
      src/core/ext/transport/chttp2/transport/hpack_encoder.cc
  35. 148
      src/core/ext/transport/chttp2/transport/hpack_encoder.h
  36. 107
      src/core/ext/transport/chttp2/transport/hpack_encoder_index.h
  37. 6
      src/core/ext/transport/chttp2/transport/hpack_parser.cc
  38. 1
      src/core/ext/transport/chttp2/transport/hpack_parser.h
  39. 95
      src/core/ext/transport/chttp2/transport/hpack_parser_table.cc
  40. 32
      src/core/ext/transport/chttp2/transport/hpack_parser_table.h
  41. 46
      src/core/ext/transport/chttp2/transport/hpack_utils.cc
  42. 30
      src/core/ext/transport/chttp2/transport/hpack_utils.h
  43. 6
      src/core/ext/transport/chttp2/transport/parsing.cc
  44. 60
      src/core/ext/transport/chttp2/transport/popularity_count.h
  45. 24
      src/core/ext/transport/chttp2/transport/writing.cc
  46. 20
      src/core/ext/transport/cronet/transport/cronet_transport.cc
  47. 4
      src/core/ext/transport/inproc/inproc_plugin.cc
  48. 74
      src/core/ext/transport/inproc/inproc_transport.cc
  49. 3
      src/core/ext/transport/inproc/inproc_transport.h
  50. 21
      src/core/ext/xds/xds_client.cc
  51. 3
      src/core/ext/xds/xds_routing.cc
  52. 1
      src/core/lib/compression/compression.cc
  53. 1
      src/core/lib/compression/compression_internal.cc
  54. 4
      src/core/lib/gpr/useful.h
  55. 46
      src/core/lib/gprpp/chunked_vector.h
  56. 11
      src/core/lib/gprpp/table.h
  57. 23
      src/core/lib/security/authorization/evaluate_args.cc
  58. 10
      src/core/lib/security/credentials/composite/composite_credentials.cc
  59. 7
      src/core/lib/security/credentials/composite/composite_credentials.h
  60. 30
      src/core/lib/security/credentials/credentials.h
  61. 61
      src/core/lib/security/credentials/credentials_metadata.cc
  62. 9
      src/core/lib/security/credentials/fake/fake_credentials.cc
  63. 15
      src/core/lib/security/credentials/fake/fake_credentials.h
  64. 35
      src/core/lib/security/credentials/iam/iam_credentials.cc
  65. 11
      src/core/lib/security/credentials/iam/iam_credentials.h
  66. 44
      src/core/lib/security/credentials/jwt/jwt_credentials.cc
  67. 16
      src/core/lib/security/credentials/jwt/jwt_credentials.h
  68. 77
      src/core/lib/security/credentials/oauth2/oauth2_credentials.cc
  69. 25
      src/core/lib/security/credentials/oauth2/oauth2_credentials.h
  70. 13
      src/core/lib/security/credentials/plugin/plugin_credentials.cc
  71. 9
      src/core/lib/security/credentials/plugin/plugin_credentials.h
  72. 29
      src/core/lib/security/transport/client_auth_filter.cc
  73. 54
      src/core/lib/security/transport/server_auth_filter.cc
  74. 44
      src/core/lib/slice/slice.h
  75. 104
      src/core/lib/slice/slice_intern.cc
  76. 3
      src/core/lib/slice/slice_internal.h
  77. 17
      src/core/lib/slice/slice_refcount.h
  78. 16
      src/core/lib/slice/slice_refcount_base.h
  79. 306
      src/core/lib/slice/static_slice.cc
  80. 246
      src/core/lib/slice/static_slice.h
  81. 16
      src/core/lib/surface/call.cc
  82. 1
      src/core/lib/surface/channel.cc
  83. 1
      src/core/lib/surface/channel.h
  84. 2
      src/core/lib/surface/init.cc
  85. 1
      src/core/lib/surface/lame_client.cc
  86. 11
      src/core/lib/surface/server.cc
  87. 714
      src/core/lib/transport/metadata.cc
  88. 449
      src/core/lib/transport/metadata.h
  89. 99
      src/core/lib/transport/metadata_batch.cc
  90. 848
      src/core/lib/transport/metadata_batch.h
  91. 118
      src/core/lib/transport/parsed_metadata.h
  92. 778
      src/core/lib/transport/static_metadata.cc
  93. 200
      src/core/lib/transport/static_metadata.h
  94. 45
      src/core/lib/transport/transport_op_string.cc
  95. 3
      src/core/plugin_registry/grpc_plugin_registry.cc
  96. 3
      src/core/plugin_registry/grpc_unsecure_plugin_registry.cc
  97. 15
      src/cpp/common/channel_filter.cc
  98. 6
      src/cpp/common/channel_filter.h
  99. 3
      src/cpp/ext/filters/census/server_filter.h
  100. 6
      src/python/grpcio/grpc_core_dependencies.py
  101. Some files were not shown because too many files have changed in this diff Show More

37
BUILD

@ -1566,13 +1566,11 @@ grpc_cc_library(
name = "slice_refcount",
srcs = [
"src/core/lib/slice/slice_refcount.cc",
"src/core/lib/slice/static_slice.cc",
],
hdrs = [
"src/core/lib/slice/slice_refcount.h",
"src/core/lib/slice/slice_refcount_base.h",
"src/core/lib/slice/slice_utils.h",
"src/core/lib/slice/static_slice.h",
],
public_hdrs = [
"include/grpc/slice.h",
@ -1909,11 +1907,8 @@ grpc_cc_library(
"src/core/lib/transport/byte_stream.cc",
"src/core/lib/transport/connectivity_state.cc",
"src/core/lib/transport/error_utils.cc",
"src/core/lib/transport/metadata.cc",
"src/core/lib/transport/metadata_batch.cc",
"src/core/lib/transport/parsed_metadata.cc",
"src/core/lib/transport/pid_controller.cc",
"src/core/lib/transport/static_metadata.cc",
"src/core/lib/transport/status_conversion.cc",
"src/core/lib/transport/timeout_encoding.cc",
"src/core/lib/transport/transport.cc",
@ -2038,11 +2033,9 @@ grpc_cc_library(
"src/core/lib/transport/bdp_estimator.h",
"src/core/lib/transport/byte_stream.h",
"src/core/lib/transport/connectivity_state.h",
"src/core/lib/transport/metadata.h",
"src/core/lib/transport/metadata_batch.h",
"src/core/lib/transport/parsed_metadata.h",
"src/core/lib/transport/pid_controller.h",
"src/core/lib/transport/static_metadata.h",
"src/core/lib/transport/status_conversion.h",
"src/core/lib/transport/timeout_encoding.h",
"src/core/lib/transport/transport.h",
@ -3483,7 +3476,6 @@ grpc_cc_library(
"src/core/lib/security/credentials/alts/alts_credentials.cc",
"src/core/lib/security/credentials/composite/composite_credentials.cc",
"src/core/lib/security/credentials/credentials.cc",
"src/core/lib/security/credentials/credentials_metadata.cc",
"src/core/lib/security/credentials/external/aws_external_account_credentials.cc",
"src/core/lib/security/credentials/external/aws_request_signer.cc",
"src/core/lib/security/credentials/external/external_account_credentials.cc",
@ -3747,17 +3739,6 @@ grpc_cc_library(
],
)
grpc_cc_library(
name = "popularity_count",
hdrs = [
"src/core/ext/transport/chttp2/transport/popularity_count.h",
],
language = "c++",
deps = [
"gpr_platform",
],
)
grpc_cc_library(
name = "hpack_constants",
hdrs = [
@ -3769,20 +3750,6 @@ grpc_cc_library(
],
)
grpc_cc_library(
name = "hpack_encoder_index",
hdrs = [
"src/core/ext/transport/chttp2/transport/hpack_encoder_index.h",
],
external_deps = [
"absl/types:optional",
],
language = "c++",
deps = [
"gpr_platform",
],
)
grpc_cc_library(
name = "hpack_encoder_table",
srcs = [
@ -3819,7 +3786,6 @@ grpc_cc_library(
"src/core/ext/transport/chttp2/transport/hpack_encoder.cc",
"src/core/ext/transport/chttp2/transport/hpack_parser.cc",
"src/core/ext/transport/chttp2/transport/hpack_parser_table.cc",
"src/core/ext/transport/chttp2/transport/hpack_utils.cc",
"src/core/ext/transport/chttp2/transport/http2_settings.cc",
"src/core/ext/transport/chttp2/transport/huffsyms.cc",
"src/core/ext/transport/chttp2/transport/parsing.cc",
@ -3844,7 +3810,6 @@ grpc_cc_library(
"src/core/ext/transport/chttp2/transport/hpack_encoder.h",
"src/core/ext/transport/chttp2/transport/hpack_parser.h",
"src/core/ext/transport/chttp2/transport/hpack_parser_table.h",
"src/core/ext/transport/chttp2/transport/hpack_utils.h",
"src/core/ext/transport/chttp2/transport/http2_settings.h",
"src/core/ext/transport/chttp2/transport/huffsyms.h",
"src/core/ext/transport/chttp2/transport/internal.h",
@ -3867,10 +3832,8 @@ grpc_cc_library(
"grpc_trace",
"grpc_transport_chttp2_alpn",
"hpack_constants",
"hpack_encoder_index",
"hpack_encoder_table",
"memory_quota",
"popularity_count",
"resource_quota_trace",
"slice",
"slice_refcount",

156
CMakeLists.txt generated

@ -704,7 +704,6 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_c memory_quota_stress_test)
endif()
add_dependencies(buildtests_c message_compress_test)
add_dependencies(buildtests_c metadata_test)
add_dependencies(buildtests_c minimal_stack_is_minimal_test)
add_dependencies(buildtests_c mpmcqueue_test)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
@ -890,7 +889,6 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx head_of_line_blocking_bad_client_test)
add_dependencies(buildtests_cxx headers_bad_client_test)
add_dependencies(buildtests_cxx health_service_end2end_test)
add_dependencies(buildtests_cxx hpack_encoder_index_test)
add_dependencies(buildtests_cxx hpack_parser_table_test)
add_dependencies(buildtests_cxx hpack_parser_test)
add_dependencies(buildtests_cxx http2_client)
@ -931,7 +929,6 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx pid_controller_test)
add_dependencies(buildtests_cxx pipe_test)
add_dependencies(buildtests_cxx poll_test)
add_dependencies(buildtests_cxx popularity_count_test)
add_dependencies(buildtests_cxx port_sharing_end2end_test)
add_dependencies(buildtests_cxx promise_factory_test)
add_dependencies(buildtests_cxx promise_map_test)
@ -984,7 +981,6 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx stack_tracer_test)
endif()
add_dependencies(buildtests_cxx stat_test)
add_dependencies(buildtests_cxx static_metadata_test)
add_dependencies(buildtests_cxx stats_test)
add_dependencies(buildtests_cxx status_helper_test)
add_dependencies(buildtests_cxx status_util_test)
@ -1638,7 +1634,6 @@ add_library(grpc
src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc
src/core/ext/transport/chttp2/transport/hpack_parser.cc
src/core/ext/transport/chttp2/transport/hpack_parser_table.cc
src/core/ext/transport/chttp2/transport/hpack_utils.cc
src/core/ext/transport/chttp2/transport/http2_settings.cc
src/core/ext/transport/chttp2/transport/huffsyms.cc
src/core/ext/transport/chttp2/transport/parsing.cc
@ -2034,7 +2029,6 @@ add_library(grpc
src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc
src/core/lib/security/credentials/composite/composite_credentials.cc
src/core/lib/security/credentials/credentials.cc
src/core/lib/security/credentials/credentials_metadata.cc
src/core/lib/security/credentials/external/aws_external_account_credentials.cc
src/core/lib/security/credentials/external/aws_request_signer.cc
src/core/lib/security/credentials/external/external_account_credentials.cc
@ -2087,7 +2081,6 @@ add_library(grpc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_split.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
src/core/lib/surface/api_trace.cc
src/core/lib/surface/builtins.cc
src/core/lib/surface/byte_buffer.cc
@ -2113,11 +2106,8 @@ add_library(grpc
src/core/lib/transport/byte_stream.cc
src/core/lib/transport/connectivity_state.cc
src/core/lib/transport/error_utils.cc
src/core/lib/transport/metadata.cc
src/core/lib/transport/metadata_batch.cc
src/core/lib/transport/parsed_metadata.cc
src/core/lib/transport/pid_controller.cc
src/core/lib/transport/static_metadata.cc
src/core/lib/transport/status_conversion.cc
src/core/lib/transport/timeout_encoding.cc
src/core/lib/transport/transport.cc
@ -2511,7 +2501,6 @@ add_library(grpc_unsecure
src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc
src/core/ext/transport/chttp2/transport/hpack_parser.cc
src/core/ext/transport/chttp2/transport/hpack_parser_table.cc
src/core/ext/transport/chttp2/transport/hpack_utils.cc
src/core/ext/transport/chttp2/transport/http2_settings.cc
src/core/ext/transport/chttp2/transport/huffsyms.cc
src/core/ext/transport/chttp2/transport/parsing.cc
@ -2675,7 +2664,6 @@ add_library(grpc_unsecure
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_split.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
src/core/lib/surface/api_trace.cc
src/core/lib/surface/builtins.cc
src/core/lib/surface/byte_buffer.cc
@ -2701,11 +2689,8 @@ add_library(grpc_unsecure
src/core/lib/transport/byte_stream.cc
src/core/lib/transport/connectivity_state.cc
src/core/lib/transport/error_utils.cc
src/core/lib/transport/metadata.cc
src/core/lib/transport/metadata_batch.cc
src/core/lib/transport/parsed_metadata.cc
src/core/lib/transport/pid_controller.cc
src/core/lib/transport/static_metadata.cc
src/core/lib/transport/status_conversion.cc
src/core/lib/transport/timeout_encoding.cc
src/core/lib/transport/transport.cc
@ -6065,7 +6050,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
test/core/resource_quota/memory_quota_stress_test.cc
)
@ -6119,33 +6103,6 @@ target_link_libraries(message_compress_test
)
endif()
if(gRPC_BUILD_TESTS)
add_executable(metadata_test
test/core/transport/metadata_test.cc
)
target_include_directories(metadata_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
${_gRPC_RE2_INCLUDE_DIR}
${_gRPC_SSL_INCLUDE_DIR}
${_gRPC_UPB_GENERATED_DIR}
${_gRPC_UPB_GRPC_GENERATED_DIR}
${_gRPC_UPB_INCLUDE_DIR}
${_gRPC_XXHASH_INCLUDE_DIR}
${_gRPC_ZLIB_INCLUDE_DIR}
)
target_link_libraries(metadata_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
)
endif()
if(gRPC_BUILD_TESTS)
@ -6795,7 +6752,6 @@ add_executable(slice_string_helpers_test
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
test/core/slice/slice_string_helpers_test.cc
)
@ -7799,7 +7755,6 @@ add_executable(arena_promise_test
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
test/core/promise/arena_promise_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
@ -9013,7 +8968,6 @@ add_executable(chunked_vector_test
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
test/core/gprpp/chunked_vector_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
@ -10420,7 +10374,6 @@ add_executable(exec_ctx_wakeup_scheduler_test
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
test/core/promise/exec_ctx_wakeup_scheduler_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
@ -10735,7 +10688,6 @@ add_executable(for_each_test
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
test/core/promise/for_each_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
@ -11782,41 +11734,6 @@ target_link_libraries(health_service_end2end_test
)
endif()
if(gRPC_BUILD_TESTS)
add_executable(hpack_encoder_index_test
test/core/transport/chttp2/hpack_encoder_index_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
target_include_directories(hpack_encoder_index_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
${_gRPC_RE2_INCLUDE_DIR}
${_gRPC_SSL_INCLUDE_DIR}
${_gRPC_UPB_GENERATED_DIR}
${_gRPC_UPB_GRPC_GENERATED_DIR}
${_gRPC_UPB_INCLUDE_DIR}
${_gRPC_XXHASH_INCLUDE_DIR}
${_gRPC_ZLIB_INCLUDE_DIR}
third_party/googletest/googletest/include
third_party/googletest/googletest
third_party/googletest/googlemock/include
third_party/googletest/googlemock
${_gRPC_PROTO_GENS_DIR}
)
target_link_libraries(hpack_encoder_index_test
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
absl::optional
)
endif()
if(gRPC_BUILD_TESTS)
@ -12775,7 +12692,6 @@ add_executable(memory_quota_test
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
test/core/resource_quota/memory_quota_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
@ -13365,7 +13281,6 @@ add_executable(pipe_test
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
test/core/promise/pipe_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
@ -13434,40 +13349,6 @@ target_link_libraries(poll_test
)
endif()
if(gRPC_BUILD_TESTS)
add_executable(popularity_count_test
test/core/transport/chttp2/popularity_count_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
target_include_directories(popularity_count_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
${_gRPC_RE2_INCLUDE_DIR}
${_gRPC_SSL_INCLUDE_DIR}
${_gRPC_UPB_GENERATED_DIR}
${_gRPC_UPB_GRPC_GENERATED_DIR}
${_gRPC_UPB_INCLUDE_DIR}
${_gRPC_XXHASH_INCLUDE_DIR}
${_gRPC_ZLIB_INCLUDE_DIR}
third_party/googletest/googletest/include
third_party/googletest/googletest
third_party/googletest/googlemock/include
third_party/googletest/googlemock
${_gRPC_PROTO_GENS_DIR}
)
target_link_libraries(popularity_count_test
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
)
endif()
if(gRPC_BUILD_TESTS)
@ -14231,7 +14112,6 @@ add_executable(resource_quota_test
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
test/core/resource_quota/resource_quota_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
@ -15272,41 +15152,6 @@ target_link_libraries(stat_test
)
endif()
if(gRPC_BUILD_TESTS)
add_executable(static_metadata_test
test/core/transport/static_metadata_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
target_include_directories(static_metadata_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
${_gRPC_RE2_INCLUDE_DIR}
${_gRPC_SSL_INCLUDE_DIR}
${_gRPC_UPB_GENERATED_DIR}
${_gRPC_UPB_GRPC_GENERATED_DIR}
${_gRPC_UPB_INCLUDE_DIR}
${_gRPC_XXHASH_INCLUDE_DIR}
${_gRPC_ZLIB_INCLUDE_DIR}
third_party/googletest/googletest/include
third_party/googletest/googletest
third_party/googletest/googlemock/include
third_party/googletest/googlemock
${_gRPC_PROTO_GENS_DIR}
)
target_link_libraries(static_metadata_test
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
)
endif()
if(gRPC_BUILD_TESTS)
@ -15583,7 +15428,6 @@ add_executable(test_core_slice_slice_test
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/slice/static_slice.cc
test/core/slice/slice_test.cc
test/core/util/build.cc
third_party/googletest/googletest/src/gtest-all.cc

12
Makefile generated

@ -1122,7 +1122,6 @@ LIBGRPC_SRC = \
src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc \
src/core/ext/transport/chttp2/transport/hpack_parser.cc \
src/core/ext/transport/chttp2/transport/hpack_parser_table.cc \
src/core/ext/transport/chttp2/transport/hpack_utils.cc \
src/core/ext/transport/chttp2/transport/http2_settings.cc \
src/core/ext/transport/chttp2/transport/huffsyms.cc \
src/core/ext/transport/chttp2/transport/parsing.cc \
@ -1518,7 +1517,6 @@ LIBGRPC_SRC = \
src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc \
src/core/lib/security/credentials/composite/composite_credentials.cc \
src/core/lib/security/credentials/credentials.cc \
src/core/lib/security/credentials/credentials_metadata.cc \
src/core/lib/security/credentials/external/aws_external_account_credentials.cc \
src/core/lib/security/credentials/external/aws_request_signer.cc \
src/core/lib/security/credentials/external/external_account_credentials.cc \
@ -1571,7 +1569,6 @@ LIBGRPC_SRC = \
src/core/lib/slice/slice_refcount.cc \
src/core/lib/slice/slice_split.cc \
src/core/lib/slice/slice_string_helpers.cc \
src/core/lib/slice/static_slice.cc \
src/core/lib/surface/api_trace.cc \
src/core/lib/surface/builtins.cc \
src/core/lib/surface/byte_buffer.cc \
@ -1597,11 +1594,8 @@ LIBGRPC_SRC = \
src/core/lib/transport/byte_stream.cc \
src/core/lib/transport/connectivity_state.cc \
src/core/lib/transport/error_utils.cc \
src/core/lib/transport/metadata.cc \
src/core/lib/transport/metadata_batch.cc \
src/core/lib/transport/parsed_metadata.cc \
src/core/lib/transport/pid_controller.cc \
src/core/lib/transport/static_metadata.cc \
src/core/lib/transport/status_conversion.cc \
src/core/lib/transport/timeout_encoding.cc \
src/core/lib/transport/transport.cc \
@ -1843,7 +1837,6 @@ LIBGRPC_UNSECURE_SRC = \
src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc \
src/core/ext/transport/chttp2/transport/hpack_parser.cc \
src/core/ext/transport/chttp2/transport/hpack_parser_table.cc \
src/core/ext/transport/chttp2/transport/hpack_utils.cc \
src/core/ext/transport/chttp2/transport/http2_settings.cc \
src/core/ext/transport/chttp2/transport/huffsyms.cc \
src/core/ext/transport/chttp2/transport/parsing.cc \
@ -2007,7 +2000,6 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/slice/slice_refcount.cc \
src/core/lib/slice/slice_split.cc \
src/core/lib/slice/slice_string_helpers.cc \
src/core/lib/slice/static_slice.cc \
src/core/lib/surface/api_trace.cc \
src/core/lib/surface/builtins.cc \
src/core/lib/surface/byte_buffer.cc \
@ -2033,11 +2025,8 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/transport/byte_stream.cc \
src/core/lib/transport/connectivity_state.cc \
src/core/lib/transport/error_utils.cc \
src/core/lib/transport/metadata.cc \
src/core/lib/transport/metadata_batch.cc \
src/core/lib/transport/parsed_metadata.cc \
src/core/lib/transport/pid_controller.cc \
src/core/lib/transport/static_metadata.cc \
src/core/lib/transport/status_conversion.cc \
src/core/lib/transport/timeout_encoding.cc \
src/core/lib/transport/transport.cc \
@ -3004,7 +2993,6 @@ src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc: $(OPENS
src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc: $(OPENSSL_DEP)
src/core/lib/security/credentials/composite/composite_credentials.cc: $(OPENSSL_DEP)
src/core/lib/security/credentials/credentials.cc: $(OPENSSL_DEP)
src/core/lib/security/credentials/credentials_metadata.cc: $(OPENSSL_DEP)
src/core/lib/security/credentials/external/aws_external_account_credentials.cc: $(OPENSSL_DEP)
src/core/lib/security/credentials/external/aws_request_signer.cc: $(OPENSSL_DEP)
src/core/lib/security/credentials/external/external_account_credentials.cc: $(OPENSSL_DEP)

@ -481,15 +481,12 @@ libs:
- src/core/ext/transport/chttp2/transport/frame_window_update.h
- src/core/ext/transport/chttp2/transport/hpack_constants.h
- src/core/ext/transport/chttp2/transport/hpack_encoder.h
- src/core/ext/transport/chttp2/transport/hpack_encoder_index.h
- src/core/ext/transport/chttp2/transport/hpack_encoder_table.h
- src/core/ext/transport/chttp2/transport/hpack_parser.h
- src/core/ext/transport/chttp2/transport/hpack_parser_table.h
- src/core/ext/transport/chttp2/transport/hpack_utils.h
- src/core/ext/transport/chttp2/transport/http2_settings.h
- src/core/ext/transport/chttp2/transport/huffsyms.h
- src/core/ext/transport/chttp2/transport/internal.h
- src/core/ext/transport/chttp2/transport/popularity_count.h
- src/core/ext/transport/chttp2/transport/stream_map.h
- src/core/ext/transport/chttp2/transport/varint.h
- src/core/ext/transport/inproc/inproc_transport.h
@ -935,7 +932,6 @@ libs:
- src/core/lib/slice/slice_split.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
- src/core/lib/surface/api_trace.h
- src/core/lib/surface/builtins.h
- src/core/lib/surface/call.h
@ -955,11 +951,9 @@ libs:
- src/core/lib/transport/connectivity_state.h
- src/core/lib/transport/error_utils.h
- src/core/lib/transport/http2_errors.h
- src/core/lib/transport/metadata.h
- src/core/lib/transport/metadata_batch.h
- src/core/lib/transport/parsed_metadata.h
- src/core/lib/transport/pid_controller.h
- src/core/lib/transport/static_metadata.h
- src/core/lib/transport/status_conversion.h
- src/core/lib/transport/timeout_encoding.h
- src/core/lib/transport/transport.h
@ -1094,7 +1088,6 @@ libs:
- src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc
- src/core/ext/transport/chttp2/transport/hpack_parser.cc
- src/core/ext/transport/chttp2/transport/hpack_parser_table.cc
- src/core/ext/transport/chttp2/transport/hpack_utils.cc
- src/core/ext/transport/chttp2/transport/http2_settings.cc
- src/core/ext/transport/chttp2/transport/huffsyms.cc
- src/core/ext/transport/chttp2/transport/parsing.cc
@ -1490,7 +1483,6 @@ libs:
- src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc
- src/core/lib/security/credentials/composite/composite_credentials.cc
- src/core/lib/security/credentials/credentials.cc
- src/core/lib/security/credentials/credentials_metadata.cc
- src/core/lib/security/credentials/external/aws_external_account_credentials.cc
- src/core/lib/security/credentials/external/aws_request_signer.cc
- src/core/lib/security/credentials/external/external_account_credentials.cc
@ -1543,7 +1535,6 @@ libs:
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_split.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- src/core/lib/surface/api_trace.cc
- src/core/lib/surface/builtins.cc
- src/core/lib/surface/byte_buffer.cc
@ -1569,11 +1560,8 @@ libs:
- src/core/lib/transport/byte_stream.cc
- src/core/lib/transport/connectivity_state.cc
- src/core/lib/transport/error_utils.cc
- src/core/lib/transport/metadata.cc
- src/core/lib/transport/metadata_batch.cc
- src/core/lib/transport/parsed_metadata.cc
- src/core/lib/transport/pid_controller.cc
- src/core/lib/transport/static_metadata.cc
- src/core/lib/transport/status_conversion.cc
- src/core/lib/transport/timeout_encoding.cc
- src/core/lib/transport/transport.cc
@ -1828,15 +1816,12 @@ libs:
- src/core/ext/transport/chttp2/transport/frame_window_update.h
- src/core/ext/transport/chttp2/transport/hpack_constants.h
- src/core/ext/transport/chttp2/transport/hpack_encoder.h
- src/core/ext/transport/chttp2/transport/hpack_encoder_index.h
- src/core/ext/transport/chttp2/transport/hpack_encoder_table.h
- src/core/ext/transport/chttp2/transport/hpack_parser.h
- src/core/ext/transport/chttp2/transport/hpack_parser_table.h
- src/core/ext/transport/chttp2/transport/hpack_utils.h
- src/core/ext/transport/chttp2/transport/http2_settings.h
- src/core/ext/transport/chttp2/transport/huffsyms.h
- src/core/ext/transport/chttp2/transport/internal.h
- src/core/ext/transport/chttp2/transport/popularity_count.h
- src/core/ext/transport/chttp2/transport/stream_map.h
- src/core/ext/transport/chttp2/transport/varint.h
- src/core/ext/transport/inproc/inproc_transport.h
@ -2002,7 +1987,6 @@ libs:
- src/core/lib/slice/slice_split.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
- src/core/lib/surface/api_trace.h
- src/core/lib/surface/builtins.h
- src/core/lib/surface/call.h
@ -2022,11 +2006,9 @@ libs:
- src/core/lib/transport/connectivity_state.h
- src/core/lib/transport/error_utils.h
- src/core/lib/transport/http2_errors.h
- src/core/lib/transport/metadata.h
- src/core/lib/transport/metadata_batch.h
- src/core/lib/transport/parsed_metadata.h
- src/core/lib/transport/pid_controller.h
- src/core/lib/transport/static_metadata.h
- src/core/lib/transport/status_conversion.h
- src/core/lib/transport/timeout_encoding.h
- src/core/lib/transport/transport.h
@ -2121,7 +2103,6 @@ libs:
- src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc
- src/core/ext/transport/chttp2/transport/hpack_parser.cc
- src/core/ext/transport/chttp2/transport/hpack_parser_table.cc
- src/core/ext/transport/chttp2/transport/hpack_utils.cc
- src/core/ext/transport/chttp2/transport/http2_settings.cc
- src/core/ext/transport/chttp2/transport/huffsyms.cc
- src/core/ext/transport/chttp2/transport/parsing.cc
@ -2285,7 +2266,6 @@ libs:
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_split.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- src/core/lib/surface/api_trace.cc
- src/core/lib/surface/builtins.cc
- src/core/lib/surface/byte_buffer.cc
@ -2311,11 +2291,8 @@ libs:
- src/core/lib/transport/byte_stream.cc
- src/core/lib/transport/connectivity_state.cc
- src/core/lib/transport/error_utils.cc
- src/core/lib/transport/metadata.cc
- src/core/lib/transport/metadata_batch.cc
- src/core/lib/transport/parsed_metadata.cc
- src/core/lib/transport/pid_controller.cc
- src/core/lib/transport/static_metadata.cc
- src/core/lib/transport/status_conversion.cc
- src/core/lib/transport/timeout_encoding.cc
- src/core/lib/transport/transport.cc
@ -3788,7 +3765,6 @@ targets:
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
src:
- src/core/lib/debug/trace.cc
- src/core/lib/event_engine/memory_allocator.cc
@ -3803,7 +3779,6 @@ targets:
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- test/core/resource_quota/memory_quota_stress_test.cc
deps:
- absl/status:statusor
@ -3822,14 +3797,6 @@ targets:
deps:
- grpc_test_util
uses_polling: false
- name: metadata_test
build: test
language: c
headers: []
src:
- test/core/transport/metadata_test.cc
deps:
- grpc_test_util
- name: minimal_stack_is_minimal_test
build: test
language: c
@ -4080,13 +4047,11 @@ targets:
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
src:
- src/core/lib/debug/trace.cc
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- test/core/slice/slice_string_helpers_test.cc
deps:
- gpr
@ -4560,7 +4525,6 @@ targets:
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
src:
- src/core/lib/debug/trace.cc
- src/core/lib/event_engine/memory_allocator.cc
@ -4578,7 +4542,6 @@ targets:
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- test/core/promise/arena_promise_test.cc
deps:
- absl/status:statusor
@ -5055,7 +5018,6 @@ targets:
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
src:
- src/core/lib/debug/trace.cc
- src/core/lib/event_engine/memory_allocator.cc
@ -5073,7 +5035,6 @@ targets:
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- test/core/gprpp/chunked_vector_test.cc
deps:
- absl/status:statusor
@ -5690,7 +5651,6 @@ targets:
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
src:
- src/core/lib/debug/trace.cc
- src/core/lib/iomgr/combiner.cc
@ -5702,7 +5662,6 @@ targets:
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- test/core/promise/exec_ctx_wakeup_scheduler_test.cc
deps:
- absl/status:statusor
@ -5902,7 +5861,6 @@ targets:
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
- test/core/promise/test_wakeup_schedulers.h
src:
- src/core/lib/debug/trace.cc
@ -5921,7 +5879,6 @@ targets:
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- test/core/promise/for_each_test.cc
deps:
- absl/container:flat_hash_set
@ -6233,16 +6190,6 @@ targets:
- test/cpp/end2end/test_service_impl.cc
deps:
- grpc++_test_util
- name: hpack_encoder_index_test
gtest: true
build: test
language: c++
headers:
- src/core/ext/transport/chttp2/transport/hpack_encoder_index.h
src:
- test/core/transport/chttp2/hpack_encoder_index_test.cc
deps:
- absl/types:optional
- name: hpack_parser_table_test
gtest: true
build: test
@ -6679,7 +6626,6 @@ targets:
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
- test/core/resource_quota/call_checker.h
src:
- src/core/lib/debug/trace.cc
@ -6695,7 +6641,6 @@ targets:
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- test/core/resource_quota/memory_quota_test.cc
deps:
- absl/status:statusor
@ -6987,7 +6932,6 @@ targets:
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
- test/core/promise/test_wakeup_schedulers.h
src:
- src/core/lib/debug/trace.cc
@ -7006,7 +6950,6 @@ targets:
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- test/core/promise/pipe_test.cc
deps:
- absl/status:statusor
@ -7024,15 +6967,6 @@ targets:
deps:
- absl/types:variant
uses_polling: false
- name: popularity_count_test
gtest: true
build: test
language: c++
headers:
- src/core/ext/transport/chttp2/transport/popularity_count.h
src:
- test/core/transport/chttp2/popularity_count_test.cc
deps: []
- name: port_sharing_end2end_test
gtest: true
build: test
@ -7351,7 +7285,6 @@ targets:
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
src:
- src/core/lib/debug/trace.cc
- src/core/lib/event_engine/memory_allocator.cc
@ -7368,7 +7301,6 @@ targets:
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- test/core/resource_quota/resource_quota_test.cc
deps:
- absl/status:statusor
@ -7688,15 +7620,6 @@ targets:
deps:
- grpc_test_util
uses_polling: false
- name: static_metadata_test
gtest: true
build: test
language: c++
headers: []
src:
- test/core/transport/static_metadata_test.cc
deps:
- grpc_test_util
- name: stats_test
gtest: true
build: test
@ -7799,14 +7722,12 @@ targets:
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/slice/slice_utils.h
- src/core/lib/slice/static_slice.h
- test/core/util/build.h
src:
- src/core/lib/debug/trace.cc
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/slice/static_slice.cc
- test/core/slice/slice_test.cc
- test/core/util/build.cc
deps:

6
config.m4 generated

@ -140,7 +140,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc \
src/core/ext/transport/chttp2/transport/hpack_parser.cc \
src/core/ext/transport/chttp2/transport/hpack_parser_table.cc \
src/core/ext/transport/chttp2/transport/hpack_utils.cc \
src/core/ext/transport/chttp2/transport/http2_settings.cc \
src/core/ext/transport/chttp2/transport/huffsyms.cc \
src/core/ext/transport/chttp2/transport/parsing.cc \
@ -580,7 +579,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc \
src/core/lib/security/credentials/composite/composite_credentials.cc \
src/core/lib/security/credentials/credentials.cc \
src/core/lib/security/credentials/credentials_metadata.cc \
src/core/lib/security/credentials/external/aws_external_account_credentials.cc \
src/core/lib/security/credentials/external/aws_request_signer.cc \
src/core/lib/security/credentials/external/external_account_credentials.cc \
@ -633,7 +631,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/slice/slice_refcount.cc \
src/core/lib/slice/slice_split.cc \
src/core/lib/slice/slice_string_helpers.cc \
src/core/lib/slice/static_slice.cc \
src/core/lib/surface/api_trace.cc \
src/core/lib/surface/builtins.cc \
src/core/lib/surface/byte_buffer.cc \
@ -659,11 +656,8 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/transport/byte_stream.cc \
src/core/lib/transport/connectivity_state.cc \
src/core/lib/transport/error_utils.cc \
src/core/lib/transport/metadata.cc \
src/core/lib/transport/metadata_batch.cc \
src/core/lib/transport/parsed_metadata.cc \
src/core/lib/transport/pid_controller.cc \
src/core/lib/transport/static_metadata.cc \
src/core/lib/transport/status_conversion.cc \
src/core/lib/transport/timeout_encoding.cc \
src/core/lib/transport/transport.cc \

6
config.w32 generated

@ -106,7 +106,6 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\transport\\chttp2\\transport\\hpack_encoder_table.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\hpack_parser.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\hpack_parser_table.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\hpack_utils.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\http2_settings.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\huffsyms.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\parsing.cc " +
@ -546,7 +545,6 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_server_options.cc " +
"src\\core\\lib\\security\\credentials\\composite\\composite_credentials.cc " +
"src\\core\\lib\\security\\credentials\\credentials.cc " +
"src\\core\\lib\\security\\credentials\\credentials_metadata.cc " +
"src\\core\\lib\\security\\credentials\\external\\aws_external_account_credentials.cc " +
"src\\core\\lib\\security\\credentials\\external\\aws_request_signer.cc " +
"src\\core\\lib\\security\\credentials\\external\\external_account_credentials.cc " +
@ -599,7 +597,6 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\slice\\slice_refcount.cc " +
"src\\core\\lib\\slice\\slice_split.cc " +
"src\\core\\lib\\slice\\slice_string_helpers.cc " +
"src\\core\\lib\\slice\\static_slice.cc " +
"src\\core\\lib\\surface\\api_trace.cc " +
"src\\core\\lib\\surface\\builtins.cc " +
"src\\core\\lib\\surface\\byte_buffer.cc " +
@ -625,11 +622,8 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\transport\\byte_stream.cc " +
"src\\core\\lib\\transport\\connectivity_state.cc " +
"src\\core\\lib\\transport\\error_utils.cc " +
"src\\core\\lib\\transport\\metadata.cc " +
"src\\core\\lib\\transport\\metadata_batch.cc " +
"src\\core\\lib\\transport\\parsed_metadata.cc " +
"src\\core\\lib\\transport\\pid_controller.cc " +
"src\\core\\lib\\transport\\static_metadata.cc " +
"src\\core\\lib\\transport\\status_conversion.cc " +
"src\\core\\lib\\transport\\timeout_encoding.cc " +
"src\\core\\lib\\transport\\transport.cc " +

12
gRPC-C++.podspec generated

@ -326,15 +326,12 @@ Pod::Spec.new do |s|
'src/core/ext/transport/chttp2/transport/frame_window_update.h',
'src/core/ext/transport/chttp2/transport/hpack_constants.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder_index.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder_table.h',
'src/core/ext/transport/chttp2/transport/hpack_parser.h',
'src/core/ext/transport/chttp2/transport/hpack_parser_table.h',
'src/core/ext/transport/chttp2/transport/hpack_utils.h',
'src/core/ext/transport/chttp2/transport/http2_settings.h',
'src/core/ext/transport/chttp2/transport/huffsyms.h',
'src/core/ext/transport/chttp2/transport/internal.h',
'src/core/ext/transport/chttp2/transport/popularity_count.h',
'src/core/ext/transport/chttp2/transport/stream_map.h',
'src/core/ext/transport/chttp2/transport/varint.h',
'src/core/ext/transport/inproc/inproc_transport.h',
@ -808,7 +805,6 @@ Pod::Spec.new do |s|
'src/core/lib/slice/slice_split.h',
'src/core/lib/slice/slice_string_helpers.h',
'src/core/lib/slice/slice_utils.h',
'src/core/lib/slice/static_slice.h',
'src/core/lib/surface/api_trace.h',
'src/core/lib/surface/builtins.h',
'src/core/lib/surface/call.h',
@ -828,11 +824,9 @@ Pod::Spec.new do |s|
'src/core/lib/transport/connectivity_state.h',
'src/core/lib/transport/error_utils.h',
'src/core/lib/transport/http2_errors.h',
'src/core/lib/transport/metadata.h',
'src/core/lib/transport/metadata_batch.h',
'src/core/lib/transport/parsed_metadata.h',
'src/core/lib/transport/pid_controller.h',
'src/core/lib/transport/static_metadata.h',
'src/core/lib/transport/status_conversion.h',
'src/core/lib/transport/timeout_encoding.h',
'src/core/lib/transport/transport.h',
@ -1064,15 +1058,12 @@ Pod::Spec.new do |s|
'src/core/ext/transport/chttp2/transport/frame_window_update.h',
'src/core/ext/transport/chttp2/transport/hpack_constants.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder_index.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder_table.h',
'src/core/ext/transport/chttp2/transport/hpack_parser.h',
'src/core/ext/transport/chttp2/transport/hpack_parser_table.h',
'src/core/ext/transport/chttp2/transport/hpack_utils.h',
'src/core/ext/transport/chttp2/transport/http2_settings.h',
'src/core/ext/transport/chttp2/transport/huffsyms.h',
'src/core/ext/transport/chttp2/transport/internal.h',
'src/core/ext/transport/chttp2/transport/popularity_count.h',
'src/core/ext/transport/chttp2/transport/stream_map.h',
'src/core/ext/transport/chttp2/transport/varint.h',
'src/core/ext/transport/inproc/inproc_transport.h',
@ -1546,7 +1537,6 @@ Pod::Spec.new do |s|
'src/core/lib/slice/slice_split.h',
'src/core/lib/slice/slice_string_helpers.h',
'src/core/lib/slice/slice_utils.h',
'src/core/lib/slice/static_slice.h',
'src/core/lib/surface/api_trace.h',
'src/core/lib/surface/builtins.h',
'src/core/lib/surface/call.h',
@ -1566,11 +1556,9 @@ Pod::Spec.new do |s|
'src/core/lib/transport/connectivity_state.h',
'src/core/lib/transport/error_utils.h',
'src/core/lib/transport/http2_errors.h',
'src/core/lib/transport/metadata.h',
'src/core/lib/transport/metadata_batch.h',
'src/core/lib/transport/parsed_metadata.h',
'src/core/lib/transport/pid_controller.h',
'src/core/lib/transport/static_metadata.h',
'src/core/lib/transport/status_conversion.h',
'src/core/lib/transport/timeout_encoding.h',
'src/core/lib/transport/transport.h',

18
gRPC-Core.podspec generated

@ -362,22 +362,18 @@ Pod::Spec.new do |s|
'src/core/ext/transport/chttp2/transport/hpack_constants.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder.cc',
'src/core/ext/transport/chttp2/transport/hpack_encoder.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder_index.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc',
'src/core/ext/transport/chttp2/transport/hpack_encoder_table.h',
'src/core/ext/transport/chttp2/transport/hpack_parser.cc',
'src/core/ext/transport/chttp2/transport/hpack_parser.h',
'src/core/ext/transport/chttp2/transport/hpack_parser_table.cc',
'src/core/ext/transport/chttp2/transport/hpack_parser_table.h',
'src/core/ext/transport/chttp2/transport/hpack_utils.cc',
'src/core/ext/transport/chttp2/transport/hpack_utils.h',
'src/core/ext/transport/chttp2/transport/http2_settings.cc',
'src/core/ext/transport/chttp2/transport/http2_settings.h',
'src/core/ext/transport/chttp2/transport/huffsyms.cc',
'src/core/ext/transport/chttp2/transport/huffsyms.h',
'src/core/ext/transport/chttp2/transport/internal.h',
'src/core/ext/transport/chttp2/transport/parsing.cc',
'src/core/ext/transport/chttp2/transport/popularity_count.h',
'src/core/ext/transport/chttp2/transport/stream_lists.cc',
'src/core/ext/transport/chttp2/transport/stream_map.cc',
'src/core/ext/transport/chttp2/transport/stream_map.h',
@ -1237,7 +1233,6 @@ Pod::Spec.new do |s|
'src/core/lib/security/credentials/composite/composite_credentials.h',
'src/core/lib/security/credentials/credentials.cc',
'src/core/lib/security/credentials/credentials.h',
'src/core/lib/security/credentials/credentials_metadata.cc',
'src/core/lib/security/credentials/external/aws_external_account_credentials.cc',
'src/core/lib/security/credentials/external/aws_external_account_credentials.h',
'src/core/lib/security/credentials/external/aws_request_signer.cc',
@ -1340,8 +1335,6 @@ Pod::Spec.new do |s|
'src/core/lib/slice/slice_string_helpers.cc',
'src/core/lib/slice/slice_string_helpers.h',
'src/core/lib/slice/slice_utils.h',
'src/core/lib/slice/static_slice.cc',
'src/core/lib/slice/static_slice.h',
'src/core/lib/surface/api_trace.cc',
'src/core/lib/surface/api_trace.h',
'src/core/lib/surface/builtins.cc',
@ -1386,16 +1379,11 @@ Pod::Spec.new do |s|
'src/core/lib/transport/error_utils.cc',
'src/core/lib/transport/error_utils.h',
'src/core/lib/transport/http2_errors.h',
'src/core/lib/transport/metadata.cc',
'src/core/lib/transport/metadata.h',
'src/core/lib/transport/metadata_batch.cc',
'src/core/lib/transport/metadata_batch.h',
'src/core/lib/transport/parsed_metadata.cc',
'src/core/lib/transport/parsed_metadata.h',
'src/core/lib/transport/pid_controller.cc',
'src/core/lib/transport/pid_controller.h',
'src/core/lib/transport/static_metadata.cc',
'src/core/lib/transport/static_metadata.h',
'src/core/lib/transport/status_conversion.cc',
'src/core/lib/transport/status_conversion.h',
'src/core/lib/transport/timeout_encoding.cc',
@ -1611,15 +1599,12 @@ Pod::Spec.new do |s|
'src/core/ext/transport/chttp2/transport/frame_window_update.h',
'src/core/ext/transport/chttp2/transport/hpack_constants.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder_index.h',
'src/core/ext/transport/chttp2/transport/hpack_encoder_table.h',
'src/core/ext/transport/chttp2/transport/hpack_parser.h',
'src/core/ext/transport/chttp2/transport/hpack_parser_table.h',
'src/core/ext/transport/chttp2/transport/hpack_utils.h',
'src/core/ext/transport/chttp2/transport/http2_settings.h',
'src/core/ext/transport/chttp2/transport/huffsyms.h',
'src/core/ext/transport/chttp2/transport/internal.h',
'src/core/ext/transport/chttp2/transport/popularity_count.h',
'src/core/ext/transport/chttp2/transport/stream_map.h',
'src/core/ext/transport/chttp2/transport/varint.h',
'src/core/ext/transport/inproc/inproc_transport.h',
@ -2093,7 +2078,6 @@ Pod::Spec.new do |s|
'src/core/lib/slice/slice_split.h',
'src/core/lib/slice/slice_string_helpers.h',
'src/core/lib/slice/slice_utils.h',
'src/core/lib/slice/static_slice.h',
'src/core/lib/surface/api_trace.h',
'src/core/lib/surface/builtins.h',
'src/core/lib/surface/call.h',
@ -2113,11 +2097,9 @@ Pod::Spec.new do |s|
'src/core/lib/transport/connectivity_state.h',
'src/core/lib/transport/error_utils.h',
'src/core/lib/transport/http2_errors.h',
'src/core/lib/transport/metadata.h',
'src/core/lib/transport/metadata_batch.h',
'src/core/lib/transport/parsed_metadata.h',
'src/core/lib/transport/pid_controller.h',
'src/core/lib/transport/static_metadata.h',
'src/core/lib/transport/status_conversion.h',
'src/core/lib/transport/timeout_encoding.h',
'src/core/lib/transport/transport.h',

12
grpc.gemspec generated

@ -281,22 +281,18 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_constants.h )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder.h )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder_index.h )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder_table.h )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_parser.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_parser.h )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_parser_table.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_parser_table.h )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_utils.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/hpack_utils.h )
s.files += %w( src/core/ext/transport/chttp2/transport/http2_settings.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/http2_settings.h )
s.files += %w( src/core/ext/transport/chttp2/transport/huffsyms.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/huffsyms.h )
s.files += %w( src/core/ext/transport/chttp2/transport/internal.h )
s.files += %w( src/core/ext/transport/chttp2/transport/parsing.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/popularity_count.h )
s.files += %w( src/core/ext/transport/chttp2/transport/stream_lists.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/stream_map.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/stream_map.h )
@ -1156,7 +1152,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/security/credentials/composite/composite_credentials.h )
s.files += %w( src/core/lib/security/credentials/credentials.cc )
s.files += %w( src/core/lib/security/credentials/credentials.h )
s.files += %w( src/core/lib/security/credentials/credentials_metadata.cc )
s.files += %w( src/core/lib/security/credentials/external/aws_external_account_credentials.cc )
s.files += %w( src/core/lib/security/credentials/external/aws_external_account_credentials.h )
s.files += %w( src/core/lib/security/credentials/external/aws_request_signer.cc )
@ -1259,8 +1254,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/slice/slice_string_helpers.cc )
s.files += %w( src/core/lib/slice/slice_string_helpers.h )
s.files += %w( src/core/lib/slice/slice_utils.h )
s.files += %w( src/core/lib/slice/static_slice.cc )
s.files += %w( src/core/lib/slice/static_slice.h )
s.files += %w( src/core/lib/surface/api_trace.cc )
s.files += %w( src/core/lib/surface/api_trace.h )
s.files += %w( src/core/lib/surface/builtins.cc )
@ -1305,16 +1298,11 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/transport/error_utils.cc )
s.files += %w( src/core/lib/transport/error_utils.h )
s.files += %w( src/core/lib/transport/http2_errors.h )
s.files += %w( src/core/lib/transport/metadata.cc )
s.files += %w( src/core/lib/transport/metadata.h )
s.files += %w( src/core/lib/transport/metadata_batch.cc )
s.files += %w( src/core/lib/transport/metadata_batch.h )
s.files += %w( src/core/lib/transport/parsed_metadata.cc )
s.files += %w( src/core/lib/transport/parsed_metadata.h )
s.files += %w( src/core/lib/transport/pid_controller.cc )
s.files += %w( src/core/lib/transport/pid_controller.h )
s.files += %w( src/core/lib/transport/static_metadata.cc )
s.files += %w( src/core/lib/transport/static_metadata.h )
s.files += %w( src/core/lib/transport/status_conversion.cc )
s.files += %w( src/core/lib/transport/status_conversion.h )
s.files += %w( src/core/lib/transport/timeout_encoding.cc )

11
grpc.gyp generated

@ -570,7 +570,6 @@
'src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc',
'src/core/ext/transport/chttp2/transport/hpack_parser.cc',
'src/core/ext/transport/chttp2/transport/hpack_parser_table.cc',
'src/core/ext/transport/chttp2/transport/hpack_utils.cc',
'src/core/ext/transport/chttp2/transport/http2_settings.cc',
'src/core/ext/transport/chttp2/transport/huffsyms.cc',
'src/core/ext/transport/chttp2/transport/parsing.cc',
@ -966,7 +965,6 @@
'src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc',
'src/core/lib/security/credentials/composite/composite_credentials.cc',
'src/core/lib/security/credentials/credentials.cc',
'src/core/lib/security/credentials/credentials_metadata.cc',
'src/core/lib/security/credentials/external/aws_external_account_credentials.cc',
'src/core/lib/security/credentials/external/aws_request_signer.cc',
'src/core/lib/security/credentials/external/external_account_credentials.cc',
@ -1019,7 +1017,6 @@
'src/core/lib/slice/slice_refcount.cc',
'src/core/lib/slice/slice_split.cc',
'src/core/lib/slice/slice_string_helpers.cc',
'src/core/lib/slice/static_slice.cc',
'src/core/lib/surface/api_trace.cc',
'src/core/lib/surface/builtins.cc',
'src/core/lib/surface/byte_buffer.cc',
@ -1045,11 +1042,8 @@
'src/core/lib/transport/byte_stream.cc',
'src/core/lib/transport/connectivity_state.cc',
'src/core/lib/transport/error_utils.cc',
'src/core/lib/transport/metadata.cc',
'src/core/lib/transport/metadata_batch.cc',
'src/core/lib/transport/parsed_metadata.cc',
'src/core/lib/transport/pid_controller.cc',
'src/core/lib/transport/static_metadata.cc',
'src/core/lib/transport/status_conversion.cc',
'src/core/lib/transport/timeout_encoding.cc',
'src/core/lib/transport/transport.cc',
@ -1263,7 +1257,6 @@
'src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc',
'src/core/ext/transport/chttp2/transport/hpack_parser.cc',
'src/core/ext/transport/chttp2/transport/hpack_parser_table.cc',
'src/core/ext/transport/chttp2/transport/hpack_utils.cc',
'src/core/ext/transport/chttp2/transport/http2_settings.cc',
'src/core/ext/transport/chttp2/transport/huffsyms.cc',
'src/core/ext/transport/chttp2/transport/parsing.cc',
@ -1427,7 +1420,6 @@
'src/core/lib/slice/slice_refcount.cc',
'src/core/lib/slice/slice_split.cc',
'src/core/lib/slice/slice_string_helpers.cc',
'src/core/lib/slice/static_slice.cc',
'src/core/lib/surface/api_trace.cc',
'src/core/lib/surface/builtins.cc',
'src/core/lib/surface/byte_buffer.cc',
@ -1453,11 +1445,8 @@
'src/core/lib/transport/byte_stream.cc',
'src/core/lib/transport/connectivity_state.cc',
'src/core/lib/transport/error_utils.cc',
'src/core/lib/transport/metadata.cc',
'src/core/lib/transport/metadata_batch.cc',
'src/core/lib/transport/parsed_metadata.cc',
'src/core/lib/transport/pid_controller.cc',
'src/core/lib/transport/static_metadata.cc',
'src/core/lib/transport/status_conversion.cc',
'src/core/lib/transport/timeout_encoding.cc',
'src/core/lib/transport/transport.cc',

12
package.xml generated

@ -261,22 +261,18 @@
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_constants.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_encoder.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_encoder.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_encoder_index.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_encoder_table.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_parser.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_parser.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_parser_table.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_parser_table.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_utils.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/hpack_utils.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/http2_settings.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/http2_settings.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/huffsyms.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/huffsyms.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/internal.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/parsing.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/popularity_count.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/stream_lists.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/stream_map.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/stream_map.h" role="src" />
@ -1136,7 +1132,6 @@
<file baseinstalldir="/" name="src/core/lib/security/credentials/composite/composite_credentials.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/credentials/credentials.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/credentials/credentials.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/credentials/credentials_metadata.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/credentials/external/aws_external_account_credentials.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/credentials/external/aws_external_account_credentials.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/credentials/external/aws_request_signer.cc" role="src" />
@ -1239,8 +1234,6 @@
<file baseinstalldir="/" name="src/core/lib/slice/slice_string_helpers.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/slice/slice_string_helpers.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/slice/slice_utils.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/slice/static_slice.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/slice/static_slice.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/surface/api_trace.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/surface/api_trace.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/surface/builtins.cc" role="src" />
@ -1285,16 +1278,11 @@
<file baseinstalldir="/" name="src/core/lib/transport/error_utils.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/error_utils.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/http2_errors.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/metadata.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/metadata.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/metadata_batch.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/metadata_batch.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/parsed_metadata.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/parsed_metadata.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/pid_controller.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/pid_controller.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/static_metadata.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/static_metadata.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/status_conversion.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/status_conversion.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/transport/timeout_encoding.cc" role="src" />

@ -70,9 +70,7 @@
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/transport/connectivity_state.h"
#include "src/core/lib/transport/error_utils.h"
#include "src/core/lib/transport/metadata.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/static_metadata.h"
//
// Client channel filter
@ -2405,16 +2403,25 @@ void ClientChannel::CallData::CreateDynamicCall(grpc_call_element* elem) {
class ClientChannel::LoadBalancedCall::Metadata
: public LoadBalancingPolicy::MetadataInterface {
public:
Metadata(LoadBalancedCall* lb_call, grpc_metadata_batch* batch)
: lb_call_(lb_call), batch_(batch) {}
explicit Metadata(grpc_metadata_batch* batch) : batch_(batch) {}
void Add(absl::string_view key, absl::string_view value) override {
grpc_linked_mdelem* linked_mdelem = static_cast<grpc_linked_mdelem*>(
lb_call_->arena_->Alloc(sizeof(grpc_linked_mdelem)));
linked_mdelem->md = grpc_mdelem_from_slices(
ExternallyManagedSlice(key.data(), key.size()),
ExternallyManagedSlice(value.data(), value.size()));
GPR_ASSERT(batch_->LinkTail(linked_mdelem) == GRPC_ERROR_NONE);
// Gross, egregious hack to support legacy grpclb behavior.
// TODO(ctiller): Use a promise context for this once that plumbing is done.
if (key == GrpcLbClientStatsMetadata::key()) {
batch_->Set(
GrpcLbClientStatsMetadata(),
const_cast<GrpcLbClientStats*>(
reinterpret_cast<const GrpcLbClientStats*>(value.data())));
return;
}
batch_->Append(key, Slice::FromStaticString(value),
[key](absl::string_view error, const Slice& value) {
gpr_log(GPR_ERROR, "%s",
absl::StrCat(error, " key:", key,
" value:", value.as_string_view())
.c_str());
});
}
std::vector<std::pair<std::string, std::string>> TestOnlyCopyToVector()
@ -2426,15 +2433,15 @@ class ClientChannel::LoadBalancedCall::Metadata
absl::optional<absl::string_view> Lookup(absl::string_view key,
std::string* buffer) const override {
return batch_->GetValue(key, buffer);
return batch_->GetStringValue(key, buffer);
}
private:
class Encoder {
public:
void Encode(grpc_mdelem md) {
out_.emplace_back(std::string(StringViewFromSlice(GRPC_MDKEY(md))),
std::string(StringViewFromSlice(GRPC_MDVALUE(md))));
void Encode(const Slice& key, const Slice& value) {
out_.emplace_back(std::string(key.as_string_view()),
std::string(value.as_string_view()));
}
template <class Which>
@ -2457,7 +2464,6 @@ class ClientChannel::LoadBalancedCall::Metadata
std::vector<std::pair<std::string, std::string>> out_;
};
LoadBalancedCall* lb_call_;
grpc_metadata_batch* batch_;
};
@ -2549,7 +2555,6 @@ ClientChannel::LoadBalancedCall::LoadBalancedCall(
GetCallAttemptTracer(args.context, is_transparent_retry)) {}
ClientChannel::LoadBalancedCall::~LoadBalancedCall() {
grpc_slice_unref_internal(path_);
GRPC_ERROR_UNREF(cancel_error_);
GRPC_ERROR_UNREF(failure_error_);
if (backend_metric_data_ != nullptr) {
@ -2887,7 +2892,7 @@ void ClientChannel::LoadBalancedCall::RecvTrailingMetadataReady(
// If the LB policy requested a callback for trailing metadata, invoke
// the callback.
if (self->lb_subchannel_call_tracker_ != nullptr) {
Metadata trailing_metadata(self, self->recv_trailing_metadata_);
Metadata trailing_metadata(self->recv_trailing_metadata_);
BackendMetricAccessor backend_metric_accessor(self);
LoadBalancingPolicy::SubchannelCallTrackerInterface::FinishArgs args = {
status, &trailing_metadata, &backend_metric_accessor};
@ -2908,7 +2913,7 @@ void ClientChannel::LoadBalancedCall::RecvTrailingMetadataReady(
void ClientChannel::LoadBalancedCall::CreateSubchannelCall() {
SubchannelCall::Args call_args = {
std::move(connected_subchannel_), pollent_, path_, /*start_time=*/0,
std::move(connected_subchannel_), pollent_, path_.Ref(), /*start_time=*/0,
deadline_, arena_,
// TODO(roth): When we implement hedging support, we will probably
// need to use a separate call context for each subchannel call.
@ -3052,10 +3057,10 @@ bool ClientChannel::LoadBalancedCall::PickSubchannelLocked(
send_initial_metadata.send_initial_metadata_flags;
// Perform LB pick.
LoadBalancingPolicy::PickArgs pick_args;
pick_args.path = StringViewFromSlice(path_);
pick_args.path = path_.as_string_view();
LbCallState lb_call_state(this);
pick_args.call_state = &lb_call_state;
Metadata initial_metadata(this, initial_metadata_batch);
Metadata initial_metadata(initial_metadata_batch);
pick_args.initial_metadata = &initial_metadata;
auto result = chand_->picker_->Pick(pick_args);
return HandlePickResult<bool>(

@ -447,7 +447,7 @@ class ClientChannel::LoadBalancedCall
// TODO(roth): Instead of duplicating these fields in every filter
// that uses any one of them, we should store them in the call
// context. This will save per-call memory overhead.
grpc_slice path_; // Request path.
Slice path_; // Request path.
grpc_millis deadline_;
Arena* arena_;
grpc_call_stack* owning_call_;

@ -294,7 +294,7 @@ void HealthCheckClient::CallState::StartCall() {
SubchannelCall::Args args = {
health_check_client_->connected_subchannel_,
&pollent_,
GRPC_MDSTR_SLASH_GRPC_DOT_HEALTH_DOT_V1_DOT_HEALTH_SLASH_WATCH,
Slice::FromStaticString("/grpc.health.v1.Health/Watch"),
gpr_get_cycle_counter(), // start_time
GRPC_MILLIS_INF_FUTURE, // deadline
arena_,
@ -328,7 +328,7 @@ void HealthCheckClient::CallState::StartCall() {
// Add send_initial_metadata op.
send_initial_metadata_.Set(
HttpPathMetadata(),
Slice(GRPC_MDSTR_SLASH_GRPC_DOT_HEALTH_DOT_V1_DOT_HEALTH_SLASH_WATCH));
Slice::FromStaticString("/grpc.health.v1.Health/Watch"));
GPR_ASSERT(error == GRPC_ERROR_NONE);
payload_.send_initial_metadata.send_initial_metadata =
&send_initial_metadata_;

@ -102,14 +102,10 @@ static void clr_start_transport_stream_op_batch(
if (batch->send_initial_metadata) {
// Grab client stats object from metadata.
auto client_stats_md =
batch->payload->send_initial_metadata.send_initial_metadata->Remove(
grpc_slice_from_static_string(
grpc_core::kGrpcLbClientStatsMetadataKey));
batch->payload->send_initial_metadata.send_initial_metadata->Take(
grpc_core::GrpcLbClientStatsMetadata());
if (client_stats_md.has_value()) {
grpc_core::GrpcLbClientStats* client_stats =
const_cast<grpc_core::GrpcLbClientStats*>(
reinterpret_cast<const grpc_core::GrpcLbClientStats*>(
GRPC_SLICE_START_PTR(*client_stats_md)));
grpc_core::GrpcLbClientStats* client_stats = *client_stats_md;
if (client_stats != nullptr) {
calld->client_stats.reset(client_stats);
// Intercept completion.

@ -100,7 +100,6 @@
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/surface/call.h"
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/transport/static_metadata.h"
#define GRPC_GRPCLB_INITIAL_CONNECT_BACKOFF_SECONDS 1
#define GRPC_GRPCLB_RECONNECT_BACKOFF_MULTIPLIER 1.6
@ -113,9 +112,6 @@ namespace grpc_core {
TraceFlag grpc_lb_glb_trace(false, "glb");
const char kGrpcLbClientStatsMetadataKey[] = "grpclb_client_stats";
const char kGrpcLbLbTokenMetadataKey[] = "lb-token";
const char kGrpcLbAddressAttributeKey[] = "grpclb";
namespace {
@ -653,7 +649,7 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
// a string and rely on the client_load_reporting filter to know
// how to interpret it.
args.initial_metadata->Add(
kGrpcLbClientStatsMetadataKey,
GrpcLbClientStatsMetadata::key(),
absl::string_view(reinterpret_cast<const char*>(client_stats), 0));
// Update calls-started.
client_stats->AddCallStarted();
@ -666,7 +662,7 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
char* lb_token = static_cast<char*>(
args.call_state->Alloc(subchannel_wrapper->lb_token().size() + 1));
strcpy(lb_token, subchannel_wrapper->lb_token().c_str());
args.initial_metadata->Add(kGrpcLbLbTokenMetadataKey, lb_token);
args.initial_metadata->Add(LbTokenMetadata::key(), lb_token);
}
// Unwrap subchannel to pass up to the channel.
complete_pick->subchannel = subchannel_wrapper->wrapped_subchannel();
@ -794,7 +790,7 @@ GrpcLb::BalancerCallState::BalancerCallState(
lb_call_ = grpc_channel_create_pollset_set_call(
grpclb_policy()->lb_channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
grpclb_policy_->interested_parties(),
GRPC_MDSTR_SLASH_GRPC_DOT_LB_DOT_V1_DOT_LOADBALANCER_SLASH_BALANCELOAD,
Slice::FromStaticString("/grpc.lb.v1.LoadBalancer/BalanceLoad").c_slice(),
nullptr, deadline, nullptr);
// Init the LB call request payload.
upb::Arena arena;

@ -36,12 +36,5 @@
#define GRPC_ARG_GRPCLB_SUBCHANNEL_CACHE_INTERVAL_MS \
"grpc.internal.grpclb_subchannel_cache_interval_ms"
namespace grpc_core {
extern const char kGrpcLbClientStatsMetadataKey[];
extern const char kGrpcLbLbTokenMetadataKey[];
} // namespace grpc_core
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_H \
*/

@ -37,7 +37,6 @@
#include "src/core/lib/gprpp/sync.h"
#include "src/core/lib/transport/connectivity_state.h"
#include "src/core/lib/transport/error_utils.h"
#include "src/core/lib/transport/static_metadata.h"
namespace grpc_core {

@ -70,7 +70,6 @@
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/transport/connectivity_state.h"
#include "src/core/lib/transport/error_utils.h"
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/uri/uri_parser.h"
#include "src/proto/grpc/lookup/v1/rls.upb.h"

@ -31,7 +31,6 @@
#include "src/core/lib/gprpp/sync.h"
#include "src/core/lib/transport/connectivity_state.h"
#include "src/core/lib/transport/error_utils.h"
#include "src/core/lib/transport/static_metadata.h"
namespace grpc_core {

@ -39,9 +39,7 @@
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/transport/error_utils.h"
#include "src/core/lib/transport/metadata.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/uri/uri_parser.h"
//
@ -418,7 +416,6 @@ class RetryFilter::CallData {
// BatchData.batch.payload points to this.
grpc_transport_stream_op_batch_payload batch_payload_;
// For send_initial_metadata.
grpc_linked_mdelem retry_attempts_metadata_;
grpc_metadata_batch send_initial_metadata_{calld_->arena_};
// For send_message.
// TODO(roth): Restructure this to eliminate use of ManualConstructor.
@ -1889,8 +1886,7 @@ void RetryFilter::CallData::CallAttempt::BatchData::
//
// If we've already completed one or more attempts, add the
// grpc-retry-attempts header.
grpc_metadata_batch_copy(&calld->send_initial_metadata_,
&call_attempt_->send_initial_metadata_);
call_attempt_->send_initial_metadata_ = calld->send_initial_metadata_.Copy();
if (GPR_UNLIKELY(calld->num_attempts_completed_ > 0)) {
call_attempt_->send_initial_metadata_.Set(GrpcPreviousRpcAttemptsMetadata(),
calld->num_attempts_completed_);
@ -1933,8 +1929,8 @@ void RetryFilter::CallData::CallAttempt::BatchData::
// We need to make a copy of the metadata batch for each attempt, since
// the filters in the subchannel stack may modify this batch, and we don't
// want those modifications to be passed forward to subsequent attempts.
grpc_metadata_batch_copy(&calld->send_trailing_metadata_,
&call_attempt_->send_trailing_metadata_);
call_attempt_->send_trailing_metadata_ =
calld->send_trailing_metadata_.Copy();
call_attempt_->started_send_trailing_metadata_ = true;
batch_.send_trailing_metadata = true;
batch_.payload->send_trailing_metadata.send_trailing_metadata =
@ -2249,7 +2245,7 @@ void RetryFilter::CallData::MaybeCacheSendOpsForBatch(PendingBatch* pending) {
seen_send_initial_metadata_ = true;
grpc_metadata_batch* send_initial_metadata =
batch->payload->send_initial_metadata.send_initial_metadata;
grpc_metadata_batch_copy(send_initial_metadata, &send_initial_metadata_);
send_initial_metadata_ = send_initial_metadata->Copy();
send_initial_metadata_flags_ =
batch->payload->send_initial_metadata.send_initial_metadata_flags;
peer_string_ = batch->payload->send_initial_metadata.peer_string;
@ -2265,7 +2261,7 @@ void RetryFilter::CallData::MaybeCacheSendOpsForBatch(PendingBatch* pending) {
seen_send_trailing_metadata_ = true;
grpc_metadata_batch* send_trailing_metadata =
batch->payload->send_trailing_metadata.send_trailing_metadata;
grpc_metadata_batch_copy(send_trailing_metadata, &send_trailing_metadata_);
send_trailing_metadata_ = send_trailing_metadata->Copy();
}
}

@ -141,14 +141,14 @@ SubchannelCall::SubchannelCall(Args args, grpc_error_handle* error)
deadline_(args.deadline) {
grpc_call_stack* callstk = SUBCHANNEL_CALL_TO_CALL_STACK(this);
const grpc_call_element_args call_args = {
callstk, /* call_stack */
nullptr, /* server_transport_data */
args.context, /* context */
args.path, /* path */
args.start_time, /* start_time */
args.deadline, /* deadline */
args.arena, /* arena */
args.call_combiner /* call_combiner */
callstk, /* call_stack */
nullptr, /* server_transport_data */
args.context, /* context */
args.path.c_slice(), /* path */
args.start_time, /* start_time */
args.deadline, /* deadline */
args.arena, /* arena */
args.call_combiner /* call_combiner */
};
*error = grpc_call_stack_init(connected_subchannel_->channel_stack(), 1,
SubchannelCall::Destroy, this, &call_args);

@ -35,7 +35,6 @@
#include "src/core/lib/iomgr/timer.h"
#include "src/core/lib/resource_quota/arena.h"
#include "src/core/lib/transport/connectivity_state.h"
#include "src/core/lib/transport/metadata.h"
namespace grpc_core {
@ -75,7 +74,7 @@ class SubchannelCall {
struct Args {
RefCountedPtr<ConnectedSubchannel> connected_subchannel;
grpc_polling_entity* pollent;
grpc_slice path;
Slice path;
gpr_cycle_counter start_time;
grpc_millis deadline;
Arena* arena;

@ -22,6 +22,7 @@
#include "absl/strings/numbers.h"
#include <grpc/status.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
@ -45,31 +46,11 @@ static_assert(
std::is_trivially_destructible<std::atomic<uint32_t>>::value,
"the active fault counter needs to have a trivially destructible type");
inline int GetMetadatumValueInt(grpc_mdelem md) {
int res;
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md)), &res)) {
return res;
} else {
return -1;
}
}
inline uint32_t GetMetadatumValueUnsignedInt(grpc_mdelem md) {
uint32_t res;
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md)), &res)) {
return res;
} else {
return -1;
}
}
inline int64_t GetMetadatumValueInt64(grpc_mdelem md) {
int64_t res;
if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md)), &res)) {
return res;
} else {
return -1;
}
template <typename T>
auto AsInt(absl::string_view s) -> absl::optional<T> {
T x;
if (absl::SimpleAtoi(s, &x)) return x;
return absl::nullopt;
}
inline bool UnderFraction(const uint32_t numerator,
@ -346,41 +327,49 @@ void CallData::DecideWhetherToInjectFaults(
*fi_policy_);
}
};
initial_metadata->ForEach([&](grpc_mdelem md) {
absl::string_view key = StringViewFromSlice(GRPC_MDKEY(md));
// Only perform string comparison if:
// 1. Needs to check this header;
// 2. The value is not been filled before.
if (!fi_policy_->abort_code_header.empty() &&
(copied_policy == nullptr ||
copied_policy->abort_code == GRPC_STATUS_OK) &&
key == fi_policy_->abort_code_header) {
std::string buffer;
if (!fi_policy_->abort_code_header.empty() &&
(copied_policy == nullptr ||
copied_policy->abort_code == GRPC_STATUS_OK)) {
auto value = initial_metadata->GetStringValue(
fi_policy_->abort_code_header, &buffer);
if (value.has_value()) {
maybe_copy_policy_func();
grpc_status_code_from_int(GetMetadatumValueInt(md),
&copied_policy->abort_code);
grpc_status_code_from_int(
AsInt<int>(*value).value_or(GRPC_STATUS_UNKNOWN),
&copied_policy->abort_code);
}
if (!fi_policy_->abort_percentage_header.empty() &&
key == fi_policy_->abort_percentage_header) {
}
if (!fi_policy_->abort_percentage_header.empty()) {
auto value = initial_metadata->GetStringValue(
fi_policy_->abort_percentage_header, &buffer);
if (value.has_value()) {
maybe_copy_policy_func();
copied_policy->abort_percentage_numerator =
std::min(GetMetadatumValueUnsignedInt(md),
std::min(AsInt<uint32_t>(*value).value_or(-1),
fi_policy_->abort_percentage_numerator);
}
if (!fi_policy_->delay_header.empty() &&
(copied_policy == nullptr || copied_policy->delay == 0) &&
key == fi_policy_->delay_header) {
}
if (!fi_policy_->delay_header.empty() &&
(copied_policy == nullptr || copied_policy->delay == 0)) {
auto value =
initial_metadata->GetStringValue(fi_policy_->delay_header, &buffer);
if (value.has_value()) {
maybe_copy_policy_func();
copied_policy->delay = static_cast<grpc_millis>(
std::max(GetMetadatumValueInt64(md), int64_t(0)));
std::max(AsInt<int64_t>(*value).value_or(0), int64_t(0)));
}
if (!fi_policy_->delay_percentage_header.empty() &&
key == fi_policy_->delay_percentage_header) {
}
if (!fi_policy_->delay_percentage_header.empty()) {
auto value = initial_metadata->GetStringValue(
fi_policy_->delay_percentage_header, &buffer);
if (value.has_value()) {
maybe_copy_policy_func();
copied_policy->delay_percentage_numerator =
std::min(GetMetadatumValueUnsignedInt(md),
std::min(AsInt<uint32_t>(*value).value_or(-1),
fi_policy_->delay_percentage_numerator);
}
});
}
if (copied_policy != nullptr) fi_policy_ = copied_policy;
}
// Roll the dice

@ -39,7 +39,6 @@
#include "src/core/lib/slice/percent_encoding.h"
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/transport/status_conversion.h"
#include "src/core/lib/transport/transport_impl.h"

@ -36,7 +36,6 @@
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/surface/call.h"
#include "src/core/lib/surface/channel_stack_type.h"
#include "src/core/lib/transport/static_metadata.h"
namespace {

@ -39,7 +39,6 @@
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/surface/call.h"
#include "src/core/lib/transport/static_metadata.h"
namespace {

@ -32,7 +32,6 @@
#include "src/core/lib/slice/percent_encoding.h"
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/transport/static_metadata.h"
static void hs_recv_initial_metadata_ready(void* user_data,
grpc_error_handle err);

@ -115,12 +115,24 @@ void ServerLoadReportingCallData::StartTransportStreamOpBatch(
original_recv_initial_metadata_ready_ = op->recv_initial_metadata_ready();
// Substitute the original closure for the wrapper closure.
op->set_recv_initial_metadata_ready(&recv_initial_metadata_ready_);
} else if (op->send_trailing_metadata() != nullptr) {
GRPC_LOG_IF_ERROR(
"server_load_reporting_filter",
grpc_metadata_batch_filter(op->send_trailing_metadata()->batch(),
SendTrailingMetadataFilter, elem,
"send_trailing_metadata filtering error"));
}
if (op->send_trailing_metadata() != nullptr) {
const auto& costs = op->send_trailing_metadata()->batch()->Take(
grpc_core::LbCostBinMetadata());
for (const auto& cost : costs) {
ServerLoadReportingChannelData* chand =
reinterpret_cast<ServerLoadReportingChannelData*>(elem->channel_data);
opencensus::stats::Record(
{{::grpc::load_reporter::MeasureOtherCallMetric(), cost.cost}},
{{::grpc::load_reporter::TagKeyToken(),
{client_ip_and_lr_token_, client_ip_and_lr_token_len_}},
{::grpc::load_reporter::TagKeyHost(),
{target_host_.data(), target_host_.length()}},
{::grpc::load_reporter::TagKeyUserId(),
{chand->peer_identity(), chand->peer_identity_len()}},
{::grpc::load_reporter::TagKeyMetricName(),
{cost.name.data(), cost.name.length()}}});
}
}
grpc_call_next_op(elem, op->op());
}
@ -224,17 +236,13 @@ void ServerLoadReportingCallData::RecvInitialMetadataReady(
calld->target_host_ = absl::AsciiStrToLower(authority->as_string_view());
}
std::string buffer;
auto lb_token = calld->recv_initial_metadata_->GetValue(
grpc_core::kGrpcLbLbTokenMetadataKey, &buffer);
auto lb_token =
calld->recv_initial_metadata_->Take(grpc_core::LbTokenMetadata());
if (lb_token.has_value()) {
if (calld->client_ip_and_lr_token_ == nullptr) {
calld->StoreClientIpAndLrToken(lb_token->data(), lb_token->size());
calld->StoreClientIpAndLrToken(
reinterpret_cast<const char*>(lb_token->data()), lb_token->size());
}
auto old = calld->recv_initial_metadata_->Remove(
grpc_core::Slice::FromCopiedString(
grpc_core::kGrpcLbLbTokenMetadataKey)
.c_slice());
if (old.has_value()) grpc_slice_unref_internal(*old);
}
// If the LB token was not found in the recv_initial_metadata, only the
// client IP part will be recorded (with an empty LB token).
@ -263,45 +271,6 @@ grpc_error_handle ServerLoadReportingCallData::Init(
return GRPC_ERROR_NONE;
}
grpc_filtered_mdelem ServerLoadReportingCallData::SendTrailingMetadataFilter(
void* user_data, grpc_mdelem md) {
grpc_call_element* elem = reinterpret_cast<grpc_call_element*>(user_data);
ServerLoadReportingCallData* calld =
reinterpret_cast<ServerLoadReportingCallData*>(elem->call_data);
ServerLoadReportingChannelData* chand =
reinterpret_cast<ServerLoadReportingChannelData*>(elem->channel_data);
if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_LB_COST_BIN)) {
const grpc_slice value = GRPC_MDVALUE(md);
const size_t cost_entry_size = GRPC_SLICE_LENGTH(value);
if (cost_entry_size < sizeof(double)) {
gpr_log(GPR_ERROR,
"Cost metadata value too small (%zu bytes) to hold valid data. "
"Ignoring.",
cost_entry_size);
return GRPC_FILTERED_REMOVE();
}
const double* cost_entry_ptr =
reinterpret_cast<const double*>(GRPC_SLICE_START_PTR(value));
double cost_value;
memcpy(&cost_value, cost_entry_ptr, sizeof(double));
cost_entry_ptr++;
const char* cost_name = reinterpret_cast<const char*>(cost_entry_ptr);
const size_t cost_name_len = cost_entry_size - sizeof(double);
opencensus::stats::Record(
{{::grpc::load_reporter::MeasureOtherCallMetric(), cost_value}},
{{::grpc::load_reporter::TagKeyToken(),
{calld->client_ip_and_lr_token_, calld->client_ip_and_lr_token_len_}},
{::grpc::load_reporter::TagKeyHost(),
{calld->target_host_.data(), calld->target_host_.length()}},
{::grpc::load_reporter::TagKeyUserId(),
{chand->peer_identity(), chand->peer_identity_len()}},
{::grpc::load_reporter::TagKeyMetricName(),
{cost_name, cost_name_len}}});
return GRPC_FILTERED_REMOVE();
}
return GRPC_FILTERED_MDELEM(md);
}
const char* ServerLoadReportingCallData::GetStatusTagForStatus(
grpc_status_code status) {
switch (status) {

@ -70,15 +70,6 @@ class ServerLoadReportingCallData : public CallData {
// Records the call start.
static void RecvInitialMetadataReady(void* arg, grpc_error_handle err);
// From the initial metadata, extracts the service_method_, target_host_, and
// client_ip_and_lr_token_.
static grpc_filtered_mdelem RecvInitialMetadataFilter(void* user_data,
grpc_mdelem md);
// Records the other call metrics.
static grpc_filtered_mdelem SendTrailingMetadataFilter(void* user_data,
grpc_mdelem md);
// The peer string (a member of the recv_initial_metadata op). Note that
// gpr_atm itself is a pointer type here, making "peer_string_" effectively a
// double pointer.

@ -40,7 +40,6 @@
#include "src/core/lib/transport/byte_stream.h"
#include "src/core/lib/transport/error_utils.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/transport/transport.h"
#ifndef NDEBUG
@ -173,10 +172,10 @@ static bool ContainsAuthorityAndPath(const grpc_binder::Metadata& metadata) {
bool has_authority = false;
bool has_path = false;
for (const auto& kv : metadata) {
if (kv.first == grpc_core::StringViewFromSlice(GRPC_MDSTR_AUTHORITY)) {
if (kv.first == ":authority") {
has_authority = true;
}
if (kv.first == grpc_core::StringViewFromSlice(GRPC_MDSTR_PATH)) {
if (kv.first == ":path") {
has_path = true;
}
}
@ -327,9 +326,10 @@ class MetadataEncoder {
MetadataEncoder(bool is_client, Transaction* tx, Metadata* init_md)
: is_client_(is_client), tx_(tx), init_md_(init_md) {}
void Encode(grpc_mdelem md) {
absl::string_view key = grpc_core::StringViewFromSlice(GRPC_MDKEY(md));
absl::string_view value = grpc_core::StringViewFromSlice(GRPC_MDVALUE(md));
void Encode(const grpc_core::Slice& key_slice,
const grpc_core::Slice& value_slice) {
absl::string_view key = key_slice.as_string_view();
absl::string_view value = value_slice.as_string_view();
gpr_log(GPR_INFO, "send metadata key-value %s",
absl::StrCat(key, " ", value).c_str());
init_md_->emplace_back(std::string(key), std::string(value));

@ -21,7 +21,6 @@
#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/gprpp/global_config.h"
#include "src/core/lib/transport/metadata.h"
GPR_GLOBAL_CONFIG_DEFINE_BOOL(
grpc_experimental_disable_flow_control, false,

@ -52,7 +52,6 @@
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/transport/error_utils.h"
#include "src/core/lib/transport/http2_errors.h"
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/transport/status_conversion.h"
#include "src/core/lib/transport/timeout_encoding.h"
#include "src/core/lib/transport/transport.h"
@ -1331,13 +1330,10 @@ static void complete_fetch_locked(void* gs, grpc_error_handle error) {
static void log_metadata(const grpc_metadata_batch* md_batch, uint32_t id,
bool is_client, bool is_initial) {
md_batch->ForEach([=](grpc_mdelem md) {
char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
char* value = grpc_slice_to_c_string(GRPC_MDVALUE(md));
gpr_log(GPR_INFO, "HTTP:%d:%s:%s: %s: %s", id, is_initial ? "HDR" : "TRL",
is_client ? "CLI" : "SVR", key, value);
gpr_free(key);
gpr_free(value);
const std::string prefix = absl::StrCat(
"HTTP:", id, is_initial ? ":HDR" : ":TRL", is_client ? ":CLI:" : ":SVR:");
md_batch->Log([&prefix](absl::string_view key, absl::string_view value) {
gpr_log(GPR_INFO, "%s", absl::StrCat(prefix, key, ": ", value).c_str());
});
}

@ -37,22 +37,17 @@
#include <grpc/support/log.h>
#include "src/core/ext/transport/chttp2/transport/bin_encoder.h"
#include "src/core/ext/transport/chttp2/transport/hpack_utils.h"
#include "src/core/ext/transport/chttp2/transport/varint.h"
#include "src/core/lib/debug/stats.h"
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/surface/validate_metadata.h"
#include "src/core/lib/transport/metadata.h"
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/transport/timeout_encoding.h"
namespace grpc_core {
namespace {
/* don't consider adding anything bigger than this to the hpack table */
constexpr size_t kMaxDecoderSpaceUsage = 512;
constexpr size_t kDataFrameHeaderSize = 9;
} /* namespace */
@ -140,19 +135,23 @@ void HPackCompressor::Framer::EnsureSpace(size_t need_bytes) {
prefix_ = BeginFrame();
}
void HPackCompressor::Framer::Add(grpc_slice slice) {
const size_t len = GRPC_SLICE_LENGTH(slice);
if (len == 0) return;
const size_t remaining = max_frame_size_ - CurrentFrameSize();
if (len <= remaining) {
stats_->header_bytes += len;
grpc_slice_buffer_add(output_, slice);
} else {
stats_->header_bytes += remaining;
grpc_slice_buffer_add(output_, grpc_slice_split_head(&slice, remaining));
FinishFrame(false);
prefix_ = BeginFrame();
Add(slice);
void HPackCompressor::Framer::Add(Slice slice) {
while (true) {
const size_t len = slice.length();
if (len == 0) return;
const size_t remaining = max_frame_size_ - CurrentFrameSize();
if (len <= remaining) {
stats_->header_bytes += len;
grpc_slice_buffer_add(output_, slice.TakeCSlice());
return;
} else {
stats_->header_bytes += remaining;
Slice tail = slice.Split(remaining);
grpc_slice_buffer_add(output_, slice.TakeCSlice());
slice = std::move(tail);
FinishFrame(false);
prefix_ = BeginFrame();
}
}
}
@ -162,37 +161,6 @@ uint8_t* HPackCompressor::Framer::AddTiny(size_t len) {
return grpc_slice_buffer_tiny_add(output_, len);
}
// Add a key to the dynamic table. Both key and value will be added to table at
// the decoder.
void HPackCompressor::AddKeyWithIndex(grpc_slice_refcount* key_ref,
uint32_t new_index, uint32_t key_hash) {
key_index_.Insert(KeySliceRef(key_ref, key_hash), new_index);
}
/* add an element to the decoder table */
void HPackCompressor::AddElemWithIndex(grpc_mdelem elem, uint32_t new_index,
uint32_t elem_hash, uint32_t key_hash) {
GPR_DEBUG_ASSERT(GRPC_MDELEM_IS_INTERNED(elem));
elem_index_.Insert(KeyElem(elem, elem_hash), new_index);
AddKeyWithIndex(GRPC_MDKEY(elem).refcount, new_index, key_hash);
}
void HPackCompressor::AddElem(grpc_mdelem elem, size_t elem_size,
uint32_t elem_hash, uint32_t key_hash) {
uint32_t new_index = table_.AllocateIndex(elem_size);
if (new_index != 0) {
AddElemWithIndex(elem, new_index, elem_hash, key_hash);
}
}
void HPackCompressor::AddKey(grpc_mdelem elem, size_t elem_size,
uint32_t key_hash) {
uint32_t new_index = table_.AllocateIndex(elem_size);
if (new_index != 0) {
AddKeyWithIndex(GRPC_MDKEY(elem).refcount, new_index, key_hash);
}
}
void HPackCompressor::Framer::EmitIndexed(uint32_t elem_index) {
GRPC_STATS_INC_HPACK_SEND_INDEXED();
VarintWriter<1> w(elem_index);
@ -201,35 +169,33 @@ void HPackCompressor::Framer::EmitIndexed(uint32_t elem_index) {
struct WireValue {
WireValue(uint8_t huffman_prefix, bool insert_null_before_wire_value,
const grpc_slice& slice)
: data(slice),
Slice slice)
: data(std::move(slice)),
huffman_prefix(huffman_prefix),
insert_null_before_wire_value(insert_null_before_wire_value),
length(GRPC_SLICE_LENGTH(slice) +
(insert_null_before_wire_value ? 1 : 0)) {}
// While wire_value is const from the POV of hpack encoder code, actually
// adding it to a slice buffer will possibly split the slice.
const grpc_slice data;
length(data.length() + (insert_null_before_wire_value ? 1 : 0)) {}
Slice data;
const uint8_t huffman_prefix;
const bool insert_null_before_wire_value;
const size_t length;
};
static WireValue GetWireValue(const grpc_slice& value, bool true_binary_enabled,
static WireValue GetWireValue(Slice value, bool true_binary_enabled,
bool is_bin_hdr) {
if (is_bin_hdr) {
if (true_binary_enabled) {
GRPC_STATS_INC_HPACK_SEND_BINARY();
return WireValue(0x00, true, grpc_slice_ref_internal(value));
return WireValue(0x00, true, std::move(value));
} else {
GRPC_STATS_INC_HPACK_SEND_BINARY_BASE64();
return WireValue(0x80, false,
grpc_chttp2_base64_encode_and_huffman_compress(value));
Slice(grpc_chttp2_base64_encode_and_huffman_compress(
value.c_slice())));
}
} else {
/* TODO(ctiller): opportunistically compress non-binary headers */
GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
return WireValue(0x00, false, grpc_slice_ref_internal(value));
return WireValue(0x00, false, std::move(value));
}
}
@ -244,38 +210,11 @@ struct UnsureIfInterned {
}
};
class StringValue {
public:
template <typename MetadataKeyType>
StringValue(MetadataKeyType, grpc_mdelem elem, bool use_true_binary_metadata)
: wire_value_(GetWireValue(GRPC_MDVALUE(elem), use_true_binary_metadata,
MetadataKeyType::IsBinary(GRPC_MDKEY(elem)))),
len_val_(wire_value_.length) {}
size_t prefix_length() const {
return len_val_.length() +
(wire_value_.insert_null_before_wire_value ? 1 : 0);
}
void WritePrefix(uint8_t* prefix_data) {
len_val_.Write(wire_value_.huffman_prefix, prefix_data);
if (wire_value_.insert_null_before_wire_value) {
prefix_data[len_val_.length()] = 0;
}
}
const grpc_slice& data() { return wire_value_.data; }
private:
WireValue wire_value_;
VarintWriter<1> len_val_;
};
class BinaryStringValue {
public:
explicit BinaryStringValue(const grpc_slice& value,
bool use_true_binary_metadata)
: wire_value_(GetWireValue(value, use_true_binary_metadata, true)),
explicit BinaryStringValue(Slice value, bool use_true_binary_metadata)
: wire_value_(
GetWireValue(std::move(value), use_true_binary_metadata, true)),
len_val_(wire_value_.length) {}
size_t prefix_length() const {
@ -290,7 +229,7 @@ class BinaryStringValue {
}
}
const grpc_slice& data() { return wire_value_.data; }
Slice data() { return std::move(wire_value_.data); }
private:
WireValue wire_value_;
@ -299,24 +238,24 @@ class BinaryStringValue {
class NonBinaryStringValue {
public:
explicit NonBinaryStringValue(const grpc_slice& value)
: value_(value), len_val_(GRPC_SLICE_LENGTH(value)) {}
explicit NonBinaryStringValue(Slice value)
: value_(std::move(value)), len_val_(value_.length()) {}
size_t prefix_length() const { return len_val_.length(); }
void WritePrefix(uint8_t* prefix_data) { len_val_.Write(0x00, prefix_data); }
const grpc_slice& data() { return value_; }
Slice data() { return std::move(value_); }
private:
grpc_slice value_;
Slice value_;
VarintWriter<1> len_val_;
};
class StringKey {
public:
explicit StringKey(grpc_slice key)
: key_(key), len_key_(GRPC_SLICE_LENGTH(key)) {}
explicit StringKey(Slice key)
: key_(std::move(key)), len_key_(key_.length()) {}
size_t prefix_length() const { return 1 + len_key_.length(); }
@ -325,98 +264,54 @@ class StringKey {
len_key_.Write(0x00, data + 1);
}
grpc_slice key() const { return key_; }
Slice key() { return std::move(key_); }
private:
grpc_slice key_;
Slice key_;
VarintWriter<1> len_key_;
};
void HPackCompressor::Framer::EmitLitHdrIncIdx(uint32_t key_index,
grpc_mdelem elem) {
GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX();
StringValue emit(DefinitelyInterned(), elem, use_true_binary_metadata_);
VarintWriter<2> key(key_index);
uint8_t* data = AddTiny(key.length() + emit.prefix_length());
key.Write(0x40, data);
emit.WritePrefix(data + key.length());
Add(emit.data());
}
void HPackCompressor::Framer::EmitLitHdrNotIdx(uint32_t key_index,
grpc_mdelem elem) {
GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX();
StringValue emit(DefinitelyInterned(), elem, use_true_binary_metadata_);
VarintWriter<4> key(key_index);
uint8_t* data = AddTiny(key.length() + emit.prefix_length());
key.Write(0x00, data);
emit.WritePrefix(data + key.length());
Add(emit.data());
}
void HPackCompressor::Framer::EmitLitHdrWithStringKeyIncIdx(grpc_mdelem elem) {
GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX_V();
GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
StringKey key(GRPC_MDKEY(elem));
key.WritePrefix(0x40, AddTiny(key.prefix_length()));
Add(grpc_slice_ref_internal(key.key()));
StringValue emit(DefinitelyInterned(), elem, use_true_binary_metadata_);
emit.WritePrefix(AddTiny(emit.prefix_length()));
Add(emit.data());
}
void HPackCompressor::Framer::EmitLitHdrWithNonBinaryStringKeyIncIdx(
const grpc_slice& key_slice, const grpc_slice& value_slice) {
Slice key_slice, Slice value_slice) {
GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX_V();
GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
StringKey key(key_slice);
StringKey key(std::move(key_slice));
key.WritePrefix(0x40, AddTiny(key.prefix_length()));
Add(grpc_slice_ref_internal(key.key()));
NonBinaryStringValue emit(value_slice);
emit.WritePrefix(AddTiny(emit.prefix_length()));
Add(grpc_slice_ref_internal(emit.data()));
}
void HPackCompressor::Framer::EmitLitHdrWithStringKeyNotIdx(grpc_mdelem elem) {
GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V();
GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
StringKey key(GRPC_MDKEY(elem));
key.WritePrefix(0x00, AddTiny(key.prefix_length()));
Add(grpc_slice_ref_internal(key.key()));
StringValue emit(UnsureIfInterned(), elem, use_true_binary_metadata_);
Add(key.key());
NonBinaryStringValue emit(std::move(value_slice));
emit.WritePrefix(AddTiny(emit.prefix_length()));
Add(emit.data());
}
void HPackCompressor::Framer::EmitLitHdrWithBinaryStringKeyNotIdx(
const grpc_slice& key_slice, const grpc_slice& value_slice) {
Slice key_slice, Slice value_slice) {
GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V();
GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
StringKey key(key_slice);
StringKey key(std::move(key_slice));
key.WritePrefix(0x00, AddTiny(key.prefix_length()));
Add(grpc_slice_ref_internal(key.key()));
BinaryStringValue emit(value_slice, use_true_binary_metadata_);
Add(key.key());
BinaryStringValue emit(std::move(value_slice), use_true_binary_metadata_);
emit.WritePrefix(AddTiny(emit.prefix_length()));
Add(emit.data());
}
void HPackCompressor::Framer::EmitLitHdrWithBinaryStringKeyIncIdx(
const grpc_slice& key_slice, const grpc_slice& value_slice) {
Slice key_slice, Slice value_slice) {
GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX_V();
GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
StringKey key(key_slice);
StringKey key(std::move(key_slice));
key.WritePrefix(0x40, AddTiny(key.prefix_length()));
Add(grpc_slice_ref_internal(key.key()));
BinaryStringValue emit(value_slice, use_true_binary_metadata_);
Add(key.key());
BinaryStringValue emit(std::move(value_slice), use_true_binary_metadata_);
emit.WritePrefix(AddTiny(emit.prefix_length()));
Add(emit.data());
}
void HPackCompressor::Framer::EmitLitHdrWithBinaryStringKeyNotIdx(
uint32_t key_index, const grpc_slice& value_slice) {
uint32_t key_index, Slice value_slice) {
GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX();
GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
BinaryStringValue emit(value_slice, use_true_binary_metadata_);
BinaryStringValue emit(std::move(value_slice), use_true_binary_metadata_);
VarintWriter<4> key(key_index);
uint8_t* data = AddTiny(key.length() + emit.prefix_length());
key.Write(0x00, data);
@ -425,15 +320,15 @@ void HPackCompressor::Framer::EmitLitHdrWithBinaryStringKeyNotIdx(
}
void HPackCompressor::Framer::EmitLitHdrWithNonBinaryStringKeyNotIdx(
const grpc_slice& key_slice, const grpc_slice& value_slice) {
Slice key_slice, Slice value_slice) {
GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V();
GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
StringKey key(key_slice);
StringKey key(std::move(key_slice));
key.WritePrefix(0x00, AddTiny(key.prefix_length()));
Add(grpc_slice_ref_internal(key.key()));
NonBinaryStringValue emit(value_slice);
Add(key.key());
NonBinaryStringValue emit(std::move(value_slice));
emit.WritePrefix(AddTiny(emit.prefix_length()));
Add(grpc_slice_ref_internal(emit.data()));
Add(emit.data());
}
void HPackCompressor::Framer::AdvertiseTableSizeChange() {
@ -441,128 +336,16 @@ void HPackCompressor::Framer::AdvertiseTableSizeChange() {
w.Write(0x20, AddTiny(w.length()));
}
void HPackCompressor::Framer::Log(grpc_mdelem elem) {
char* k = grpc_slice_to_c_string(GRPC_MDKEY(elem));
char* v = nullptr;
if (grpc_is_binary_header_internal(GRPC_MDKEY(elem))) {
v = grpc_dump_slice(GRPC_MDVALUE(elem), GPR_DUMP_HEX);
} else {
v = grpc_slice_to_c_string(GRPC_MDVALUE(elem));
}
gpr_log(
GPR_INFO,
"Encode: '%s: %s', elem_interned=%d [%d], k_interned=%d, v_interned=%d",
k, v, GRPC_MDELEM_IS_INTERNED(elem), GRPC_MDELEM_STORAGE(elem),
grpc_slice_is_interned(GRPC_MDKEY(elem)),
grpc_slice_is_interned(GRPC_MDVALUE(elem)));
gpr_free(k);
gpr_free(v);
}
struct EmitIndexedStatus {
EmitIndexedStatus() = default;
EmitIndexedStatus(uint32_t elem_hash, bool emitted, bool can_add)
: elem_hash(elem_hash), emitted(emitted), can_add(can_add) {}
const uint32_t elem_hash = 0;
const bool emitted = false;
const bool can_add = false;
};
/* encode an mdelem */
void HPackCompressor::Framer::EncodeDynamic(grpc_mdelem elem) {
const grpc_slice& elem_key = GRPC_MDKEY(elem);
// User-provided key len validated in grpc_validate_header_key_is_legal().
GPR_DEBUG_ASSERT(GRPC_SLICE_LENGTH(elem_key) > 0);
// Header ordering: all reserved headers (prefixed with ':') must precede
// regular headers. This can be a debug assert, since:
// 1) User cannot give us ':' headers (grpc_validate_header_key_is_legal()).
// 2) grpc filters/core should be checked during debug builds. */
#ifndef NDEBUG
if (GRPC_SLICE_START_PTR(elem_key)[0] != ':') { /* regular header */
seen_regular_header_ = true;
} else {
GPR_DEBUG_ASSERT(
!seen_regular_header_ &&
"Reserved header (colon-prefixed) happening after regular ones.");
}
#endif
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
Log(elem);
}
const bool elem_interned = GRPC_MDELEM_IS_INTERNED(elem);
const bool key_interned = elem_interned || grpc_slice_is_interned(elem_key);
// Key is not interned, emit literals.
if (!key_interned) {
EmitLitHdrWithStringKeyNotIdx(elem);
return;
}
/* Interned metadata => maybe already indexed. */
uint32_t elem_hash = 0;
if (elem_interned) {
// Update filter to see if we can perhaps add this elem.
elem_hash =
GRPC_MDELEM_STORAGE(elem) == GRPC_MDELEM_STORAGE_INTERNED
? reinterpret_cast<InternedMetadata*>(GRPC_MDELEM_DATA(elem))
->hash()
: reinterpret_cast<StaticMetadata*>(GRPC_MDELEM_DATA(elem))->hash();
bool can_add_to_hashtable =
compressor_->filter_elems_.AddElement(elem_hash % kNumFilterValues);
/* is this elem currently in the decoders table? */
auto indices_key =
compressor_->elem_index_.Lookup(KeyElem(elem, elem_hash));
if (indices_key.has_value() &&
compressor_->table_.ConvertableToDynamicIndex(*indices_key)) {
EmitIndexed(compressor_->table_.DynamicIndex(*indices_key));
return;
}
/* Didn't hit either cuckoo index, so no emit. */
if (!can_add_to_hashtable) elem_hash = 0;
}
/* should this elem be in the table? */
const size_t decoder_space_usage =
MetadataSizeInHPackTable(elem, use_true_binary_metadata_);
const bool decoder_space_available =
decoder_space_usage < kMaxDecoderSpaceUsage;
const bool should_add_elem =
elem_interned && decoder_space_available && elem_hash != 0;
/* no hits for the elem... maybe there's a key? */
const uint32_t key_hash = elem_key.refcount->Hash(elem_key);
auto indices_key =
compressor_->key_index_.Lookup(KeySliceRef(elem_key.refcount, key_hash));
if (indices_key.has_value() &&
compressor_->table_.ConvertableToDynamicIndex(*indices_key)) {
if (should_add_elem) {
EmitLitHdrIncIdx(compressor_->table_.DynamicIndex(*indices_key), elem);
compressor_->AddElem(elem, decoder_space_usage, elem_hash, key_hash);
} else {
EmitLitHdrNotIdx(compressor_->table_.DynamicIndex(*indices_key), elem);
}
return;
}
/* no elem, key in the table... fall back to literal emission */
const bool should_add_key = !elem_interned && decoder_space_available;
if (should_add_elem || should_add_key) {
EmitLitHdrWithStringKeyIncIdx(elem);
} else {
EmitLitHdrWithStringKeyNotIdx(elem);
}
if (should_add_elem) {
compressor_->AddElem(elem, decoder_space_usage, elem_hash, key_hash);
} else if (should_add_key) {
compressor_->AddKey(elem, decoder_space_usage, key_hash);
}
}
void HPackCompressor::SliceIndex::EmitTo(const grpc_slice& key,
void HPackCompressor::SliceIndex::EmitTo(absl::string_view key,
const Slice& value, Framer* framer) {
auto& table = framer->compressor_->table_;
using It = std::vector<ValueIndex>::iterator;
It prev = values_.end();
uint32_t transport_length =
GRPC_SLICE_LENGTH(key) + value.length() + hpack_constants::kEntryOverhead;
key.length() + value.length() + hpack_constants::kEntryOverhead;
if (transport_length > HPackEncoderTable::MaxEntrySize()) {
framer->EmitLitHdrWithNonBinaryStringKeyNotIdx(key, value.c_slice());
framer->EmitLitHdrWithNonBinaryStringKeyNotIdx(Slice::FromStaticString(key),
value.Ref());
return;
}
// Linear scan through previous values to see if we find the value.
@ -575,7 +358,8 @@ void HPackCompressor::SliceIndex::EmitTo(const grpc_slice& key,
} else {
// Not current, emit a new literal and update the index.
it->index = table.AllocateIndex(transport_length);
framer->EmitLitHdrWithNonBinaryStringKeyIncIdx(key, value.c_slice());
framer->EmitLitHdrWithNonBinaryStringKeyIncIdx(
Slice::FromStaticString(key), value.Ref());
}
// Bubble this entry up if we can - ensures that the most used values end
// up towards the start of the array.
@ -593,23 +377,33 @@ void HPackCompressor::SliceIndex::EmitTo(const grpc_slice& key,
}
// No hit, emit a new literal and add it to the index.
uint32_t index = table.AllocateIndex(transport_length);
framer->EmitLitHdrWithNonBinaryStringKeyIncIdx(key, value.c_slice());
framer->EmitLitHdrWithNonBinaryStringKeyIncIdx(Slice::FromStaticString(key),
value.Ref());
values_.emplace_back(value.Ref(), index);
}
void HPackCompressor::Framer::Encode(const Slice& key, const Slice& value) {
if (absl::EndsWith(key.as_string_view(), "-bin")) {
EmitLitHdrWithBinaryStringKeyNotIdx(key.Ref(), value.Ref());
} else {
EmitLitHdrWithNonBinaryStringKeyNotIdx(key.Ref(), value.Ref());
}
}
void HPackCompressor::Framer::Encode(HttpPathMetadata, const Slice& value) {
compressor_->path_index_.EmitTo(GRPC_MDSTR_PATH, value, this);
compressor_->path_index_.EmitTo(HttpPathMetadata::key(), value, this);
}
void HPackCompressor::Framer::Encode(HttpAuthorityMetadata,
const Slice& value) {
compressor_->authority_index_.EmitTo(GRPC_MDSTR_AUTHORITY, value, this);
compressor_->authority_index_.EmitTo(HttpAuthorityMetadata::key(), value,
this);
}
void HPackCompressor::Framer::Encode(TeMetadata, TeMetadata::ValueType value) {
GPR_ASSERT(value == TeMetadata::ValueType::kTrailers);
EncodeAlwaysIndexed(
&compressor_->te_index_, GRPC_MDSTR_TE, GRPC_MDSTR_TRAILERS,
&compressor_->te_index_, "te", Slice::FromStaticString("trailers"),
2 /* te */ + 8 /* trailers */ + hpack_constants::kEntryOverhead);
}
@ -619,11 +413,10 @@ void HPackCompressor::Framer::Encode(ContentTypeMetadata,
gpr_log(GPR_ERROR, "Not encoding bad content-type header");
return;
}
EncodeAlwaysIndexed(
&compressor_->content_type_index_, GRPC_MDSTR_CONTENT_TYPE,
StaticSlice::FromStaticString("application/grpc").c_slice(),
12 /* content-type */ + 16 /* application/grpc */ +
hpack_constants::kEntryOverhead);
EncodeAlwaysIndexed(&compressor_->content_type_index_, "content-type",
Slice::FromStaticString("application/grpc"),
12 /* content-type */ + 16 /* application/grpc */ +
hpack_constants::kEntryOverhead);
}
void HPackCompressor::Framer::Encode(HttpSchemeMetadata,
@ -643,12 +436,12 @@ void HPackCompressor::Framer::Encode(HttpSchemeMetadata,
void HPackCompressor::Framer::Encode(GrpcTraceBinMetadata, const Slice& slice) {
EncodeIndexedKeyWithBinaryValue(&compressor_->grpc_trace_bin_index_,
"grpc-trace-bin", slice.c_slice());
"grpc-trace-bin", slice.Ref());
}
void HPackCompressor::Framer::Encode(GrpcTagsBinMetadata, const Slice& slice) {
EncodeIndexedKeyWithBinaryValue(&compressor_->grpc_tags_bin_index_,
"grpc-tags-bin", slice.c_slice());
"grpc-tags-bin", slice.Ref());
}
void HPackCompressor::Framer::Encode(HttpStatusMetadata, uint32_t status) {
@ -680,10 +473,8 @@ void HPackCompressor::Framer::Encode(HttpStatusMetadata, uint32_t status) {
if (GPR_LIKELY(index != 0)) {
EmitIndexed(index);
} else {
char buffer[GPR_LTOA_MIN_BUFSIZE];
gpr_ltoa(status, buffer);
EmitLitHdrWithNonBinaryStringKeyIncIdx(
GRPC_MDSTR_STATUS, Slice::FromCopiedString(buffer).c_slice());
EmitLitHdrWithNonBinaryStringKeyIncIdx(Slice::FromStaticString(":status"),
Slice::FromInt64(status));
}
}
@ -697,9 +488,8 @@ void HPackCompressor::Framer::Encode(HttpMethodMetadata,
EmitIndexed(3); // :method: POST
break;
case HttpMethodMetadata::ValueType::kPut:
EmitLitHdrWithNonBinaryStringKeyNotIdx(
StaticSlice::FromStaticString(":method").c_slice(),
StaticSlice::FromStaticString("PUT").c_slice());
EmitLitHdrWithNonBinaryStringKeyNotIdx(Slice::FromStaticString(":method"),
Slice::FromStaticString("PUT"));
break;
case HttpMethodMetadata::ValueType::kInvalid:
GPR_ASSERT(false);
@ -708,28 +498,28 @@ void HPackCompressor::Framer::Encode(HttpMethodMetadata,
}
void HPackCompressor::Framer::EncodeAlwaysIndexed(uint32_t* index,
const grpc_slice& key,
const grpc_slice& value,
absl::string_view key,
Slice value,
uint32_t transport_length) {
if (compressor_->table_.ConvertableToDynamicIndex(*index)) {
EmitIndexed(compressor_->table_.DynamicIndex(*index));
} else {
*index = compressor_->table_.AllocateIndex(transport_length);
EmitLitHdrWithNonBinaryStringKeyIncIdx(key, value);
EmitLitHdrWithNonBinaryStringKeyIncIdx(Slice::FromStaticString(key),
std::move(value));
}
}
void HPackCompressor::Framer::EncodeIndexedKeyWithBinaryValue(
uint32_t* index, absl::string_view key, const grpc_slice& value) {
uint32_t* index, absl::string_view key, Slice value) {
if (compressor_->table_.ConvertableToDynamicIndex(*index)) {
EmitLitHdrWithBinaryStringKeyNotIdx(
compressor_->table_.DynamicIndex(*index), value);
compressor_->table_.DynamicIndex(*index), std::move(value));
} else {
*index = compressor_->table_.AllocateIndex(key.length() +
GRPC_SLICE_LENGTH(value) +
*index = compressor_->table_.AllocateIndex(key.length() + value.length() +
hpack_constants::kEntryOverhead);
EmitLitHdrWithBinaryStringKeyIncIdx(
StaticSlice::FromStaticString(key).c_slice(), value);
EmitLitHdrWithBinaryStringKeyIncIdx(Slice::FromStaticString(key),
std::move(value));
}
}
@ -762,15 +552,13 @@ void HPackCompressor::Framer::Encode(GrpcTimeoutMetadata,
hpack_constants::kEntryOverhead);
compressor_->previous_timeouts_.push_back(PreviousTimeout{timeout, index});
EmitLitHdrWithNonBinaryStringKeyIncIdx(
StaticSlice::FromStaticString(GrpcTimeoutMetadata::key()).c_slice(),
encoded.c_slice());
Slice::FromStaticString(GrpcTimeoutMetadata::key()), std::move(encoded));
}
void HPackCompressor::Framer::Encode(UserAgentMetadata, const Slice& slice) {
if (slice.length() > HPackEncoderTable::MaxEntrySize()) {
EmitLitHdrWithNonBinaryStringKeyNotIdx(
StaticSlice::FromStaticString(UserAgentMetadata::key()).c_slice(),
slice.c_slice());
Slice::FromStaticString(UserAgentMetadata::key()), slice.Ref());
return;
}
if (!slice.is_equivalent(compressor_->user_agent_)) {
@ -778,7 +566,7 @@ void HPackCompressor::Framer::Encode(UserAgentMetadata, const Slice& slice) {
compressor_->user_agent_index_ = 0;
}
EncodeAlwaysIndexed(
&compressor_->user_agent_index_, GRPC_MDSTR_USER_AGENT, slice.c_slice(),
&compressor_->user_agent_index_, "user-agent", slice.Ref(),
10 /* user-agent */ + slice.size() + hpack_constants::kEntryOverhead);
}
@ -793,19 +581,15 @@ void HPackCompressor::Framer::Encode(GrpcStatusMetadata,
return;
}
}
char buffer[GPR_LTOA_MIN_BUFSIZE];
gpr_ltoa(code, buffer);
grpc_slice key = ExternallyManagedSlice(GrpcStatusMetadata::key().data(),
GrpcStatusMetadata::key().size());
grpc_slice value = grpc_slice_from_copied_string(buffer);
const uint32_t transport_length = GRPC_SLICE_LENGTH(key) +
GRPC_SLICE_LENGTH(value) +
hpack_constants::kEntryOverhead;
Slice key = Slice::FromStaticString(GrpcStatusMetadata::key());
Slice value = Slice::FromInt64(code);
const uint32_t transport_length =
key.length() + value.length() + hpack_constants::kEntryOverhead;
if (index != nullptr) {
*index = compressor_->table_.AllocateIndex(transport_length);
EmitLitHdrWithNonBinaryStringKeyIncIdx(key, value);
EmitLitHdrWithNonBinaryStringKeyIncIdx(std::move(key), std::move(value));
} else {
EmitLitHdrWithNonBinaryStringKeyNotIdx(key, value);
EmitLitHdrWithNonBinaryStringKeyNotIdx(std::move(key), std::move(value));
}
}
@ -819,17 +603,17 @@ void HPackCompressor::Framer::Encode(GrpcEncodingMetadata,
return;
}
}
auto key = StaticSlice::FromStaticString(GrpcEncodingMetadata::key());
auto key = Slice::FromStaticString(GrpcEncodingMetadata::key());
auto encoded_value = GrpcEncodingMetadata::Encode(value);
uint32_t transport_length =
key.length() + encoded_value.length() + hpack_constants::kEntryOverhead;
if (index != nullptr) {
*index = compressor_->table_.AllocateIndex(transport_length);
EmitLitHdrWithNonBinaryStringKeyIncIdx(key.c_slice(),
encoded_value.c_slice());
EmitLitHdrWithNonBinaryStringKeyIncIdx(std::move(key),
std::move(encoded_value));
} else {
EmitLitHdrWithNonBinaryStringKeyNotIdx(key.c_slice(),
encoded_value.c_slice());
EmitLitHdrWithNonBinaryStringKeyNotIdx(std::move(key),
std::move(encoded_value));
}
}
@ -843,15 +627,15 @@ void HPackCompressor::Framer::Encode(GrpcAcceptEncodingMetadata,
compressor_->grpc_accept_encoding_index_));
return;
}
auto key = StaticSlice::FromStaticString(GrpcAcceptEncodingMetadata::key());
auto key = Slice::FromStaticString(GrpcAcceptEncodingMetadata::key());
auto encoded_value = GrpcAcceptEncodingMetadata::Encode(value);
uint32_t transport_length =
key.length() + encoded_value.length() + hpack_constants::kEntryOverhead;
compressor_->grpc_accept_encoding_index_ =
compressor_->table_.AllocateIndex(transport_length);
compressor_->grpc_accept_encoding_ = value;
EmitLitHdrWithNonBinaryStringKeyIncIdx(key.c_slice(),
encoded_value.c_slice());
EmitLitHdrWithNonBinaryStringKeyIncIdx(std::move(key),
std::move(encoded_value));
}
void HPackCompressor::SetMaxUsableSize(uint32_t max_table_size) {
@ -885,16 +669,4 @@ HPackCompressor::Framer::Framer(const EncodeHeaderOptions& options,
}
}
void HPackCompressor::Framer::Encode(grpc_mdelem md) {
if (GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_STATIC) {
const uintptr_t static_index =
reinterpret_cast<StaticMetadata*>(GRPC_MDELEM_DATA(md))->StaticIndex();
if (static_index < hpack_constants::kLastStaticEntry) {
EmitIndexed(static_cast<uint32_t>(static_index + 1));
return;
}
}
EncodeDynamic(md);
}
} // namespace grpc_core

@ -27,10 +27,7 @@
#include <grpc/slice_buffer.h>
#include "src/core/ext/transport/chttp2/transport/frame.h"
#include "src/core/ext/transport/chttp2/transport/hpack_encoder_index.h"
#include "src/core/ext/transport/chttp2/transport/hpack_encoder_table.h"
#include "src/core/ext/transport/chttp2/transport/popularity_count.h"
#include "src/core/lib/transport/metadata.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/transport.h"
@ -79,7 +76,7 @@ class HPackCompressor {
Framer(const Framer&) = delete;
Framer& operator=(const Framer&) = delete;
void Encode(grpc_mdelem md);
void Encode(const Slice& key, const Slice& value);
void Encode(HttpPathMetadata, const Slice& value);
void Encode(HttpAuthorityMetadata, const Slice& value);
void Encode(HttpStatusMetadata, uint32_t status);
@ -97,20 +94,17 @@ class HPackCompressor {
void Encode(GrpcMessageMetadata, const Slice& slice) {
if (slice.empty()) return;
EmitLitHdrWithNonBinaryStringKeyNotIdx(
StaticSlice::FromStaticString("grpc-message").c_slice(),
slice.c_slice());
Slice::FromStaticString("grpc-message"), slice.Ref());
}
template <typename Which>
void Encode(Which, const typename Which::ValueType& value) {
const Slice& slice = MetadataValueAsSlice<Which>(value);
if (absl::EndsWith(Which::key(), "-bin")) {
EmitLitHdrWithBinaryStringKeyNotIdx(
StaticSlice::FromStaticString(Which::key()).c_slice(),
slice.c_slice());
Slice::FromStaticString(Which::key()), slice.Ref());
} else {
EmitLitHdrWithNonBinaryStringKeyNotIdx(
StaticSlice::FromStaticString(Which::key()).c_slice(),
slice.c_slice());
Slice::FromStaticString(Which::key()), slice.Ref());
}
}
@ -131,32 +125,24 @@ class HPackCompressor {
void AdvertiseTableSizeChange();
void EmitIndexed(uint32_t index);
void EncodeDynamic(grpc_mdelem elem);
static GPR_ATTRIBUTE_NOINLINE void Log(grpc_mdelem elem);
void EmitLitHdrIncIdx(uint32_t key_index, grpc_mdelem elem);
void EmitLitHdrNotIdx(uint32_t key_index, grpc_mdelem elem);
void EmitLitHdrWithStringKeyIncIdx(grpc_mdelem elem);
void EmitLitHdrWithNonBinaryStringKeyIncIdx(const grpc_slice& key_slice,
const grpc_slice& value_slice);
void EmitLitHdrWithBinaryStringKeyIncIdx(const grpc_slice& key_slice,
const grpc_slice& value_slice);
void EmitLitHdrWithBinaryStringKeyNotIdx(const grpc_slice& key_slice,
const grpc_slice& value_slice);
void EmitLitHdrWithNonBinaryStringKeyIncIdx(Slice key_slice,
Slice value_slice);
void EmitLitHdrWithBinaryStringKeyIncIdx(Slice key_slice,
Slice value_slice);
void EmitLitHdrWithBinaryStringKeyNotIdx(Slice key_slice,
Slice value_slice);
void EmitLitHdrWithBinaryStringKeyNotIdx(uint32_t key_index,
const grpc_slice& value_slice);
void EmitLitHdrWithNonBinaryStringKeyNotIdx(const grpc_slice& key_slice,
const grpc_slice& value_slice);
void EmitLitHdrWithStringKeyNotIdx(grpc_mdelem elem);
void EncodeAlwaysIndexed(uint32_t* index, const grpc_slice& key,
const grpc_slice& value,
uint32_t transport_length);
Slice value_slice);
void EmitLitHdrWithNonBinaryStringKeyNotIdx(Slice key_slice,
Slice value_slice);
void EncodeAlwaysIndexed(uint32_t* index, absl::string_view key,
Slice value, uint32_t transport_length);
void EncodeIndexedKeyWithBinaryValue(uint32_t* index, absl::string_view key,
const grpc_slice& value);
Slice value);
size_t CurrentFrameSize() const;
void Add(grpc_slice slice);
void Add(Slice slice);
uint8_t* AddTiny(size_t len);
// maximum size of a frame
@ -166,10 +152,6 @@ class HPackCompressor {
const bool is_end_of_stream_;
// output stream id
const uint32_t stream_id_;
#ifndef NDEBUG
// have we seen a regular (non-colon-prefixed) header yet?
bool seen_regular_header_ = false;
#endif
grpc_slice_buffer* const output_;
grpc_transport_one_way_stats* const stats_;
HPackCompressor* const compressor_;
@ -180,14 +162,6 @@ class HPackCompressor {
static constexpr size_t kNumFilterValues = 64;
static constexpr uint32_t kNumCachedGrpcStatusValues = 16;
void AddKeyWithIndex(grpc_slice_refcount* key_ref, uint32_t new_index,
uint32_t key_hash);
void AddElemWithIndex(grpc_mdelem elem, uint32_t new_index,
uint32_t elem_hash, uint32_t key_hash);
void AddElem(grpc_mdelem elem, size_t elem_size, uint32_t elem_hash,
uint32_t key_hash);
void AddKey(grpc_mdelem elem, size_t elem_size, uint32_t key_hash);
// maximum number of bytes we'll use for the decode table (to guard against
// peers ooming us by setting decode table size high)
uint32_t max_usable_size_ = hpack_constants::kInitialTableSize;
@ -196,89 +170,9 @@ class HPackCompressor {
bool advertise_table_size_change_ = false;
HPackEncoderTable table_;
// filter tables for elems: this tables provides an approximate
// popularity count for particular hashes, and are used to determine whether
// a new literal should be added to the compression table or not.
// They track a single integer that counts how often a particular value has
// been seen. When that count reaches max (255), all values are halved.
PopularityCount<kNumFilterValues> filter_elems_;
class KeyElem {
public:
class Stored {
public:
Stored() : elem_(GRPC_MDNULL) {}
explicit Stored(grpc_mdelem elem) : elem_(GRPC_MDELEM_REF(elem)) {}
Stored(const Stored& other) : elem_(GRPC_MDELEM_REF(other.elem_)) {}
Stored& operator=(Stored other) {
std::swap(elem_, other.elem_);
return *this;
}
~Stored() { GRPC_MDELEM_UNREF(elem_); }
const grpc_mdelem& elem() const { return elem_; }
bool operator==(const Stored& other) const noexcept {
return elem_.payload == other.elem_.payload;
}
private:
grpc_mdelem elem_;
};
KeyElem(grpc_mdelem elem, uint32_t hash) : elem_(elem), hash_(hash) {}
KeyElem(const KeyElem&);
KeyElem& operator=(const KeyElem&);
uint32_t hash() const {
// TODO(ctiller): unify this with what's in the cc file when we move this
// code to c++
return hash_ >> 6;
}
Stored stored() const { return Stored(elem_); }
bool operator==(const Stored& stored) const noexcept {
return elem_.payload == stored.elem().payload;
}
private:
grpc_mdelem elem_;
uint32_t hash_;
};
class KeySliceRef {
public:
using Stored = RefCountedPtr<grpc_slice_refcount>;
KeySliceRef(grpc_slice_refcount* ref, uint32_t hash)
: ref_(ref), hash_(hash) {}
KeySliceRef(const KeySliceRef&) = delete;
KeySliceRef& operator=(const KeySliceRef&) = delete;
uint32_t hash() const {
// TODO(ctiller): unify this with what's in the cc file when we move this
// code to c++
return hash_ >> 6;
}
Stored stored() const {
ref_->Ref();
return Stored(ref_);
}
bool operator==(const Stored& stored) const noexcept {
return ref_ == stored.get();
}
private:
grpc_slice_refcount* ref_;
uint32_t hash_;
};
class SliceIndex {
public:
void EmitTo(const grpc_slice& key, const Slice& value, Framer* framer);
void EmitTo(absl::string_view key, const Slice& value, Framer* framer);
private:
struct ValueIndex {
@ -295,10 +189,6 @@ class HPackCompressor {
uint32_t index;
};
// entry tables for keys & elems: these tables track values that have been
// seen and *may* be in the decompressor table
HPackEncoderIndex<KeyElem, kNumFilterValues> elem_index_;
HPackEncoderIndex<KeySliceRef, kNumFilterValues> key_index_;
// Index into table_ for the te:trailers metadata element
uint32_t te_index_ = 0;
// Index into table_ for the content-type metadata element

@ -1,107 +0,0 @@
// Copyright 2021 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_ENCODER_INDEX_H
#define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_ENCODER_INDEX_H
#include <grpc/support/port_platform.h>
#include "absl/types/optional.h"
namespace grpc_core {
// A fixed size mapping of a key to a chronologically ordered index
template <typename Key, size_t kNumEntries>
class HPackEncoderIndex {
public:
using Index = uint32_t;
HPackEncoderIndex() : entries_{} {}
// If key exists in the table, update it to a new index.
// If it does not and there is an empty slot, add it to the index.
// Finally, if it does not and there is no empty slot, evict the oldest
// conflicting member.
void Insert(const Key& key, Index new_index) {
auto* const cuckoo_first = first_slot(key);
if (cuckoo_first->UpdateOrAdd(key, new_index)) return;
auto* const cuckoo_second = second_slot(key);
if (cuckoo_second->UpdateOrAdd(key, new_index)) return;
auto* const clobber = Older(cuckoo_first, cuckoo_second);
clobber->key = key.stored();
clobber->index = new_index;
}
// Lookup key and return its index, or return empty if it's not in this table.
absl::optional<Index> Lookup(const Key& key) {
auto* const cuckoo_first = first_slot(key);
if (key == cuckoo_first->key) return cuckoo_first->index;
auto* const cuckoo_second = second_slot(key);
if (key == cuckoo_second->key) return cuckoo_second->index;
return {};
}
private:
using StoredKey = typename Key::Stored;
// One entry in the index
struct Entry {
Entry() : key{}, index{} {};
StoredKey key;
Index index;
// Update this entry if it matches key, otherwise if it's empty add it.
// If neither happens, return false.
bool UpdateOrAdd(const Key& new_key, Index new_index) {
if (new_key == key) {
index = new_index;
return true;
} else if (key == StoredKey()) {
key = new_key.stored();
index = new_index;
return true;
} else {
return false;
}
}
};
static Entry* Older(Entry* a, Entry* b) {
if (a->index < b->index) {
return a;
} else {
return b;
}
}
// Return the first slot in which key could be stored.
Entry* first_slot(const Key& key) {
return &entries_[key.hash() % kNumEntries];
}
// Return the second slot in which key could be stored.
Entry* second_slot(const Key& key) {
return &entries_[(key.hash() / kNumEntries) % kNumEntries];
}
// Fixed size entry map.
// We store each key/value pair in two slots based on it's hash value.
// They can be evicted individually.
Entry entries_[kNumEntries];
};
} // namespace grpc_core
#endif // GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_ENCODER_INDEX_H

@ -1076,11 +1076,7 @@ class HPackParser::Parser {
return HandleMetadataSizeLimitExceeded(md);
}
grpc_error_handle err = metadata_buffer_->Set(md);
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) {
input_->SetError(err);
return false;
}
metadata_buffer_->Set(md);
return true;
}

@ -25,7 +25,6 @@
#include "src/core/ext/transport/chttp2/transport/frame.h"
#include "src/core/ext/transport/chttp2/transport/hpack_parser_table.h"
#include "src/core/lib/transport/metadata.h"
#include "src/core/lib/transport/metadata_batch.h"
namespace grpc_core {

@ -24,6 +24,7 @@
#include <string.h>
#include "absl/strings/str_format.h"
#include "hpack_constants.h"
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
@ -32,7 +33,6 @@
#include "src/core/lib/gpr/murmur_hash.h"
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/surface/validate_metadata.h"
#include "src/core/lib/transport/static_metadata.h"
extern grpc_core::TraceFlag grpc_http_trace;
@ -143,4 +143,97 @@ grpc_error_handle HPackTable::Add(Memento md) {
return GRPC_ERROR_NONE;
}
namespace {
struct StaticTableEntry {
const char* key;
const char* value;
};
const StaticTableEntry kStaticTable[hpack_constants::kLastStaticEntry] = {
{":authority", ""},
{":method", "GET"},
{":method", "POST"},
{":path", "/"},
{":path", "/index.html"},
{":scheme", "http"},
{":scheme", "https"},
{":status", "200"},
{":status", "204"},
{":status", "206"},
{":status", "304"},
{":status", "400"},
{":status", "404"},
{":status", "500"},
{"accept-charset", ""},
{"accept-encoding", "gzip, deflate"},
{"accept-language", ""},
{"accept-ranges", ""},
{"accept", ""},
{"access-control-allow-origin", ""},
{"age", ""},
{"allow", ""},
{"authorization", ""},
{"cache-control", ""},
{"content-disposition", ""},
{"content-encoding", ""},
{"content-language", ""},
{"content-length", ""},
{"content-location", ""},
{"content-range", ""},
{"content-type", ""},
{"cookie", ""},
{"date", ""},
{"etag", ""},
{"expect", ""},
{"expires", ""},
{"from", ""},
{"host", ""},
{"if-match", ""},
{"if-modified-since", ""},
{"if-none-match", ""},
{"if-range", ""},
{"if-unmodified-since", ""},
{"last-modified", ""},
{"link", ""},
{"location", ""},
{"max-forwards", ""},
{"proxy-authenticate", ""},
{"proxy-authorization", ""},
{"range", ""},
{"referer", ""},
{"refresh", ""},
{"retry-after", ""},
{"server", ""},
{"set-cookie", ""},
{"strict-transport-security", ""},
{"transfer-encoding", ""},
{"user-agent", ""},
{"vary", ""},
{"via", ""},
{"www-authenticate", ""},
};
GPR_ATTRIBUTE_NOINLINE HPackTable::Memento MakeMemento(size_t i) {
auto sm = kStaticTable[i];
return grpc_metadata_batch::Parse(
sm.key, Slice::FromStaticString(sm.value),
strlen(sm.key) + strlen(sm.value) + hpack_constants::kEntryOverhead,
[](absl::string_view, const Slice&) {
abort(); // not expecting to see this
});
}
} // namespace
const HPackTable::StaticMementos& HPackTable::GetStaticMementos() {
static const StaticMementos static_mementos;
return static_mementos;
}
HPackTable::StaticMementos::StaticMementos() {
for (uint32_t i = 0; i < hpack_constants::kLastStaticEntry; i++) {
memento[i] = MakeMemento(i);
}
}
} // namespace grpc_core

@ -26,9 +26,7 @@
#include "src/core/ext/transport/chttp2/transport/hpack_constants.h"
#include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/transport/metadata.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/static_metadata.h"
namespace grpc_core {
@ -69,23 +67,10 @@ class HPackTable {
private:
struct StaticMementos {
StaticMementos() {
for (uint32_t i = 0; i < hpack_constants::kLastStaticEntry; i++) {
const grpc_mdelem_data& sm = g_static_mdelem_table[i].data();
memento[i] = grpc_metadata_batch::Parse(
StringViewFromSlice(sm.key),
Slice(grpc_slice_ref_internal(sm.value)),
GRPC_SLICE_LENGTH(sm.key) + GRPC_SLICE_LENGTH(sm.value) +
hpack_constants::kEntryOverhead,
[](absl::string_view, const Slice&) {});
}
}
StaticMementos();
Memento memento[hpack_constants::kLastStaticEntry];
};
static const StaticMementos& GetStaticMementos() {
static const StaticMementos static_mementos;
return static_mementos;
}
static const StaticMementos& GetStaticMementos() GPR_ATTRIBUTE_NOINLINE;
enum { kInlineEntries = hpack_constants::kInitialTableEntries };
using EntriesVec = absl::InlinedVector<Memento, kInlineEntries>;
@ -127,17 +112,4 @@ class HPackTable {
} // namespace grpc_core
/* Returns the static hpack table index that corresponds to /a elem. Returns 0
if /a elem is not statically stored or if it is not in the static hpack
table */
inline uintptr_t grpc_chttp2_get_static_hpack_table_index(grpc_mdelem md) {
uintptr_t index =
reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(md)) -
grpc_core::g_static_mdelem_table;
if (index < grpc_core::hpack_constants::kLastStaticEntry) {
return index + 1; // Hpack static metadata element indices start at 1
}
return 0;
}
#endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_TABLE_H */

@ -1,46 +0,0 @@
// Copyright 2021 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <grpc/support/port_platform.h>
#include "src/core/ext/transport/chttp2/transport/hpack_utils.h"
#include "src/core/lib/surface/validate_metadata.h"
namespace grpc_core {
namespace {
size_t Base64EncodedSize(size_t raw_length) {
static constexpr uint8_t tail_xtra[3] = {0, 2, 3};
return raw_length / 3 * 4 + tail_xtra[raw_length % 3];
}
} // namespace
// Return the size occupied by some metadata in the HPACK table.
size_t MetadataSizeInHPackTable(grpc_mdelem elem,
bool use_true_binary_metadata) {
const uint8_t* key_buf = GRPC_SLICE_START_PTR(GRPC_MDKEY(elem));
size_t key_len = GRPC_SLICE_LENGTH(GRPC_MDKEY(elem));
size_t overhead_and_key = 32 + key_len;
size_t value_len = GRPC_SLICE_LENGTH(GRPC_MDVALUE(elem));
if (grpc_key_is_binary_header(key_buf, key_len)) {
return overhead_and_key + (use_true_binary_metadata
? value_len + 1
: Base64EncodedSize(value_len));
} else {
return overhead_and_key + value_len;
}
}
} // namespace grpc_core

@ -1,30 +0,0 @@
// Copyright 2021 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_UTILS_H
#define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_UTILS_H
#include <grpc/support/port_platform.h>
#include "src/core/lib/transport/metadata.h"
namespace grpc_core {
// Return the size occupied by some metadata in the HPACK table.
size_t MetadataSizeInHPackTable(grpc_mdelem elem,
bool use_true_binary_metadata);
} // namespace grpc_core
#endif // GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_UTILS_H

@ -31,7 +31,6 @@
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/slice/slice_utils.h"
#include "src/core/lib/transport/http2_errors.h"
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/transport/status_conversion.h"
#include "src/core/lib/transport/timeout_encoding.h"
@ -306,11 +305,6 @@ static grpc_error_handle skip_parser(void* /*parser*/,
return GRPC_ERROR_NONE;
}
grpc_error_handle skip_header(grpc_mdelem md) {
GRPC_MDELEM_UNREF(md);
return GRPC_ERROR_NONE;
}
static HPackParser::Boundary hpack_boundary_type(grpc_chttp2_transport* t,
bool is_eoh) {
if (is_eoh) {

@ -1,60 +0,0 @@
// Copyright 2021 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_POPULARITY_COUNT_H
#define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_POPULARITY_COUNT_H
#include <grpc/support/port_platform.h>
namespace grpc_core {
// filter tables for elems: this tables provides an approximate
// popularity count for particular hashes, and are used to determine whether
// a new literal should be added to the compression table or not.
// They track a single integer that counts how often a particular value has
// been seen. When that count reaches max (255), all values are halved. */
template <uint8_t kElems>
class PopularityCount {
public:
PopularityCount() : sum_{0}, elems_{} {}
// increment a filter count, halve all counts if one element reaches max
// return true if this element seems to be popular, false otherwise
bool AddElement(uint8_t idx) {
elems_[idx]++;
if (GPR_LIKELY(elems_[idx] < 255)) {
sum_++;
} else {
HalveFilter();
}
return elems_[idx] >= 2 * sum_ / kElems;
}
private:
// halve all counts because an element reached max
void HalveFilter() {
sum_ = 0;
for (int i = 0; i < kElems; i++) {
elems_[i] /= 2;
sum_ += elems_[i];
}
}
uint32_t sum_;
uint8_t elems_[kElems];
};
} // namespace grpc_core
#endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_POPULARITY_COUNT_H */

@ -185,10 +185,30 @@ static uint32_t target_write_size(grpc_chttp2_transport* /*t*/) {
return 1024 * 1024;
}
namespace {
class CountDefaultMetadataEncoder {
public:
size_t count() const { return count_; }
void Encode(const grpc_core::Slice&, const grpc_core::Slice&) {}
template <typename Which>
void Encode(Which, const typename Which::ValueType&) {
count_++;
}
private:
size_t count_ = 0;
};
} // namespace
// Returns true if initial_metadata contains only default headers.
static bool is_default_initial_metadata(grpc_metadata_batch* initial_metadata) {
return initial_metadata->default_count() ==
initial_metadata->non_deadline_count();
CountDefaultMetadataEncoder enc;
initial_metadata->Encode(&enc);
return enc.count() == initial_metadata->count();
}
namespace {

@ -45,7 +45,6 @@
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/surface/validate_metadata.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/transport/timeout_encoding.h"
#include "src/core/lib/transport/transport_impl.h"
@ -722,12 +721,8 @@ class CronetMetadataEncoder {
template <class T, class V>
void Encode(T, const V& value) {
auto value_slice = T::Encode(value);
auto key_slice =
grpc_core::ExternallyManagedSlice(T::key().data(), T::key().length());
auto mdelem = grpc_mdelem_from_slices(key_slice, value_slice.TakeCSlice());
Encode(mdelem);
GRPC_MDELEM_UNREF(mdelem);
Encode(grpc_core::Slice::FromStaticString(T::key()),
grpc_core::Slice(T::Encode(value)));
}
void Encode(grpc_core::HttpSchemeMetadata,
@ -762,15 +757,16 @@ class CronetMetadataEncoder {
*url_ = absl::StrCat("https://", host_, path.as_string_view());
}
void Encode(grpc_mdelem mdelem) {
char* key = grpc_slice_to_c_string(GRPC_MDKEY(mdelem));
void Encode(const grpc_core::Slice& key_slice,
const grpc_core::Slice& value_slice) {
char* key = grpc_slice_to_c_string(key_slice.c_slice());
char* value;
if (grpc_is_binary_header_internal(GRPC_MDKEY(mdelem))) {
grpc_slice wire_value = grpc_chttp2_base64_encode(GRPC_MDVALUE(mdelem));
if (grpc_is_binary_header_internal(value_slice.c_slice())) {
grpc_slice wire_value = grpc_chttp2_base64_encode(value_slice.c_slice());
value = grpc_slice_to_c_string(wire_value);
grpc_slice_unref_internal(wire_value);
} else {
value = grpc_slice_to_c_string(GRPC_MDVALUE(mdelem));
value = grpc_slice_to_c_string(value_slice.c_slice());
}
CRONET_LOG(GPR_DEBUG, "header %s = %s", key, value);
GPR_ASSERT(count_ < capacity_);

@ -22,7 +22,3 @@
#include "src/core/lib/debug/trace.h"
grpc_core::TraceFlag grpc_inproc_trace(false, "inproc");
void grpc_inproc_plugin_init(void) { grpc_inproc_transport_init(); }
void grpc_inproc_plugin_shutdown(void) { grpc_inproc_transport_shutdown(); }

@ -46,12 +46,6 @@
} while (0)
namespace {
grpc_slice g_empty_slice;
grpc_slice g_fake_path_key;
grpc_slice g_fake_path_value;
grpc_slice g_fake_auth_key;
grpc_slice g_fake_auth_value;
struct inproc_stream;
bool cancel_stream_locked(inproc_stream* s, grpc_error_handle error);
void maybe_process_ops_locked(inproc_stream* s, grpc_error_handle error);
@ -280,13 +274,10 @@ struct inproc_stream {
void log_metadata(const grpc_metadata_batch* md_batch, bool is_client,
bool is_initial) {
md_batch->ForEach([=](grpc_mdelem md) {
char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
char* value = grpc_slice_to_c_string(GRPC_MDVALUE(md));
gpr_log(GPR_INFO, "INPROC:%s:%s: %s: %s", is_initial ? "HDR" : "TRL",
is_client ? "CLI" : "SVR", key, value);
gpr_free(key);
gpr_free(value);
std::string prefix = absl::StrCat(
"INPROC:", is_initial ? "HDR:" : "TRL:", is_client ? "CLI:" : "SVR:");
md_batch->Log([&prefix](absl::string_view key, absl::string_view value) {
gpr_log(GPR_INFO, "%s", absl::StrCat(prefix, key, ": ", value).c_str());
});
}
@ -296,19 +287,9 @@ class CopySink {
public:
explicit CopySink(grpc_metadata_batch* dst) : dst_(dst) {}
void Encode(grpc_mdelem md) {
// Differently to grpc_metadata_batch_copy, we always copy slices here so
// that we don't need to deal with the plethora of edge cases in that world.
// TODO(ctiller): revisit this when deleting mdelem.
md = grpc_mdelem_from_slices(grpc_slice_intern(GRPC_MDKEY(md)),
grpc_slice_copy(GRPC_MDVALUE(md)));
// Error unused in non-debug builds.
grpc_error_handle GRPC_UNUSED error = dst_->Append(md);
// The only way that Append() can fail is if
// there's a duplicate entry for a callout. However, that can't be
// the case here, because we would not have been allowed to create
// a source batch that had that kind of conflict.
GPR_DEBUG_ASSERT(error == GRPC_ERROR_NONE);
void Encode(const grpc_core::Slice& key, const grpc_core::Slice& value) {
dst_->Append(key.as_string_view(), value.AsOwned(),
[](absl::string_view, const grpc_core::Slice&) {});
}
template <class T, class V>
@ -462,14 +443,10 @@ void fail_helper_locked(inproc_stream* s, grpc_error_handle error) {
// If this is a server, provide initial metadata with a path and authority
// since it expects that as well as no error yet
grpc_metadata_batch fake_md(s->arena);
grpc_linked_mdelem* path_md =
static_cast<grpc_linked_mdelem*>(s->arena->Alloc(sizeof(*path_md)));
path_md->md = grpc_mdelem_from_slices(g_fake_path_key, g_fake_path_value);
GPR_ASSERT(fake_md.LinkTail(path_md) == GRPC_ERROR_NONE);
grpc_linked_mdelem* auth_md =
static_cast<grpc_linked_mdelem*>(s->arena->Alloc(sizeof(*auth_md)));
auth_md->md = grpc_mdelem_from_slices(g_fake_auth_key, g_fake_auth_value);
GPR_ASSERT(fake_md.LinkTail(auth_md) == GRPC_ERROR_NONE);
fake_md.Set(grpc_core::HttpPathMetadata(),
grpc_core::Slice::FromStaticString("/"));
fake_md.Set(grpc_core::HttpAuthorityMetadata(),
grpc_core::Slice::FromStaticString("inproc-fail"));
(void)fill_in_metadata(
s, &fake_md, 0,
@ -1260,26 +1237,6 @@ void inproc_transports_create(grpc_transport** server_transport,
}
} // namespace
/*******************************************************************************
* GLOBAL INIT AND DESTROY
*/
void grpc_inproc_transport_init(void) {
grpc_core::ExecCtx exec_ctx;
g_empty_slice = grpc_core::ExternallyManagedSlice();
grpc_slice key_tmp = grpc_slice_from_static_string(":path");
g_fake_path_key = grpc_slice_intern(key_tmp);
grpc_slice_unref_internal(key_tmp);
g_fake_path_value = grpc_slice_from_static_string("/");
grpc_slice auth_tmp = grpc_slice_from_static_string(":authority");
g_fake_auth_key = grpc_slice_intern(auth_tmp);
grpc_slice_unref_internal(auth_tmp);
g_fake_auth_value = grpc_slice_from_static_string("inproc-fail");
}
grpc_channel* grpc_inproc_channel_create(grpc_server* server,
const grpc_channel_args* args,
void* /*reserved*/) {
@ -1358,12 +1315,3 @@ grpc_channel* grpc_inproc_channel_create(grpc_server* server,
return channel;
}
void grpc_inproc_transport_shutdown(void) {
grpc_core::ExecCtx exec_ctx;
grpc_slice_unref_internal(g_empty_slice);
grpc_slice_unref_internal(g_fake_path_key);
grpc_slice_unref_internal(g_fake_path_value);
grpc_slice_unref_internal(g_fake_auth_key);
grpc_slice_unref_internal(g_fake_auth_value);
}

@ -29,7 +29,4 @@ grpc_channel* grpc_inproc_channel_create(grpc_server* server,
extern grpc_core::TraceFlag grpc_inproc_trace;
void grpc_inproc_transport_init(void);
void grpc_inproc_transport_shutdown(void);
#endif /* GRPC_CORE_EXT_TRANSPORT_INPROC_INPROC_TRANSPORT_H */

@ -57,7 +57,6 @@
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/surface/call.h"
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/uri/uri_parser.h"
#define GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS 1
@ -910,13 +909,16 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
// the polling entities from client_channel.
GPR_ASSERT(xds_client() != nullptr);
// Create a call with the specified method name.
const auto& method =
const char* method =
chand()->server_.ShouldUseV3()
? GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V3_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES
: GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V2_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES;
? "/envoy.service.discovery.v3.AggregatedDiscoveryService/"
"StreamAggregatedResources"
: "/envoy.service.discovery.v2.AggregatedDiscoveryService/"
"StreamAggregatedResources";
call_ = grpc_channel_create_pollset_set_call(
chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
xds_client()->interested_parties_, method, nullptr,
xds_client()->interested_parties_,
StaticSlice::FromStaticString(method).c_slice(), nullptr,
GRPC_MILLIS_INF_FUTURE, nullptr);
GPR_ASSERT(call_ != nullptr);
// Init data associated with the call.
@ -1451,13 +1453,14 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
// activity in xds_client()->interested_parties_, which is comprised of
// the polling entities from client_channel.
GPR_ASSERT(xds_client() != nullptr);
const auto& method =
const char* method =
chand()->server_.ShouldUseV3()
? GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V3_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS
: GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V2_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS;
? "/envoy.service.load_stats.v3.LoadReportingService/StreamLoadStats"
: "/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats";
call_ = grpc_channel_create_pollset_set_call(
chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
xds_client()->interested_parties_, method, nullptr,
xds_client()->interested_parties_,
StaticSlice::FromStaticString(method).c_slice(), nullptr,
GRPC_MILLIS_INF_FUTURE, nullptr);
GPR_ASSERT(call_ != nullptr);
// Init the request payload.

@ -174,8 +174,7 @@ absl::optional<absl::string_view> XdsRouting::GetHeaderValue(
} else if (header_name == "content-type") {
return "application/grpc";
}
return grpc_metadata_batch_get_value(initial_metadata, header_name,
concatenated_value);
return initial_metadata->GetStringValue(header_name, concatenated_value);
}
namespace {

@ -27,7 +27,6 @@
#include "src/core/lib/gpr/useful.h"
#include "src/core/lib/slice/slice_utils.h"
#include "src/core/lib/surface/api_trace.h"
#include "src/core/lib/transport/static_metadata.h"
int grpc_compression_algorithm_is_message(grpc_compression_algorithm) {
return 1;

@ -35,7 +35,6 @@
#include "src/core/lib/gpr/useful.h"
#include "src/core/lib/slice/slice_utils.h"
#include "src/core/lib/surface/api_trace.h"
#include "src/core/lib/transport/static_metadata.h"
namespace grpc_core {

@ -106,6 +106,10 @@ constexpr size_t HashPointer(T* p, size_t range) {
range;
}
inline uint32_t MixHash32(uint32_t a, uint32_t b) {
return RotateLeft(a, 2u) ^ b;
}
} // namespace grpc_core
#define GPR_ARRAY_SIZE(array) (sizeof(array) / sizeof(*(array)))

@ -17,6 +17,8 @@
#include <grpc/support/port_platform.h>
#include <cstddef>
#include "src/core/lib/gprpp/manual_constructor.h"
#include "src/core/lib/resource_quota/arena.h"
@ -48,8 +50,9 @@ class ChunkedVector {
}
ChunkedVector(const ChunkedVector& other)
: ChunkedVector(other.arena_, other.begin(), other.end()) {}
ChunkedVector& operator=(ChunkedVector other) {
Swap(&other);
ChunkedVector& operator=(const ChunkedVector& other) {
ChunkedVector tmp(other);
Swap(&tmp);
return *this;
}
ChunkedVector(ChunkedVector&& other) noexcept
@ -113,6 +116,12 @@ class ChunkedVector {
public:
ForwardIterator(Chunk* chunk, size_t n) : chunk_(chunk), n_(n) {}
using difference_type = std::ptrdiff_t;
using iterator_category = std::forward_iterator_tag;
using value_type = T;
using pointer = T*;
using reference = T&;
T& operator*() const { return *chunk_->data[n_]; }
T* operator->() const { return &*chunk_->data[n_]; }
ForwardIterator& operator++() {
@ -123,6 +132,11 @@ class ChunkedVector {
}
return *this;
}
ForwardIterator& operator++(int) {
ForwardIterator tmp = *this;
++*this;
return tmp;
}
bool operator==(const ForwardIterator& other) const {
return chunk_ == other.chunk_ && n_ == other.n_;
}
@ -131,6 +145,8 @@ class ChunkedVector {
}
private:
friend class ChunkedVector;
Chunk* chunk_;
size_t n_;
};
@ -140,6 +156,8 @@ class ChunkedVector {
public:
ConstForwardIterator(const Chunk* chunk, size_t n) : chunk_(chunk), n_(n) {}
using iterator_category = std::forward_iterator_tag;
const T& operator*() const { return *chunk_->data[n_]; }
const T* operator->() const { return &*chunk_->data[n_]; }
ConstForwardIterator& operator++() {
@ -150,6 +168,11 @@ class ChunkedVector {
}
return *this;
}
ConstForwardIterator& operator++(int) {
ConstForwardIterator tmp = *this;
++*this;
return tmp;
}
bool operator==(const ConstForwardIterator& other) const {
return chunk_ == other.chunk_ && n_ == other.n_;
}
@ -186,6 +209,25 @@ class ChunkedVector {
return n;
}
// Return true if the vector is empty.
bool empty() const { return first_ == nullptr || first_->count == 0; }
void SetEnd(ForwardIterator it) {
if (it == end()) return;
Chunk* chunk = it.chunk_;
for (size_t i = it.n_; i < chunk->count; i++) {
chunk->data[i].Destroy();
}
chunk->count = it.n_;
append_ = chunk;
while ((chunk = chunk->next) != nullptr) {
for (size_t i = 0; i < chunk->count; i++) {
chunk->data[i].Destroy();
}
chunk->count = 0;
}
}
private:
ManualConstructor<T>* AppendSlot() {
if (append_ == nullptr) {

@ -311,6 +311,12 @@ class Table {
// Count the number of set fields in the table
size_t count() const { return present_bits_.count(); }
// Check if the table is completely empty
bool empty() const { return present_bits_.none(); }
// Clear all elements in the table.
void ClearAll() { ClearAllImpl(absl::make_index_sequence<sizeof...(Ts)>()); }
private:
// Bit field for which elements of the table are set (true) or un-set (false,
// the default) -- one bit for each type in Ts.
@ -412,6 +418,11 @@ class Table {
table_detail::do_these_things<int>({(CallIf<I>(&f), 1)...});
}
template <size_t... I>
void ClearAllImpl(absl::index_sequence<I...>) {
table_detail::do_these_things<int>({(clear<I>(), 1)...});
}
// Bit field indicating which elements are set.
GPR_NO_UNIQUE_ADDRESS PresentBits present_bits_;
// The memory to store the elements themselves.

@ -115,28 +115,7 @@ absl::optional<absl::string_view> EvaluateArgs::GetHeaderValue(
if (metadata_ == nullptr) {
return absl::nullopt;
}
// TODO(yashykt): Remove these special cases for known metadata after
// https://github.com/grpc/grpc/pull/28267 is merged
if (key == HttpMethodMetadata::key()) {
auto method = metadata_->get(HttpMethodMetadata());
return method.has_value()
? absl::optional<absl::string_view>(
HttpMethodMetadata::Encode(*method).as_string_view())
: absl::nullopt;
}
if (key == HttpAuthorityMetadata().key()) {
auto authority = metadata_->get_pointer(HttpAuthorityMetadata());
return authority != nullptr
? absl::optional<absl::string_view>(authority->as_string_view())
: absl::nullopt;
}
if (key == HttpPathMetadata().key()) {
auto path = metadata_->get_pointer(HttpPathMetadata());
return path != nullptr
? absl::optional<absl::string_view>(path->as_string_view())
: absl::nullopt;
}
return metadata_->GetValue(key, concatenated_value);
return metadata_->GetStringValue(key, concatenated_value);
}
grpc_resolved_address EvaluateArgs::GetLocalAddress() const {

@ -44,7 +44,7 @@ struct grpc_composite_call_credentials_metadata_context {
grpc_composite_call_credentials_metadata_context(
grpc_composite_call_credentials* composite_creds,
grpc_polling_entity* pollent, grpc_auth_metadata_context auth_md_context,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata)
: composite_creds(composite_creds),
pollent(pollent),
@ -59,7 +59,7 @@ struct grpc_composite_call_credentials_metadata_context {
size_t creds_index = 0;
grpc_polling_entity* pollent;
grpc_auth_metadata_context auth_md_context;
grpc_credentials_mdelem_array* md_array;
grpc_core::CredentialsMetadataArray* md_array;
grpc_closure* on_request_metadata;
grpc_closure internal_on_request_metadata;
};
@ -91,8 +91,8 @@ static void composite_call_metadata_cb(void* arg, grpc_error_handle error) {
bool grpc_composite_call_credentials::get_request_metadata(
grpc_polling_entity* pollent, grpc_auth_metadata_context auth_md_context,
grpc_credentials_mdelem_array* md_array, grpc_closure* on_request_metadata,
grpc_error_handle* error) {
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata, grpc_error_handle* error) {
grpc_composite_call_credentials_metadata_context* ctx;
ctx = new grpc_composite_call_credentials_metadata_context(
this, pollent, auth_md_context, md_array, on_request_metadata);
@ -113,7 +113,7 @@ bool grpc_composite_call_credentials::get_request_metadata(
}
void grpc_composite_call_credentials::cancel_get_request_metadata(
grpc_credentials_mdelem_array* md_array, grpc_error_handle error) {
grpc_core::CredentialsMetadataArray* md_array, grpc_error_handle error) {
for (size_t i = 0; i < inner_.size(); ++i) {
inner_[i]->cancel_get_request_metadata(md_array, GRPC_ERROR_REF(error));
}

@ -81,12 +81,13 @@ class grpc_composite_call_credentials : public grpc_call_credentials {
bool get_request_metadata(grpc_polling_entity* pollent,
grpc_auth_metadata_context context,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata,
grpc_error_handle* error) override;
void cancel_get_request_metadata(grpc_credentials_mdelem_array* md_array,
grpc_error_handle error) override;
void cancel_get_request_metadata(
grpc_core::CredentialsMetadataArray* md_array,
grpc_error_handle error) override;
grpc_security_level min_security_level() const override {
return min_security_level_;

@ -153,21 +153,11 @@ grpc_channel_credentials* grpc_channel_credentials_from_arg(
grpc_channel_credentials* grpc_channel_credentials_find_in_args(
const grpc_channel_args* args);
/* --- grpc_credentials_mdelem_array. --- */
/* --- grpc_core::CredentialsMetadataArray. --- */
struct grpc_credentials_mdelem_array {
grpc_mdelem* md = nullptr;
size_t size = 0;
};
/// Takes a new ref to \a md.
void grpc_credentials_mdelem_array_add(grpc_credentials_mdelem_array* list,
grpc_mdelem md);
/// Appends all elements from \a src to \a dst, taking a new ref to each one.
void grpc_credentials_mdelem_array_append(grpc_credentials_mdelem_array* dst,
grpc_credentials_mdelem_array* src);
void grpc_credentials_mdelem_array_destroy(grpc_credentials_mdelem_array* list);
namespace grpc_core {
using CredentialsMetadataArray = std::vector<std::pair<Slice, Slice>>;
}
/* --- grpc_call_credentials. --- */
@ -188,17 +178,17 @@ struct grpc_call_credentials
// be set to indicate the result. Otherwise, \a on_request_metadata will
// be invoked asynchronously when complete. \a md_array will be populated
// with the resulting metadata once complete.
virtual bool get_request_metadata(grpc_polling_entity* pollent,
grpc_auth_metadata_context context,
grpc_credentials_mdelem_array* md_array,
grpc_closure* on_request_metadata,
grpc_error_handle* error) = 0;
virtual bool get_request_metadata(
grpc_polling_entity* pollent, grpc_auth_metadata_context context,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata, grpc_error_handle* error) = 0;
// Cancels a pending asynchronous operation started by
// grpc_call_credentials_get_request_metadata() with the corresponding
// value of \a md_array.
virtual void cancel_get_request_metadata(
grpc_credentials_mdelem_array* md_array, grpc_error_handle error) = 0;
grpc_core::CredentialsMetadataArray* md_array,
grpc_error_handle error) = 0;
virtual grpc_security_level min_security_level() const {
return min_security_level_;

@ -1,61 +0,0 @@
/*
*
* Copyright 2015 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <grpc/support/port_platform.h>
#include <string.h>
#include <grpc/support/alloc.h>
#include "src/core/lib/security/credentials/credentials.h"
#include "src/core/lib/slice/slice_internal.h"
static void mdelem_list_ensure_capacity(grpc_credentials_mdelem_array* list,
size_t additional_space_needed) {
size_t target_size = list->size + additional_space_needed;
// Find the next power of two greater than the target size (i.e.,
// whenever we add more space, we double what we already have).
size_t new_size = 2;
while (new_size < target_size) {
new_size *= 2;
}
list->md = static_cast<grpc_mdelem*>(
gpr_realloc(list->md, sizeof(grpc_mdelem) * new_size));
}
void grpc_credentials_mdelem_array_add(grpc_credentials_mdelem_array* list,
grpc_mdelem md) {
mdelem_list_ensure_capacity(list, 1);
list->md[list->size++] = GRPC_MDELEM_REF(md);
}
void grpc_credentials_mdelem_array_append(grpc_credentials_mdelem_array* dst,
grpc_credentials_mdelem_array* src) {
mdelem_list_ensure_capacity(dst, src->size);
for (size_t i = 0; i < src->size; ++i) {
dst->md[dst->size++] = GRPC_MDELEM_REF(src->md[i]);
}
}
void grpc_credentials_mdelem_array_destroy(
grpc_credentials_mdelem_array* list) {
for (size_t i = 0; i < list->size; ++i) {
GRPC_MDELEM_UNREF(list->md[i]);
}
gpr_free(list->md);
}

@ -91,9 +91,9 @@ const char* grpc_fake_transport_get_expected_targets(
bool grpc_md_only_test_credentials::get_request_metadata(
grpc_polling_entity* /*pollent*/, grpc_auth_metadata_context /*context*/,
grpc_credentials_mdelem_array* md_array, grpc_closure* on_request_metadata,
grpc_error_handle* /*error*/) {
grpc_credentials_mdelem_array_add(md_array, md_);
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata, grpc_error_handle* /*error*/) {
md_array->emplace_back(key_.Ref(), value_.Ref());
if (is_async_) {
grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_request_metadata,
GRPC_ERROR_NONE);
@ -103,7 +103,8 @@ bool grpc_md_only_test_credentials::get_request_metadata(
}
void grpc_md_only_test_credentials::cancel_get_request_metadata(
grpc_credentials_mdelem_array* /*md_array*/, grpc_error_handle error) {
grpc_core::CredentialsMetadataArray* /*md_array*/,
grpc_error_handle error) {
GRPC_ERROR_UNREF(error);
}

@ -63,24 +63,25 @@ class grpc_md_only_test_credentials : public grpc_call_credentials {
bool is_async)
: grpc_call_credentials(GRPC_CALL_CREDENTIALS_TYPE_OAUTH2,
GRPC_SECURITY_NONE),
md_(grpc_mdelem_from_slices(grpc_slice_from_copied_string(md_key),
grpc_slice_from_copied_string(md_value))),
key_(grpc_core::Slice::FromCopiedString(md_key)),
value_(grpc_core::Slice::FromCopiedString(md_value)),
is_async_(is_async) {}
~grpc_md_only_test_credentials() override { GRPC_MDELEM_UNREF(md_); }
bool get_request_metadata(grpc_polling_entity* pollent,
grpc_auth_metadata_context context,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata,
grpc_error_handle* error) override;
void cancel_get_request_metadata(grpc_credentials_mdelem_array* md_array,
grpc_error_handle error) override;
void cancel_get_request_metadata(
grpc_core::CredentialsMetadataArray* md_array,
grpc_error_handle error) override;
std::string debug_string() override { return "MD only Test Credentials"; };
private:
grpc_mdelem md_;
grpc_core::Slice key_;
grpc_core::Slice value_;
bool is_async_;
};

@ -30,40 +30,37 @@
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/surface/api_trace.h"
grpc_google_iam_credentials::~grpc_google_iam_credentials() {
grpc_credentials_mdelem_array_destroy(&md_array_);
}
bool grpc_google_iam_credentials::get_request_metadata(
grpc_polling_entity* /*pollent*/, grpc_auth_metadata_context /*context*/,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* /*on_request_metadata*/, grpc_error_handle* /*error*/) {
grpc_credentials_mdelem_array_append(md_array, &md_array_);
if (token_.has_value()) {
md_array->emplace_back(grpc_core::Slice::FromStaticString(
GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY),
token_->Ref());
}
md_array->emplace_back(grpc_core::Slice::FromStaticString(
GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY),
authority_selector_.Ref());
return true;
}
void grpc_google_iam_credentials::cancel_get_request_metadata(
grpc_credentials_mdelem_array* /*md_array*/, grpc_error_handle error) {
grpc_core::CredentialsMetadataArray* /*md_array*/,
grpc_error_handle error) {
GRPC_ERROR_UNREF(error);
}
grpc_google_iam_credentials::grpc_google_iam_credentials(
const char* token, const char* authority_selector)
: grpc_call_credentials(GRPC_CALL_CREDENTIALS_TYPE_IAM),
token_(token == nullptr ? absl::optional<grpc_core::Slice>()
: grpc_core::Slice::FromCopiedString(token)),
authority_selector_(
grpc_core::Slice::FromCopiedString(authority_selector)),
debug_string_(absl::StrFormat(
"GoogleIAMCredentials{Token:%s,AuthoritySelector:%s}",
token != nullptr ? "present" : "absent", authority_selector)) {
grpc_mdelem md = grpc_mdelem_from_slices(
grpc_slice_from_static_string(GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY),
grpc_slice_from_copied_string(token));
grpc_credentials_mdelem_array_add(&md_array_, md);
GRPC_MDELEM_UNREF(md);
md = grpc_mdelem_from_slices(
grpc_slice_from_static_string(GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY),
grpc_slice_from_copied_string(authority_selector));
grpc_credentials_mdelem_array_add(&md_array_, md);
GRPC_MDELEM_UNREF(md);
}
token != nullptr ? "present" : "absent", authority_selector)) {}
grpc_call_credentials* grpc_google_iam_credentials_create(
const char* token, const char* authority_selector, void* reserved) {

@ -29,20 +29,21 @@ class grpc_google_iam_credentials : public grpc_call_credentials {
public:
grpc_google_iam_credentials(const char* token,
const char* authority_selector);
~grpc_google_iam_credentials() override;
bool get_request_metadata(grpc_polling_entity* pollent,
grpc_auth_metadata_context context,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata,
grpc_error_handle* error) override;
void cancel_get_request_metadata(grpc_credentials_mdelem_array* md_array,
grpc_error_handle error) override;
void cancel_get_request_metadata(
grpc_core::CredentialsMetadataArray* md_array,
grpc_error_handle error) override;
std::string debug_string() override { return debug_string_; }
private:
grpc_credentials_mdelem_array md_array_;
const absl::optional<grpc_core::Slice> token_;
const grpc_core::Slice authority_selector_;
const std::string debug_string_;
};

@ -41,23 +41,15 @@
using grpc_core::Json;
void grpc_service_account_jwt_access_credentials::reset_cache() {
GRPC_MDELEM_UNREF(cached_.jwt_md);
cached_.jwt_md = GRPC_MDNULL;
cached_.service_url.clear();
cached_.jwt_expiration = gpr_inf_past(GPR_CLOCK_REALTIME);
}
grpc_service_account_jwt_access_credentials::
~grpc_service_account_jwt_access_credentials() {
grpc_auth_json_key_destruct(&key_);
reset_cache();
gpr_mu_destroy(&cache_mu_);
}
bool grpc_service_account_jwt_access_credentials::get_request_metadata(
grpc_polling_entity* /*pollent*/, grpc_auth_metadata_context context,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* /*on_request_metadata*/, grpc_error_handle* error) {
gpr_timespec refresh_threshold = gpr_time_from_seconds(
GRPC_SECURE_TOKEN_REFRESH_THRESHOLD_SECS, GPR_TIMESPAN);
@ -71,42 +63,38 @@ bool grpc_service_account_jwt_access_credentials::get_request_metadata(
return true;
}
/* See if we can return a cached jwt. */
grpc_mdelem jwt_md = GRPC_MDNULL;
absl::optional<grpc_core::Slice> jwt_value;
{
gpr_mu_lock(&cache_mu_);
if (!cached_.service_url.empty() && cached_.service_url == *uri &&
!GRPC_MDISNULL(cached_.jwt_md) &&
if (cached_.has_value() && cached_->service_url == *uri &&
(gpr_time_cmp(
gpr_time_sub(cached_.jwt_expiration, gpr_now(GPR_CLOCK_REALTIME)),
gpr_time_sub(cached_->jwt_expiration, gpr_now(GPR_CLOCK_REALTIME)),
refresh_threshold) > 0)) {
jwt_md = GRPC_MDELEM_REF(cached_.jwt_md);
jwt_value = cached_->jwt_value.Ref();
}
gpr_mu_unlock(&cache_mu_);
}
if (GRPC_MDISNULL(jwt_md)) {
if (!jwt_value.has_value()) {
char* jwt = nullptr;
/* Generate a new jwt. */
gpr_mu_lock(&cache_mu_);
reset_cache();
cached_.reset();
jwt = grpc_jwt_encode_and_sign(&key_, uri->c_str(), jwt_lifetime_, nullptr);
if (jwt != nullptr) {
std::string md_value = absl::StrCat("Bearer ", jwt);
gpr_free(jwt);
cached_.jwt_expiration =
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), jwt_lifetime_);
cached_.service_url = std::move(*uri);
cached_.jwt_md = grpc_mdelem_from_slices(
grpc_slice_from_static_string(GRPC_AUTHORIZATION_METADATA_KEY),
grpc_slice_from_cpp_string(std::move(md_value)));
jwt_md = GRPC_MDELEM_REF(cached_.jwt_md);
jwt_value = grpc_core::Slice::FromCopiedString(md_value);
cached_ = {jwt_value->Ref(), std::move(*uri),
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), jwt_lifetime_)};
}
gpr_mu_unlock(&cache_mu_);
}
if (!GRPC_MDISNULL(jwt_md)) {
grpc_credentials_mdelem_array_add(md_array, jwt_md);
GRPC_MDELEM_UNREF(jwt_md);
if (jwt_value.has_value()) {
md_array->emplace_back(
grpc_core::Slice::FromStaticString(GRPC_AUTHORIZATION_METADATA_KEY),
std::move(*jwt_value));
} else {
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Could not generate JWT.");
}
@ -114,7 +102,8 @@ bool grpc_service_account_jwt_access_credentials::get_request_metadata(
}
void grpc_service_account_jwt_access_credentials::cancel_get_request_metadata(
grpc_credentials_mdelem_array* /*md_array*/, grpc_error_handle error) {
grpc_core::CredentialsMetadataArray* /*md_array*/,
grpc_error_handle error) {
GRPC_ERROR_UNREF(error);
}
@ -131,7 +120,6 @@ grpc_service_account_jwt_access_credentials::
}
jwt_lifetime_ = token_lifetime;
gpr_mu_init(&cache_mu_);
reset_cache();
}
grpc_core::RefCountedPtr<grpc_call_credentials>

@ -40,12 +40,13 @@ class grpc_service_account_jwt_access_credentials
bool get_request_metadata(grpc_polling_entity* pollent,
grpc_auth_metadata_context context,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata,
grpc_error_handle* error) override;
void cancel_get_request_metadata(grpc_credentials_mdelem_array* md_array,
grpc_error_handle error) override;
void cancel_get_request_metadata(
grpc_core::CredentialsMetadataArray* md_array,
grpc_error_handle error) override;
const gpr_timespec& jwt_lifetime() const { return jwt_lifetime_; }
const grpc_auth_json_key& key() const { return key_; }
@ -58,16 +59,15 @@ class grpc_service_account_jwt_access_credentials
};
private:
void reset_cache();
// Have a simple cache for now with just 1 entry. We could have a map based on
// the service_url for a more sophisticated one.
gpr_mu cache_mu_;
struct {
grpc_mdelem jwt_md = GRPC_MDNULL;
struct Cache {
grpc_core::Slice jwt_value;
std::string service_url;
gpr_timespec jwt_expiration;
} cached_;
};
absl::optional<Cache> cached_;
grpc_auth_json_key key_;
gpr_timespec jwt_lifetime_;

@ -127,7 +127,6 @@ void grpc_auth_refresh_token_destruct(grpc_auth_refresh_token* refresh_token) {
grpc_oauth2_token_fetcher_credentials::
~grpc_oauth2_token_fetcher_credentials() {
GRPC_MDELEM_UNREF(access_token_md_);
gpr_mu_destroy(&mu_);
grpc_pollset_set_destroy(grpc_polling_entity_pollset_set(&pollent_));
grpc_httpcli_context_destroy(&httpcli_context_);
@ -135,7 +134,8 @@ grpc_oauth2_token_fetcher_credentials::
grpc_credentials_status
grpc_oauth2_token_fetcher_credentials_parse_server_response(
const grpc_http_response* response, grpc_mdelem* token_md,
const grpc_http_response* response,
absl::optional<grpc_core::Slice>* token_value,
grpc_millis* token_lifetime) {
char* null_terminated_body = nullptr;
grpc_credentials_status status = GRPC_CREDENTIALS_OK;
@ -204,19 +204,13 @@ grpc_oauth2_token_fetcher_credentials_parse_server_response(
}
expires_in = it->second.string_value().c_str();
*token_lifetime = strtol(expires_in, nullptr, 10) * GPR_MS_PER_SEC;
if (!GRPC_MDISNULL(*token_md)) GRPC_MDELEM_UNREF(*token_md);
*token_md = grpc_mdelem_from_slices(
grpc_core::ExternallyManagedSlice(GRPC_AUTHORIZATION_METADATA_KEY),
grpc_slice_from_cpp_string(
absl::StrCat(token_type, " ", access_token)));
*token_value = grpc_core::Slice::FromCopiedString(
absl::StrCat(token_type, " ", access_token));
status = GRPC_CREDENTIALS_OK;
}
end:
if (status != GRPC_CREDENTIALS_OK && !GRPC_MDISNULL(*token_md)) {
GRPC_MDELEM_UNREF(*token_md);
*token_md = GRPC_MDNULL;
}
if (status != GRPC_CREDENTIALS_OK) *token_value = absl::nullopt;
gpr_free(null_terminated_body);
return status;
}
@ -233,17 +227,21 @@ static void on_oauth2_token_fetcher_http_response(void* user_data,
void grpc_oauth2_token_fetcher_credentials::on_http_response(
grpc_credentials_metadata_request* r, grpc_error_handle error) {
grpc_mdelem access_token_md = GRPC_MDNULL;
absl::optional<grpc_core::Slice> access_token_value;
grpc_millis token_lifetime = 0;
grpc_credentials_status status =
error == GRPC_ERROR_NONE
? grpc_oauth2_token_fetcher_credentials_parse_server_response(
&r->response, &access_token_md, &token_lifetime)
&r->response, &access_token_value, &token_lifetime)
: GRPC_CREDENTIALS_ERROR;
// Update cache and grab list of pending requests.
gpr_mu_lock(&mu_);
token_fetch_pending_ = false;
access_token_md_ = GRPC_MDELEM_REF(access_token_md);
if (access_token_value.has_value()) {
access_token_value_ = access_token_value->Ref();
} else {
access_token_value_ = absl::nullopt;
}
token_expiration_ =
status == GRPC_CREDENTIALS_OK
? gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC),
@ -256,8 +254,9 @@ void grpc_oauth2_token_fetcher_credentials::on_http_response(
while (pending_request != nullptr) {
grpc_error_handle new_error = GRPC_ERROR_NONE;
if (status == GRPC_CREDENTIALS_OK) {
grpc_credentials_mdelem_array_add(pending_request->md_array,
access_token_md);
pending_request->md_array->emplace_back(
grpc_core::Slice::FromStaticString(GRPC_AUTHORIZATION_METADATA_KEY),
access_token_value->Ref());
} else {
new_error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
"Error occurred when fetching oauth2 token.", &error, 1);
@ -270,31 +269,31 @@ void grpc_oauth2_token_fetcher_credentials::on_http_response(
pending_request = pending_request->next;
gpr_free(prev);
}
GRPC_MDELEM_UNREF(access_token_md);
Unref();
grpc_credentials_metadata_request_destroy(r);
}
bool grpc_oauth2_token_fetcher_credentials::get_request_metadata(
grpc_polling_entity* pollent, grpc_auth_metadata_context /*context*/,
grpc_credentials_mdelem_array* md_array, grpc_closure* on_request_metadata,
grpc_error_handle* /*error*/) {
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata, grpc_error_handle* /*error*/) {
// Check if we can use the cached token.
grpc_millis refresh_threshold =
GRPC_SECURE_TOKEN_REFRESH_THRESHOLD_SECS * GPR_MS_PER_SEC;
grpc_mdelem cached_access_token_md = GRPC_MDNULL;
absl::optional<grpc_core::Slice> cached_access_token_value;
gpr_mu_lock(&mu_);
if (!GRPC_MDISNULL(access_token_md_) &&
if (access_token_value_.has_value() &&
gpr_time_cmp(
gpr_time_sub(token_expiration_, gpr_now(GPR_CLOCK_MONOTONIC)),
gpr_time_from_seconds(GRPC_SECURE_TOKEN_REFRESH_THRESHOLD_SECS,
GPR_TIMESPAN)) > 0) {
cached_access_token_md = GRPC_MDELEM_REF(access_token_md_);
cached_access_token_value = access_token_value_->Ref();
}
if (!GRPC_MDISNULL(cached_access_token_md)) {
if (cached_access_token_value.has_value()) {
gpr_mu_unlock(&mu_);
grpc_credentials_mdelem_array_add(md_array, cached_access_token_md);
GRPC_MDELEM_UNREF(cached_access_token_md);
md_array->emplace_back(
grpc_core::Slice::FromStaticString(GRPC_AUTHORIZATION_METADATA_KEY),
std::move(*cached_access_token_value));
return true;
}
// Couldn't get the token from the cache.
@ -326,7 +325,7 @@ bool grpc_oauth2_token_fetcher_credentials::get_request_metadata(
}
void grpc_oauth2_token_fetcher_credentials::cancel_get_request_metadata(
grpc_credentials_mdelem_array* md_array, grpc_error_handle error) {
grpc_core::CredentialsMetadataArray* md_array, grpc_error_handle error) {
gpr_mu_lock(&mu_);
grpc_oauth2_pending_get_request_metadata* prev = nullptr;
grpc_oauth2_pending_get_request_metadata* pending_request = pending_requests_;
@ -705,36 +704,30 @@ grpc_call_credentials* grpc_sts_credentials_create(
// Oauth2 Access Token credentials.
//
grpc_access_token_credentials::~grpc_access_token_credentials() {
GRPC_MDELEM_UNREF(access_token_md_);
}
bool grpc_access_token_credentials::get_request_metadata(
grpc_polling_entity* /*pollent*/, grpc_auth_metadata_context /*context*/,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* /*on_request_metadata*/, grpc_error_handle* /*error*/) {
grpc_credentials_mdelem_array_add(md_array, access_token_md_);
md_array->emplace_back(
grpc_core::Slice::FromStaticString(GRPC_AUTHORIZATION_METADATA_KEY),
access_token_value_.Ref());
return true;
}
void grpc_access_token_credentials::cancel_get_request_metadata(
grpc_credentials_mdelem_array* /*md_array*/, grpc_error_handle error) {
grpc_core::CredentialsMetadataArray* /*md_array*/,
grpc_error_handle error) {
GRPC_ERROR_UNREF(error);
}
grpc_access_token_credentials::grpc_access_token_credentials(
const char* access_token)
: grpc_call_credentials(GRPC_CALL_CREDENTIALS_TYPE_OAUTH2) {
grpc_core::ExecCtx exec_ctx;
access_token_md_ = grpc_mdelem_from_slices(
grpc_core::ExternallyManagedSlice(GRPC_AUTHORIZATION_METADATA_KEY),
grpc_slice_from_cpp_string(absl::StrCat("Bearer ", access_token)));
}
: grpc_call_credentials(GRPC_CALL_CREDENTIALS_TYPE_OAUTH2),
access_token_value_(grpc_core::Slice::FromCopiedString(
absl::StrCat("Bearer ", access_token))) {}
std::string grpc_access_token_credentials::debug_string() {
bool access_token_present = !GRPC_MDISNULL(access_token_md_);
return absl::StrFormat("AccessTokenCredentials{Token:%s}",
access_token_present ? "present" : "absent");
return absl::StrFormat("AccessTokenCredentials{Token:present}");
}
grpc_call_credentials* grpc_access_token_credentials_create(

@ -64,7 +64,7 @@ void grpc_auth_refresh_token_destruct(grpc_auth_refresh_token* refresh_token);
// from an http service.
struct grpc_oauth2_pending_get_request_metadata {
grpc_credentials_mdelem_array* md_array;
grpc_core::CredentialsMetadataArray* md_array;
grpc_closure* on_request_metadata;
grpc_polling_entity* pollent;
struct grpc_oauth2_pending_get_request_metadata* next;
@ -77,12 +77,13 @@ class grpc_oauth2_token_fetcher_credentials : public grpc_call_credentials {
bool get_request_metadata(grpc_polling_entity* pollent,
grpc_auth_metadata_context context,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata,
grpc_error_handle* error) override;
void cancel_get_request_metadata(grpc_credentials_mdelem_array* md_array,
grpc_error_handle error) override;
void cancel_get_request_metadata(
grpc_core::CredentialsMetadataArray* md_array,
grpc_error_handle error) override;
void on_http_response(grpc_credentials_metadata_request* r,
grpc_error_handle error);
@ -96,7 +97,7 @@ class grpc_oauth2_token_fetcher_credentials : public grpc_call_credentials {
private:
gpr_mu mu_;
grpc_mdelem access_token_md_ = GRPC_MDNULL;
absl::optional<grpc_core::Slice> access_token_value_;
gpr_timespec token_expiration_;
bool token_fetch_pending_ = false;
grpc_oauth2_pending_get_request_metadata* pending_requests_ = nullptr;
@ -133,21 +134,21 @@ class grpc_google_refresh_token_credentials final
class grpc_access_token_credentials final : public grpc_call_credentials {
public:
explicit grpc_access_token_credentials(const char* access_token);
~grpc_access_token_credentials() override;
bool get_request_metadata(grpc_polling_entity* pollent,
grpc_auth_metadata_context context,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata,
grpc_error_handle* error) override;
void cancel_get_request_metadata(grpc_credentials_mdelem_array* md_array,
grpc_error_handle error) override;
void cancel_get_request_metadata(
grpc_core::CredentialsMetadataArray* md_array,
grpc_error_handle error) override;
std::string debug_string() override;
private:
grpc_mdelem access_token_md_;
const grpc_core::Slice access_token_value_;
};
// Private constructor for refresh token credentials from an already parsed
@ -159,8 +160,8 @@ grpc_refresh_token_credentials_create_from_auth_refresh_token(
// Exposed for testing only.
grpc_credentials_status
grpc_oauth2_token_fetcher_credentials_parse_server_response(
const struct grpc_http_response* response, grpc_mdelem* token_md,
grpc_millis* token_lifetime);
const struct grpc_http_response* response,
absl::optional<grpc_core::Slice>* token_value, grpc_millis* token_lifetime);
namespace grpc_core {
// Exposed for testing only. This function validates the options, ensuring that

@ -110,10 +110,9 @@ static grpc_error_handle process_plugin_result(
error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal metadata");
} else {
for (size_t i = 0; i < num_md; ++i) {
grpc_mdelem mdelem =
grpc_mdelem_create(md[i].key, md[i].value, nullptr);
grpc_credentials_mdelem_array_add(r->md_array, mdelem);
GRPC_MDELEM_UNREF(mdelem);
r->md_array->emplace_back(
grpc_core::Slice(grpc_slice_ref_internal(md[i].key)),
grpc_core::Slice(grpc_slice_ref_internal(md[i].value)));
}
}
}
@ -155,8 +154,8 @@ static void plugin_md_request_metadata_ready(void* request,
bool grpc_plugin_credentials::get_request_metadata(
grpc_polling_entity* /*pollent*/, grpc_auth_metadata_context context,
grpc_credentials_mdelem_array* md_array, grpc_closure* on_request_metadata,
grpc_error_handle* error) {
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata, grpc_error_handle* error) {
bool retval = true; // Synchronous return.
if (plugin_.get_metadata != nullptr) {
// Create pending_request object.
@ -229,7 +228,7 @@ bool grpc_plugin_credentials::get_request_metadata(
}
void grpc_plugin_credentials::cancel_get_request_metadata(
grpc_credentials_mdelem_array* md_array, grpc_error_handle error) {
grpc_core::CredentialsMetadataArray* md_array, grpc_error_handle error) {
gpr_mu_lock(&mu_);
for (pending_request* pending_request = pending_requests_;
pending_request != nullptr; pending_request = pending_request->next) {

@ -33,7 +33,7 @@ struct grpc_plugin_credentials final : public grpc_call_credentials {
struct pending_request {
bool cancelled;
struct grpc_plugin_credentials* creds;
grpc_credentials_mdelem_array* md_array;
grpc_core::CredentialsMetadataArray* md_array;
grpc_closure* on_request_metadata;
struct pending_request* prev;
struct pending_request* next;
@ -45,12 +45,13 @@ struct grpc_plugin_credentials final : public grpc_call_credentials {
bool get_request_metadata(grpc_polling_entity* pollent,
grpc_auth_metadata_context context,
grpc_credentials_mdelem_array* md_array,
grpc_core::CredentialsMetadataArray* md_array,
grpc_closure* on_request_metadata,
grpc_error_handle* error) override;
void cancel_get_request_metadata(grpc_credentials_mdelem_array* md_array,
grpc_error_handle error) override;
void cancel_get_request_metadata(
grpc_core::CredentialsMetadataArray* md_array,
grpc_error_handle error) override;
// Checks if the request has been cancelled.
// If not, removes it from the pending list, so that it cannot be

@ -30,6 +30,7 @@
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/profiling/timers.h"
#include "src/core/lib/security/context/security_context.h"
#include "src/core/lib/security/credentials/credentials.h"
@ -39,7 +40,6 @@
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/surface/call.h"
#include "src/core/lib/transport/static_metadata.h"
#define MAX_CREDENTIALS_METADATA_COUNT 4
@ -67,6 +67,7 @@ struct call_data {
: owning_call(args.call_stack), call_combiner(args.call_combiner) {
host.Init();
method.Init();
md_array.Init();
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
GPR_ASSERT(args.context != nullptr);
if (args.context[GRPC_CONTEXT_SECURITY].value == nullptr) {
@ -89,7 +90,7 @@ struct call_data {
// fields will be accessed after calling dtor, and msan correctly complains
// that the memory is not initialized.
void destroy() {
grpc_credentials_mdelem_array_destroy(&md_array);
md_array.Destroy();
creds.reset();
grpc_auth_metadata_context_reset(&auth_md_context);
host.Destroy();
@ -106,8 +107,7 @@ struct call_data {
pollset_set so that work can progress when this call wants work to progress
*/
grpc_polling_entity* pollent = nullptr;
grpc_credentials_mdelem_array md_array;
grpc_linked_mdelem md_links[MAX_CREDENTIALS_METADATA_COUNT] = {};
grpc_core::ManualConstructor<grpc_core::CredentialsMetadataArray> md_array;
grpc_auth_metadata_context auth_md_context =
grpc_auth_metadata_context(); // Zero-initialize the C struct.
grpc_closure async_result_closure;
@ -165,17 +165,20 @@ static void on_credentials_metadata(void* arg, grpc_error_handle input_error) {
grpc_auth_metadata_context_reset(&calld->auth_md_context);
grpc_error_handle error = GRPC_ERROR_REF(input_error);
if (error == GRPC_ERROR_NONE) {
GPR_ASSERT(calld->md_array.size <= MAX_CREDENTIALS_METADATA_COUNT);
GPR_ASSERT(calld->md_array->size() <= MAX_CREDENTIALS_METADATA_COUNT);
GPR_ASSERT(batch->send_initial_metadata);
grpc_metadata_batch* mdb =
batch->payload->send_initial_metadata.send_initial_metadata;
for (size_t i = 0; i < calld->md_array.size; ++i) {
add_error(&error, grpc_metadata_batch_add_tail(
mdb, &calld->md_links[i],
GRPC_MDELEM_REF(calld->md_array.md[i])));
for (const auto& md : *calld->md_array) {
mdb->Append(
md.first.as_string_view(), md.second.Ref(),
[&](absl::string_view error_message, const grpc_core::Slice& value) {
add_error(&error, GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
"on_credentials_metadata: ", error_message,
": ", md.first.as_string_view(), ": ",
value.as_string_view())));
});
}
}
if (error == GRPC_ERROR_NONE) {
grpc_call_next_op(elem, batch);
} else {
error = grpc_error_set_int(error, GRPC_ERROR_INT_GRPC_STATUS,
@ -230,7 +233,7 @@ static void cancel_get_request_metadata(void* arg, grpc_error_handle error) {
grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
call_data* calld = static_cast<call_data*>(elem->call_data);
if (error != GRPC_ERROR_NONE) {
calld->creds->cancel_get_request_metadata(&calld->md_array,
calld->creds->cancel_get_request_metadata(&*calld->md_array,
GRPC_ERROR_REF(error));
}
GRPC_CALL_STACK_UNREF(calld->owning_call, "cancel_get_request_metadata");
@ -316,7 +319,7 @@ static void send_security_metadata(grpc_call_element* elem,
batch, grpc_schedule_on_exec_ctx);
grpc_error_handle error = GRPC_ERROR_NONE;
if (calld->creds->get_request_metadata(
calld->pollent, calld->auth_md_context, &calld->md_array,
calld->pollent, calld->auth_md_context, &*calld->md_array,
&calld->async_result_closure, &error)) {
// Synchronous return; invoke on_credentials_metadata() directly.
on_credentials_metadata(batch, error);

@ -86,44 +86,42 @@ struct call_data {
grpc_error_handle recv_trailing_metadata_error;
bool seen_recv_trailing_metadata_ready = false;
grpc_metadata_array md;
const grpc_metadata* consumed_md;
size_t num_consumed_md;
grpc_closure cancel_closure;
gpr_atm state = STATE_INIT; // async_state
};
class ArrayEncoder {
public:
explicit ArrayEncoder(grpc_metadata_array* array) : array_(array) {}
explicit ArrayEncoder(grpc_metadata_array* result) : result_(result) {}
void Encode(grpc_mdelem mdelem) {
Add(grpc_core::Slice(grpc_slice_ref_internal(GRPC_MDKEY(mdelem))),
grpc_core::Slice(grpc_slice_ref_internal(GRPC_MDVALUE(mdelem))));
void Encode(const grpc_core::Slice& key, const grpc_core::Slice& value) {
Append(key.Ref(), value.Ref());
}
template <typename Which>
void Encode(Which, const typename Which::ValueType& value) {
Add(grpc_core::Slice(
grpc_core::StaticSlice::FromStaticString(Which::key())),
grpc_core::Slice(Which::Encode(value)));
Append(grpc_core::Slice(
grpc_core::StaticSlice::FromStaticString(Which::key())),
grpc_core::Slice(Which::Encode(value)));
}
void Encode(grpc_core::HttpMethodMetadata,
const typename grpc_core::HttpMethodMetadata::ValueType&) {}
private:
void Add(grpc_core::Slice key, grpc_core::Slice value) {
if (array_->count == array_->capacity) {
array_->capacity = std::max(array_->capacity + 8, array_->capacity * 2);
array_->metadata = static_cast<grpc_metadata*>(gpr_realloc(
array_->metadata, array_->capacity * sizeof(grpc_metadata)));
void Append(grpc_core::Slice key, grpc_core::Slice value) {
if (result_->count == result_->capacity) {
result_->capacity =
std::max(result_->capacity + 8, result_->capacity * 2);
result_->metadata = static_cast<grpc_metadata*>(gpr_realloc(
result_->metadata, result_->capacity * sizeof(grpc_metadata)));
}
auto* usr_md = &array_->metadata[array_->count++];
auto* usr_md = &result_->metadata[result_->count++];
usr_md->key = key.TakeCSlice();
usr_md->value = value.TakeCSlice();
}
grpc_metadata_array* array_;
grpc_metadata_array* result_;
};
} // namespace
@ -137,21 +135,6 @@ static grpc_metadata_array metadata_batch_to_md_array(
return result;
}
static grpc_filtered_mdelem remove_consumed_md(void* user_data,
grpc_mdelem md) {
grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
call_data* calld = static_cast<call_data*>(elem->call_data);
size_t i;
for (i = 0; i < calld->num_consumed_md; i++) {
const grpc_metadata* consumed_md = &calld->consumed_md[i];
if (grpc_slice_eq(GRPC_MDKEY(md), consumed_md->key) &&
grpc_slice_eq(GRPC_MDVALUE(md), consumed_md->value)) {
return GRPC_FILTERED_REMOVE();
}
}
return GRPC_FILTERED_MDELEM(md);
}
static void on_md_processing_done_inner(grpc_call_element* elem,
const grpc_metadata* consumed_md,
size_t num_consumed_md,
@ -167,11 +150,10 @@ static void on_md_processing_done_inner(grpc_call_element* elem,
"Ignoring...");
}
if (error == GRPC_ERROR_NONE) {
calld->consumed_md = consumed_md;
calld->num_consumed_md = num_consumed_md;
error = grpc_metadata_batch_filter(
batch->payload->recv_initial_metadata.recv_initial_metadata,
remove_consumed_md, elem, "Response metadata filtering error");
for (size_t i = 0; i < num_consumed_md; i++) {
batch->payload->recv_initial_metadata.recv_initial_metadata->Remove(
grpc_core::StringViewFromSlice(consumed_md[i].key));
}
}
calld->recv_initial_metadata_error = GRPC_ERROR_REF(error);
grpc_closure* closure = calld->original_recv_initial_metadata_ready;

@ -17,6 +17,8 @@
#include <grpc/support/port_platform.h>
#include <cstdint>
#include "absl/strings/string_view.h"
#include <grpc/slice.h>
@ -111,6 +113,8 @@ class BaseSlice {
uint8_t* mutable_data() { return GRPC_SLICE_START_PTR(slice_); }
grpc_slice* c_slice_ptr() { return &slice_; }
private:
grpc_slice slice_;
};
@ -160,6 +164,9 @@ struct CopyConstructors {
static Out FromCopiedString(const char* s) {
return Out(grpc_slice_from_copied_string(s));
}
static Out FromCopiedString(absl::string_view s) {
return FromCopiedBuffer(s.data(), s.size());
}
static Out FromCopiedString(std::string s) {
return Out(grpc_slice_from_cpp_string(std::move(s)));
}
@ -180,28 +187,31 @@ struct CopyConstructors {
}
};
template <typename Out>
struct StaticConstructors {
static Out FromStaticString(const char* s) {
return Out(grpc_slice_from_static_string(s));
}
static Out FromStaticString(absl::string_view s) {
return Out(ExternallyManagedSlice(s.data(), s.size()));
}
};
} // namespace slice_detail
class StaticSlice : public slice_detail::BaseSlice {
class StaticSlice : public slice_detail::BaseSlice,
public slice_detail::StaticConstructors<StaticSlice> {
public:
StaticSlice() = default;
explicit StaticSlice(const grpc_slice& slice)
: slice_detail::BaseSlice(slice) {
GPR_DEBUG_ASSERT(
slice.refcount->GetType() == grpc_slice_refcount::Type::STATIC ||
slice.refcount->GetType() == grpc_slice_refcount::Type::NOP);
GPR_DEBUG_ASSERT(slice.refcount->GetType() ==
grpc_slice_refcount::Type::NOP);
}
explicit StaticSlice(const StaticMetadataSlice& slice)
: slice_detail::BaseSlice(slice) {}
static StaticSlice FromStaticString(const char* s) {
return StaticSlice(grpc_slice_from_static_string(s));
}
static StaticSlice FromStaticString(absl::string_view s) {
return StaticSlice(ExternallyManagedSlice(s.data(), s.size()));
}
StaticSlice(const StaticSlice& other)
: slice_detail::BaseSlice(other.c_slice()) {}
StaticSlice& operator=(const StaticSlice& other) {
@ -249,13 +259,15 @@ class MutableSlice : public slice_detail::BaseSlice,
// Iterator access to the underlying bytes
uint8_t* begin() { return mutable_data(); }
uint8_t* end() { return mutable_data() + size(); }
uint8_t* data() { return mutable_data(); }
// Array access
uint8_t& operator[](size_t i) { return mutable_data()[i]; }
};
class Slice : public slice_detail::BaseSlice,
public slice_detail::CopyConstructors<Slice> {
public slice_detail::CopyConstructors<Slice>,
public slice_detail::StaticConstructors<Slice> {
public:
Slice() = default;
~Slice() { grpc_slice_unref_internal(c_slice()); }
@ -333,6 +345,12 @@ class Slice : public slice_detail::BaseSlice,
return Slice(grpc_slice_sub(c_slice(), pos, pos + n));
}
// Split this slice, returning a new slice containing (split:end] and
// leaving this slice with [begin:split).
Slice Split(size_t split) {
return Slice(grpc_slice_split_tail(c_slice_ptr(), split));
}
Slice Ref() const { return Slice(grpc_slice_ref_internal(c_slice())); }
Slice Copy() const { return Slice(grpc_slice_copy(c_slice())); }

@ -31,7 +31,6 @@
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/slice/slice_utils.h"
#include "src/core/lib/transport/static_metadata.h"
#define LOG2_SHARD_COUNT 5
#define SHARD_COUNT (1 << LOG2_SHARD_COUNT)
@ -51,15 +50,6 @@ typedef struct slice_shard {
static slice_shard* g_shards;
struct static_metadata_hash_ent {
uint32_t hash;
uint32_t idx;
};
static static_metadata_hash_ent
static_metadata_hash[4 * GRPC_STATIC_MDSTR_COUNT];
static uint32_t max_static_metadata_hash_probe;
uint32_t grpc_static_metadata_hash_values[GRPC_STATIC_MDSTR_COUNT];
namespace grpc_core {
/* hash seed: decided at initialization time */
@ -116,37 +106,8 @@ uint32_t grpc_slice_default_hash_impl(grpc_slice s) {
grpc_core::g_hash_seed);
}
uint32_t grpc_static_slice_hash(grpc_slice s) {
return grpc_static_metadata_hash_values[GRPC_STATIC_METADATA_INDEX(s)];
}
int grpc_static_slice_eq(grpc_slice a, grpc_slice b) {
return GRPC_STATIC_METADATA_INDEX(a) == GRPC_STATIC_METADATA_INDEX(b);
}
uint32_t grpc_slice_hash(grpc_slice s) { return grpc_slice_hash_internal(s); }
grpc_slice grpc_slice_maybe_static_intern(grpc_slice slice,
bool* returned_slice_is_different) {
if (GRPC_IS_STATIC_METADATA_STRING(slice)) {
return slice;
}
uint32_t hash = grpc_slice_hash_internal(slice);
for (uint32_t i = 0; i <= max_static_metadata_hash_probe; i++) {
static_metadata_hash_ent ent =
static_metadata_hash[(hash + i) % GPR_ARRAY_SIZE(static_metadata_hash)];
if (ent.hash == hash && ent.idx < GRPC_STATIC_MDSTR_COUNT &&
grpc_slice_eq_static_interned(
slice, grpc_core::g_static_metadata_slice_table[ent.idx])) {
*returned_slice_is_different = true;
return grpc_core::g_static_metadata_slice_table[ent.idx];
}
}
return slice;
}
grpc_slice grpc_slice_intern(grpc_slice slice) {
/* TODO(arjunroy): At present, this is capable of returning either a static or
an interned slice. This yields weirdness like the constructor for
@ -155,25 +116,6 @@ grpc_slice grpc_slice_intern(grpc_slice slice) {
return grpc_core::ManagedMemorySlice(&slice);
}
// Attempt to see if the provided slice or string matches a static slice.
// SliceArgs is either a const grpc_slice& or const pair<const char*, size_t>&.
// In either case, hash is the pre-computed hash value.
//
// Returns: a matching static slice, or null.
template <typename SliceArgs>
static const grpc_core::StaticMetadataSlice* MatchStaticSlice(
uint32_t hash, const SliceArgs& args) {
for (uint32_t i = 0; i <= max_static_metadata_hash_probe; i++) {
static_metadata_hash_ent ent =
static_metadata_hash[(hash + i) % GPR_ARRAY_SIZE(static_metadata_hash)];
if (ent.hash == hash && ent.idx < GRPC_STATIC_MDSTR_COUNT &&
grpc_core::g_static_metadata_slice_table[ent.idx] == args) {
return &grpc_core::g_static_metadata_slice_table[ent.idx];
}
}
return nullptr;
}
// Helper methods to enable us to select appropriately overloaded slice methods
// whether we're dealing with a slice, or a buffer with length, when interning
// strings. Helpers for FindOrCreateInternedSlice().
@ -271,30 +213,15 @@ grpc_core::ManagedMemorySlice::ManagedMemorySlice(const char* string)
grpc_core::ManagedMemorySlice::ManagedMemorySlice(const char* buf, size_t len) {
GPR_TIMER_SCOPE("grpc_slice_intern", 0);
const uint32_t hash = gpr_murmur_hash3(buf, len, g_hash_seed);
const StaticMetadataSlice* static_slice =
MatchStaticSlice(hash, std::pair<const char*, size_t>(buf, len));
if (static_slice) {
*this = *static_slice;
} else {
*this = grpc_core::InternedSlice(FindOrCreateInternedSlice(
hash, std::pair<const char*, size_t>(buf, len)));
}
*this = grpc_core::InternedSlice(FindOrCreateInternedSlice(
hash, std::pair<const char*, size_t>(buf, len)));
}
grpc_core::ManagedMemorySlice::ManagedMemorySlice(const grpc_slice* slice_ptr) {
GPR_TIMER_SCOPE("grpc_slice_intern", 0);
const grpc_slice& slice = *slice_ptr;
if (GRPC_IS_STATIC_METADATA_STRING(slice)) {
*this = static_cast<const grpc_core::StaticMetadataSlice&>(slice);
return;
}
const uint32_t hash = grpc_slice_hash_internal(slice);
const StaticMetadataSlice* static_slice = MatchStaticSlice(hash, slice);
if (static_slice) {
*this = *static_slice;
} else {
*this = grpc_core::InternedSlice(FindOrCreateInternedSlice(hash, slice));
}
*this = grpc_core::InternedSlice(FindOrCreateInternedSlice(hash, slice));
}
void grpc_test_only_set_slice_hash_seed(uint32_t seed) {
@ -315,31 +242,6 @@ void grpc_slice_intern_init(void) {
shard->strs = static_cast<InternedSliceRefcount**>(
gpr_zalloc(sizeof(*shard->strs) * shard->capacity));
}
for (size_t i = 0; i < GPR_ARRAY_SIZE(static_metadata_hash); i++) {
static_metadata_hash[i].hash = 0;
static_metadata_hash[i].idx = GRPC_STATIC_MDSTR_COUNT;
}
max_static_metadata_hash_probe = 0;
for (size_t i = 0; i < GRPC_STATIC_MDSTR_COUNT; i++) {
grpc_static_metadata_hash_values[i] = grpc_slice_default_hash_internal(
grpc_core::g_static_metadata_slice_table[i]);
for (size_t j = 0; j < GPR_ARRAY_SIZE(static_metadata_hash); j++) {
size_t slot = (grpc_static_metadata_hash_values[i] + j) %
GPR_ARRAY_SIZE(static_metadata_hash);
if (static_metadata_hash[slot].idx == GRPC_STATIC_MDSTR_COUNT) {
static_metadata_hash[slot].hash = grpc_static_metadata_hash_values[i];
static_metadata_hash[slot].idx = static_cast<uint32_t>(i);
if (j > max_static_metadata_hash_probe) {
max_static_metadata_hash_probe = static_cast<uint32_t>(j);
}
break;
}
}
}
// Handle KV hash for all static mdelems.
for (size_t i = 0; i < GRPC_STATIC_MDELEM_COUNT; ++i) {
grpc_core::g_static_mdelem_table[i].HashInit();
}
}
void grpc_slice_intern_shutdown(void) {

@ -56,8 +56,7 @@ void grpc_slice_buffer_sub_first(grpc_slice_buffer* sb, size_t begin,
bool grpc_slice_is_interned(const grpc_slice& slice);
inline bool grpc_slice_is_interned(const grpc_slice& slice) {
return (slice.refcount &&
(slice.refcount->GetType() == grpc_slice_refcount::Type::INTERNED ||
slice.refcount->GetType() == grpc_slice_refcount::Type::STATIC));
(slice.refcount->GetType() == grpc_slice_refcount::Type::INTERNED));
}
inline bool grpc_slice_static_interned_equal(const grpc_slice& a,

@ -17,17 +17,16 @@
#include <grpc/support/port_platform.h>
#include <string.h>
#include <grpc/support/alloc.h>
#include "src/core/lib/gpr/murmur_hash.h"
#include "src/core/lib/slice/slice_refcount_base.h"
#include "src/core/lib/slice/static_slice.h"
// Interned slices have specific fast-path operations for hashing. To inline
// these operations, we need to forward declare them here.
extern uint32_t grpc_static_metadata_hash_values[GRPC_STATIC_MDSTR_COUNT];
namespace grpc_core {
extern uint32_t g_hash_seed;
extern grpc_slice_refcount kNoopRefcount;
// TODO(ctiller): when this is removed, remove the std::atomic* in
@ -73,11 +72,6 @@ inline int grpc_slice_refcount::Eq(const grpc_slice& a, const grpc_slice& b) {
GPR_DEBUG_ASSERT(a.refcount != nullptr);
GPR_DEBUG_ASSERT(a.refcount == this);
switch (ref_type_) {
case Type::STATIC:
GPR_DEBUG_ASSERT(
(GRPC_STATIC_METADATA_INDEX(a) == GRPC_STATIC_METADATA_INDEX(b)) ==
(a.refcount == b.refcount));
ABSL_FALLTHROUGH_INTENDED;
case Type::INTERNED:
return a.refcount == b.refcount;
case Type::NOP:
@ -94,9 +88,6 @@ inline uint32_t grpc_slice_refcount::Hash(const grpc_slice& slice) {
GPR_DEBUG_ASSERT(slice.refcount != nullptr);
GPR_DEBUG_ASSERT(slice.refcount == this);
switch (ref_type_) {
case Type::STATIC:
return ::grpc_static_metadata_hash_values[GRPC_STATIC_METADATA_INDEX(
slice)];
case Type::INTERNED:
return reinterpret_cast<grpc_core::InternedSliceRefcount*>(slice.refcount)
->hash;

@ -85,7 +85,6 @@
struct grpc_slice_refcount {
public:
enum class Type {
STATIC, // Refcount for a static metadata slice.
INTERNED, // Refcount for an interned slice.
NOP, // No-Op
REGULAR // Refcount for non-static-metadata, non-interned slices.
@ -163,19 +162,4 @@ struct grpc_slice_refcount {
void* destroy_fn_arg_ = nullptr;
};
namespace grpc_core {
struct StaticSliceRefcount {
static grpc_slice_refcount kStaticSubRefcount;
explicit StaticSliceRefcount(uint32_t index)
: base(&kStaticSubRefcount, grpc_slice_refcount::Type::STATIC),
index(index) {}
grpc_slice_refcount base;
const uint32_t index;
};
} // namespace grpc_core
#endif // GRPC_CORE_LIB_SLICE_SLICE_REFCOUNT_BASE_H

@ -1,306 +0,0 @@
/*
* Copyright 2015 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* WARNING: Auto-generated code.
*
* To make changes to this file, change
* tools/codegen/core/gen_static_metadata.py, and then re-run it.
*
* See metadata.h for an explanation of the interface here, and metadata.cc for
* an explanation of what's going on.
*/
#include <grpc/support/port_platform.h>
#include "src/core/lib/slice/static_slice.h"
namespace grpc_core {
const uint8_t g_static_metadata_bytes[] = {
103, 114, 112, 99, 45, 116, 105, 109, 101, 111, 117, 116, 47, 103, 114,
112, 99, 46, 108, 98, 46, 118, 49, 46, 76, 111, 97, 100, 66, 97,
108, 97, 110, 99, 101, 114, 47, 66, 97, 108, 97, 110, 99, 101, 76,
111, 97, 100, 47, 101, 110, 118, 111, 121, 46, 115, 101, 114, 118, 105,
99, 101, 46, 108, 111, 97, 100, 95, 115, 116, 97, 116, 115, 46, 118,
50, 46, 76, 111, 97, 100, 82, 101, 112, 111, 114, 116, 105, 110, 103,
83, 101, 114, 118, 105, 99, 101, 47, 83, 116, 114, 101, 97, 109, 76,
111, 97, 100, 83, 116, 97, 116, 115, 47, 101, 110, 118, 111, 121, 46,
115, 101, 114, 118, 105, 99, 101, 46, 108, 111, 97, 100, 95, 115, 116,
97, 116, 115, 46, 118, 51, 46, 76, 111, 97, 100, 82, 101, 112, 111,
114, 116, 105, 110, 103, 83, 101, 114, 118, 105, 99, 101, 47, 83, 116,
114, 101, 97, 109, 76, 111, 97, 100, 83, 116, 97, 116, 115, 47, 103,
114, 112, 99, 46, 104, 101, 97, 108, 116, 104, 46, 118, 49, 46, 72,
101, 97, 108, 116, 104, 47, 87, 97, 116, 99, 104, 47, 101, 110, 118,
111, 121, 46, 115, 101, 114, 118, 105, 99, 101, 46, 100, 105, 115, 99,
111, 118, 101, 114, 121, 46, 118, 50, 46, 65, 103, 103, 114, 101, 103,
97, 116, 101, 100, 68, 105, 115, 99, 111, 118, 101, 114, 121, 83, 101,
114, 118, 105, 99, 101, 47, 83, 116, 114, 101, 97, 109, 65, 103, 103,
114, 101, 103, 97, 116, 101, 100, 82, 101, 115, 111, 117, 114, 99, 101,
115, 47, 101, 110, 118, 111, 121, 46, 115, 101, 114, 118, 105, 99, 101,
46, 100, 105, 115, 99, 111, 118, 101, 114, 121, 46, 118, 51, 46, 65,
103, 103, 114, 101, 103, 97, 116, 101, 100, 68, 105, 115, 99, 111, 118,
101, 114, 121, 83, 101, 114, 118, 105, 99, 101, 47, 83, 116, 114, 101,
97, 109, 65, 103, 103, 114, 101, 103, 97, 116, 101, 100, 82, 101, 115,
111, 117, 114, 99, 101, 115, 116, 101, 116, 114, 97, 105, 108, 101, 114,
115, 58, 97, 117, 116, 104, 111, 114, 105, 116, 121, 58, 109, 101, 116,
104, 111, 100, 71, 69, 84, 80, 79, 83, 84, 58, 112, 97, 116, 104,
47, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 58, 115, 99,
104, 101, 109, 101, 104, 116, 116, 112, 104, 116, 116, 112, 115, 58, 115,
116, 97, 116, 117, 115, 50, 48, 48, 50, 48, 52, 50, 48, 54, 51,
48, 52, 52, 48, 48, 52, 48, 52, 53, 48, 48, 97, 99, 99, 101,
112, 116, 45, 99, 104, 97, 114, 115, 101, 116, 97, 99, 99, 101, 112,
116, 45, 101, 110, 99, 111, 100, 105, 110, 103, 103, 122, 105, 112, 44,
32, 100, 101, 102, 108, 97, 116, 101, 97, 99, 99, 101, 112, 116, 45,
108, 97, 110, 103, 117, 97, 103, 101, 97, 99, 99, 101, 112, 116, 45,
114, 97, 110, 103, 101, 115, 97, 99, 99, 101, 112, 116, 97, 99, 99,
101, 115, 115, 45, 99, 111, 110, 116, 114, 111, 108, 45, 97, 108, 108,
111, 119, 45, 111, 114, 105, 103, 105, 110, 97, 103, 101, 97, 108, 108,
111, 119, 97, 117, 116, 104, 111, 114, 105, 122, 97, 116, 105, 111, 110,
99, 97, 99, 104, 101, 45, 99, 111, 110, 116, 114, 111, 108, 99, 111,
110, 116, 101, 110, 116, 45, 100, 105, 115, 112, 111, 115, 105, 116, 105,
111, 110, 99, 111, 110, 116, 101, 110, 116, 45, 101, 110, 99, 111, 100,
105, 110, 103, 99, 111, 110, 116, 101, 110, 116, 45, 108, 97, 110, 103,
117, 97, 103, 101, 99, 111, 110, 116, 101, 110, 116, 45, 108, 101, 110,
103, 116, 104, 99, 111, 110, 116, 101, 110, 116, 45, 108, 111, 99, 97,
116, 105, 111, 110, 99, 111, 110, 116, 101, 110, 116, 45, 114, 97, 110,
103, 101, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 99,
111, 111, 107, 105, 101, 100, 97, 116, 101, 101, 116, 97, 103, 101, 120,
112, 101, 99, 116, 101, 120, 112, 105, 114, 101, 115, 102, 114, 111, 109,
104, 111, 115, 116, 105, 102, 45, 109, 97, 116, 99, 104, 105, 102, 45,
109, 111, 100, 105, 102, 105, 101, 100, 45, 115, 105, 110, 99, 101, 105,
102, 45, 110, 111, 110, 101, 45, 109, 97, 116, 99, 104, 105, 102, 45,
114, 97, 110, 103, 101, 105, 102, 45, 117, 110, 109, 111, 100, 105, 102,
105, 101, 100, 45, 115, 105, 110, 99, 101, 108, 97, 115, 116, 45, 109,
111, 100, 105, 102, 105, 101, 100, 108, 105, 110, 107, 108, 111, 99, 97,
116, 105, 111, 110, 109, 97, 120, 45, 102, 111, 114, 119, 97, 114, 100,
115, 112, 114, 111, 120, 121, 45, 97, 117, 116, 104, 101, 110, 116, 105,
99, 97, 116, 101, 112, 114, 111, 120, 121, 45, 97, 117, 116, 104, 111,
114, 105, 122, 97, 116, 105, 111, 110, 114, 97, 110, 103, 101, 114, 101,
102, 101, 114, 101, 114, 114, 101, 102, 114, 101, 115, 104, 114, 101, 116,
114, 121, 45, 97, 102, 116, 101, 114, 115, 101, 114, 118, 101, 114, 115,
101, 116, 45, 99, 111, 111, 107, 105, 101, 115, 116, 114, 105, 99, 116,
45, 116, 114, 97, 110, 115, 112, 111, 114, 116, 45, 115, 101, 99, 117,
114, 105, 116, 121, 116, 114, 97, 110, 115, 102, 101, 114, 45, 101, 110,
99, 111, 100, 105, 110, 103, 117, 115, 101, 114, 45, 97, 103, 101, 110,
116, 118, 97, 114, 121, 118, 105, 97, 119, 119, 119, 45, 97, 117, 116,
104, 101, 110, 116, 105, 99, 97, 116, 101, 108, 98, 45, 99, 111, 115,
116, 45, 98, 105, 110};
grpc_slice_refcount StaticSliceRefcount::kStaticSubRefcount;
StaticSliceRefcount g_static_metadata_slice_refcounts[GRPC_STATIC_MDSTR_COUNT] =
{
StaticSliceRefcount(0), StaticSliceRefcount(1),
StaticSliceRefcount(2), StaticSliceRefcount(3),
StaticSliceRefcount(4), StaticSliceRefcount(5),
StaticSliceRefcount(6), StaticSliceRefcount(7),
StaticSliceRefcount(8), StaticSliceRefcount(9),
StaticSliceRefcount(10), StaticSliceRefcount(11),
StaticSliceRefcount(12), StaticSliceRefcount(13),
StaticSliceRefcount(14), StaticSliceRefcount(15),
StaticSliceRefcount(16), StaticSliceRefcount(17),
StaticSliceRefcount(18), StaticSliceRefcount(19),
StaticSliceRefcount(20), StaticSliceRefcount(21),
StaticSliceRefcount(22), StaticSliceRefcount(23),
StaticSliceRefcount(24), StaticSliceRefcount(25),
StaticSliceRefcount(26), StaticSliceRefcount(27),
StaticSliceRefcount(28), StaticSliceRefcount(29),
StaticSliceRefcount(30), StaticSliceRefcount(31),
StaticSliceRefcount(32), StaticSliceRefcount(33),
StaticSliceRefcount(34), StaticSliceRefcount(35),
StaticSliceRefcount(36), StaticSliceRefcount(37),
StaticSliceRefcount(38), StaticSliceRefcount(39),
StaticSliceRefcount(40), StaticSliceRefcount(41),
StaticSliceRefcount(42), StaticSliceRefcount(43),
StaticSliceRefcount(44), StaticSliceRefcount(45),
StaticSliceRefcount(46), StaticSliceRefcount(47),
StaticSliceRefcount(48), StaticSliceRefcount(49),
StaticSliceRefcount(50), StaticSliceRefcount(51),
StaticSliceRefcount(52), StaticSliceRefcount(53),
StaticSliceRefcount(54), StaticSliceRefcount(55),
StaticSliceRefcount(56), StaticSliceRefcount(57),
StaticSliceRefcount(58), StaticSliceRefcount(59),
StaticSliceRefcount(60), StaticSliceRefcount(61),
StaticSliceRefcount(62), StaticSliceRefcount(63),
StaticSliceRefcount(64), StaticSliceRefcount(65),
StaticSliceRefcount(66), StaticSliceRefcount(67),
StaticSliceRefcount(68), StaticSliceRefcount(69),
StaticSliceRefcount(70), StaticSliceRefcount(71),
StaticSliceRefcount(72), StaticSliceRefcount(73),
StaticSliceRefcount(74), StaticSliceRefcount(75),
StaticSliceRefcount(76),
};
const StaticMetadataSlice
g_static_metadata_slice_table[GRPC_STATIC_MDSTR_COUNT] = {
StaticMetadataSlice(&g_static_metadata_slice_refcounts[0].base, 12,
g_static_metadata_bytes + 0),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 36,
g_static_metadata_bytes + 12),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[3].base, 65,
g_static_metadata_bytes + 48),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[4].base, 65,
g_static_metadata_bytes + 113),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 28,
g_static_metadata_bytes + 178),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 80,
g_static_metadata_bytes + 206),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 80,
g_static_metadata_bytes + 286),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 2,
g_static_metadata_bytes + 366),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 8,
g_static_metadata_bytes + 368),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 10,
g_static_metadata_bytes + 376),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[11].base, 7,
g_static_metadata_bytes + 386),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[12].base, 3,
g_static_metadata_bytes + 393),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[13].base, 4,
g_static_metadata_bytes + 396),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 5,
g_static_metadata_bytes + 400),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 1,
g_static_metadata_bytes + 405),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[16].base, 11,
g_static_metadata_bytes + 406),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[17].base, 7,
g_static_metadata_bytes + 417),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[18].base, 4,
g_static_metadata_bytes + 424),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 5,
g_static_metadata_bytes + 428),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 7,
g_static_metadata_bytes + 433),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[21].base, 3,
g_static_metadata_bytes + 440),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[22].base, 3,
g_static_metadata_bytes + 443),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[23].base, 3,
g_static_metadata_bytes + 446),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[24].base, 3,
g_static_metadata_bytes + 449),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[25].base, 3,
g_static_metadata_bytes + 452),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[26].base, 3,
g_static_metadata_bytes + 455),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 3,
g_static_metadata_bytes + 458),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[28].base, 14,
g_static_metadata_bytes + 461),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[29].base, 15,
g_static_metadata_bytes + 475),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[30].base, 13,
g_static_metadata_bytes + 490),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[31].base, 15,
g_static_metadata_bytes + 503),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[32].base, 13,
g_static_metadata_bytes + 518),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[33].base, 6,
g_static_metadata_bytes + 531),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 27,
g_static_metadata_bytes + 537),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 3,
g_static_metadata_bytes + 564),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[36].base, 5,
g_static_metadata_bytes + 567),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[37].base, 13,
g_static_metadata_bytes + 572),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[38].base, 13,
g_static_metadata_bytes + 585),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[39].base, 19,
g_static_metadata_bytes + 598),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[40].base, 16,
g_static_metadata_bytes + 617),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[41].base, 16,
g_static_metadata_bytes + 633),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[42].base, 14,
g_static_metadata_bytes + 649),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[43].base, 16,
g_static_metadata_bytes + 663),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[44].base, 13,
g_static_metadata_bytes + 679),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[45].base, 12,
g_static_metadata_bytes + 692),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[46].base, 6,
g_static_metadata_bytes + 704),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[47].base, 4,
g_static_metadata_bytes + 710),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[48].base, 4,
g_static_metadata_bytes + 714),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[49].base, 6,
g_static_metadata_bytes + 718),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[50].base, 7,
g_static_metadata_bytes + 724),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[51].base, 4,
g_static_metadata_bytes + 731),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[52].base, 4,
g_static_metadata_bytes + 735),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[53].base, 8,
g_static_metadata_bytes + 739),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[54].base, 17,
g_static_metadata_bytes + 747),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[55].base, 13,
g_static_metadata_bytes + 764),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[56].base, 8,
g_static_metadata_bytes + 777),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[57].base, 19,
g_static_metadata_bytes + 785),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[58].base, 13,
g_static_metadata_bytes + 804),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[59].base, 4,
g_static_metadata_bytes + 817),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[60].base, 8,
g_static_metadata_bytes + 821),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[61].base, 12,
g_static_metadata_bytes + 829),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[62].base, 18,
g_static_metadata_bytes + 841),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[63].base, 19,
g_static_metadata_bytes + 859),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[64].base, 5,
g_static_metadata_bytes + 878),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[65].base, 7,
g_static_metadata_bytes + 883),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[66].base, 7,
g_static_metadata_bytes + 890),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[67].base, 11,
g_static_metadata_bytes + 897),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[68].base, 6,
g_static_metadata_bytes + 908),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[69].base, 10,
g_static_metadata_bytes + 914),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[70].base, 25,
g_static_metadata_bytes + 924),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[71].base, 17,
g_static_metadata_bytes + 949),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[72].base, 10,
g_static_metadata_bytes + 966),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[73].base, 4,
g_static_metadata_bytes + 976),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[74].base, 3,
g_static_metadata_bytes + 980),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[75].base, 16,
g_static_metadata_bytes + 983),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[76].base, 11,
g_static_metadata_bytes + 999),
};
} // namespace grpc_core

@ -1,246 +0,0 @@
/*
* Copyright 2015 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* WARNING: Auto-generated code.
*
* To make changes to this file, change
* tools/codegen/core/gen_static_metadata.py, and then re-run it.
*
* See metadata.h for an explanation of the interface here, and metadata.cc for
* an explanation of what's going on.
*/
#ifndef GRPC_CORE_LIB_SLICE_STATIC_SLICE_H
#define GRPC_CORE_LIB_SLICE_STATIC_SLICE_H
#include <grpc/support/port_platform.h>
#include <cstdint>
#include <type_traits>
#include "src/core/lib/slice/slice_refcount_base.h"
#include "src/core/lib/slice/slice_utils.h"
static_assert(
std::is_trivially_destructible<grpc_core::StaticMetadataSlice>::value,
"StaticMetadataSlice must be trivially destructible.");
#define GRPC_STATIC_MDSTR_COUNT 77
/* "grpc-timeout" */
#define GRPC_MDSTR_GRPC_TIMEOUT (::grpc_core::g_static_metadata_slice_table[0])
/* "" */
#define GRPC_MDSTR_EMPTY (::grpc_core::g_static_metadata_slice_table[1])
/* "/grpc.lb.v1.LoadBalancer/BalanceLoad" */
#define GRPC_MDSTR_SLASH_GRPC_DOT_LB_DOT_V1_DOT_LOADBALANCER_SLASH_BALANCELOAD \
(::grpc_core::g_static_metadata_slice_table[2])
/* "/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats" */
#define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V2_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS \
(::grpc_core::g_static_metadata_slice_table[3])
/* "/envoy.service.load_stats.v3.LoadReportingService/StreamLoadStats" */
#define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V3_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS \
(::grpc_core::g_static_metadata_slice_table[4])
/* "/grpc.health.v1.Health/Watch" */
#define GRPC_MDSTR_SLASH_GRPC_DOT_HEALTH_DOT_V1_DOT_HEALTH_SLASH_WATCH \
(::grpc_core::g_static_metadata_slice_table[5])
/* "/envoy.service.discovery.v2.AggregatedDiscoveryService/StreamAggregatedResources"
*/
#define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V2_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES \
(::grpc_core::g_static_metadata_slice_table[6])
/* "/envoy.service.discovery.v3.AggregatedDiscoveryService/StreamAggregatedResources"
*/
#define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V3_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES \
(::grpc_core::g_static_metadata_slice_table[7])
/* "te" */
#define GRPC_MDSTR_TE (::grpc_core::g_static_metadata_slice_table[8])
/* "trailers" */
#define GRPC_MDSTR_TRAILERS (::grpc_core::g_static_metadata_slice_table[9])
/* ":authority" */
#define GRPC_MDSTR_AUTHORITY (::grpc_core::g_static_metadata_slice_table[10])
/* ":method" */
#define GRPC_MDSTR_METHOD (::grpc_core::g_static_metadata_slice_table[11])
/* "GET" */
#define GRPC_MDSTR_GET (::grpc_core::g_static_metadata_slice_table[12])
/* "POST" */
#define GRPC_MDSTR_POST (::grpc_core::g_static_metadata_slice_table[13])
/* ":path" */
#define GRPC_MDSTR_PATH (::grpc_core::g_static_metadata_slice_table[14])
/* "/" */
#define GRPC_MDSTR_SLASH (::grpc_core::g_static_metadata_slice_table[15])
/* "/index.html" */
#define GRPC_MDSTR_SLASH_INDEX_DOT_HTML \
(::grpc_core::g_static_metadata_slice_table[16])
/* ":scheme" */
#define GRPC_MDSTR_SCHEME (::grpc_core::g_static_metadata_slice_table[17])
/* "http" */
#define GRPC_MDSTR_HTTP (::grpc_core::g_static_metadata_slice_table[18])
/* "https" */
#define GRPC_MDSTR_HTTPS (::grpc_core::g_static_metadata_slice_table[19])
/* ":status" */
#define GRPC_MDSTR_STATUS (::grpc_core::g_static_metadata_slice_table[20])
/* "200" */
#define GRPC_MDSTR_200 (::grpc_core::g_static_metadata_slice_table[21])
/* "204" */
#define GRPC_MDSTR_204 (::grpc_core::g_static_metadata_slice_table[22])
/* "206" */
#define GRPC_MDSTR_206 (::grpc_core::g_static_metadata_slice_table[23])
/* "304" */
#define GRPC_MDSTR_304 (::grpc_core::g_static_metadata_slice_table[24])
/* "400" */
#define GRPC_MDSTR_400 (::grpc_core::g_static_metadata_slice_table[25])
/* "404" */
#define GRPC_MDSTR_404 (::grpc_core::g_static_metadata_slice_table[26])
/* "500" */
#define GRPC_MDSTR_500 (::grpc_core::g_static_metadata_slice_table[27])
/* "accept-charset" */
#define GRPC_MDSTR_ACCEPT_CHARSET \
(::grpc_core::g_static_metadata_slice_table[28])
/* "accept-encoding" */
#define GRPC_MDSTR_ACCEPT_ENCODING \
(::grpc_core::g_static_metadata_slice_table[29])
/* "gzip, deflate" */
#define GRPC_MDSTR_GZIP_COMMA_DEFLATE \
(::grpc_core::g_static_metadata_slice_table[30])
/* "accept-language" */
#define GRPC_MDSTR_ACCEPT_LANGUAGE \
(::grpc_core::g_static_metadata_slice_table[31])
/* "accept-ranges" */
#define GRPC_MDSTR_ACCEPT_RANGES \
(::grpc_core::g_static_metadata_slice_table[32])
/* "accept" */
#define GRPC_MDSTR_ACCEPT (::grpc_core::g_static_metadata_slice_table[33])
/* "access-control-allow-origin" */
#define GRPC_MDSTR_ACCESS_CONTROL_ALLOW_ORIGIN \
(::grpc_core::g_static_metadata_slice_table[34])
/* "age" */
#define GRPC_MDSTR_AGE (::grpc_core::g_static_metadata_slice_table[35])
/* "allow" */
#define GRPC_MDSTR_ALLOW (::grpc_core::g_static_metadata_slice_table[36])
/* "authorization" */
#define GRPC_MDSTR_AUTHORIZATION \
(::grpc_core::g_static_metadata_slice_table[37])
/* "cache-control" */
#define GRPC_MDSTR_CACHE_CONTROL \
(::grpc_core::g_static_metadata_slice_table[38])
/* "content-disposition" */
#define GRPC_MDSTR_CONTENT_DISPOSITION \
(::grpc_core::g_static_metadata_slice_table[39])
/* "content-encoding" */
#define GRPC_MDSTR_CONTENT_ENCODING \
(::grpc_core::g_static_metadata_slice_table[40])
/* "content-language" */
#define GRPC_MDSTR_CONTENT_LANGUAGE \
(::grpc_core::g_static_metadata_slice_table[41])
/* "content-length" */
#define GRPC_MDSTR_CONTENT_LENGTH \
(::grpc_core::g_static_metadata_slice_table[42])
/* "content-location" */
#define GRPC_MDSTR_CONTENT_LOCATION \
(::grpc_core::g_static_metadata_slice_table[43])
/* "content-range" */
#define GRPC_MDSTR_CONTENT_RANGE \
(::grpc_core::g_static_metadata_slice_table[44])
/* "content-type" */
#define GRPC_MDSTR_CONTENT_TYPE (::grpc_core::g_static_metadata_slice_table[45])
/* "cookie" */
#define GRPC_MDSTR_COOKIE (::grpc_core::g_static_metadata_slice_table[46])
/* "date" */
#define GRPC_MDSTR_DATE (::grpc_core::g_static_metadata_slice_table[47])
/* "etag" */
#define GRPC_MDSTR_ETAG (::grpc_core::g_static_metadata_slice_table[48])
/* "expect" */
#define GRPC_MDSTR_EXPECT (::grpc_core::g_static_metadata_slice_table[49])
/* "expires" */
#define GRPC_MDSTR_EXPIRES (::grpc_core::g_static_metadata_slice_table[50])
/* "from" */
#define GRPC_MDSTR_FROM (::grpc_core::g_static_metadata_slice_table[51])
/* "host" */
#define GRPC_MDSTR_HOST (::grpc_core::g_static_metadata_slice_table[52])
/* "if-match" */
#define GRPC_MDSTR_IF_MATCH (::grpc_core::g_static_metadata_slice_table[53])
/* "if-modified-since" */
#define GRPC_MDSTR_IF_MODIFIED_SINCE \
(::grpc_core::g_static_metadata_slice_table[54])
/* "if-none-match" */
#define GRPC_MDSTR_IF_NONE_MATCH \
(::grpc_core::g_static_metadata_slice_table[55])
/* "if-range" */
#define GRPC_MDSTR_IF_RANGE (::grpc_core::g_static_metadata_slice_table[56])
/* "if-unmodified-since" */
#define GRPC_MDSTR_IF_UNMODIFIED_SINCE \
(::grpc_core::g_static_metadata_slice_table[57])
/* "last-modified" */
#define GRPC_MDSTR_LAST_MODIFIED \
(::grpc_core::g_static_metadata_slice_table[58])
/* "link" */
#define GRPC_MDSTR_LINK (::grpc_core::g_static_metadata_slice_table[59])
/* "location" */
#define GRPC_MDSTR_LOCATION (::grpc_core::g_static_metadata_slice_table[60])
/* "max-forwards" */
#define GRPC_MDSTR_MAX_FORWARDS (::grpc_core::g_static_metadata_slice_table[61])
/* "proxy-authenticate" */
#define GRPC_MDSTR_PROXY_AUTHENTICATE \
(::grpc_core::g_static_metadata_slice_table[62])
/* "proxy-authorization" */
#define GRPC_MDSTR_PROXY_AUTHORIZATION \
(::grpc_core::g_static_metadata_slice_table[63])
/* "range" */
#define GRPC_MDSTR_RANGE (::grpc_core::g_static_metadata_slice_table[64])
/* "referer" */
#define GRPC_MDSTR_REFERER (::grpc_core::g_static_metadata_slice_table[65])
/* "refresh" */
#define GRPC_MDSTR_REFRESH (::grpc_core::g_static_metadata_slice_table[66])
/* "retry-after" */
#define GRPC_MDSTR_RETRY_AFTER (::grpc_core::g_static_metadata_slice_table[67])
/* "server" */
#define GRPC_MDSTR_SERVER (::grpc_core::g_static_metadata_slice_table[68])
/* "set-cookie" */
#define GRPC_MDSTR_SET_COOKIE (::grpc_core::g_static_metadata_slice_table[69])
/* "strict-transport-security" */
#define GRPC_MDSTR_STRICT_TRANSPORT_SECURITY \
(::grpc_core::g_static_metadata_slice_table[70])
/* "transfer-encoding" */
#define GRPC_MDSTR_TRANSFER_ENCODING \
(::grpc_core::g_static_metadata_slice_table[71])
/* "user-agent" */
#define GRPC_MDSTR_USER_AGENT (::grpc_core::g_static_metadata_slice_table[72])
/* "vary" */
#define GRPC_MDSTR_VARY (::grpc_core::g_static_metadata_slice_table[73])
/* "via" */
#define GRPC_MDSTR_VIA (::grpc_core::g_static_metadata_slice_table[74])
/* "www-authenticate" */
#define GRPC_MDSTR_WWW_AUTHENTICATE \
(::grpc_core::g_static_metadata_slice_table[75])
/* "lb-cost-bin" */
#define GRPC_MDSTR_LB_COST_BIN (::grpc_core::g_static_metadata_slice_table[76])
namespace grpc_core {
extern StaticSliceRefcount
g_static_metadata_slice_refcounts[GRPC_STATIC_MDSTR_COUNT];
extern const StaticMetadataSlice
g_static_metadata_slice_table[GRPC_STATIC_MDSTR_COUNT];
extern const uint8_t g_static_metadata_bytes[];
} // namespace grpc_core
#define GRPC_IS_STATIC_METADATA_STRING(slice) \
((slice).refcount != NULL && \
(slice).refcount->GetType() == grpc_slice_refcount::Type::STATIC)
#define GRPC_STATIC_METADATA_INDEX(static_slice) \
(reinterpret_cast<::grpc_core::StaticSliceRefcount*>( \
(static_slice).refcount) \
->index)
#endif /* GRPC_CORE_LIB_SLICE_STATIC_SLICE_H */

@ -60,8 +60,6 @@
#include "src/core/lib/surface/server.h"
#include "src/core/lib/surface/validate_metadata.h"
#include "src/core/lib/transport/error_utils.h"
#include "src/core/lib/transport/metadata.h"
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/transport/transport.h"
/** The maximum number of concurrent batches possible.
@ -75,9 +73,6 @@
- status/close recv (depending on client/server) */
#define MAX_CONCURRENT_BATCHES 6
// Used to create arena for the first call.
#define ESTIMATED_MDELEM_COUNT 16
struct batch_control {
batch_control() = default;
@ -328,8 +323,7 @@ static parent_call* get_parent_call(grpc_call* call) {
}
size_t grpc_call_get_initial_size_estimate() {
return sizeof(grpc_call) + sizeof(batch_control) * MAX_CONCURRENT_BATCHES +
sizeof(grpc_linked_mdelem) * ESTIMATED_MDELEM_COUNT;
return sizeof(grpc_call) + sizeof(batch_control) * MAX_CONCURRENT_BATCHES;
}
grpc_error_handle grpc_call_create(grpc_call_create_args* args,
@ -814,7 +808,9 @@ class PublishToAppEncoder {
public:
explicit PublishToAppEncoder(grpc_metadata_array* dest) : dest_(dest) {}
void Encode(grpc_mdelem md) { Append(GRPC_MDKEY(md), GRPC_MDVALUE(md)); }
void Encode(const grpc_core::Slice& key, const grpc_core::Slice& value) {
Append(key.c_slice(), value.c_slice());
}
// Catch anything that is not explicitly handled, and do not publish it to the
// application. If new metadata is added to a batch that needs to be
@ -838,6 +834,10 @@ class PublishToAppEncoder {
Append(grpc_core::GrpcRetryPushbackMsMetadata::key(), count);
}
void Encode(grpc_core::LbTokenMetadata, const grpc_core::Slice& slice) {
Append(grpc_core::LbTokenMetadata::key(), slice);
}
private:
void Append(absl::string_view key, int64_t value) {
Append(grpc_core::StaticSlice::FromStaticString(key).c_slice(),

@ -46,7 +46,6 @@
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/surface/api_trace.h"
#include "src/core/lib/surface/call.h"
#include "src/core/lib/transport/static_metadata.h"
/** Cache grpc-status: X mdelems for X = 0..NUM_CACHED_STATUS_ELEMS.
* Avoids needing to take a metadata context lock for sending status

@ -29,7 +29,6 @@
#include "src/core/lib/gprpp/manual_constructor.h"
#include "src/core/lib/resource_quota/memory_quota.h"
#include "src/core/lib/surface/channel_stack_type.h"
#include "src/core/lib/transport/metadata.h"
/// Creates a grpc_channel.
grpc_channel* grpc_channel_create(const char* target,

@ -105,7 +105,6 @@ void grpc_init(void) {
grpc_fork_handlers_auto_register();
grpc_stats_init();
grpc_slice_intern_init();
grpc_mdctx_global_init();
grpc_core::channelz::ChannelzRegistry::Init();
grpc_security_pre_init();
grpc_core::ApplicationCallbackExecCtx::GlobalInit();
@ -141,7 +140,6 @@ void grpc_shutdown_internal_locked(void)
grpc_iomgr_shutdown();
gpr_timers_global_destroy();
grpc_tracer_shutdown();
grpc_mdctx_global_shutdown();
grpc_slice_intern_shutdown();
grpc_core::channelz::ChannelzRegistry::Shutdown();
grpc_stats_shutdown();

@ -35,7 +35,6 @@
#include "src/core/lib/surface/call.h"
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/transport/connectivity_state.h"
#include "src/core/lib/transport/static_metadata.h"
#define GRPC_ARG_LAME_FILTER_ERROR "grpc.lame_filter_error"

@ -53,8 +53,6 @@
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/surface/completion_queue.h"
#include "src/core/lib/surface/init.h"
#include "src/core/lib/transport/metadata.h"
#include "src/core/lib/transport/static_metadata.h"
namespace grpc_core {
@ -1035,8 +1033,7 @@ void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
if (has_host) {
host = ExternallyManagedSlice(rm->host.c_str());
}
uint32_t hash =
GRPC_MDSTR_KV_HASH(has_host ? host.Hash() : 0, method.Hash());
uint32_t hash = MixHash32(has_host ? host.Hash() : 0, method.Hash());
uint32_t probes = 0;
for (probes = 0; (*registered_methods_)[(hash + probes) % slots]
.server_registered_method != nullptr;
@ -1080,8 +1077,8 @@ Server::ChannelRegisteredMethod* Server::ChannelData::GetRegisteredMethod(
if (registered_methods_ == nullptr) return nullptr;
/* TODO(ctiller): unify these two searches */
/* check for an exact match with host */
uint32_t hash = GRPC_MDSTR_KV_HASH(grpc_slice_hash_internal(host),
grpc_slice_hash_internal(path));
uint32_t hash =
MixHash32(grpc_slice_hash_internal(host), grpc_slice_hash_internal(path));
for (size_t i = 0; i <= registered_method_max_probes_; i++) {
ChannelRegisteredMethod* rm =
&(*registered_methods_)[(hash + i) % registered_methods_->size()];
@ -1096,7 +1093,7 @@ Server::ChannelRegisteredMethod* Server::ChannelData::GetRegisteredMethod(
return rm;
}
/* check for a wildcard method definition (no host set) */
hash = GRPC_MDSTR_KV_HASH(0, grpc_slice_hash_internal(path));
hash = MixHash32(0, grpc_slice_hash_internal(path));
for (size_t i = 0; i <= registered_method_max_probes_; i++) {
ChannelRegisteredMethod* rm =
&(*registered_methods_)[(hash + i) % registered_methods_->size()];

@ -1,714 +0,0 @@
/*
*
* Copyright 2015 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <grpc/support/port_platform.h>
#include "src/core/lib/transport/metadata.h"
#include <assert.h>
#include <inttypes.h>
#include <stddef.h>
#include <string.h>
#include <grpc/compression.h>
#include <grpc/grpc.h>
#include <grpc/support/alloc.h>
#include <grpc/support/atm.h>
#include <grpc/support/log.h>
#include <grpc/support/string_util.h>
#include <grpc/support/time.h>
#include "src/core/lib/gpr/murmur_hash.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
#include "src/core/lib/profiling/timers.h"
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/transport/static_metadata.h"
using grpc_core::AllocatedMetadata;
using grpc_core::InternedMetadata;
using grpc_core::StaticMetadata;
using grpc_core::UserData;
/* There are two kinds of mdelem and mdstr instances.
* Static instances are declared in static_metadata.{h,c} and
* are initialized by grpc_mdctx_global_init().
* Dynamic instances are stored in hash tables on grpc_mdctx, and are backed
* by internal_string and internal_element structures.
* Internal helper functions here-in (is_mdstr_static, is_mdelem_static) are
* used to determine which kind of element a pointer refers to.
*/
grpc_core::DebugOnlyTraceFlag grpc_trace_metadata(false, "metadata");
#ifndef NDEBUG
#define DEBUG_ARGS , const char *file, int line
#define FWD_DEBUG_ARGS file, line
void grpc_mdelem_trace_ref(void* md, const grpc_slice& key,
const grpc_slice& value, intptr_t refcnt,
const char* file, int line) {
if (grpc_trace_metadata.enabled()) {
char* key_str = grpc_slice_to_c_string(key);
char* value_str = grpc_slice_to_c_string(value);
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
"mdelem REF:%p:%" PRIdPTR "->%" PRIdPTR ": '%s' = '%s'", md,
refcnt, refcnt + 1, key_str, value_str);
gpr_free(key_str);
gpr_free(value_str);
}
}
void grpc_mdelem_trace_unref(void* md, const grpc_slice& key,
const grpc_slice& value, intptr_t refcnt,
const char* file, int line) {
if (grpc_trace_metadata.enabled()) {
char* key_str = grpc_slice_to_c_string(key);
char* value_str = grpc_slice_to_c_string(value);
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
"mdelem UNREF:%p:%" PRIdPTR "->%" PRIdPTR ": '%s' = '%s'", md,
refcnt, refcnt - 1, key_str, value_str);
gpr_free(key_str);
gpr_free(value_str);
}
}
#else // ifndef NDEBUG
#define DEBUG_ARGS
#define FWD_DEBUG_ARGS
#endif // ifndef NDEBUG
#define INITIAL_SHARD_CAPACITY 8
#define LOG2_SHARD_COUNT 4
#define SHARD_COUNT ((size_t)(1 << LOG2_SHARD_COUNT))
#define TABLE_IDX(hash, capacity) (((hash) >> (LOG2_SHARD_COUNT)) % (capacity))
#define SHARD_IDX(hash) ((hash) & ((1 << (LOG2_SHARD_COUNT)) - 1))
void StaticMetadata::HashInit() {
uint32_t k_hash = grpc_slice_hash_internal(kv_.key);
uint32_t v_hash = grpc_slice_hash_internal(kv_.value);
hash_ = GRPC_MDSTR_KV_HASH(k_hash, v_hash);
}
AllocatedMetadata::AllocatedMetadata(const grpc_slice& key,
const grpc_slice& value)
: RefcountedMdBase(grpc_slice_ref_internal(key),
grpc_slice_ref_internal(value)) {
#ifndef NDEBUG
TraceAtStart("ALLOC_MD");
#endif
}
AllocatedMetadata::AllocatedMetadata(const grpc_slice& key,
const grpc_slice& value, const NoRefKey*)
: RefcountedMdBase(key, grpc_slice_ref_internal(value)) {
#ifndef NDEBUG
TraceAtStart("ALLOC_MD_NOREF_KEY");
#endif
}
AllocatedMetadata::AllocatedMetadata(
const grpc_core::ManagedMemorySlice& key,
const grpc_core::UnmanagedMemorySlice& value)
: RefcountedMdBase(key, value) {
#ifndef NDEBUG
TraceAtStart("ALLOC_MD_NOREF_KEY_VAL");
#endif
}
AllocatedMetadata::AllocatedMetadata(
const grpc_core::ExternallyManagedSlice& key,
const grpc_core::UnmanagedMemorySlice& value)
: RefcountedMdBase(key, value) {
#ifndef NDEBUG
TraceAtStart("ALLOC_MD_NOREF_KEY_VAL");
#endif
}
AllocatedMetadata::~AllocatedMetadata() {
grpc_slice_unref_internal(key());
grpc_slice_unref_internal(value());
void* user_data = user_data_.data.load(std::memory_order_relaxed);
if (user_data) {
destroy_user_data_func destroy_user_data =
user_data_.destroy_user_data.load(std::memory_order_relaxed);
destroy_user_data(user_data);
}
}
#ifndef NDEBUG
void grpc_core::RefcountedMdBase::TraceAtStart(const char* tag) {
if (grpc_trace_metadata.enabled()) {
char* key_str = grpc_slice_to_c_string(key());
char* value_str = grpc_slice_to_c_string(value());
gpr_log(GPR_DEBUG, "mdelem %s:%p:%" PRIdPTR ": '%s' = '%s'", tag, this,
RefValue(), key_str, value_str);
gpr_free(key_str);
gpr_free(value_str);
}
}
#endif
InternedMetadata::InternedMetadata(const grpc_slice& key,
const grpc_slice& value, uint32_t hash,
InternedMetadata* next)
: RefcountedMdBase(grpc_slice_ref_internal(key),
grpc_slice_ref_internal(value), hash),
link_(next) {
#ifndef NDEBUG
TraceAtStart("INTERNED_MD");
#endif
}
InternedMetadata::InternedMetadata(const grpc_slice& key,
const grpc_slice& value, uint32_t hash,
InternedMetadata* next, const NoRefKey*)
: RefcountedMdBase(key, grpc_slice_ref_internal(value), hash), link_(next) {
#ifndef NDEBUG
TraceAtStart("INTERNED_MD_NOREF_KEY");
#endif
}
InternedMetadata::~InternedMetadata() {
grpc_slice_unref_internal(key());
grpc_slice_unref_internal(value());
void* user_data = user_data_.data.load(std::memory_order_relaxed);
if (user_data) {
destroy_user_data_func destroy_user_data =
user_data_.destroy_user_data.load(std::memory_order_relaxed);
destroy_user_data(user_data);
}
}
size_t InternedMetadata::CleanupLinkedMetadata(
InternedMetadata::BucketLink* head) {
size_t num_freed = 0;
InternedMetadata::BucketLink* prev_next = head;
InternedMetadata *md, *next;
for (md = head->next; md; md = next) {
next = md->link_.next;
if (md->AllRefsDropped()) {
prev_next->next = next;
delete md;
num_freed++;
} else {
prev_next = &md->link_;
}
}
return num_freed;
}
typedef struct mdtab_shard {
gpr_mu mu;
InternedMetadata::BucketLink* elems;
size_t count;
size_t capacity;
/** Estimate of the number of unreferenced mdelems in the hash table.
This will eventually converge to the exact number, but it's instantaneous
accuracy is not guaranteed */
gpr_atm free_estimate;
} mdtab_shard;
static mdtab_shard g_shards[SHARD_COUNT];
static void gc_mdtab(mdtab_shard* shard);
void grpc_mdctx_global_init(void) {
/* initialize shards */
for (size_t i = 0; i < SHARD_COUNT; i++) {
mdtab_shard* shard = &g_shards[i];
gpr_mu_init(&shard->mu);
shard->count = 0;
gpr_atm_no_barrier_store(&shard->free_estimate, 0);
shard->capacity = INITIAL_SHARD_CAPACITY;
shard->elems = static_cast<InternedMetadata::BucketLink*>(
gpr_zalloc(sizeof(*shard->elems) * shard->capacity));
}
}
void grpc_mdctx_global_shutdown() {
for (size_t i = 0; i < SHARD_COUNT; i++) {
mdtab_shard* shard = &g_shards[i];
gpr_mu_destroy(&shard->mu);
gc_mdtab(shard);
if (shard->count != 0) {
gpr_log(GPR_ERROR, "WARNING: %" PRIuPTR " metadata elements were leaked",
shard->count);
for (size_t i = 0; i < shard->capacity; i++) {
for (InternedMetadata* md = shard->elems[i].next; md;
md = md->bucket_next()) {
char* key_str = grpc_slice_to_c_string(md->key());
char* value_str = grpc_slice_to_c_string(md->value());
gpr_log(GPR_ERROR, "mdelem '%s' = '%s'", key_str, value_str);
gpr_free(key_str);
gpr_free(value_str);
}
}
if (grpc_iomgr_abort_on_leaks()) {
abort();
}
}
// For ASAN builds, we don't want to crash here, because that will
// prevent ASAN from providing leak detection information, which is
// far more useful than this simple assertion.
#ifndef GRPC_ASAN_ENABLED
GPR_DEBUG_ASSERT(shard->count == 0);
#endif
gpr_free(shard->elems);
}
}
#ifndef NDEBUG
static int is_mdelem_static(grpc_mdelem e) {
return reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(e)) >=
&grpc_core::g_static_mdelem_table[0] &&
reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(e)) <
&grpc_core::g_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT];
}
#endif
void InternedMetadata::RefWithShardLocked(mdtab_shard* shard) {
#ifndef NDEBUG
if (grpc_trace_metadata.enabled()) {
char* key_str = grpc_slice_to_c_string(key());
char* value_str = grpc_slice_to_c_string(value());
intptr_t value = RefValue();
gpr_log(__FILE__, __LINE__, GPR_LOG_SEVERITY_DEBUG,
"mdelem REF:%p:%" PRIdPTR "->%" PRIdPTR ": '%s' = '%s'", this,
value, value + 1, key_str, value_str);
gpr_free(key_str);
gpr_free(value_str);
}
#endif
if (FirstRef()) {
gpr_atm_no_barrier_fetch_add(&shard->free_estimate, -1);
}
}
static void gc_mdtab(mdtab_shard* shard) {
GPR_TIMER_SCOPE("gc_mdtab", 0);
size_t num_freed = 0;
for (size_t i = 0; i < shard->capacity; ++i) {
intptr_t freed = InternedMetadata::CleanupLinkedMetadata(&shard->elems[i]);
num_freed += freed;
shard->count -= freed;
}
gpr_atm_no_barrier_fetch_add(&shard->free_estimate,
-static_cast<intptr_t>(num_freed));
}
static void grow_mdtab(mdtab_shard* shard) {
GPR_TIMER_SCOPE("grow_mdtab", 0);
size_t capacity = shard->capacity * 2;
size_t i;
InternedMetadata::BucketLink* mdtab;
InternedMetadata *md, *next;
uint32_t hash;
mdtab = static_cast<InternedMetadata::BucketLink*>(
gpr_zalloc(sizeof(InternedMetadata::BucketLink) * capacity));
for (i = 0; i < shard->capacity; i++) {
for (md = shard->elems[i].next; md; md = next) {
size_t idx;
hash = md->hash();
next = md->bucket_next();
idx = TABLE_IDX(hash, capacity);
md->set_bucket_next(mdtab[idx].next);
mdtab[idx].next = md;
}
}
gpr_free(shard->elems);
shard->elems = mdtab;
shard->capacity = capacity;
}
static void rehash_mdtab(mdtab_shard* shard) {
if (gpr_atm_no_barrier_load(&shard->free_estimate) >
static_cast<gpr_atm>(shard->capacity / 4)) {
gc_mdtab(shard);
} else {
grow_mdtab(shard);
}
}
template <bool key_definitely_static, bool value_definitely_static = false>
static grpc_mdelem md_create_maybe_static(const grpc_slice& key,
const grpc_slice& value);
template <bool key_definitely_static>
static grpc_mdelem md_create_must_intern(const grpc_slice& key,
const grpc_slice& value,
uint32_t hash);
template <bool key_definitely_static, bool value_definitely_static = false>
static grpc_mdelem md_create(
const grpc_slice& key, const grpc_slice& value,
grpc_mdelem_data* compatible_external_backing_store) {
// Ensure slices are, in fact, static if we claimed they were.
GPR_DEBUG_ASSERT(!key_definitely_static ||
GRPC_IS_STATIC_METADATA_STRING(key));
GPR_DEBUG_ASSERT(!value_definitely_static ||
GRPC_IS_STATIC_METADATA_STRING(value));
const bool key_is_interned =
key_definitely_static || grpc_slice_is_interned(key);
const bool value_is_interned =
value_definitely_static || grpc_slice_is_interned(value);
// External storage if either slice is not interned and the caller already
// created a backing store. If no backing store, we allocate one.
if (!key_is_interned || !value_is_interned) {
if (compatible_external_backing_store != nullptr) {
// Caller provided backing store.
return GRPC_MAKE_MDELEM(compatible_external_backing_store,
GRPC_MDELEM_STORAGE_EXTERNAL);
} else {
// We allocate backing store.
return key_definitely_static
? GRPC_MAKE_MDELEM(
new AllocatedMetadata(
key, value,
static_cast<const AllocatedMetadata::NoRefKey*>(
nullptr)),
GRPC_MDELEM_STORAGE_ALLOCATED)
: GRPC_MAKE_MDELEM(new AllocatedMetadata(key, value),
GRPC_MDELEM_STORAGE_ALLOCATED);
}
}
return md_create_maybe_static<key_definitely_static, value_definitely_static>(
key, value);
}
template <bool key_definitely_static, bool value_definitely_static>
static grpc_mdelem md_create_maybe_static(const grpc_slice& key,
const grpc_slice& value) {
// Ensure slices are, in fact, static if we claimed they were.
GPR_DEBUG_ASSERT(!key_definitely_static ||
GRPC_IS_STATIC_METADATA_STRING(key));
GPR_DEBUG_ASSERT(!value_definitely_static ||
GRPC_IS_STATIC_METADATA_STRING(value));
GPR_DEBUG_ASSERT(key.refcount != nullptr);
GPR_DEBUG_ASSERT(value.refcount != nullptr);
const bool key_is_static_mdstr =
key_definitely_static ||
key.refcount->GetType() == grpc_slice_refcount::Type::STATIC;
const bool value_is_static_mdstr =
value_definitely_static ||
value.refcount->GetType() == grpc_slice_refcount::Type::STATIC;
const intptr_t kidx = GRPC_STATIC_METADATA_INDEX(key);
// Not all static slice input yields a statically stored metadata element.
if (key_is_static_mdstr && value_is_static_mdstr) {
grpc_mdelem static_elem = grpc_static_mdelem_for_static_strings(
kidx, GRPC_STATIC_METADATA_INDEX(value));
if (!GRPC_MDISNULL(static_elem)) {
return static_elem;
}
}
uint32_t khash = key_definitely_static
? grpc_static_metadata_hash_values[kidx]
: grpc_slice_hash_refcounted(key);
uint32_t hash = GRPC_MDSTR_KV_HASH(khash, grpc_slice_hash_refcounted(value));
return md_create_must_intern<key_definitely_static>(key, value, hash);
}
template <bool key_definitely_static>
static grpc_mdelem md_create_must_intern(const grpc_slice& key,
const grpc_slice& value,
uint32_t hash) {
// Here, we know both key and value are both at least interned, and both
// possibly static. We know that anything inside the shared interned table is
// also at least interned (and maybe static). Note that equality for a static
// and interned slice implies that they are both the same exact slice.
// The same applies to a pair of interned slices, or a pair of static slices.
// Rather than run the full equality check, we can therefore just do a pointer
// comparison of the refcounts.
InternedMetadata* md;
mdtab_shard* shard = &g_shards[SHARD_IDX(hash)];
size_t idx;
GPR_TIMER_SCOPE("grpc_mdelem_from_metadata_strings", 0);
gpr_mu_lock(&shard->mu);
idx = TABLE_IDX(hash, shard->capacity);
/* search for an existing pair */
for (md = shard->elems[idx].next; md; md = md->bucket_next()) {
if (grpc_slice_static_interned_equal(key, md->key()) &&
grpc_slice_static_interned_equal(value, md->value())) {
md->RefWithShardLocked(shard);
gpr_mu_unlock(&shard->mu);
return GRPC_MAKE_MDELEM(md, GRPC_MDELEM_STORAGE_INTERNED);
}
}
/* not found: create a new pair */
md = key_definitely_static
? new InternedMetadata(
key, value, hash, shard->elems[idx].next,
static_cast<const InternedMetadata::NoRefKey*>(nullptr))
: new InternedMetadata(key, value, hash, shard->elems[idx].next);
shard->elems[idx].next = md;
shard->count++;
if (shard->count > shard->capacity * 2) {
rehash_mdtab(shard);
}
gpr_mu_unlock(&shard->mu);
return GRPC_MAKE_MDELEM(md, GRPC_MDELEM_STORAGE_INTERNED);
}
grpc_mdelem grpc_mdelem_create(
const grpc_slice& key, const grpc_slice& value,
grpc_mdelem_data* compatible_external_backing_store) {
return md_create<false>(key, value, compatible_external_backing_store);
}
grpc_mdelem grpc_mdelem_create(
const grpc_core::StaticMetadataSlice& key, const grpc_slice& value,
grpc_mdelem_data* compatible_external_backing_store) {
return md_create<true>(key, value, compatible_external_backing_store);
}
/* Create grpc_mdelem from provided slices. We specify via template parameter
whether we know that the input key is static or not. If it is, we short
circuit various comparisons and a no-op unref. */
template <bool key_definitely_static>
static grpc_mdelem md_from_slices(const grpc_slice& key,
const grpc_slice& value) {
// Ensure key is, in fact, static if we claimed it was.
GPR_DEBUG_ASSERT(!key_definitely_static ||
GRPC_IS_STATIC_METADATA_STRING(key));
grpc_mdelem out = md_create<key_definitely_static>(key, value, nullptr);
if (!key_definitely_static) {
grpc_slice_unref_internal(key);
}
grpc_slice_unref_internal(value);
return out;
}
grpc_mdelem grpc_mdelem_from_slices(const grpc_slice& key,
const grpc_slice& value) {
return md_from_slices</*key_definitely_static=*/false>(key, value);
}
grpc_mdelem grpc_mdelem_from_slices(const grpc_core::StaticMetadataSlice& key,
const grpc_slice& value) {
return md_from_slices</*key_definitely_static=*/true>(key, value);
}
grpc_mdelem grpc_mdelem_from_slices(
const grpc_core::StaticMetadataSlice& key,
const grpc_core::StaticMetadataSlice& value) {
grpc_mdelem out = md_create_maybe_static<true, true>(key, value);
return out;
}
grpc_mdelem grpc_mdelem_from_slices(
const grpc_core::StaticMetadataSlice& key,
const grpc_core::ManagedMemorySlice& value) {
// TODO(arjunroy): We can save the unref if md_create_maybe_static ended up
// creating a new interned metadata. But otherwise - we need this here.
grpc_mdelem out = md_create_maybe_static<true>(key, value);
grpc_slice_unref_internal(value);
return out;
}
grpc_mdelem grpc_mdelem_from_slices(
const grpc_core::ManagedMemorySlice& key,
const grpc_core::ManagedMemorySlice& value) {
grpc_mdelem out = md_create_maybe_static<false>(key, value);
// TODO(arjunroy): We can save the unref if md_create_maybe_static ended up
// creating a new interned metadata. But otherwise - we need this here.
grpc_slice_unref_internal(key);
grpc_slice_unref_internal(value);
return out;
}
grpc_mdelem grpc_mdelem_from_grpc_metadata(grpc_metadata* metadata) {
bool key_changed = false;
grpc_slice key_slice =
grpc_slice_maybe_static_intern(metadata->key, &key_changed);
bool value_changed = false;
grpc_slice* unref_slice = nullptr;
grpc_slice value_slice =
grpc_slice_maybe_static_intern(metadata->value, &value_changed);
// If key or value changed, but the other didn't.... AND the other is a NOP
// refcount, then we need to convert it to a slice with a refcount else we run
// the risk of leaving a dangling reference to that metadata on the heap via
// this mdelem.
if (key_changed && !value_changed && value_slice.refcount != nullptr &&
value_slice.refcount->GetType() == grpc_slice_refcount::Type::NOP) {
value_slice = grpc_slice_copy(value_slice);
unref_slice = &value_slice;
value_changed = true;
} else if (!key_changed && value_changed && key_slice.refcount != nullptr &&
key_slice.refcount->GetType() == grpc_slice_refcount::Type::NOP) {
key_slice = grpc_slice_copy(key_slice);
unref_slice = &key_slice;
key_changed = true;
}
auto mdelem =
grpc_mdelem_create(key_slice, value_slice,
key_changed || value_changed
? nullptr
: reinterpret_cast<grpc_mdelem_data*>(metadata));
if (unref_slice != nullptr) grpc_slice_unref_internal(*unref_slice);
return mdelem;
}
static void* get_user_data(UserData* user_data, void (*destroy_func)(void*)) {
if (user_data->destroy_user_data.load(std::memory_order_acquire) ==
destroy_func) {
return user_data->data.load(std::memory_order_relaxed);
} else {
return nullptr;
}
}
void* grpc_mdelem_get_user_data(grpc_mdelem md, void (*destroy_func)(void*)) {
switch (GRPC_MDELEM_STORAGE(md)) {
case GRPC_MDELEM_STORAGE_EXTERNAL:
return nullptr;
case GRPC_MDELEM_STORAGE_STATIC:
return reinterpret_cast<void*>(
grpc_static_mdelem_user_data
[reinterpret_cast<grpc_core::StaticMetadata*>(
GRPC_MDELEM_DATA(md)) -
grpc_core::g_static_mdelem_table]);
case GRPC_MDELEM_STORAGE_ALLOCATED: {
auto* am = reinterpret_cast<AllocatedMetadata*>(GRPC_MDELEM_DATA(md));
return get_user_data(am->user_data(), destroy_func);
}
case GRPC_MDELEM_STORAGE_INTERNED: {
auto* im = reinterpret_cast<InternedMetadata*> GRPC_MDELEM_DATA(md);
return get_user_data(im->user_data(), destroy_func);
}
}
GPR_UNREACHABLE_CODE(return nullptr);
}
static void* set_user_data(UserData* ud, void (*destroy_func)(void*),
void* data) {
GPR_ASSERT((data == nullptr) == (destroy_func == nullptr));
grpc_core::ReleasableMutexLock lock(&ud->mu_user_data);
if (ud->destroy_user_data.load(std::memory_order_relaxed)) {
/* user data can only be set once */
lock.Release();
if (destroy_func != nullptr) {
destroy_func(data);
}
return ud->data.load(std::memory_order_relaxed);
}
ud->data.store(data, std::memory_order_relaxed);
ud->destroy_user_data.store(destroy_func, std::memory_order_release);
return data;
}
void* grpc_mdelem_set_user_data(grpc_mdelem md, void (*destroy_func)(void*),
void* data) {
switch (GRPC_MDELEM_STORAGE(md)) {
case GRPC_MDELEM_STORAGE_EXTERNAL:
destroy_func(data);
return nullptr;
case GRPC_MDELEM_STORAGE_STATIC:
destroy_func(data);
return reinterpret_cast<void*>(
grpc_static_mdelem_user_data
[reinterpret_cast<grpc_core::StaticMetadata*>(
GRPC_MDELEM_DATA(md)) -
grpc_core::g_static_mdelem_table]);
case GRPC_MDELEM_STORAGE_ALLOCATED: {
auto* am = reinterpret_cast<AllocatedMetadata*>(GRPC_MDELEM_DATA(md));
return set_user_data(am->user_data(), destroy_func, data);
}
case GRPC_MDELEM_STORAGE_INTERNED: {
auto* im = reinterpret_cast<InternedMetadata*> GRPC_MDELEM_DATA(md);
GPR_DEBUG_ASSERT(!is_mdelem_static(md));
return set_user_data(im->user_data(), destroy_func, data);
}
}
GPR_UNREACHABLE_CODE(return nullptr);
}
bool grpc_mdelem_eq(grpc_mdelem a, grpc_mdelem b) {
if (a.payload == b.payload) return true;
if (GRPC_MDELEM_IS_INTERNED(a) && GRPC_MDELEM_IS_INTERNED(b)) return false;
if (GRPC_MDISNULL(a) || GRPC_MDISNULL(b)) return false;
return grpc_slice_eq(GRPC_MDKEY(a), GRPC_MDKEY(b)) &&
grpc_slice_eq(GRPC_MDVALUE(a), GRPC_MDVALUE(b));
}
static void note_disposed_interned_metadata(uint32_t hash) {
mdtab_shard* shard = &g_shards[SHARD_IDX(hash)];
gpr_atm_no_barrier_fetch_add(&shard->free_estimate, 1);
}
void grpc_mdelem_do_unref(grpc_mdelem gmd DEBUG_ARGS) {
switch (GRPC_MDELEM_STORAGE(gmd)) {
case GRPC_MDELEM_STORAGE_EXTERNAL:
case GRPC_MDELEM_STORAGE_STATIC:
return;
case GRPC_MDELEM_STORAGE_INTERNED: {
auto* md = reinterpret_cast<InternedMetadata*> GRPC_MDELEM_DATA(gmd);
uint32_t hash = md->hash();
if (GPR_UNLIKELY(md->Unref(FWD_DEBUG_ARGS))) {
/* once the refcount hits zero, some other thread can come along and
free md at any time: it's unsafe from this point on to access it */
note_disposed_interned_metadata(hash);
}
break;
}
case GRPC_MDELEM_STORAGE_ALLOCATED: {
auto* md = reinterpret_cast<AllocatedMetadata*> GRPC_MDELEM_DATA(gmd);
if (GPR_UNLIKELY(md->Unref(FWD_DEBUG_ARGS))) {
delete md;
}
break;
}
}
}
void grpc_mdelem_on_final_unref(grpc_mdelem_data_storage storage, void* ptr,
uint32_t hash DEBUG_ARGS) {
#ifndef NDEBUG
(void)file;
(void)line;
#endif
switch (storage) {
case GRPC_MDELEM_STORAGE_EXTERNAL:
case GRPC_MDELEM_STORAGE_STATIC:
return;
case GRPC_MDELEM_STORAGE_INTERNED: {
note_disposed_interned_metadata(hash);
break;
}
case GRPC_MDELEM_STORAGE_ALLOCATED: {
delete reinterpret_cast<AllocatedMetadata*>(ptr);
break;
}
}
}

@ -1,449 +0,0 @@
/*
*
* Copyright 2015 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#ifndef GRPC_CORE_LIB_TRANSPORT_METADATA_H
#define GRPC_CORE_LIB_TRANSPORT_METADATA_H
#include <grpc/support/port_platform.h>
#include <atomic>
#include <grpc/grpc.h>
#include <grpc/impl/codegen/log.h>
#include <grpc/slice.h>
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/gpr/useful.h"
#include "src/core/lib/gprpp/sync.h"
#include "src/core/lib/slice/slice_utils.h"
extern grpc_core::DebugOnlyTraceFlag grpc_trace_metadata;
/* This file provides a mechanism for tracking metadata through the grpc stack.
It's not intended for consumption outside of the library.
Metadata is tracked in the context of a sharded global grpc_mdctx. The
context tracks unique strings (grpc_mdstr) and pairs of strings
(grpc_mdelem). Any of these objects can be checked for equality by comparing
their pointers. These objects are reference counted.
grpc_mdelem can additionally store a (non-NULL) user data pointer. This
pointer is intended to be used to cache semantic meaning of a metadata
element. For example, an OAuth token may cache the credentials it represents
and the time at which it expires in the mdelem user data.
Combining this metadata cache and the hpack compression table allows us to
simply lookup complete preparsed objects quickly, incurring a few atomic
ops per metadata element on the fast path.
grpc_mdelem instances MAY live longer than their refcount implies, and are
garbage collected periodically, meaning cached data can easily outlive a
single request.
STATIC METADATA: in static_metadata.h we declare a set of static metadata.
These mdelems and mdstrs are available via pre-declared code generated macros
and are available to code anywhere between grpc_init() and grpc_shutdown().
They are not refcounted, but can be passed to _ref and _unref functions
declared here - in which case those functions are effectively no-ops. */
/* Forward declarations */
typedef struct grpc_mdelem grpc_mdelem;
/* if changing this, make identical changes in:
- grpc_core::{InternedMetadata, AllocatedMetadata}
- grpc_metadata in grpc_types.h */
typedef struct grpc_mdelem_data {
const grpc_slice key;
const grpc_slice value;
/* there is a private part to this in metadata.c */
} grpc_mdelem_data;
/* GRPC_MDELEM_STORAGE_* enum values that can be treated as interned always have
this bit set in their integer value */
#define GRPC_MDELEM_STORAGE_INTERNED_BIT 1
/* External and static storage metadata has no refcount to ref/unref. Allocated
* and interned metadata do have a refcount. Metadata ref and unref methods use
* a switch statement on this enum to determine which behaviour to execute.
* Keeping the no-ref cases together and the ref-cases together leads to
* slightly better code generation (9 inlined instructions rather than 10). */
typedef enum {
/* memory pointed to by grpc_mdelem::payload is owned by an external system */
GRPC_MDELEM_STORAGE_EXTERNAL = 0,
/* memory is in the static metadata table */
GRPC_MDELEM_STORAGE_STATIC = GRPC_MDELEM_STORAGE_INTERNED_BIT,
/* memory pointed to by grpc_mdelem::payload is allocated by the metadata
system */
GRPC_MDELEM_STORAGE_ALLOCATED = 2,
/* memory pointed to by grpc_mdelem::payload is interned by the metadata
system */
GRPC_MDELEM_STORAGE_INTERNED = 2 | GRPC_MDELEM_STORAGE_INTERNED_BIT,
} grpc_mdelem_data_storage;
struct grpc_mdelem {
/* a grpc_mdelem_data* generally, with the two lower bits signalling memory
ownership as per grpc_mdelem_data_storage */
uintptr_t payload;
};
#define GRPC_MDELEM_DATA(md) ((grpc_mdelem_data*)((md).payload & ~(uintptr_t)3))
#define GRPC_MDELEM_STORAGE(md) \
((grpc_mdelem_data_storage)((md).payload & (uintptr_t)3))
#ifdef __cplusplus
#define GRPC_MAKE_MDELEM(data, storage) \
(grpc_mdelem{((uintptr_t)(data)) | ((uintptr_t)(storage))})
#else
#define GRPC_MAKE_MDELEM(data, storage) \
((grpc_mdelem){((uintptr_t)(data)) | ((uintptr_t)(storage))})
#endif
#define GRPC_MDELEM_IS_INTERNED(md) \
((grpc_mdelem_data_storage)((md).payload & \
(uintptr_t)GRPC_MDELEM_STORAGE_INTERNED_BIT))
/* Given arbitrary input slices, create a grpc_mdelem object. The caller refs
* the input slices; we unref them. This method is always safe to call; however,
* if we know data about the slices in question (e.g. if we knew our key was
* static) we can call specializations that save on cycle count. */
grpc_mdelem grpc_mdelem_from_slices(const grpc_slice& key,
const grpc_slice& value);
/* Like grpc_mdelem_from_slices, but we know that key is a static slice. This
saves us a few branches and a no-op call to md_unref() for the key. */
grpc_mdelem grpc_mdelem_from_slices(const grpc_core::StaticMetadataSlice& key,
const grpc_slice& value);
/* Like grpc_mdelem_from_slices, but key is static and val is static. */
grpc_mdelem grpc_mdelem_from_slices(
const grpc_core::StaticMetadataSlice& key,
const grpc_core::StaticMetadataSlice& value);
/* Like grpc_mdelem_from_slices, but key is static and val is interned. */
grpc_mdelem grpc_mdelem_from_slices(const grpc_core::StaticMetadataSlice& key,
const grpc_core::ManagedMemorySlice& value);
/* Like grpc_mdelem_from_slices, but key and val are interned. */
grpc_mdelem grpc_mdelem_from_slices(const grpc_core::ManagedMemorySlice& key,
const grpc_core::ManagedMemorySlice& value);
/* Cheaply convert a grpc_metadata to a grpc_mdelem; may use the grpc_metadata
object as backing storage (so lifetimes should align) */
grpc_mdelem grpc_mdelem_from_grpc_metadata(grpc_metadata* metadata);
/* Does not unref the slices; if a new non-interned mdelem is needed, allocates
one if compatible_external_backing_store is NULL, or uses
compatible_external_backing_store if it is non-NULL (in which case it's the
users responsibility to ensure that it outlives usage) */
grpc_mdelem grpc_mdelem_create(
const grpc_slice& key, const grpc_slice& value,
grpc_mdelem_data* compatible_external_backing_store);
/* Like grpc_mdelem_create, but we know that key is static. */
grpc_mdelem grpc_mdelem_create(
const grpc_core::StaticMetadataSlice& key, const grpc_slice& value,
grpc_mdelem_data* compatible_external_backing_store);
#define GRPC_MDKEY(md) (GRPC_MDELEM_DATA(md)->key)
#define GRPC_MDVALUE(md) (GRPC_MDELEM_DATA(md)->value)
bool grpc_mdelem_eq(grpc_mdelem a, grpc_mdelem b);
/* Often we compare metadata where we know a-priori that the second parameter is
* static, and that the keys match. This most commonly happens when processing
* metadata batch callouts in initial/trailing filters. In this case, fastpath
* grpc_mdelem_eq and remove unnecessary checks. */
inline bool grpc_mdelem_static_value_eq(grpc_mdelem a, grpc_mdelem b_static) {
if (a.payload == b_static.payload) return true;
return grpc_slice_eq_static_interned(GRPC_MDVALUE(a), GRPC_MDVALUE(b_static));
}
#define GRPC_MDISNULL(md) (GRPC_MDELEM_DATA(md) == NULL)
inline bool grpc_mdelem_both_interned_eq(grpc_mdelem a_interned,
grpc_mdelem b_interned) {
GPR_DEBUG_ASSERT(GRPC_MDELEM_IS_INTERNED(a_interned) ||
GRPC_MDISNULL(a_interned));
GPR_DEBUG_ASSERT(GRPC_MDELEM_IS_INTERNED(b_interned) ||
GRPC_MDISNULL(b_interned));
return a_interned.payload == b_interned.payload;
}
/* Mutator and accessor for grpc_mdelem user data. The destructor function
is used as a type tag and is checked during user_data fetch. */
void* grpc_mdelem_get_user_data(grpc_mdelem md, void (*if_destroy_func)(void*));
void* grpc_mdelem_set_user_data(grpc_mdelem md, void (*destroy_func)(void*),
void* data);
// Defined in metadata.cc.
struct mdtab_shard;
#ifndef NDEBUG
void grpc_mdelem_trace_ref(void* md, const grpc_slice& key,
const grpc_slice& value, intptr_t refcnt,
const char* file, int line);
void grpc_mdelem_trace_unref(void* md, const grpc_slice& key,
const grpc_slice& value, intptr_t refcnt,
const char* file, int line);
#endif
namespace grpc_core {
typedef void (*destroy_user_data_func)(void* data);
struct UserData {
Mutex mu_user_data;
std::atomic<destroy_user_data_func> destroy_user_data{nullptr};
std::atomic<void*> data{nullptr};
};
class StaticMetadata {
public:
StaticMetadata(const grpc_slice& key, const grpc_slice& value, uintptr_t idx)
: kv_({key, value}), hash_(0), static_idx_(idx) {}
const grpc_mdelem_data& data() const { return kv_; }
void HashInit();
uint32_t hash() { return hash_; }
uintptr_t StaticIndex() { return static_idx_; }
private:
grpc_mdelem_data kv_;
/* private only data */
uint32_t hash_;
uintptr_t static_idx_;
};
class RefcountedMdBase {
public:
RefcountedMdBase(const grpc_slice& key, const grpc_slice& value)
: key_(key), value_(value), refcnt_(1) {}
RefcountedMdBase(const grpc_slice& key, const grpc_slice& value,
uint32_t hash)
: key_(key), value_(value), refcnt_(1), hash_(hash) {}
const grpc_slice& key() const { return key_; }
const grpc_slice& value() const { return value_; }
uint32_t hash() { return hash_; }
#ifndef NDEBUG
void Ref(const char* file, int line) {
grpc_mdelem_trace_ref(this, key_, value_, RefValue(), file, line);
const intptr_t prior = refcnt_.fetch_add(1, std::memory_order_relaxed);
GPR_ASSERT(prior > 0);
}
bool Unref(const char* file, int line) {
grpc_mdelem_trace_unref(this, key_, value_, RefValue(), file, line);
return Unref();
}
#endif
void Ref() {
/* we can assume the ref count is >= 1 as the application is calling
this function - meaning that no adjustment to mdtab_free is necessary,
simplifying the logic here to be just an atomic increment */
refcnt_.fetch_add(1, std::memory_order_relaxed);
}
bool Unref() {
const intptr_t prior = refcnt_.fetch_sub(1, std::memory_order_acq_rel);
GPR_DEBUG_ASSERT(prior > 0);
return prior == 1;
}
protected:
#ifndef NDEBUG
void TraceAtStart(const char* tag);
#endif
intptr_t RefValue() { return refcnt_.load(std::memory_order_relaxed); }
bool AllRefsDropped() { return refcnt_.load(std::memory_order_acquire) == 0; }
bool FirstRef() {
return refcnt_.fetch_add(1, std::memory_order_relaxed) == 0;
}
private:
/* must be byte compatible with grpc_mdelem_data */
grpc_slice key_;
grpc_slice value_;
std::atomic<intptr_t> refcnt_{0};
uint32_t hash_ = 0;
};
class InternedMetadata : public RefcountedMdBase {
public:
// TODO(arjunroy): Change to use strongly typed slices instead.
struct NoRefKey {};
struct BucketLink {
explicit BucketLink(InternedMetadata* md) : next(md) {}
InternedMetadata* next = nullptr;
};
InternedMetadata(const grpc_slice& key, const grpc_slice& value,
uint32_t hash, InternedMetadata* next);
InternedMetadata(const grpc_slice& key, const grpc_slice& value,
uint32_t hash, InternedMetadata* next, const NoRefKey*);
~InternedMetadata();
void RefWithShardLocked(mdtab_shard* shard);
UserData* user_data() { return &user_data_; }
InternedMetadata* bucket_next() { return link_.next; }
void set_bucket_next(InternedMetadata* md) { link_.next = md; }
static size_t CleanupLinkedMetadata(BucketLink* head);
private:
UserData user_data_;
BucketLink link_;
};
/* Shadow structure for grpc_mdelem_data for allocated elements */
class AllocatedMetadata : public RefcountedMdBase {
public:
// TODO(arjunroy): Change to use strongly typed slices instead.
struct NoRefKey {};
AllocatedMetadata(const grpc_slice& key, const grpc_slice& value);
AllocatedMetadata(const ManagedMemorySlice& key,
const UnmanagedMemorySlice& value);
AllocatedMetadata(const ExternallyManagedSlice& key,
const UnmanagedMemorySlice& value);
AllocatedMetadata(const grpc_slice& key, const grpc_slice& value,
const NoRefKey*);
~AllocatedMetadata();
UserData* user_data() { return &user_data_; }
private:
UserData user_data_;
};
} // namespace grpc_core
#ifndef NDEBUG
#define GRPC_MDELEM_REF(s) grpc_mdelem_ref((s), __FILE__, __LINE__)
inline grpc_mdelem grpc_mdelem_ref(grpc_mdelem gmd, const char* file,
int line) {
#else // ifndef NDEBUG
#define GRPC_MDELEM_REF(s) grpc_mdelem_ref((s))
inline grpc_mdelem grpc_mdelem_ref(grpc_mdelem gmd) {
#endif // ifndef NDEBUG
switch (GRPC_MDELEM_STORAGE(gmd)) {
case GRPC_MDELEM_STORAGE_EXTERNAL:
case GRPC_MDELEM_STORAGE_STATIC:
break;
case GRPC_MDELEM_STORAGE_INTERNED: {
auto* md =
reinterpret_cast<grpc_core::InternedMetadata*> GRPC_MDELEM_DATA(gmd);
/* use C assert to have this removed in opt builds */
#ifndef NDEBUG
md->Ref(file, line);
#else
md->Ref();
#endif
break;
}
case GRPC_MDELEM_STORAGE_ALLOCATED: {
auto* md =
reinterpret_cast<grpc_core::AllocatedMetadata*> GRPC_MDELEM_DATA(gmd);
#ifndef NDEBUG
md->Ref(file, line);
#else
md->Ref();
#endif
break;
}
}
return gmd;
}
#ifndef NDEBUG
#define GRPC_MDELEM_UNREF(s) grpc_mdelem_unref((s), __FILE__, __LINE__)
void grpc_mdelem_on_final_unref(grpc_mdelem_data_storage storage, void* ptr,
uint32_t hash, const char* file, int line);
inline void grpc_mdelem_unref(grpc_mdelem gmd, const char* file, int line) {
#else
#define GRPC_MDELEM_UNREF(s) grpc_mdelem_unref((s))
void grpc_mdelem_on_final_unref(grpc_mdelem_data_storage storage, void* ptr,
uint32_t hash);
inline void grpc_mdelem_unref(grpc_mdelem gmd) {
#endif
const grpc_mdelem_data_storage storage = GRPC_MDELEM_STORAGE(gmd);
switch (storage) {
case GRPC_MDELEM_STORAGE_EXTERNAL:
case GRPC_MDELEM_STORAGE_STATIC:
return;
case GRPC_MDELEM_STORAGE_INTERNED:
case GRPC_MDELEM_STORAGE_ALLOCATED:
auto* md =
reinterpret_cast<grpc_core::RefcountedMdBase*> GRPC_MDELEM_DATA(gmd);
/* once the refcount hits zero, some other thread can come along and
free an interned md at any time: it's unsafe from this point on to
access it so we read the hash now. */
uint32_t hash = md->hash();
#ifndef NDEBUG
if (GPR_UNLIKELY(md->Unref(file, line))) {
grpc_mdelem_on_final_unref(storage, md, hash, file, line);
#else
if (GPR_UNLIKELY(md->Unref())) {
grpc_mdelem_on_final_unref(storage, md, hash);
#endif
}
return;
}
}
#define GRPC_MDNULL GRPC_MAKE_MDELEM(NULL, GRPC_MDELEM_STORAGE_EXTERNAL)
/* We add 32 bytes of padding as per RFC-7540 section 6.5.2. */
#define GRPC_MDELEM_LENGTH(e) \
(GRPC_SLICE_LENGTH(GRPC_MDKEY((e))) + GRPC_SLICE_LENGTH(GRPC_MDVALUE((e))) + \
32)
#define GRPC_MDSTR_KV_HASH(k_hash, v_hash) \
(::grpc_core::RotateLeft(size_t(k_hash), size_t(2)) ^ (v_hash))
void grpc_mdctx_global_init(void);
void grpc_mdctx_global_shutdown();
/* Like grpc_mdelem_from_slices, but we know that key is a static or interned
slice and value is not static or interned. This gives us an inlinable
fastpath - we know we must allocate metadata now, and that we do not need to
unref the value (rather, we just transfer the ref). We can avoid a ref since:
1) the key slice is passed in already ref'd
2) We're guaranteed to create a new Allocated slice, thus meaning the
ref can be considered 'transferred'.*/
inline grpc_mdelem grpc_mdelem_from_slices(
const grpc_core::ManagedMemorySlice& key,
const grpc_core::UnmanagedMemorySlice& value) {
using grpc_core::AllocatedMetadata;
return GRPC_MAKE_MDELEM(new AllocatedMetadata(key, value),
GRPC_MDELEM_STORAGE_ALLOCATED);
}
inline grpc_mdelem grpc_mdelem_from_slices(
const grpc_core::ExternallyManagedSlice& key,
const grpc_core::UnmanagedMemorySlice& value) {
using grpc_core::AllocatedMetadata;
return GRPC_MAKE_MDELEM(new AllocatedMetadata(key, value),
GRPC_MDELEM_STORAGE_ALLOCATED);
}
inline grpc_mdelem grpc_mdelem_from_slices(
const grpc_core::StaticMetadataSlice& key,
const grpc_core::UnmanagedMemorySlice& value) {
using grpc_core::AllocatedMetadata;
return GRPC_MAKE_MDELEM(new AllocatedMetadata(key, value),
GRPC_MDELEM_STORAGE_ALLOCATED);
}
#endif /* GRPC_CORE_LIB_TRANSPORT_METADATA_H */

@ -1,99 +0,0 @@
/*
*
* Copyright 2015 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <grpc/support/port_platform.h>
#include "src/core/lib/transport/metadata_batch.h"
#include <stdbool.h>
#include <string.h>
#include "absl/container/inlined_vector.h"
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include "src/core/lib/profiling/timers.h"
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
void grpc_metadata_batch_set_value(grpc_linked_mdelem* storage,
const grpc_slice& value) {
grpc_mdelem old_mdelem = storage->md;
grpc_mdelem new_mdelem = grpc_mdelem_from_slices(
grpc_slice_ref_internal(GRPC_MDKEY(old_mdelem)), value);
storage->md = new_mdelem;
GRPC_MDELEM_UNREF(old_mdelem);
}
namespace {
class CopySink {
public:
explicit CopySink(grpc_metadata_batch* dst) : dst_(dst) {}
void Encode(grpc_mdelem md) {
// If the mdelem is not external, take a ref.
// Otherwise, create a new copy, holding its own refs to the
// underlying slices.
if (GRPC_MDELEM_STORAGE(md) != GRPC_MDELEM_STORAGE_EXTERNAL) {
md = GRPC_MDELEM_REF(md);
} else {
md = grpc_mdelem_from_slices(grpc_slice_copy(GRPC_MDKEY(md)),
grpc_slice_copy(GRPC_MDVALUE(md)));
}
// Error unused in non-debug builds.
grpc_error_handle GRPC_UNUSED error = dst_->Append(md);
// The only way that Append() can fail is if
// there's a duplicate entry for a callout. However, that can't be
// the case here, because we would not have been allowed to create
// a source batch that had that kind of conflict.
GPR_DEBUG_ASSERT(error == GRPC_ERROR_NONE);
}
template <class T, class V>
void Encode(T trait, V value) {
dst_->Set(trait, value);
}
template <class T>
void Encode(T trait, const grpc_core::Slice& value) {
dst_->Set(trait, std::move(value.AsOwned()));
}
private:
grpc_metadata_batch* dst_;
};
} // namespace
void grpc_metadata_batch_copy(const grpc_metadata_batch* src,
grpc_metadata_batch* dst) {
dst->Clear();
CopySink sink(dst);
src->Encode(&sink);
}
grpc_error_handle grpc_attach_md_to_error(grpc_error_handle src,
grpc_mdelem md) {
grpc_error_handle out = grpc_error_set_str(
grpc_error_set_str(src, GRPC_ERROR_STR_KEY,
grpc_core::StringViewFromSlice(GRPC_MDKEY(md))),
GRPC_ERROR_STR_VALUE, grpc_core::StringViewFromSlice(GRPC_MDVALUE(md)));
return out;
}

File diff suppressed because it is too large Load Diff

@ -26,7 +26,6 @@
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/slice/slice.h"
#include "src/core/lib/surface/validate_metadata.h"
#include "src/core/lib/transport/metadata.h"
namespace grpc_core {
@ -41,15 +40,14 @@ template <typename Which>
struct HasSimpleMemento {
static constexpr bool value =
std::is_trivial<typename Which::MementoType>::value &&
sizeof(typename Which::MementoType) <= sizeof(uint64_t);
sizeof(typename Which::MementoType) <= sizeof(grpc_slice);
};
// Storage type for a single metadata entry.
union Buffer {
uint64_t trivial;
char trivial[sizeof(grpc_slice)];
void* pointer;
grpc_slice slice;
grpc_mdelem mdelem;
};
// Given a key and a value, concatenate together to make a debug string.
@ -74,7 +72,9 @@ GPR_ATTRIBUTE_NOINLINE std::string MakeDebugStringPipeline(
// Extract a trivial field value from a Buffer - for MakeDebugStringPipeline.
template <typename Field>
Field FieldFromTrivial(const Buffer& value) {
return static_cast<Field>(value.trivial);
Field x;
memcpy(&x, value.trivial, sizeof(x));
return x;
}
// Extract a pointer field value from a Buffer - for MakeDebugStringPipeline.
@ -113,7 +113,7 @@ class ParsedMetadata {
uint32_t transport_size)
: vtable_(ParsedMetadata::template TrivialTraitVTable<Which>()),
transport_size_(transport_size) {
value_.trivial = static_cast<uint64_t>(value);
memcpy(value_.trivial, &value, sizeof(value));
}
template <typename Which>
ParsedMetadata(
@ -135,13 +135,12 @@ class ParsedMetadata {
transport_size_(transport_size) {
value_.slice = value.TakeCSlice();
}
// Takes ownership of elem
explicit ParsedMetadata(grpc_mdelem elem)
: vtable_(grpc_is_binary_header_internal(GRPC_MDKEY(elem))
? MdelemVtable<true>()
: MdelemVtable<false>()),
transport_size_(GRPC_MDELEM_LENGTH(elem)) {
value_.mdelem = elem;
// Construct metadata from a string key, slice value pair.
ParsedMetadata(Slice key, Slice value)
: vtable_(ParsedMetadata::KeyValueVTable(key.as_string_view())),
transport_size_(key.size() + value.size() + 32) {
value_.pointer =
new std::pair<Slice, Slice>(std::move(key), std::move(value));
}
ParsedMetadata() : vtable_(EmptyVTable()), transport_size_(0) {}
~ParsedMetadata() { vtable_->destroy(value_); }
@ -164,9 +163,8 @@ class ParsedMetadata {
}
// Set this parsed value on a container.
GRPC_MUST_USE_RESULT grpc_error_handle
SetOnContainer(MetadataContainer* container) const {
return vtable_->set(value_, container);
void SetOnContainer(MetadataContainer* container) const {
vtable_->set(value_, container);
}
// Is this a binary header or not?
@ -199,8 +197,7 @@ class ParsedMetadata {
struct VTable {
const bool is_binary_header;
void (*const destroy)(const Buffer& value);
grpc_error_handle (*const set)(const Buffer& value,
MetadataContainer* container);
void (*const set)(const Buffer& value, MetadataContainer* container);
// result is a bitwise copy of the originating ParsedMetadata.
void (*const with_new_value)(Slice* new_value,
MetadataParseErrorFn on_error,
@ -210,14 +207,13 @@ class ParsedMetadata {
};
static const VTable* EmptyVTable();
static const VTable* KeyValueVTable(absl::string_view key);
template <typename Which>
static const VTable* TrivialTraitVTable();
template <typename Which>
static const VTable* NonTrivialTraitVTable();
template <typename Which>
static const VTable* SliceTraitVTable();
template <bool kIsBinaryHeader>
static const VTable* MdelemVtable();
template <Slice (*ParseMemento)(Slice, MetadataParseErrorFn)>
GPR_ATTRIBUTE_NOINLINE static void WithNewValueSetSlice(
@ -229,8 +225,8 @@ class ParsedMetadata {
template <typename T, T (*ParseMemento)(Slice, MetadataParseErrorFn)>
GPR_ATTRIBUTE_NOINLINE static void WithNewValueSetTrivial(
Slice* slice, MetadataParseErrorFn on_error, ParsedMetadata* result) {
result->value_.trivial =
static_cast<uint64_t>(ParseMemento(std::move(*slice), on_error));
T memento = ParseMemento(std::move(*slice), on_error);
memcpy(result->value_.trivial, &memento, sizeof(memento));
}
const VTable* vtable_;
@ -248,7 +244,7 @@ ParsedMetadata<MetadataContainer>::EmptyVTable() {
// destroy
metadata_detail::DestroyTrivialMemento,
// set
[](const Buffer&, MetadataContainer*) { return GRPC_ERROR_NONE; },
[](const Buffer&, MetadataContainer*) {},
// with_new_value
[](Slice*, MetadataParseErrorFn, ParsedMetadata*) {},
// debug_string
@ -269,10 +265,11 @@ ParsedMetadata<MetadataContainer>::TrivialTraitVTable() {
metadata_detail::DestroyTrivialMemento,
// set
[](const Buffer& value, MetadataContainer* map) {
map->Set(Which(),
Which::MementoToValue(
static_cast<typename Which::MementoType>(value.trivial)));
return GRPC_ERROR_NONE;
map->Set(
Which(),
Which::MementoToValue(
metadata_detail::FieldFromTrivial<typename Which::MementoType>(
value)));
},
// with_new_value
WithNewValueSetTrivial<typename Which::MementoType, Which::ParseMemento>,
@ -303,7 +300,6 @@ ParsedMetadata<MetadataContainer>::NonTrivialTraitVTable() {
[](const Buffer& value, MetadataContainer* map) {
auto* p = static_cast<typename Which::MementoType*>(value.pointer);
map->Set(Which(), Which::MementoToValue(*p));
return GRPC_ERROR_NONE;
},
// with_new_value
[](Slice* value, MetadataParseErrorFn on_error, ParsedMetadata* result) {
@ -335,7 +331,6 @@ ParsedMetadata<MetadataContainer>::SliceTraitVTable() {
[](const Buffer& value, MetadataContainer* map) {
map->Set(Which(), Which::MementoToValue(
metadata_detail::SliceFromBuffer(value)));
return GRPC_ERROR_NONE;
},
// with_new_value
WithNewValueSetSlice<Which::ParseMemento>,
@ -352,42 +347,37 @@ ParsedMetadata<MetadataContainer>::SliceTraitVTable() {
}
template <typename MetadataContainer>
template <bool kIsBinaryHeader>
const typename ParsedMetadata<MetadataContainer>::VTable*
ParsedMetadata<MetadataContainer>::MdelemVtable() {
static const VTable vtable = {
kIsBinaryHeader,
// destroy
[](const Buffer& value) { GRPC_MDELEM_UNREF(value.mdelem); },
// set
[](const Buffer& value, MetadataContainer* map) {
auto md = GRPC_MDELEM_REF(value.mdelem);
auto err = map->Append(md);
// If an error occurs, md is not consumed and we need to.
// This is an awful API, but that's why we're replacing it.
if (err != GRPC_ERROR_NONE) {
GRPC_MDELEM_UNREF(md);
}
return err;
},
// with_new_value
[](Slice* value_slice, MetadataParseErrorFn, ParsedMetadata* result) {
result->value_.mdelem = grpc_mdelem_from_slices(
static_cast<const ManagedMemorySlice&>(
grpc_slice_ref_internal(GRPC_MDKEY(result->value_.mdelem))),
value_slice->TakeCSlice());
},
// debug_string
[](const Buffer& value) {
return metadata_detail::MakeDebugString(
StringViewFromSlice(GRPC_MDKEY(value.mdelem)),
StringViewFromSlice(GRPC_MDVALUE(value.mdelem)));
},
// key
[](const Buffer& value) {
return StringViewFromSlice(GRPC_MDKEY(value.mdelem));
}};
return &vtable;
ParsedMetadata<MetadataContainer>::KeyValueVTable(absl::string_view key) {
using KV = std::pair<Slice, Slice>;
static const auto destroy = [](const Buffer& value) {
delete static_cast<KV*>(value.pointer);
};
static const auto set = [](const Buffer& value, MetadataContainer* map) {
auto* p = static_cast<KV*>(value.pointer);
map->AppendUnknown(p->first.as_string_view(), p->second.Ref());
};
static const auto with_new_value = [](Slice* value, MetadataParseErrorFn,
ParsedMetadata* result) {
auto* p = new KV{
static_cast<KV*>(result->value_.pointer)->first.Ref(),
std::move(*value),
};
result->value_.pointer = p;
};
static const auto debug_string = [](const Buffer& value) {
auto* p = static_cast<KV*>(value.pointer);
return absl::StrCat(p->first.as_string_view(), ": ",
p->second.as_string_view());
};
static const auto key_fn = [](const Buffer& value) {
return static_cast<KV*>(value.pointer)->first.as_string_view();
};
static const VTable vtable[2] = {
{false, destroy, set, with_new_value, debug_string, key_fn},
{true, destroy, set, with_new_value, debug_string, key_fn},
};
return &vtable[absl::EndsWith(key, "-bin")];
}
} // namespace grpc_core

@ -1,778 +0,0 @@
/*
* Copyright 2015 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* WARNING: Auto-generated code.
*
* To make changes to this file, change
* tools/codegen/core/gen_static_metadata.py, and then re-run it.
*
* See metadata.h for an explanation of the interface here, and metadata.cc for
* an explanation of what's going on.
*/
#include <grpc/support/port_platform.h>
#include "src/core/lib/transport/static_metadata.h"
#include "src/core/lib/slice/slice_internal.h"
namespace grpc_core {
StaticMetadata g_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT] = {
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 10,
g_static_metadata_bytes + 376),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
0),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[11].base, 7,
g_static_metadata_bytes + 386),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[12].base, 3,
g_static_metadata_bytes + 393),
1),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[11].base, 7,
g_static_metadata_bytes + 386),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[13].base, 4,
g_static_metadata_bytes + 396),
2),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 5,
g_static_metadata_bytes + 400),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 1,
g_static_metadata_bytes + 405),
3),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 5,
g_static_metadata_bytes + 400),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[16].base, 11,
g_static_metadata_bytes + 406),
4),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[17].base, 7,
g_static_metadata_bytes + 417),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[18].base, 4,
g_static_metadata_bytes + 424),
5),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[17].base, 7,
g_static_metadata_bytes + 417),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 5,
g_static_metadata_bytes + 428),
6),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 7,
g_static_metadata_bytes + 433),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[21].base, 3,
g_static_metadata_bytes + 440),
7),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 7,
g_static_metadata_bytes + 433),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[22].base, 3,
g_static_metadata_bytes + 443),
8),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 7,
g_static_metadata_bytes + 433),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[23].base, 3,
g_static_metadata_bytes + 446),
9),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 7,
g_static_metadata_bytes + 433),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[24].base, 3,
g_static_metadata_bytes + 449),
10),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 7,
g_static_metadata_bytes + 433),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[25].base, 3,
g_static_metadata_bytes + 452),
11),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 7,
g_static_metadata_bytes + 433),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[26].base, 3,
g_static_metadata_bytes + 455),
12),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 7,
g_static_metadata_bytes + 433),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 3,
g_static_metadata_bytes + 458),
13),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[28].base, 14,
g_static_metadata_bytes + 461),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
14),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[29].base, 15,
g_static_metadata_bytes + 475),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[30].base, 13,
g_static_metadata_bytes + 490),
15),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[31].base, 15,
g_static_metadata_bytes + 503),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
16),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[32].base, 13,
g_static_metadata_bytes + 518),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
17),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[33].base, 6,
g_static_metadata_bytes + 531),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
18),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 27,
g_static_metadata_bytes + 537),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
19),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 3,
g_static_metadata_bytes + 564),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
20),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[36].base, 5,
g_static_metadata_bytes + 567),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
21),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[37].base, 13,
g_static_metadata_bytes + 572),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
22),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[38].base, 13,
g_static_metadata_bytes + 585),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
23),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[39].base, 19,
g_static_metadata_bytes + 598),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
24),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[40].base, 16,
g_static_metadata_bytes + 617),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
25),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[41].base, 16,
g_static_metadata_bytes + 633),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
26),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[42].base, 14,
g_static_metadata_bytes + 649),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
27),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[43].base, 16,
g_static_metadata_bytes + 663),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
28),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[44].base, 13,
g_static_metadata_bytes + 679),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
29),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[45].base, 12,
g_static_metadata_bytes + 692),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
30),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[46].base, 6,
g_static_metadata_bytes + 704),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
31),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[47].base, 4,
g_static_metadata_bytes + 710),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
32),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[48].base, 4,
g_static_metadata_bytes + 714),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
33),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[49].base, 6,
g_static_metadata_bytes + 718),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
34),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[50].base, 7,
g_static_metadata_bytes + 724),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
35),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[51].base, 4,
g_static_metadata_bytes + 731),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
36),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[52].base, 4,
g_static_metadata_bytes + 735),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
37),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[53].base, 8,
g_static_metadata_bytes + 739),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
38),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[54].base, 17,
g_static_metadata_bytes + 747),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
39),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[55].base, 13,
g_static_metadata_bytes + 764),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
40),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[56].base, 8,
g_static_metadata_bytes + 777),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
41),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[57].base, 19,
g_static_metadata_bytes + 785),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
42),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[58].base, 13,
g_static_metadata_bytes + 804),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
43),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[59].base, 4,
g_static_metadata_bytes + 817),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
44),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[60].base, 8,
g_static_metadata_bytes + 821),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
45),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[61].base, 12,
g_static_metadata_bytes + 829),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
46),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[62].base, 18,
g_static_metadata_bytes + 841),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
47),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[63].base, 19,
g_static_metadata_bytes + 859),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
48),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[64].base, 5,
g_static_metadata_bytes + 878),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
49),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[65].base, 7,
g_static_metadata_bytes + 883),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
50),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[66].base, 7,
g_static_metadata_bytes + 890),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
51),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[67].base, 11,
g_static_metadata_bytes + 897),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
52),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[68].base, 6,
g_static_metadata_bytes + 908),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
53),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[69].base, 10,
g_static_metadata_bytes + 914),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
54),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[70].base, 25,
g_static_metadata_bytes + 924),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
55),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[71].base, 17,
g_static_metadata_bytes + 949),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
56),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[72].base, 10,
g_static_metadata_bytes + 966),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
57),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[73].base, 4,
g_static_metadata_bytes + 976),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
58),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[74].base, 3,
g_static_metadata_bytes + 980),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
59),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[75].base, 16,
g_static_metadata_bytes + 983),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
60),
StaticMetadata(
StaticMetadataSlice(&g_static_metadata_slice_refcounts[76].base, 11,
g_static_metadata_bytes + 999),
StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 0,
g_static_metadata_bytes + 12),
61),
};
/* Warning: the core static metadata currently operates under the soft
constraint that the first GRPC_CHTTP2_LAST_STATIC_ENTRY (61) entries must
contain metadata specified by the http2 hpack standard. The CHTTP2 transport
reads the core metadata with this assumption in mind. If the order of the core
static metadata is to be changed, then the CHTTP2 transport must be changed as
well to stop relying on the core metadata. */
grpc_mdelem g_static_mdelem_manifested[GRPC_STATIC_MDELEM_COUNT] = {
// clang-format off
/* GRPC_MDELEM_AUTHORITY_EMPTY:
":authority": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[0].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_METHOD_GET:
":method": "GET" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[1].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_METHOD_POST:
":method": "POST" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[2].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_PATH_SLASH:
":path": "/" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[3].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_PATH_SLASH_INDEX_DOT_HTML:
":path": "/index.html" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[4].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_SCHEME_HTTP:
":scheme": "http" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[5].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_SCHEME_HTTPS:
":scheme": "https" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[6].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_STATUS_200:
":status": "200" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[7].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_STATUS_204:
":status": "204" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[8].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_STATUS_206:
":status": "206" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[9].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_STATUS_304:
":status": "304" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[10].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_STATUS_400:
":status": "400" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[11].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_STATUS_404:
":status": "404" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[12].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_STATUS_500:
":status": "500" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[13].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_ACCEPT_CHARSET_EMPTY:
"accept-charset": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[14].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_ACCEPT_ENCODING_GZIP_COMMA_DEFLATE:
"accept-encoding": "gzip, deflate" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[15].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_ACCEPT_LANGUAGE_EMPTY:
"accept-language": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[16].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_ACCEPT_RANGES_EMPTY:
"accept-ranges": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[17].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_ACCEPT_EMPTY:
"accept": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[18].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_ACCESS_CONTROL_ALLOW_ORIGIN_EMPTY:
"access-control-allow-origin": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[19].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_AGE_EMPTY:
"age": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[20].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_ALLOW_EMPTY:
"allow": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[21].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_AUTHORIZATION_EMPTY:
"authorization": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[22].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_CACHE_CONTROL_EMPTY:
"cache-control": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[23].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_CONTENT_DISPOSITION_EMPTY:
"content-disposition": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[24].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_CONTENT_ENCODING_EMPTY:
"content-encoding": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[25].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_CONTENT_LANGUAGE_EMPTY:
"content-language": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[26].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_CONTENT_LENGTH_EMPTY:
"content-length": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[27].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_CONTENT_LOCATION_EMPTY:
"content-location": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[28].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_CONTENT_RANGE_EMPTY:
"content-range": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[29].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_CONTENT_TYPE_EMPTY:
"content-type": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[30].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_COOKIE_EMPTY:
"cookie": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[31].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_DATE_EMPTY:
"date": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[32].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_ETAG_EMPTY:
"etag": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[33].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_EXPECT_EMPTY:
"expect": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[34].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_EXPIRES_EMPTY:
"expires": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[35].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_FROM_EMPTY:
"from": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[36].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_HOST_EMPTY:
"host": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[37].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_IF_MATCH_EMPTY:
"if-match": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[38].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_IF_MODIFIED_SINCE_EMPTY:
"if-modified-since": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[39].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_IF_NONE_MATCH_EMPTY:
"if-none-match": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[40].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_IF_RANGE_EMPTY:
"if-range": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[41].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_IF_UNMODIFIED_SINCE_EMPTY:
"if-unmodified-since": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[42].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_LAST_MODIFIED_EMPTY:
"last-modified": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[43].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_LINK_EMPTY:
"link": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[44].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_LOCATION_EMPTY:
"location": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[45].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_MAX_FORWARDS_EMPTY:
"max-forwards": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[46].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_PROXY_AUTHENTICATE_EMPTY:
"proxy-authenticate": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[47].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_PROXY_AUTHORIZATION_EMPTY:
"proxy-authorization": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[48].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_RANGE_EMPTY:
"range": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[49].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_REFERER_EMPTY:
"referer": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[50].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_REFRESH_EMPTY:
"refresh": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[51].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_RETRY_AFTER_EMPTY:
"retry-after": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[52].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_SERVER_EMPTY:
"server": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[53].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_SET_COOKIE_EMPTY:
"set-cookie": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[54].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_STRICT_TRANSPORT_SECURITY_EMPTY:
"strict-transport-security": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[55].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_TRANSFER_ENCODING_EMPTY:
"transfer-encoding": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[56].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_USER_AGENT_EMPTY:
"user-agent": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[57].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_VARY_EMPTY:
"vary": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[58].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_VIA_EMPTY:
"via": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[59].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_WWW_AUTHENTICATE_EMPTY:
"www-authenticate": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[60].data(),
GRPC_MDELEM_STORAGE_STATIC),
/* GRPC_MDELEM_LB_COST_BIN_EMPTY:
"lb-cost-bin": "" */
GRPC_MAKE_MDELEM(
&g_static_mdelem_table[61].data(),
GRPC_MDELEM_STORAGE_STATIC)
// clang-format on
};
} // namespace grpc_core
uintptr_t grpc_static_mdelem_user_data[GRPC_STATIC_MDELEM_COUNT] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static const int8_t elems_r[] = {
13, -11, 0, 0, -27, 0, 0, -43, 0, 0, -59, 0, 0, 0, 0,
0, 0, 0, 0, -4, -37, 0, -17, -21, -25, -29, -33, -37, -41, -45,
0, 23, 19, 15, 11, 7, 3, -1, -5, -9, -13, -17, -21, -25, -29,
-33, 0, 35, 31, 27, 23, 19, 15, 11, 7, 3, -1, -5, -9, -13,
-17, 0, 51, 47, 43, 39, 35, 31, 27, 23, 19, 0};
static uint32_t elems_phash(uint32_t i) {
i -= 771;
uint32_t x = i % 72;
uint32_t y = i / 72;
uint32_t h = x;
if (y < GPR_ARRAY_SIZE(elems_r)) {
uint32_t delta = static_cast<uint32_t>(elems_r[y]);
h += delta;
}
return h;
}
static const uint16_t elem_keys[] = {
1563, 1564, 1565, 1566, 1567, 859, 860, 1093, 1094, 1327, 1328,
1561, 1562, 771, 2157, 2263, 2388, 2465, 2542, 2619, 2696, 2773,
2850, 2927, 3004, 3081, 3158, 3235, 3312, 3389, 3466, 3543, 3620,
3697, 3774, 3851, 3928, 4005, 4082, 4159, 4236, 4313, 4390, 4467,
4544, 4621, 4698, 4775, 4852, 4929, 5006, 5083, 5160, 5237, 5314,
5391, 5468, 5545, 5622, 5699, 5776, 5853};
static const uint8_t elem_idxs[] = {
9, 10, 11, 12, 13, 1, 2, 3, 4, 5, 6, 7, 8, 0, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61};
grpc_mdelem grpc_static_mdelem_for_static_strings(intptr_t a, intptr_t b) {
if (a == -1 || b == -1) return GRPC_MDNULL;
uint32_t k = static_cast<uint32_t>(a * 77 + b);
uint32_t h = elems_phash(k);
return h < GPR_ARRAY_SIZE(elem_keys) && elem_keys[h] == k &&
elem_idxs[h] != 255
? GRPC_MAKE_MDELEM(
&grpc_core::g_static_mdelem_table[elem_idxs[h]].data(),
GRPC_MDELEM_STORAGE_STATIC)
: GRPC_MDNULL;
}

@ -1,200 +0,0 @@
/*
* Copyright 2015 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* WARNING: Auto-generated code.
*
* To make changes to this file, change
* tools/codegen/core/gen_static_metadata.py, and then re-run it.
*
* See metadata.h for an explanation of the interface here, and metadata.cc for
* an explanation of what's going on.
*/
#ifndef GRPC_CORE_LIB_TRANSPORT_STATIC_METADATA_H
#define GRPC_CORE_LIB_TRANSPORT_STATIC_METADATA_H
#include <grpc/support/port_platform.h>
#include <cstdint>
#include "src/core/lib/slice/static_slice.h"
#include "src/core/lib/transport/metadata.h"
#define GRPC_STATIC_MDELEM_COUNT 62
namespace grpc_core {
extern StaticMetadata g_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT];
extern grpc_mdelem g_static_mdelem_manifested[GRPC_STATIC_MDELEM_COUNT];
} // namespace grpc_core
extern uintptr_t grpc_static_mdelem_user_data[GRPC_STATIC_MDELEM_COUNT];
/* ":authority": "" */
#define GRPC_MDELEM_AUTHORITY_EMPTY (::grpc_core::g_static_mdelem_manifested[0])
/* ":method": "GET" */
#define GRPC_MDELEM_METHOD_GET (::grpc_core::g_static_mdelem_manifested[1])
/* ":method": "POST" */
#define GRPC_MDELEM_METHOD_POST (::grpc_core::g_static_mdelem_manifested[2])
/* ":path": "/" */
#define GRPC_MDELEM_PATH_SLASH (::grpc_core::g_static_mdelem_manifested[3])
/* ":path": "/index.html" */
#define GRPC_MDELEM_PATH_SLASH_INDEX_DOT_HTML \
(::grpc_core::g_static_mdelem_manifested[4])
/* ":scheme": "http" */
#define GRPC_MDELEM_SCHEME_HTTP (::grpc_core::g_static_mdelem_manifested[5])
/* ":scheme": "https" */
#define GRPC_MDELEM_SCHEME_HTTPS (::grpc_core::g_static_mdelem_manifested[6])
/* ":status": "200" */
#define GRPC_MDELEM_STATUS_200 (::grpc_core::g_static_mdelem_manifested[7])
/* ":status": "204" */
#define GRPC_MDELEM_STATUS_204 (::grpc_core::g_static_mdelem_manifested[8])
/* ":status": "206" */
#define GRPC_MDELEM_STATUS_206 (::grpc_core::g_static_mdelem_manifested[9])
/* ":status": "304" */
#define GRPC_MDELEM_STATUS_304 (::grpc_core::g_static_mdelem_manifested[10])
/* ":status": "400" */
#define GRPC_MDELEM_STATUS_400 (::grpc_core::g_static_mdelem_manifested[11])
/* ":status": "404" */
#define GRPC_MDELEM_STATUS_404 (::grpc_core::g_static_mdelem_manifested[12])
/* ":status": "500" */
#define GRPC_MDELEM_STATUS_500 (::grpc_core::g_static_mdelem_manifested[13])
/* "accept-charset": "" */
#define GRPC_MDELEM_ACCEPT_CHARSET_EMPTY \
(::grpc_core::g_static_mdelem_manifested[14])
/* "accept-encoding": "gzip, deflate" */
#define GRPC_MDELEM_ACCEPT_ENCODING_GZIP_COMMA_DEFLATE \
(::grpc_core::g_static_mdelem_manifested[15])
/* "accept-language": "" */
#define GRPC_MDELEM_ACCEPT_LANGUAGE_EMPTY \
(::grpc_core::g_static_mdelem_manifested[16])
/* "accept-ranges": "" */
#define GRPC_MDELEM_ACCEPT_RANGES_EMPTY \
(::grpc_core::g_static_mdelem_manifested[17])
/* "accept": "" */
#define GRPC_MDELEM_ACCEPT_EMPTY (::grpc_core::g_static_mdelem_manifested[18])
/* "access-control-allow-origin": "" */
#define GRPC_MDELEM_ACCESS_CONTROL_ALLOW_ORIGIN_EMPTY \
(::grpc_core::g_static_mdelem_manifested[19])
/* "age": "" */
#define GRPC_MDELEM_AGE_EMPTY (::grpc_core::g_static_mdelem_manifested[20])
/* "allow": "" */
#define GRPC_MDELEM_ALLOW_EMPTY (::grpc_core::g_static_mdelem_manifested[21])
/* "authorization": "" */
#define GRPC_MDELEM_AUTHORIZATION_EMPTY \
(::grpc_core::g_static_mdelem_manifested[22])
/* "cache-control": "" */
#define GRPC_MDELEM_CACHE_CONTROL_EMPTY \
(::grpc_core::g_static_mdelem_manifested[23])
/* "content-disposition": "" */
#define GRPC_MDELEM_CONTENT_DISPOSITION_EMPTY \
(::grpc_core::g_static_mdelem_manifested[24])
/* "content-encoding": "" */
#define GRPC_MDELEM_CONTENT_ENCODING_EMPTY \
(::grpc_core::g_static_mdelem_manifested[25])
/* "content-language": "" */
#define GRPC_MDELEM_CONTENT_LANGUAGE_EMPTY \
(::grpc_core::g_static_mdelem_manifested[26])
/* "content-length": "" */
#define GRPC_MDELEM_CONTENT_LENGTH_EMPTY \
(::grpc_core::g_static_mdelem_manifested[27])
/* "content-location": "" */
#define GRPC_MDELEM_CONTENT_LOCATION_EMPTY \
(::grpc_core::g_static_mdelem_manifested[28])
/* "content-range": "" */
#define GRPC_MDELEM_CONTENT_RANGE_EMPTY \
(::grpc_core::g_static_mdelem_manifested[29])
/* "content-type": "" */
#define GRPC_MDELEM_CONTENT_TYPE_EMPTY \
(::grpc_core::g_static_mdelem_manifested[30])
/* "cookie": "" */
#define GRPC_MDELEM_COOKIE_EMPTY (::grpc_core::g_static_mdelem_manifested[31])
/* "date": "" */
#define GRPC_MDELEM_DATE_EMPTY (::grpc_core::g_static_mdelem_manifested[32])
/* "etag": "" */
#define GRPC_MDELEM_ETAG_EMPTY (::grpc_core::g_static_mdelem_manifested[33])
/* "expect": "" */
#define GRPC_MDELEM_EXPECT_EMPTY (::grpc_core::g_static_mdelem_manifested[34])
/* "expires": "" */
#define GRPC_MDELEM_EXPIRES_EMPTY (::grpc_core::g_static_mdelem_manifested[35])
/* "from": "" */
#define GRPC_MDELEM_FROM_EMPTY (::grpc_core::g_static_mdelem_manifested[36])
/* "host": "" */
#define GRPC_MDELEM_HOST_EMPTY (::grpc_core::g_static_mdelem_manifested[37])
/* "if-match": "" */
#define GRPC_MDELEM_IF_MATCH_EMPTY (::grpc_core::g_static_mdelem_manifested[38])
/* "if-modified-since": "" */
#define GRPC_MDELEM_IF_MODIFIED_SINCE_EMPTY \
(::grpc_core::g_static_mdelem_manifested[39])
/* "if-none-match": "" */
#define GRPC_MDELEM_IF_NONE_MATCH_EMPTY \
(::grpc_core::g_static_mdelem_manifested[40])
/* "if-range": "" */
#define GRPC_MDELEM_IF_RANGE_EMPTY (::grpc_core::g_static_mdelem_manifested[41])
/* "if-unmodified-since": "" */
#define GRPC_MDELEM_IF_UNMODIFIED_SINCE_EMPTY \
(::grpc_core::g_static_mdelem_manifested[42])
/* "last-modified": "" */
#define GRPC_MDELEM_LAST_MODIFIED_EMPTY \
(::grpc_core::g_static_mdelem_manifested[43])
/* "link": "" */
#define GRPC_MDELEM_LINK_EMPTY (::grpc_core::g_static_mdelem_manifested[44])
/* "location": "" */
#define GRPC_MDELEM_LOCATION_EMPTY (::grpc_core::g_static_mdelem_manifested[45])
/* "max-forwards": "" */
#define GRPC_MDELEM_MAX_FORWARDS_EMPTY \
(::grpc_core::g_static_mdelem_manifested[46])
/* "proxy-authenticate": "" */
#define GRPC_MDELEM_PROXY_AUTHENTICATE_EMPTY \
(::grpc_core::g_static_mdelem_manifested[47])
/* "proxy-authorization": "" */
#define GRPC_MDELEM_PROXY_AUTHORIZATION_EMPTY \
(::grpc_core::g_static_mdelem_manifested[48])
/* "range": "" */
#define GRPC_MDELEM_RANGE_EMPTY (::grpc_core::g_static_mdelem_manifested[49])
/* "referer": "" */
#define GRPC_MDELEM_REFERER_EMPTY (::grpc_core::g_static_mdelem_manifested[50])
/* "refresh": "" */
#define GRPC_MDELEM_REFRESH_EMPTY (::grpc_core::g_static_mdelem_manifested[51])
/* "retry-after": "" */
#define GRPC_MDELEM_RETRY_AFTER_EMPTY \
(::grpc_core::g_static_mdelem_manifested[52])
/* "server": "" */
#define GRPC_MDELEM_SERVER_EMPTY (::grpc_core::g_static_mdelem_manifested[53])
/* "set-cookie": "" */
#define GRPC_MDELEM_SET_COOKIE_EMPTY \
(::grpc_core::g_static_mdelem_manifested[54])
/* "strict-transport-security": "" */
#define GRPC_MDELEM_STRICT_TRANSPORT_SECURITY_EMPTY \
(::grpc_core::g_static_mdelem_manifested[55])
/* "transfer-encoding": "" */
#define GRPC_MDELEM_TRANSFER_ENCODING_EMPTY \
(::grpc_core::g_static_mdelem_manifested[56])
/* "user-agent": "" */
#define GRPC_MDELEM_USER_AGENT_EMPTY \
(::grpc_core::g_static_mdelem_manifested[57])
/* "vary": "" */
#define GRPC_MDELEM_VARY_EMPTY (::grpc_core::g_static_mdelem_manifested[58])
/* "via": "" */
#define GRPC_MDELEM_VIA_EMPTY (::grpc_core::g_static_mdelem_manifested[59])
/* "www-authenticate": "" */
#define GRPC_MDELEM_WWW_AUTHENTICATE_EMPTY \
(::grpc_core::g_static_mdelem_manifested[60])
/* "lb-cost-bin": "" */
#define GRPC_MDELEM_LB_COST_BIN_EMPTY \
(::grpc_core::g_static_mdelem_manifested[61])
grpc_mdelem grpc_static_mdelem_for_static_strings(intptr_t a, intptr_t b);
#endif /* GRPC_CORE_LIB_TRANSPORT_STATIC_METADATA_H */

@ -40,47 +40,14 @@
/* These routines are here to facilitate debugging - they produce string
representations of various transport data structures */
namespace {
class MetadataListEncoder {
public:
explicit MetadataListEncoder(std::vector<std::string>* out) : out_(out) {}
void Encode(const grpc_mdelem& md) {
MaybeAddComma();
out_->push_back("key=");
char* dump = grpc_dump_slice(GRPC_MDKEY(md), GPR_DUMP_HEX | GPR_DUMP_ASCII);
out_->push_back(dump);
gpr_free(dump);
out_->push_back(" value=");
dump = grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX | GPR_DUMP_ASCII);
out_->push_back(dump);
gpr_free(dump);
}
void Encode(grpc_core::GrpcTimeoutMetadata, grpc_millis deadline) {
MaybeAddComma();
out_->push_back(absl::StrFormat("deadline=%" PRId64, deadline));
}
template <typename Which>
void Encode(Which, const typename Which::ValueType& value) {
MaybeAddComma();
out_->push_back(
absl::StrCat(Which::key(), "=", Which::DisplayValue(value)));
}
private:
void MaybeAddComma() {
if (out_->size() != initial_size_) out_->push_back(", ");
}
std::vector<std::string>* const out_;
const size_t initial_size_ = out_->size();
};
} // namespace
static void put_metadata_list(const grpc_metadata_batch& md,
std::vector<std::string>* out) {
MetadataListEncoder encoder(out);
md.Encode(&encoder);
bool first = true;
md.Log([out, &first](absl::string_view key, absl::string_view value) {
if (!first) out->push_back(", ");
first = false;
out->push_back(absl::StrCat(key, "=", value));
});
}
std::string grpc_transport_stream_op_batch_string(

@ -27,8 +27,6 @@ void grpc_chttp2_plugin_init(void);
void grpc_chttp2_plugin_shutdown(void);
void grpc_client_channel_init(void);
void grpc_client_channel_shutdown(void);
void grpc_inproc_plugin_init(void);
void grpc_inproc_plugin_shutdown(void);
void grpc_resolver_fake_init(void);
void grpc_resolver_fake_shutdown(void);
void grpc_lb_policy_grpclb_init(void);
@ -101,7 +99,6 @@ void grpc_register_built_in_plugins(void) {
grpc_register_plugin(grpc_core::ServiceConfigParserInit,
grpc_core::ServiceConfigParserShutdown);
grpc_register_plugin(grpc_client_channel_init, grpc_client_channel_shutdown);
grpc_register_plugin(grpc_inproc_plugin_init, grpc_inproc_plugin_shutdown);
grpc_register_plugin(grpc_resolver_fake_init, grpc_resolver_fake_shutdown);
grpc_register_plugin(grpc_lb_policy_grpclb_init,
grpc_lb_policy_grpclb_shutdown);

@ -27,8 +27,6 @@ void grpc_chttp2_plugin_init(void);
void grpc_chttp2_plugin_shutdown(void);
void grpc_client_channel_init(void);
void grpc_client_channel_shutdown(void);
void grpc_inproc_plugin_init(void);
void grpc_inproc_plugin_shutdown(void);
void grpc_resolver_dns_ares_init(void);
void grpc_resolver_dns_ares_shutdown(void);
void grpc_resolver_dns_native_init(void);
@ -63,7 +61,6 @@ void grpc_register_built_in_plugins(void) {
grpc_register_plugin(grpc_core::ServiceConfigParserInit,
grpc_core::ServiceConfigParserShutdown);
grpc_register_plugin(grpc_client_channel_init, grpc_client_channel_shutdown);
grpc_register_plugin(grpc_inproc_plugin_init, grpc_inproc_plugin_shutdown);
grpc_register_plugin(grpc_resolver_dns_ares_init,
grpc_resolver_dns_ares_shutdown);
grpc_register_plugin(grpc_resolver_dns_native_init,

@ -30,13 +30,14 @@ namespace grpc {
// MetadataBatch
grpc_linked_mdelem* MetadataBatch::AddMetadata(const string& key,
const string& value) {
grpc_linked_mdelem* storage = new grpc_linked_mdelem;
storage->md = grpc_mdelem_from_slices(SliceFromCopiedString(key),
SliceFromCopiedString(value));
GRPC_LOG_IF_ERROR("MetadataBatch::AddMetadata", batch_->LinkHead(storage));
return storage;
void MetadataBatch::AddMetadata(const string& key, const string& value) {
batch_->Append(key, grpc_core::Slice::FromCopiedString(value),
[&](absl::string_view error, const grpc_core::Slice&) {
gpr_log(GPR_INFO, "%s",
absl::StrCat("MetadataBatch::AddMetadata error:",
error, " key=", key, " value=", value)
.c_str());
});
}
// ChannelData

@ -51,10 +51,8 @@ class MetadataBatch {
grpc_metadata_batch* batch() const { return batch_; }
/// Adds metadata and returns the newly allocated storage.
/// The caller takes ownership of the result, which must exist for the
/// lifetime of the gRPC call.
grpc_linked_mdelem* AddMetadata(const string& key, const string& value);
/// Adds metadata.
void AddMetadata(const string& key, const string& value);
private:
grpc_metadata_batch* batch_; // Not owned.

@ -50,7 +50,6 @@ class CensusServerCallData : public CallData {
recv_message_(nullptr),
recv_message_count_(0),
sent_message_count_(0) {
memset(&census_bin_, 0, sizeof(grpc_linked_mdelem));
memset(&on_done_recv_initial_metadata_, 0, sizeof(grpc_closure));
memset(&on_done_recv_message_, 0, sizeof(grpc_closure));
}
@ -79,8 +78,6 @@ class CensusServerCallData : public CallData {
grpc_call* gc_;
// Authorization context for the call.
grpc_auth_context* auth_context_;
// Metadata element for census stats.
grpc_linked_mdelem census_bin_;
// recv callback
grpc_metadata_batch* recv_initial_metadata_;
grpc_closure* initial_on_done_recv_initial_metadata_;

@ -115,7 +115,6 @@ CORE_SOURCE_FILES = [
'src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc',
'src/core/ext/transport/chttp2/transport/hpack_parser.cc',
'src/core/ext/transport/chttp2/transport/hpack_parser_table.cc',
'src/core/ext/transport/chttp2/transport/hpack_utils.cc',
'src/core/ext/transport/chttp2/transport/http2_settings.cc',
'src/core/ext/transport/chttp2/transport/huffsyms.cc',
'src/core/ext/transport/chttp2/transport/parsing.cc',
@ -555,7 +554,6 @@ CORE_SOURCE_FILES = [
'src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc',
'src/core/lib/security/credentials/composite/composite_credentials.cc',
'src/core/lib/security/credentials/credentials.cc',
'src/core/lib/security/credentials/credentials_metadata.cc',
'src/core/lib/security/credentials/external/aws_external_account_credentials.cc',
'src/core/lib/security/credentials/external/aws_request_signer.cc',
'src/core/lib/security/credentials/external/external_account_credentials.cc',
@ -608,7 +606,6 @@ CORE_SOURCE_FILES = [
'src/core/lib/slice/slice_refcount.cc',
'src/core/lib/slice/slice_split.cc',
'src/core/lib/slice/slice_string_helpers.cc',
'src/core/lib/slice/static_slice.cc',
'src/core/lib/surface/api_trace.cc',
'src/core/lib/surface/builtins.cc',
'src/core/lib/surface/byte_buffer.cc',
@ -634,11 +631,8 @@ CORE_SOURCE_FILES = [
'src/core/lib/transport/byte_stream.cc',
'src/core/lib/transport/connectivity_state.cc',
'src/core/lib/transport/error_utils.cc',
'src/core/lib/transport/metadata.cc',
'src/core/lib/transport/metadata_batch.cc',
'src/core/lib/transport/parsed_metadata.cc',
'src/core/lib/transport/pid_controller.cc',
'src/core/lib/transport/static_metadata.cc',
'src/core/lib/transport/status_conversion.cc',
'src/core/lib/transport/timeout_encoding.cc',
'src/core/lib/transport/transport.cc',

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save