Merge branch 'fix_cpp_deps' of https://github.com/dgquintas/grpc into bb_reader_error

pull/7190/head
David Garcia Quintas 9 years ago
commit b44b385ad2
  1. 455
      BUILD
  2. 233
      CMakeLists.txt
  3. 286
      Makefile
  4. 2
      build.yaml
  5. 108
      src/ruby/ext/grpc/rb_call.c
  6. 2
      src/ruby/ext/grpc/rb_call.h
  7. 31
      src/ruby/ext/grpc/rb_call_credentials.c
  8. 54
      src/ruby/ext/grpc/rb_channel.c
  9. 32
      src/ruby/ext/grpc/rb_channel_credentials.c
  10. 149
      src/ruby/ext/grpc/rb_completion_queue.c
  11. 9
      src/ruby/ext/grpc/rb_completion_queue.h
  12. 6
      src/ruby/ext/grpc/rb_grpc.c
  13. 214
      src/ruby/ext/grpc/rb_server.c
  14. 37
      src/ruby/ext/grpc/rb_server_credentials.c
  15. 71
      src/ruby/lib/grpc/generic/active_call.rb
  16. 42
      src/ruby/lib/grpc/generic/bidi_call.rb
  17. 11
      src/ruby/lib/grpc/generic/client_stub.rb
  18. 40
      src/ruby/lib/grpc/generic/rpc_server.rb
  19. 2
      src/ruby/lib/grpc/generic/service.rb
  20. 28
      src/ruby/pb/test/client.rb
  21. 12
      src/ruby/pb/test/server.rb
  22. 3
      src/ruby/spec/call_spec.rb
  23. 5
      src/ruby/spec/channel_spec.rb
  24. 99
      src/ruby/spec/client_server_spec.rb
  25. 42
      src/ruby/spec/completion_queue_spec.rb
  26. 148
      src/ruby/spec/generic/active_call_spec.rb
  27. 75
      src/ruby/spec/generic/client_stub_spec.rb
  28. 34
      src/ruby/spec/generic/rpc_server_spec.rb
  29. 2
      src/ruby/spec/pb/health/checker_spec.rb
  30. 44
      src/ruby/spec/server_spec.rb
  31. 10
      tools/doxygen/Doxyfile.c++
  32. 227
      tools/doxygen/Doxyfile.c++.internal
  33. 6
      tools/run_tests/sources_and_headers.json
  34. 1
      vsprojects/grpc.sln
  35. 346
      vsprojects/vcxproj/grpc++/grpc++.vcxproj
  36. 765
      vsprojects/vcxproj/grpc++/grpc++.vcxproj.filters
  37. 343
      vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj
  38. 765
      vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj.filters

455
BUILD

@ -1235,6 +1235,109 @@ cc_library(
"src/cpp/client/create_channel_internal.h", "src/cpp/client/create_channel_internal.h",
"src/cpp/server/dynamic_thread_pool.h", "src/cpp/server/dynamic_thread_pool.h",
"src/cpp/server/thread_pool_interface.h", "src/cpp/server/thread_pool_interface.h",
"src/core/lib/channel/channel_args.h",
"src/core/lib/channel/channel_stack.h",
"src/core/lib/channel/channel_stack_builder.h",
"src/core/lib/channel/compress_filter.h",
"src/core/lib/channel/connected_channel.h",
"src/core/lib/channel/context.h",
"src/core/lib/channel/http_client_filter.h",
"src/core/lib/channel/http_server_filter.h",
"src/core/lib/compression/algorithm_metadata.h",
"src/core/lib/compression/message_compress.h",
"src/core/lib/debug/trace.h",
"src/core/lib/http/format_request.h",
"src/core/lib/http/httpcli.h",
"src/core/lib/http/parser.h",
"src/core/lib/iomgr/closure.h",
"src/core/lib/iomgr/endpoint.h",
"src/core/lib/iomgr/endpoint_pair.h",
"src/core/lib/iomgr/error.h",
"src/core/lib/iomgr/ev_epoll_linux.h",
"src/core/lib/iomgr/ev_poll_and_epoll_posix.h",
"src/core/lib/iomgr/ev_poll_posix.h",
"src/core/lib/iomgr/ev_posix.h",
"src/core/lib/iomgr/exec_ctx.h",
"src/core/lib/iomgr/executor.h",
"src/core/lib/iomgr/iocp_windows.h",
"src/core/lib/iomgr/iomgr.h",
"src/core/lib/iomgr/iomgr_internal.h",
"src/core/lib/iomgr/iomgr_posix.h",
"src/core/lib/iomgr/load_file.h",
"src/core/lib/iomgr/network_status_tracker.h",
"src/core/lib/iomgr/polling_entity.h",
"src/core/lib/iomgr/pollset.h",
"src/core/lib/iomgr/pollset_set.h",
"src/core/lib/iomgr/pollset_set_windows.h",
"src/core/lib/iomgr/pollset_windows.h",
"src/core/lib/iomgr/resolve_address.h",
"src/core/lib/iomgr/sockaddr.h",
"src/core/lib/iomgr/sockaddr_posix.h",
"src/core/lib/iomgr/sockaddr_utils.h",
"src/core/lib/iomgr/sockaddr_windows.h",
"src/core/lib/iomgr/socket_utils_posix.h",
"src/core/lib/iomgr/socket_windows.h",
"src/core/lib/iomgr/tcp_client.h",
"src/core/lib/iomgr/tcp_posix.h",
"src/core/lib/iomgr/tcp_server.h",
"src/core/lib/iomgr/tcp_windows.h",
"src/core/lib/iomgr/time_averaged_stats.h",
"src/core/lib/iomgr/timer.h",
"src/core/lib/iomgr/timer_heap.h",
"src/core/lib/iomgr/udp_server.h",
"src/core/lib/iomgr/unix_sockets_posix.h",
"src/core/lib/iomgr/wakeup_fd_pipe.h",
"src/core/lib/iomgr/wakeup_fd_posix.h",
"src/core/lib/iomgr/workqueue.h",
"src/core/lib/iomgr/workqueue_posix.h",
"src/core/lib/iomgr/workqueue_windows.h",
"src/core/lib/json/json.h",
"src/core/lib/json/json_common.h",
"src/core/lib/json/json_reader.h",
"src/core/lib/json/json_writer.h",
"src/core/lib/surface/api_trace.h",
"src/core/lib/surface/call.h",
"src/core/lib/surface/call_test_only.h",
"src/core/lib/surface/channel.h",
"src/core/lib/surface/channel_init.h",
"src/core/lib/surface/channel_stack_type.h",
"src/core/lib/surface/completion_queue.h",
"src/core/lib/surface/event_string.h",
"src/core/lib/surface/init.h",
"src/core/lib/surface/lame_client.h",
"src/core/lib/surface/server.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/static_metadata.h",
"src/core/lib/transport/transport.h",
"src/core/lib/transport/transport_impl.h",
"src/core/lib/security/context/security_context.h",
"src/core/lib/security/credentials/composite/composite_credentials.h",
"src/core/lib/security/credentials/credentials.h",
"src/core/lib/security/credentials/fake/fake_credentials.h",
"src/core/lib/security/credentials/google_default/google_default_credentials.h",
"src/core/lib/security/credentials/iam/iam_credentials.h",
"src/core/lib/security/credentials/jwt/json_token.h",
"src/core/lib/security/credentials/jwt/jwt_credentials.h",
"src/core/lib/security/credentials/jwt/jwt_verifier.h",
"src/core/lib/security/credentials/oauth2/oauth2_credentials.h",
"src/core/lib/security/credentials/plugin/plugin_credentials.h",
"src/core/lib/security/credentials/ssl/ssl_credentials.h",
"src/core/lib/security/transport/auth_filters.h",
"src/core/lib/security/transport/handshake.h",
"src/core/lib/security/transport/secure_endpoint.h",
"src/core/lib/security/transport/security_connector.h",
"src/core/lib/security/transport/tsi_error.h",
"src/core/lib/security/util/b64.h",
"src/core/lib/security/util/json_util.h",
"src/core/ext/transport/chttp2/alpn/alpn.h",
"src/core/lib/tsi/fake_transport_security.h",
"src/core/lib/tsi/ssl_transport_security.h",
"src/core/lib/tsi/ssl_types.h",
"src/core/lib/tsi/transport_security.h",
"src/core/lib/tsi/transport_security_interface.h",
"src/cpp/client/secure_credentials.cc", "src/cpp/client/secure_credentials.cc",
"src/cpp/common/auth_property_iterator.cc", "src/cpp/common/auth_property_iterator.cc",
"src/cpp/common/secure_auth_context.cc", "src/cpp/common/secure_auth_context.cc",
@ -1267,6 +1370,122 @@ cc_library(
"src/cpp/util/status.cc", "src/cpp/util/status.cc",
"src/cpp/util/string_ref.cc", "src/cpp/util/string_ref.cc",
"src/cpp/util/time.cc", "src/cpp/util/time.cc",
"src/core/lib/channel/channel_args.c",
"src/core/lib/channel/channel_stack.c",
"src/core/lib/channel/channel_stack_builder.c",
"src/core/lib/channel/compress_filter.c",
"src/core/lib/channel/connected_channel.c",
"src/core/lib/channel/http_client_filter.c",
"src/core/lib/channel/http_server_filter.c",
"src/core/lib/compression/compression.c",
"src/core/lib/compression/message_compress.c",
"src/core/lib/debug/trace.c",
"src/core/lib/http/format_request.c",
"src/core/lib/http/httpcli.c",
"src/core/lib/http/parser.c",
"src/core/lib/iomgr/closure.c",
"src/core/lib/iomgr/endpoint.c",
"src/core/lib/iomgr/endpoint_pair_posix.c",
"src/core/lib/iomgr/endpoint_pair_windows.c",
"src/core/lib/iomgr/error.c",
"src/core/lib/iomgr/ev_epoll_linux.c",
"src/core/lib/iomgr/ev_poll_and_epoll_posix.c",
"src/core/lib/iomgr/ev_poll_posix.c",
"src/core/lib/iomgr/ev_posix.c",
"src/core/lib/iomgr/exec_ctx.c",
"src/core/lib/iomgr/executor.c",
"src/core/lib/iomgr/iocp_windows.c",
"src/core/lib/iomgr/iomgr.c",
"src/core/lib/iomgr/iomgr_posix.c",
"src/core/lib/iomgr/iomgr_windows.c",
"src/core/lib/iomgr/load_file.c",
"src/core/lib/iomgr/network_status_tracker.c",
"src/core/lib/iomgr/polling_entity.c",
"src/core/lib/iomgr/pollset_set_windows.c",
"src/core/lib/iomgr/pollset_windows.c",
"src/core/lib/iomgr/resolve_address_posix.c",
"src/core/lib/iomgr/resolve_address_windows.c",
"src/core/lib/iomgr/sockaddr_utils.c",
"src/core/lib/iomgr/socket_utils_common_posix.c",
"src/core/lib/iomgr/socket_utils_linux.c",
"src/core/lib/iomgr/socket_utils_posix.c",
"src/core/lib/iomgr/socket_windows.c",
"src/core/lib/iomgr/tcp_client_posix.c",
"src/core/lib/iomgr/tcp_client_windows.c",
"src/core/lib/iomgr/tcp_posix.c",
"src/core/lib/iomgr/tcp_server_posix.c",
"src/core/lib/iomgr/tcp_server_windows.c",
"src/core/lib/iomgr/tcp_windows.c",
"src/core/lib/iomgr/time_averaged_stats.c",
"src/core/lib/iomgr/timer.c",
"src/core/lib/iomgr/timer_heap.c",
"src/core/lib/iomgr/udp_server.c",
"src/core/lib/iomgr/unix_sockets_posix.c",
"src/core/lib/iomgr/unix_sockets_posix_noop.c",
"src/core/lib/iomgr/wakeup_fd_eventfd.c",
"src/core/lib/iomgr/wakeup_fd_nospecial.c",
"src/core/lib/iomgr/wakeup_fd_pipe.c",
"src/core/lib/iomgr/wakeup_fd_posix.c",
"src/core/lib/iomgr/workqueue_posix.c",
"src/core/lib/iomgr/workqueue_windows.c",
"src/core/lib/json/json.c",
"src/core/lib/json/json_reader.c",
"src/core/lib/json/json_string.c",
"src/core/lib/json/json_writer.c",
"src/core/lib/surface/alarm.c",
"src/core/lib/surface/api_trace.c",
"src/core/lib/surface/byte_buffer.c",
"src/core/lib/surface/byte_buffer_reader.c",
"src/core/lib/surface/call.c",
"src/core/lib/surface/call_details.c",
"src/core/lib/surface/call_log_batch.c",
"src/core/lib/surface/channel.c",
"src/core/lib/surface/channel_init.c",
"src/core/lib/surface/channel_ping.c",
"src/core/lib/surface/channel_stack_type.c",
"src/core/lib/surface/completion_queue.c",
"src/core/lib/surface/event_string.c",
"src/core/lib/surface/lame_client.c",
"src/core/lib/surface/metadata_array.c",
"src/core/lib/surface/server.c",
"src/core/lib/surface/validate_metadata.c",
"src/core/lib/surface/version.c",
"src/core/lib/transport/byte_stream.c",
"src/core/lib/transport/connectivity_state.c",
"src/core/lib/transport/metadata.c",
"src/core/lib/transport/metadata_batch.c",
"src/core/lib/transport/static_metadata.c",
"src/core/lib/transport/transport.c",
"src/core/lib/transport/transport_op_string.c",
"src/core/lib/http/httpcli_security_connector.c",
"src/core/lib/security/context/security_context.c",
"src/core/lib/security/credentials/composite/composite_credentials.c",
"src/core/lib/security/credentials/credentials.c",
"src/core/lib/security/credentials/credentials_metadata.c",
"src/core/lib/security/credentials/fake/fake_credentials.c",
"src/core/lib/security/credentials/google_default/credentials_posix.c",
"src/core/lib/security/credentials/google_default/credentials_windows.c",
"src/core/lib/security/credentials/google_default/google_default_credentials.c",
"src/core/lib/security/credentials/iam/iam_credentials.c",
"src/core/lib/security/credentials/jwt/json_token.c",
"src/core/lib/security/credentials/jwt/jwt_credentials.c",
"src/core/lib/security/credentials/jwt/jwt_verifier.c",
"src/core/lib/security/credentials/oauth2/oauth2_credentials.c",
"src/core/lib/security/credentials/plugin/plugin_credentials.c",
"src/core/lib/security/credentials/ssl/ssl_credentials.c",
"src/core/lib/security/transport/client_auth_filter.c",
"src/core/lib/security/transport/handshake.c",
"src/core/lib/security/transport/secure_endpoint.c",
"src/core/lib/security/transport/security_connector.c",
"src/core/lib/security/transport/server_auth_filter.c",
"src/core/lib/security/transport/tsi_error.c",
"src/core/lib/security/util/b64.c",
"src/core/lib/security/util/json_util.c",
"src/core/lib/surface/init_secure.c",
"src/core/ext/transport/chttp2/alpn/alpn.c",
"src/core/lib/tsi/fake_transport_security.c",
"src/core/lib/tsi/ssl_transport_security.c",
"src/core/lib/tsi/transport_security.c",
"src/cpp/codegen/codegen_init.cc", "src/cpp/codegen/codegen_init.cc",
], ],
hdrs = [ hdrs = [
@ -1368,6 +1587,14 @@ cc_library(
"include/grpc/impl/codegen/sync_posix.h", "include/grpc/impl/codegen/sync_posix.h",
"include/grpc/impl/codegen/sync_windows.h", "include/grpc/impl/codegen/sync_windows.h",
"include/grpc/impl/codegen/time.h", "include/grpc/impl/codegen/time.h",
"include/grpc/byte_buffer.h",
"include/grpc/byte_buffer_reader.h",
"include/grpc/compression.h",
"include/grpc/grpc.h",
"include/grpc/grpc_posix.h",
"include/grpc/status.h",
"include/grpc/grpc_security.h",
"include/grpc/grpc_security_constants.h",
], ],
includes = [ includes = [
"include", "include",
@ -1377,6 +1604,7 @@ cc_library(
"//external:libssl", "//external:libssl",
"//external:protobuf_clib", "//external:protobuf_clib",
":grpc", ":grpc",
":gpr",
], ],
) )
@ -1466,6 +1694,109 @@ cc_library(
"src/cpp/client/create_channel_internal.h", "src/cpp/client/create_channel_internal.h",
"src/cpp/server/dynamic_thread_pool.h", "src/cpp/server/dynamic_thread_pool.h",
"src/cpp/server/thread_pool_interface.h", "src/cpp/server/thread_pool_interface.h",
"src/core/lib/channel/channel_args.h",
"src/core/lib/channel/channel_stack.h",
"src/core/lib/channel/channel_stack_builder.h",
"src/core/lib/channel/compress_filter.h",
"src/core/lib/channel/connected_channel.h",
"src/core/lib/channel/context.h",
"src/core/lib/channel/http_client_filter.h",
"src/core/lib/channel/http_server_filter.h",
"src/core/lib/compression/algorithm_metadata.h",
"src/core/lib/compression/message_compress.h",
"src/core/lib/debug/trace.h",
"src/core/lib/http/format_request.h",
"src/core/lib/http/httpcli.h",
"src/core/lib/http/parser.h",
"src/core/lib/iomgr/closure.h",
"src/core/lib/iomgr/endpoint.h",
"src/core/lib/iomgr/endpoint_pair.h",
"src/core/lib/iomgr/error.h",
"src/core/lib/iomgr/ev_epoll_linux.h",
"src/core/lib/iomgr/ev_poll_and_epoll_posix.h",
"src/core/lib/iomgr/ev_poll_posix.h",
"src/core/lib/iomgr/ev_posix.h",
"src/core/lib/iomgr/exec_ctx.h",
"src/core/lib/iomgr/executor.h",
"src/core/lib/iomgr/iocp_windows.h",
"src/core/lib/iomgr/iomgr.h",
"src/core/lib/iomgr/iomgr_internal.h",
"src/core/lib/iomgr/iomgr_posix.h",
"src/core/lib/iomgr/load_file.h",
"src/core/lib/iomgr/network_status_tracker.h",
"src/core/lib/iomgr/polling_entity.h",
"src/core/lib/iomgr/pollset.h",
"src/core/lib/iomgr/pollset_set.h",
"src/core/lib/iomgr/pollset_set_windows.h",
"src/core/lib/iomgr/pollset_windows.h",
"src/core/lib/iomgr/resolve_address.h",
"src/core/lib/iomgr/sockaddr.h",
"src/core/lib/iomgr/sockaddr_posix.h",
"src/core/lib/iomgr/sockaddr_utils.h",
"src/core/lib/iomgr/sockaddr_windows.h",
"src/core/lib/iomgr/socket_utils_posix.h",
"src/core/lib/iomgr/socket_windows.h",
"src/core/lib/iomgr/tcp_client.h",
"src/core/lib/iomgr/tcp_posix.h",
"src/core/lib/iomgr/tcp_server.h",
"src/core/lib/iomgr/tcp_windows.h",
"src/core/lib/iomgr/time_averaged_stats.h",
"src/core/lib/iomgr/timer.h",
"src/core/lib/iomgr/timer_heap.h",
"src/core/lib/iomgr/udp_server.h",
"src/core/lib/iomgr/unix_sockets_posix.h",
"src/core/lib/iomgr/wakeup_fd_pipe.h",
"src/core/lib/iomgr/wakeup_fd_posix.h",
"src/core/lib/iomgr/workqueue.h",
"src/core/lib/iomgr/workqueue_posix.h",
"src/core/lib/iomgr/workqueue_windows.h",
"src/core/lib/json/json.h",
"src/core/lib/json/json_common.h",
"src/core/lib/json/json_reader.h",
"src/core/lib/json/json_writer.h",
"src/core/lib/surface/api_trace.h",
"src/core/lib/surface/call.h",
"src/core/lib/surface/call_test_only.h",
"src/core/lib/surface/channel.h",
"src/core/lib/surface/channel_init.h",
"src/core/lib/surface/channel_stack_type.h",
"src/core/lib/surface/completion_queue.h",
"src/core/lib/surface/event_string.h",
"src/core/lib/surface/init.h",
"src/core/lib/surface/lame_client.h",
"src/core/lib/surface/server.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/static_metadata.h",
"src/core/lib/transport/transport.h",
"src/core/lib/transport/transport_impl.h",
"src/core/lib/security/context/security_context.h",
"src/core/lib/security/credentials/composite/composite_credentials.h",
"src/core/lib/security/credentials/credentials.h",
"src/core/lib/security/credentials/fake/fake_credentials.h",
"src/core/lib/security/credentials/google_default/google_default_credentials.h",
"src/core/lib/security/credentials/iam/iam_credentials.h",
"src/core/lib/security/credentials/jwt/json_token.h",
"src/core/lib/security/credentials/jwt/jwt_credentials.h",
"src/core/lib/security/credentials/jwt/jwt_verifier.h",
"src/core/lib/security/credentials/oauth2/oauth2_credentials.h",
"src/core/lib/security/credentials/plugin/plugin_credentials.h",
"src/core/lib/security/credentials/ssl/ssl_credentials.h",
"src/core/lib/security/transport/auth_filters.h",
"src/core/lib/security/transport/handshake.h",
"src/core/lib/security/transport/secure_endpoint.h",
"src/core/lib/security/transport/security_connector.h",
"src/core/lib/security/transport/tsi_error.h",
"src/core/lib/security/util/b64.h",
"src/core/lib/security/util/json_util.h",
"src/core/ext/transport/chttp2/alpn/alpn.h",
"src/core/lib/tsi/fake_transport_security.h",
"src/core/lib/tsi/ssl_transport_security.h",
"src/core/lib/tsi/ssl_types.h",
"src/core/lib/tsi/transport_security.h",
"src/core/lib/tsi/transport_security_interface.h",
"src/cpp/common/insecure_create_auth_context.cc", "src/cpp/common/insecure_create_auth_context.cc",
"src/cpp/client/channel.cc", "src/cpp/client/channel.cc",
"src/cpp/client/client_context.cc", "src/cpp/client/client_context.cc",
@ -1493,6 +1824,122 @@ cc_library(
"src/cpp/util/status.cc", "src/cpp/util/status.cc",
"src/cpp/util/string_ref.cc", "src/cpp/util/string_ref.cc",
"src/cpp/util/time.cc", "src/cpp/util/time.cc",
"src/core/lib/channel/channel_args.c",
"src/core/lib/channel/channel_stack.c",
"src/core/lib/channel/channel_stack_builder.c",
"src/core/lib/channel/compress_filter.c",
"src/core/lib/channel/connected_channel.c",
"src/core/lib/channel/http_client_filter.c",
"src/core/lib/channel/http_server_filter.c",
"src/core/lib/compression/compression.c",
"src/core/lib/compression/message_compress.c",
"src/core/lib/debug/trace.c",
"src/core/lib/http/format_request.c",
"src/core/lib/http/httpcli.c",
"src/core/lib/http/parser.c",
"src/core/lib/iomgr/closure.c",
"src/core/lib/iomgr/endpoint.c",
"src/core/lib/iomgr/endpoint_pair_posix.c",
"src/core/lib/iomgr/endpoint_pair_windows.c",
"src/core/lib/iomgr/error.c",
"src/core/lib/iomgr/ev_epoll_linux.c",
"src/core/lib/iomgr/ev_poll_and_epoll_posix.c",
"src/core/lib/iomgr/ev_poll_posix.c",
"src/core/lib/iomgr/ev_posix.c",
"src/core/lib/iomgr/exec_ctx.c",
"src/core/lib/iomgr/executor.c",
"src/core/lib/iomgr/iocp_windows.c",
"src/core/lib/iomgr/iomgr.c",
"src/core/lib/iomgr/iomgr_posix.c",
"src/core/lib/iomgr/iomgr_windows.c",
"src/core/lib/iomgr/load_file.c",
"src/core/lib/iomgr/network_status_tracker.c",
"src/core/lib/iomgr/polling_entity.c",
"src/core/lib/iomgr/pollset_set_windows.c",
"src/core/lib/iomgr/pollset_windows.c",
"src/core/lib/iomgr/resolve_address_posix.c",
"src/core/lib/iomgr/resolve_address_windows.c",
"src/core/lib/iomgr/sockaddr_utils.c",
"src/core/lib/iomgr/socket_utils_common_posix.c",
"src/core/lib/iomgr/socket_utils_linux.c",
"src/core/lib/iomgr/socket_utils_posix.c",
"src/core/lib/iomgr/socket_windows.c",
"src/core/lib/iomgr/tcp_client_posix.c",
"src/core/lib/iomgr/tcp_client_windows.c",
"src/core/lib/iomgr/tcp_posix.c",
"src/core/lib/iomgr/tcp_server_posix.c",
"src/core/lib/iomgr/tcp_server_windows.c",
"src/core/lib/iomgr/tcp_windows.c",
"src/core/lib/iomgr/time_averaged_stats.c",
"src/core/lib/iomgr/timer.c",
"src/core/lib/iomgr/timer_heap.c",
"src/core/lib/iomgr/udp_server.c",
"src/core/lib/iomgr/unix_sockets_posix.c",
"src/core/lib/iomgr/unix_sockets_posix_noop.c",
"src/core/lib/iomgr/wakeup_fd_eventfd.c",
"src/core/lib/iomgr/wakeup_fd_nospecial.c",
"src/core/lib/iomgr/wakeup_fd_pipe.c",
"src/core/lib/iomgr/wakeup_fd_posix.c",
"src/core/lib/iomgr/workqueue_posix.c",
"src/core/lib/iomgr/workqueue_windows.c",
"src/core/lib/json/json.c",
"src/core/lib/json/json_reader.c",
"src/core/lib/json/json_string.c",
"src/core/lib/json/json_writer.c",
"src/core/lib/surface/alarm.c",
"src/core/lib/surface/api_trace.c",
"src/core/lib/surface/byte_buffer.c",
"src/core/lib/surface/byte_buffer_reader.c",
"src/core/lib/surface/call.c",
"src/core/lib/surface/call_details.c",
"src/core/lib/surface/call_log_batch.c",
"src/core/lib/surface/channel.c",
"src/core/lib/surface/channel_init.c",
"src/core/lib/surface/channel_ping.c",
"src/core/lib/surface/channel_stack_type.c",
"src/core/lib/surface/completion_queue.c",
"src/core/lib/surface/event_string.c",
"src/core/lib/surface/lame_client.c",
"src/core/lib/surface/metadata_array.c",
"src/core/lib/surface/server.c",
"src/core/lib/surface/validate_metadata.c",
"src/core/lib/surface/version.c",
"src/core/lib/transport/byte_stream.c",
"src/core/lib/transport/connectivity_state.c",
"src/core/lib/transport/metadata.c",
"src/core/lib/transport/metadata_batch.c",
"src/core/lib/transport/static_metadata.c",
"src/core/lib/transport/transport.c",
"src/core/lib/transport/transport_op_string.c",
"src/core/lib/http/httpcli_security_connector.c",
"src/core/lib/security/context/security_context.c",
"src/core/lib/security/credentials/composite/composite_credentials.c",
"src/core/lib/security/credentials/credentials.c",
"src/core/lib/security/credentials/credentials_metadata.c",
"src/core/lib/security/credentials/fake/fake_credentials.c",
"src/core/lib/security/credentials/google_default/credentials_posix.c",
"src/core/lib/security/credentials/google_default/credentials_windows.c",
"src/core/lib/security/credentials/google_default/google_default_credentials.c",
"src/core/lib/security/credentials/iam/iam_credentials.c",
"src/core/lib/security/credentials/jwt/json_token.c",
"src/core/lib/security/credentials/jwt/jwt_credentials.c",
"src/core/lib/security/credentials/jwt/jwt_verifier.c",
"src/core/lib/security/credentials/oauth2/oauth2_credentials.c",
"src/core/lib/security/credentials/plugin/plugin_credentials.c",
"src/core/lib/security/credentials/ssl/ssl_credentials.c",
"src/core/lib/security/transport/client_auth_filter.c",
"src/core/lib/security/transport/handshake.c",
"src/core/lib/security/transport/secure_endpoint.c",
"src/core/lib/security/transport/security_connector.c",
"src/core/lib/security/transport/server_auth_filter.c",
"src/core/lib/security/transport/tsi_error.c",
"src/core/lib/security/util/b64.c",
"src/core/lib/security/util/json_util.c",
"src/core/lib/surface/init_secure.c",
"src/core/ext/transport/chttp2/alpn/alpn.c",
"src/core/lib/tsi/fake_transport_security.c",
"src/core/lib/tsi/ssl_transport_security.c",
"src/core/lib/tsi/transport_security.c",
"src/cpp/codegen/codegen_init.cc", "src/cpp/codegen/codegen_init.cc",
], ],
hdrs = [ hdrs = [
@ -1594,6 +2041,14 @@ cc_library(
"include/grpc/impl/codegen/sync_posix.h", "include/grpc/impl/codegen/sync_posix.h",
"include/grpc/impl/codegen/sync_windows.h", "include/grpc/impl/codegen/sync_windows.h",
"include/grpc/impl/codegen/time.h", "include/grpc/impl/codegen/time.h",
"include/grpc/byte_buffer.h",
"include/grpc/byte_buffer_reader.h",
"include/grpc/compression.h",
"include/grpc/grpc.h",
"include/grpc/grpc_posix.h",
"include/grpc/status.h",
"include/grpc/grpc_security.h",
"include/grpc/grpc_security_constants.h",
], ],
includes = [ includes = [
"include", "include",

@ -718,6 +718,122 @@ add_library(grpc++
src/cpp/util/status.cc src/cpp/util/status.cc
src/cpp/util/string_ref.cc src/cpp/util/string_ref.cc
src/cpp/util/time.cc src/cpp/util/time.cc
src/core/lib/channel/channel_args.c
src/core/lib/channel/channel_stack.c
src/core/lib/channel/channel_stack_builder.c
src/core/lib/channel/compress_filter.c
src/core/lib/channel/connected_channel.c
src/core/lib/channel/http_client_filter.c
src/core/lib/channel/http_server_filter.c
src/core/lib/compression/compression.c
src/core/lib/compression/message_compress.c
src/core/lib/debug/trace.c
src/core/lib/http/format_request.c
src/core/lib/http/httpcli.c
src/core/lib/http/parser.c
src/core/lib/iomgr/closure.c
src/core/lib/iomgr/endpoint.c
src/core/lib/iomgr/endpoint_pair_posix.c
src/core/lib/iomgr/endpoint_pair_windows.c
src/core/lib/iomgr/error.c
src/core/lib/iomgr/ev_epoll_linux.c
src/core/lib/iomgr/ev_poll_and_epoll_posix.c
src/core/lib/iomgr/ev_poll_posix.c
src/core/lib/iomgr/ev_posix.c
src/core/lib/iomgr/exec_ctx.c
src/core/lib/iomgr/executor.c
src/core/lib/iomgr/iocp_windows.c
src/core/lib/iomgr/iomgr.c
src/core/lib/iomgr/iomgr_posix.c
src/core/lib/iomgr/iomgr_windows.c
src/core/lib/iomgr/load_file.c
src/core/lib/iomgr/network_status_tracker.c
src/core/lib/iomgr/polling_entity.c
src/core/lib/iomgr/pollset_set_windows.c
src/core/lib/iomgr/pollset_windows.c
src/core/lib/iomgr/resolve_address_posix.c
src/core/lib/iomgr/resolve_address_windows.c
src/core/lib/iomgr/sockaddr_utils.c
src/core/lib/iomgr/socket_utils_common_posix.c
src/core/lib/iomgr/socket_utils_linux.c
src/core/lib/iomgr/socket_utils_posix.c
src/core/lib/iomgr/socket_windows.c
src/core/lib/iomgr/tcp_client_posix.c
src/core/lib/iomgr/tcp_client_windows.c
src/core/lib/iomgr/tcp_posix.c
src/core/lib/iomgr/tcp_server_posix.c
src/core/lib/iomgr/tcp_server_windows.c
src/core/lib/iomgr/tcp_windows.c
src/core/lib/iomgr/time_averaged_stats.c
src/core/lib/iomgr/timer.c
src/core/lib/iomgr/timer_heap.c
src/core/lib/iomgr/udp_server.c
src/core/lib/iomgr/unix_sockets_posix.c
src/core/lib/iomgr/unix_sockets_posix_noop.c
src/core/lib/iomgr/wakeup_fd_eventfd.c
src/core/lib/iomgr/wakeup_fd_nospecial.c
src/core/lib/iomgr/wakeup_fd_pipe.c
src/core/lib/iomgr/wakeup_fd_posix.c
src/core/lib/iomgr/workqueue_posix.c
src/core/lib/iomgr/workqueue_windows.c
src/core/lib/json/json.c
src/core/lib/json/json_reader.c
src/core/lib/json/json_string.c
src/core/lib/json/json_writer.c
src/core/lib/surface/alarm.c
src/core/lib/surface/api_trace.c
src/core/lib/surface/byte_buffer.c
src/core/lib/surface/byte_buffer_reader.c
src/core/lib/surface/call.c
src/core/lib/surface/call_details.c
src/core/lib/surface/call_log_batch.c
src/core/lib/surface/channel.c
src/core/lib/surface/channel_init.c
src/core/lib/surface/channel_ping.c
src/core/lib/surface/channel_stack_type.c
src/core/lib/surface/completion_queue.c
src/core/lib/surface/event_string.c
src/core/lib/surface/lame_client.c
src/core/lib/surface/metadata_array.c
src/core/lib/surface/server.c
src/core/lib/surface/validate_metadata.c
src/core/lib/surface/version.c
src/core/lib/transport/byte_stream.c
src/core/lib/transport/connectivity_state.c
src/core/lib/transport/metadata.c
src/core/lib/transport/metadata_batch.c
src/core/lib/transport/static_metadata.c
src/core/lib/transport/transport.c
src/core/lib/transport/transport_op_string.c
src/core/lib/http/httpcli_security_connector.c
src/core/lib/security/context/security_context.c
src/core/lib/security/credentials/composite/composite_credentials.c
src/core/lib/security/credentials/credentials.c
src/core/lib/security/credentials/credentials_metadata.c
src/core/lib/security/credentials/fake/fake_credentials.c
src/core/lib/security/credentials/google_default/credentials_posix.c
src/core/lib/security/credentials/google_default/credentials_windows.c
src/core/lib/security/credentials/google_default/google_default_credentials.c
src/core/lib/security/credentials/iam/iam_credentials.c
src/core/lib/security/credentials/jwt/json_token.c
src/core/lib/security/credentials/jwt/jwt_credentials.c
src/core/lib/security/credentials/jwt/jwt_verifier.c
src/core/lib/security/credentials/oauth2/oauth2_credentials.c
src/core/lib/security/credentials/plugin/plugin_credentials.c
src/core/lib/security/credentials/ssl/ssl_credentials.c
src/core/lib/security/transport/client_auth_filter.c
src/core/lib/security/transport/handshake.c
src/core/lib/security/transport/secure_endpoint.c
src/core/lib/security/transport/security_connector.c
src/core/lib/security/transport/server_auth_filter.c
src/core/lib/security/transport/tsi_error.c
src/core/lib/security/util/b64.c
src/core/lib/security/util/json_util.c
src/core/lib/surface/init_secure.c
src/core/ext/transport/chttp2/alpn/alpn.c
src/core/lib/tsi/fake_transport_security.c
src/core/lib/tsi/ssl_transport_security.c
src/core/lib/tsi/transport_security.c
src/cpp/codegen/codegen_init.cc src/cpp/codegen/codegen_init.cc
) )
@ -734,6 +850,7 @@ target_link_libraries(grpc++
ssl ssl
libprotobuf libprotobuf
grpc grpc
gpr
) )
@ -786,6 +903,122 @@ add_library(grpc++_unsecure
src/cpp/util/status.cc src/cpp/util/status.cc
src/cpp/util/string_ref.cc src/cpp/util/string_ref.cc
src/cpp/util/time.cc src/cpp/util/time.cc
src/core/lib/channel/channel_args.c
src/core/lib/channel/channel_stack.c
src/core/lib/channel/channel_stack_builder.c
src/core/lib/channel/compress_filter.c
src/core/lib/channel/connected_channel.c
src/core/lib/channel/http_client_filter.c
src/core/lib/channel/http_server_filter.c
src/core/lib/compression/compression.c
src/core/lib/compression/message_compress.c
src/core/lib/debug/trace.c
src/core/lib/http/format_request.c
src/core/lib/http/httpcli.c
src/core/lib/http/parser.c
src/core/lib/iomgr/closure.c
src/core/lib/iomgr/endpoint.c
src/core/lib/iomgr/endpoint_pair_posix.c
src/core/lib/iomgr/endpoint_pair_windows.c
src/core/lib/iomgr/error.c
src/core/lib/iomgr/ev_epoll_linux.c
src/core/lib/iomgr/ev_poll_and_epoll_posix.c
src/core/lib/iomgr/ev_poll_posix.c
src/core/lib/iomgr/ev_posix.c
src/core/lib/iomgr/exec_ctx.c
src/core/lib/iomgr/executor.c
src/core/lib/iomgr/iocp_windows.c
src/core/lib/iomgr/iomgr.c
src/core/lib/iomgr/iomgr_posix.c
src/core/lib/iomgr/iomgr_windows.c
src/core/lib/iomgr/load_file.c
src/core/lib/iomgr/network_status_tracker.c
src/core/lib/iomgr/polling_entity.c
src/core/lib/iomgr/pollset_set_windows.c
src/core/lib/iomgr/pollset_windows.c
src/core/lib/iomgr/resolve_address_posix.c
src/core/lib/iomgr/resolve_address_windows.c
src/core/lib/iomgr/sockaddr_utils.c
src/core/lib/iomgr/socket_utils_common_posix.c
src/core/lib/iomgr/socket_utils_linux.c
src/core/lib/iomgr/socket_utils_posix.c
src/core/lib/iomgr/socket_windows.c
src/core/lib/iomgr/tcp_client_posix.c
src/core/lib/iomgr/tcp_client_windows.c
src/core/lib/iomgr/tcp_posix.c
src/core/lib/iomgr/tcp_server_posix.c
src/core/lib/iomgr/tcp_server_windows.c
src/core/lib/iomgr/tcp_windows.c
src/core/lib/iomgr/time_averaged_stats.c
src/core/lib/iomgr/timer.c
src/core/lib/iomgr/timer_heap.c
src/core/lib/iomgr/udp_server.c
src/core/lib/iomgr/unix_sockets_posix.c
src/core/lib/iomgr/unix_sockets_posix_noop.c
src/core/lib/iomgr/wakeup_fd_eventfd.c
src/core/lib/iomgr/wakeup_fd_nospecial.c
src/core/lib/iomgr/wakeup_fd_pipe.c
src/core/lib/iomgr/wakeup_fd_posix.c
src/core/lib/iomgr/workqueue_posix.c
src/core/lib/iomgr/workqueue_windows.c
src/core/lib/json/json.c
src/core/lib/json/json_reader.c
src/core/lib/json/json_string.c
src/core/lib/json/json_writer.c
src/core/lib/surface/alarm.c
src/core/lib/surface/api_trace.c
src/core/lib/surface/byte_buffer.c
src/core/lib/surface/byte_buffer_reader.c
src/core/lib/surface/call.c
src/core/lib/surface/call_details.c
src/core/lib/surface/call_log_batch.c
src/core/lib/surface/channel.c
src/core/lib/surface/channel_init.c
src/core/lib/surface/channel_ping.c
src/core/lib/surface/channel_stack_type.c
src/core/lib/surface/completion_queue.c
src/core/lib/surface/event_string.c
src/core/lib/surface/lame_client.c
src/core/lib/surface/metadata_array.c
src/core/lib/surface/server.c
src/core/lib/surface/validate_metadata.c
src/core/lib/surface/version.c
src/core/lib/transport/byte_stream.c
src/core/lib/transport/connectivity_state.c
src/core/lib/transport/metadata.c
src/core/lib/transport/metadata_batch.c
src/core/lib/transport/static_metadata.c
src/core/lib/transport/transport.c
src/core/lib/transport/transport_op_string.c
src/core/lib/http/httpcli_security_connector.c
src/core/lib/security/context/security_context.c
src/core/lib/security/credentials/composite/composite_credentials.c
src/core/lib/security/credentials/credentials.c
src/core/lib/security/credentials/credentials_metadata.c
src/core/lib/security/credentials/fake/fake_credentials.c
src/core/lib/security/credentials/google_default/credentials_posix.c
src/core/lib/security/credentials/google_default/credentials_windows.c
src/core/lib/security/credentials/google_default/google_default_credentials.c
src/core/lib/security/credentials/iam/iam_credentials.c
src/core/lib/security/credentials/jwt/json_token.c
src/core/lib/security/credentials/jwt/jwt_credentials.c
src/core/lib/security/credentials/jwt/jwt_verifier.c
src/core/lib/security/credentials/oauth2/oauth2_credentials.c
src/core/lib/security/credentials/plugin/plugin_credentials.c
src/core/lib/security/credentials/ssl/ssl_credentials.c
src/core/lib/security/transport/client_auth_filter.c
src/core/lib/security/transport/handshake.c
src/core/lib/security/transport/secure_endpoint.c
src/core/lib/security/transport/security_connector.c
src/core/lib/security/transport/server_auth_filter.c
src/core/lib/security/transport/tsi_error.c
src/core/lib/security/util/b64.c
src/core/lib/security/util/json_util.c
src/core/lib/surface/init_secure.c
src/core/ext/transport/chttp2/alpn/alpn.c
src/core/lib/tsi/fake_transport_security.c
src/core/lib/tsi/ssl_transport_security.c
src/core/lib/tsi/transport_security.c
src/cpp/codegen/codegen_init.cc src/cpp/codegen/codegen_init.cc
) )

@ -3421,6 +3421,122 @@ LIBGRPC++_SRC = \
src/cpp/util/status.cc \ src/cpp/util/status.cc \
src/cpp/util/string_ref.cc \ src/cpp/util/string_ref.cc \
src/cpp/util/time.cc \ src/cpp/util/time.cc \
src/core/lib/channel/channel_args.c \
src/core/lib/channel/channel_stack.c \
src/core/lib/channel/channel_stack_builder.c \
src/core/lib/channel/compress_filter.c \
src/core/lib/channel/connected_channel.c \
src/core/lib/channel/http_client_filter.c \
src/core/lib/channel/http_server_filter.c \
src/core/lib/compression/compression.c \
src/core/lib/compression/message_compress.c \
src/core/lib/debug/trace.c \
src/core/lib/http/format_request.c \
src/core/lib/http/httpcli.c \
src/core/lib/http/parser.c \
src/core/lib/iomgr/closure.c \
src/core/lib/iomgr/endpoint.c \
src/core/lib/iomgr/endpoint_pair_posix.c \
src/core/lib/iomgr/endpoint_pair_windows.c \
src/core/lib/iomgr/error.c \
src/core/lib/iomgr/ev_epoll_linux.c \
src/core/lib/iomgr/ev_poll_and_epoll_posix.c \
src/core/lib/iomgr/ev_poll_posix.c \
src/core/lib/iomgr/ev_posix.c \
src/core/lib/iomgr/exec_ctx.c \
src/core/lib/iomgr/executor.c \
src/core/lib/iomgr/iocp_windows.c \
src/core/lib/iomgr/iomgr.c \
src/core/lib/iomgr/iomgr_posix.c \
src/core/lib/iomgr/iomgr_windows.c \
src/core/lib/iomgr/load_file.c \
src/core/lib/iomgr/network_status_tracker.c \
src/core/lib/iomgr/polling_entity.c \
src/core/lib/iomgr/pollset_set_windows.c \
src/core/lib/iomgr/pollset_windows.c \
src/core/lib/iomgr/resolve_address_posix.c \
src/core/lib/iomgr/resolve_address_windows.c \
src/core/lib/iomgr/sockaddr_utils.c \
src/core/lib/iomgr/socket_utils_common_posix.c \
src/core/lib/iomgr/socket_utils_linux.c \
src/core/lib/iomgr/socket_utils_posix.c \
src/core/lib/iomgr/socket_windows.c \
src/core/lib/iomgr/tcp_client_posix.c \
src/core/lib/iomgr/tcp_client_windows.c \
src/core/lib/iomgr/tcp_posix.c \
src/core/lib/iomgr/tcp_server_posix.c \
src/core/lib/iomgr/tcp_server_windows.c \
src/core/lib/iomgr/tcp_windows.c \
src/core/lib/iomgr/time_averaged_stats.c \
src/core/lib/iomgr/timer.c \
src/core/lib/iomgr/timer_heap.c \
src/core/lib/iomgr/udp_server.c \
src/core/lib/iomgr/unix_sockets_posix.c \
src/core/lib/iomgr/unix_sockets_posix_noop.c \
src/core/lib/iomgr/wakeup_fd_eventfd.c \
src/core/lib/iomgr/wakeup_fd_nospecial.c \
src/core/lib/iomgr/wakeup_fd_pipe.c \
src/core/lib/iomgr/wakeup_fd_posix.c \
src/core/lib/iomgr/workqueue_posix.c \
src/core/lib/iomgr/workqueue_windows.c \
src/core/lib/json/json.c \
src/core/lib/json/json_reader.c \
src/core/lib/json/json_string.c \
src/core/lib/json/json_writer.c \
src/core/lib/surface/alarm.c \
src/core/lib/surface/api_trace.c \
src/core/lib/surface/byte_buffer.c \
src/core/lib/surface/byte_buffer_reader.c \
src/core/lib/surface/call.c \
src/core/lib/surface/call_details.c \
src/core/lib/surface/call_log_batch.c \
src/core/lib/surface/channel.c \
src/core/lib/surface/channel_init.c \
src/core/lib/surface/channel_ping.c \
src/core/lib/surface/channel_stack_type.c \
src/core/lib/surface/completion_queue.c \
src/core/lib/surface/event_string.c \
src/core/lib/surface/lame_client.c \
src/core/lib/surface/metadata_array.c \
src/core/lib/surface/server.c \
src/core/lib/surface/validate_metadata.c \
src/core/lib/surface/version.c \
src/core/lib/transport/byte_stream.c \
src/core/lib/transport/connectivity_state.c \
src/core/lib/transport/metadata.c \
src/core/lib/transport/metadata_batch.c \
src/core/lib/transport/static_metadata.c \
src/core/lib/transport/transport.c \
src/core/lib/transport/transport_op_string.c \
src/core/lib/http/httpcli_security_connector.c \
src/core/lib/security/context/security_context.c \
src/core/lib/security/credentials/composite/composite_credentials.c \
src/core/lib/security/credentials/credentials.c \
src/core/lib/security/credentials/credentials_metadata.c \
src/core/lib/security/credentials/fake/fake_credentials.c \
src/core/lib/security/credentials/google_default/credentials_posix.c \
src/core/lib/security/credentials/google_default/credentials_windows.c \
src/core/lib/security/credentials/google_default/google_default_credentials.c \
src/core/lib/security/credentials/iam/iam_credentials.c \
src/core/lib/security/credentials/jwt/json_token.c \
src/core/lib/security/credentials/jwt/jwt_credentials.c \
src/core/lib/security/credentials/jwt/jwt_verifier.c \
src/core/lib/security/credentials/oauth2/oauth2_credentials.c \
src/core/lib/security/credentials/plugin/plugin_credentials.c \
src/core/lib/security/credentials/ssl/ssl_credentials.c \
src/core/lib/security/transport/client_auth_filter.c \
src/core/lib/security/transport/handshake.c \
src/core/lib/security/transport/secure_endpoint.c \
src/core/lib/security/transport/security_connector.c \
src/core/lib/security/transport/server_auth_filter.c \
src/core/lib/security/transport/tsi_error.c \
src/core/lib/security/util/b64.c \
src/core/lib/security/util/json_util.c \
src/core/lib/surface/init_secure.c \
src/core/ext/transport/chttp2/alpn/alpn.c \
src/core/lib/tsi/fake_transport_security.c \
src/core/lib/tsi/ssl_transport_security.c \
src/core/lib/tsi/transport_security.c \
src/cpp/codegen/codegen_init.cc \ src/cpp/codegen/codegen_init.cc \
PUBLIC_HEADERS_CXX += \ PUBLIC_HEADERS_CXX += \
@ -3522,6 +3638,14 @@ PUBLIC_HEADERS_CXX += \
include/grpc/impl/codegen/sync_posix.h \ include/grpc/impl/codegen/sync_posix.h \
include/grpc/impl/codegen/sync_windows.h \ include/grpc/impl/codegen/sync_windows.h \
include/grpc/impl/codegen/time.h \ include/grpc/impl/codegen/time.h \
include/grpc/byte_buffer.h \
include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \
include/grpc/grpc.h \
include/grpc/grpc_posix.h \
include/grpc/status.h \
include/grpc/grpc_security.h \
include/grpc/grpc_security_constants.h \
LIBGRPC++_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_SRC)))) LIBGRPC++_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_SRC))))
@ -3558,18 +3682,18 @@ endif
ifeq ($(SYSTEM),MINGW32) ifeq ($(SYSTEM),MINGW32)
$(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION).$(SHARED_EXT): $(LIBGRPC++_OBJS) $(ZLIB_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/grpc.$(SHARED_EXT) $(OPENSSL_DEP) $(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION).$(SHARED_EXT): $(LIBGRPC++_OBJS) $(ZLIB_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/grpc.$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/gpr.$(SHARED_EXT) $(OPENSSL_DEP)
$(E) "[LD] Linking $@" $(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@` $(Q) mkdir -p `dirname $@`
$(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared grpc++.def -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION)-dll.a -o $(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION).$(SHARED_EXT) $(LIBGRPC++_OBJS) $(LDLIBS) $(ZLIB_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) -lgrpc-imp $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared grpc++.def -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION)-dll.a -o $(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION).$(SHARED_EXT) $(LIBGRPC++_OBJS) $(LDLIBS) $(ZLIB_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) -lgrpc-imp -lgpr-imp
else else
$(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION).$(SHARED_EXT): $(LIBGRPC++_OBJS) $(ZLIB_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/libgrpc.$(SHARED_EXT) $(OPENSSL_DEP) $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION).$(SHARED_EXT): $(LIBGRPC++_OBJS) $(ZLIB_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/libgrpc.$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgpr.$(SHARED_EXT) $(OPENSSL_DEP)
$(E) "[LD] Linking $@" $(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@` $(Q) mkdir -p `dirname $@`
ifeq ($(SYSTEM),Darwin) ifeq ($(SYSTEM),Darwin)
$(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc++$(SHARED_VERSION).$(SHARED_EXT) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION).$(SHARED_EXT) $(LIBGRPC++_OBJS) $(LDLIBS) $(ZLIB_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) -lgrpc $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc++$(SHARED_VERSION).$(SHARED_EXT) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION).$(SHARED_EXT) $(LIBGRPC++_OBJS) $(LDLIBS) $(ZLIB_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) -lgrpc -lgpr
else else
$(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc++.so.0 -o $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION).$(SHARED_EXT) $(LIBGRPC++_OBJS) $(LDLIBS) $(ZLIB_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) -lgrpc $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc++.so.0 -o $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION).$(SHARED_EXT) $(LIBGRPC++_OBJS) $(LDLIBS) $(ZLIB_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) -lgrpc -lgpr
$(Q) ln -sf $(SHARED_PREFIX)grpc++$(SHARED_VERSION).$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION).so.0 $(Q) ln -sf $(SHARED_PREFIX)grpc++$(SHARED_VERSION).$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION).so.0
$(Q) ln -sf $(SHARED_PREFIX)grpc++$(SHARED_VERSION).$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION).so $(Q) ln -sf $(SHARED_PREFIX)grpc++$(SHARED_VERSION).$(SHARED_EXT) $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION).so
endif endif
@ -3908,6 +4032,122 @@ LIBGRPC++_UNSECURE_SRC = \
src/cpp/util/status.cc \ src/cpp/util/status.cc \
src/cpp/util/string_ref.cc \ src/cpp/util/string_ref.cc \
src/cpp/util/time.cc \ src/cpp/util/time.cc \
src/core/lib/channel/channel_args.c \
src/core/lib/channel/channel_stack.c \
src/core/lib/channel/channel_stack_builder.c \
src/core/lib/channel/compress_filter.c \
src/core/lib/channel/connected_channel.c \
src/core/lib/channel/http_client_filter.c \
src/core/lib/channel/http_server_filter.c \
src/core/lib/compression/compression.c \
src/core/lib/compression/message_compress.c \
src/core/lib/debug/trace.c \
src/core/lib/http/format_request.c \
src/core/lib/http/httpcli.c \
src/core/lib/http/parser.c \
src/core/lib/iomgr/closure.c \
src/core/lib/iomgr/endpoint.c \
src/core/lib/iomgr/endpoint_pair_posix.c \
src/core/lib/iomgr/endpoint_pair_windows.c \
src/core/lib/iomgr/error.c \
src/core/lib/iomgr/ev_epoll_linux.c \
src/core/lib/iomgr/ev_poll_and_epoll_posix.c \
src/core/lib/iomgr/ev_poll_posix.c \
src/core/lib/iomgr/ev_posix.c \
src/core/lib/iomgr/exec_ctx.c \
src/core/lib/iomgr/executor.c \
src/core/lib/iomgr/iocp_windows.c \
src/core/lib/iomgr/iomgr.c \
src/core/lib/iomgr/iomgr_posix.c \
src/core/lib/iomgr/iomgr_windows.c \
src/core/lib/iomgr/load_file.c \
src/core/lib/iomgr/network_status_tracker.c \
src/core/lib/iomgr/polling_entity.c \
src/core/lib/iomgr/pollset_set_windows.c \
src/core/lib/iomgr/pollset_windows.c \
src/core/lib/iomgr/resolve_address_posix.c \
src/core/lib/iomgr/resolve_address_windows.c \
src/core/lib/iomgr/sockaddr_utils.c \
src/core/lib/iomgr/socket_utils_common_posix.c \
src/core/lib/iomgr/socket_utils_linux.c \
src/core/lib/iomgr/socket_utils_posix.c \
src/core/lib/iomgr/socket_windows.c \
src/core/lib/iomgr/tcp_client_posix.c \
src/core/lib/iomgr/tcp_client_windows.c \
src/core/lib/iomgr/tcp_posix.c \
src/core/lib/iomgr/tcp_server_posix.c \
src/core/lib/iomgr/tcp_server_windows.c \
src/core/lib/iomgr/tcp_windows.c \
src/core/lib/iomgr/time_averaged_stats.c \
src/core/lib/iomgr/timer.c \
src/core/lib/iomgr/timer_heap.c \
src/core/lib/iomgr/udp_server.c \
src/core/lib/iomgr/unix_sockets_posix.c \
src/core/lib/iomgr/unix_sockets_posix_noop.c \
src/core/lib/iomgr/wakeup_fd_eventfd.c \
src/core/lib/iomgr/wakeup_fd_nospecial.c \
src/core/lib/iomgr/wakeup_fd_pipe.c \
src/core/lib/iomgr/wakeup_fd_posix.c \
src/core/lib/iomgr/workqueue_posix.c \
src/core/lib/iomgr/workqueue_windows.c \
src/core/lib/json/json.c \
src/core/lib/json/json_reader.c \
src/core/lib/json/json_string.c \
src/core/lib/json/json_writer.c \
src/core/lib/surface/alarm.c \
src/core/lib/surface/api_trace.c \
src/core/lib/surface/byte_buffer.c \
src/core/lib/surface/byte_buffer_reader.c \
src/core/lib/surface/call.c \
src/core/lib/surface/call_details.c \
src/core/lib/surface/call_log_batch.c \
src/core/lib/surface/channel.c \
src/core/lib/surface/channel_init.c \
src/core/lib/surface/channel_ping.c \
src/core/lib/surface/channel_stack_type.c \
src/core/lib/surface/completion_queue.c \
src/core/lib/surface/event_string.c \
src/core/lib/surface/lame_client.c \
src/core/lib/surface/metadata_array.c \
src/core/lib/surface/server.c \
src/core/lib/surface/validate_metadata.c \
src/core/lib/surface/version.c \
src/core/lib/transport/byte_stream.c \
src/core/lib/transport/connectivity_state.c \
src/core/lib/transport/metadata.c \
src/core/lib/transport/metadata_batch.c \
src/core/lib/transport/static_metadata.c \
src/core/lib/transport/transport.c \
src/core/lib/transport/transport_op_string.c \
src/core/lib/http/httpcli_security_connector.c \
src/core/lib/security/context/security_context.c \
src/core/lib/security/credentials/composite/composite_credentials.c \
src/core/lib/security/credentials/credentials.c \
src/core/lib/security/credentials/credentials_metadata.c \
src/core/lib/security/credentials/fake/fake_credentials.c \
src/core/lib/security/credentials/google_default/credentials_posix.c \
src/core/lib/security/credentials/google_default/credentials_windows.c \
src/core/lib/security/credentials/google_default/google_default_credentials.c \
src/core/lib/security/credentials/iam/iam_credentials.c \
src/core/lib/security/credentials/jwt/json_token.c \
src/core/lib/security/credentials/jwt/jwt_credentials.c \
src/core/lib/security/credentials/jwt/jwt_verifier.c \
src/core/lib/security/credentials/oauth2/oauth2_credentials.c \
src/core/lib/security/credentials/plugin/plugin_credentials.c \
src/core/lib/security/credentials/ssl/ssl_credentials.c \
src/core/lib/security/transport/client_auth_filter.c \
src/core/lib/security/transport/handshake.c \
src/core/lib/security/transport/secure_endpoint.c \
src/core/lib/security/transport/security_connector.c \
src/core/lib/security/transport/server_auth_filter.c \
src/core/lib/security/transport/tsi_error.c \
src/core/lib/security/util/b64.c \
src/core/lib/security/util/json_util.c \
src/core/lib/surface/init_secure.c \
src/core/ext/transport/chttp2/alpn/alpn.c \
src/core/lib/tsi/fake_transport_security.c \
src/core/lib/tsi/ssl_transport_security.c \
src/core/lib/tsi/transport_security.c \
src/cpp/codegen/codegen_init.cc \ src/cpp/codegen/codegen_init.cc \
PUBLIC_HEADERS_CXX += \ PUBLIC_HEADERS_CXX += \
@ -4009,6 +4249,14 @@ PUBLIC_HEADERS_CXX += \
include/grpc/impl/codegen/sync_posix.h \ include/grpc/impl/codegen/sync_posix.h \
include/grpc/impl/codegen/sync_windows.h \ include/grpc/impl/codegen/sync_windows.h \
include/grpc/impl/codegen/time.h \ include/grpc/impl/codegen/time.h \
include/grpc/byte_buffer.h \
include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \
include/grpc/grpc.h \
include/grpc/grpc_posix.h \
include/grpc/status.h \
include/grpc/grpc_security.h \
include/grpc/grpc_security_constants.h \
LIBGRPC++_UNSECURE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_UNSECURE_SRC)))) LIBGRPC++_UNSECURE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_UNSECURE_SRC))))
@ -14851,34 +15099,6 @@ src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c: $(OPENSSL_DE
src/core/ext/transport/cronet/client/secure/cronet_channel_create.c: $(OPENSSL_DEP) src/core/ext/transport/cronet/client/secure/cronet_channel_create.c: $(OPENSSL_DEP)
src/core/ext/transport/cronet/transport/cronet_api_dummy.c: $(OPENSSL_DEP) src/core/ext/transport/cronet/transport/cronet_api_dummy.c: $(OPENSSL_DEP)
src/core/ext/transport/cronet/transport/cronet_transport.c: $(OPENSSL_DEP) src/core/ext/transport/cronet/transport/cronet_transport.c: $(OPENSSL_DEP)
src/core/lib/http/httpcli_security_connector.c: $(OPENSSL_DEP)
src/core/lib/security/context/security_context.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/composite/composite_credentials.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/credentials.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/credentials_metadata.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/fake/fake_credentials.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/google_default/credentials_posix.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/google_default/credentials_windows.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/google_default/google_default_credentials.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/iam/iam_credentials.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/jwt/json_token.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/jwt/jwt_credentials.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/jwt/jwt_verifier.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/oauth2/oauth2_credentials.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/plugin/plugin_credentials.c: $(OPENSSL_DEP)
src/core/lib/security/credentials/ssl/ssl_credentials.c: $(OPENSSL_DEP)
src/core/lib/security/transport/client_auth_filter.c: $(OPENSSL_DEP)
src/core/lib/security/transport/handshake.c: $(OPENSSL_DEP)
src/core/lib/security/transport/secure_endpoint.c: $(OPENSSL_DEP)
src/core/lib/security/transport/security_connector.c: $(OPENSSL_DEP)
src/core/lib/security/transport/server_auth_filter.c: $(OPENSSL_DEP)
src/core/lib/security/transport/tsi_error.c: $(OPENSSL_DEP)
src/core/lib/security/util/b64.c: $(OPENSSL_DEP)
src/core/lib/security/util/json_util.c: $(OPENSSL_DEP)
src/core/lib/surface/init_secure.c: $(OPENSSL_DEP)
src/core/lib/tsi/fake_transport_security.c: $(OPENSSL_DEP)
src/core/lib/tsi/ssl_transport_security.c: $(OPENSSL_DEP)
src/core/lib/tsi/transport_security.c: $(OPENSSL_DEP)
src/core/plugin_registry/grpc_cronet_plugin_registry.c: $(OPENSSL_DEP) src/core/plugin_registry/grpc_cronet_plugin_registry.c: $(OPENSSL_DEP)
src/core/plugin_registry/grpc_plugin_registry.c: $(OPENSSL_DEP) src/core/plugin_registry/grpc_plugin_registry.c: $(OPENSSL_DEP)
src/cpp/client/secure_credentials.cc: $(OPENSSL_DEP) src/cpp/client/secure_credentials.cc: $(OPENSSL_DEP)

@ -714,6 +714,8 @@ filegroups:
- src/cpp/util/time.cc - src/cpp/util/time.cc
uses: uses:
- grpc++_codegen_base - grpc++_codegen_base
- grpc_base
- grpc_secure
- name: grpc++_codegen_base - name: grpc++_codegen_base
language: c++ language: c++
public_headers: public_headers:

@ -63,23 +63,10 @@ static VALUE grpc_rb_sBatchResult;
* grpc_metadata_array. */ * grpc_metadata_array. */
static VALUE grpc_rb_cMdAry; static VALUE grpc_rb_cMdAry;
/* id_cq is the name of the hidden ivar that preserves a reference to a
* completion queue */
static ID id_cq;
/* id_flags is the name of the hidden ivar that preserves the value of
* the flags used to create metadata from a Hash */
static ID id_flags;
/* id_credentials is the name of the hidden ivar that preserves the value /* id_credentials is the name of the hidden ivar that preserves the value
* of the credentials added to the call */ * of the credentials added to the call */
static ID id_credentials; static ID id_credentials;
/* id_input_md is the name of the hidden ivar that preserves the hash used to
* create metadata, so that references to the strings it contains last as long
* as the call the metadata is added to. */
static ID id_input_md;
/* id_metadata is name of the attribute used to access the metadata hash /* id_metadata is name of the attribute used to access the metadata hash
* received by the call and subsequently saved on it. */ * received by the call and subsequently saved on it. */
static ID id_metadata; static ID id_metadata;
@ -101,14 +88,27 @@ static VALUE sym_message;
static VALUE sym_status; static VALUE sym_status;
static VALUE sym_cancelled; static VALUE sym_cancelled;
typedef struct grpc_rb_call {
grpc_call *wrapped;
grpc_completion_queue *queue;
} grpc_rb_call;
static void destroy_call(grpc_rb_call *call) {
/* Ensure that we only try to destroy the call once */
if (call->wrapped != NULL) {
grpc_call_destroy(call->wrapped);
call->wrapped = NULL;
grpc_rb_completion_queue_destroy(call->queue);
call->queue = NULL;
}
}
/* Destroys a Call. */ /* Destroys a Call. */
static void grpc_rb_call_destroy(void *p) { static void grpc_rb_call_destroy(void *p) {
grpc_call* call = NULL;
if (p == NULL) { if (p == NULL) {
return; return;
} }
call = (grpc_call *)p; destroy_call((grpc_rb_call*)p);
grpc_call_destroy(call);
} }
static size_t md_ary_datasize(const void *p) { static size_t md_ary_datasize(const void *p) {
@ -167,15 +167,15 @@ const char *grpc_call_error_detail_of(grpc_call_error err) {
/* Called by clients to cancel an RPC on the server. /* Called by clients to cancel an RPC on the server.
Can be called multiple times, from any thread. */ Can be called multiple times, from any thread. */
static VALUE grpc_rb_call_cancel(VALUE self) { static VALUE grpc_rb_call_cancel(VALUE self) {
grpc_call *call = NULL; grpc_rb_call *call = NULL;
grpc_call_error err; grpc_call_error err;
if (RTYPEDDATA_DATA(self) == NULL) { if (RTYPEDDATA_DATA(self) == NULL) {
//This call has been closed //This call has been closed
return Qnil; return Qnil;
} }
TypedData_Get_Struct(self, grpc_call, &grpc_call_data_type, call); TypedData_Get_Struct(self, grpc_rb_call, &grpc_call_data_type, call);
err = grpc_call_cancel(call, NULL); err = grpc_call_cancel(call->wrapped, NULL);
if (err != GRPC_CALL_OK) { if (err != GRPC_CALL_OK) {
rb_raise(grpc_rb_eCallError, "cancel failed: %s (code=%d)", rb_raise(grpc_rb_eCallError, "cancel failed: %s (code=%d)",
grpc_call_error_detail_of(err), err); grpc_call_error_detail_of(err), err);
@ -189,10 +189,10 @@ static VALUE grpc_rb_call_cancel(VALUE self) {
processed. processed.
*/ */
static VALUE grpc_rb_call_close(VALUE self) { static VALUE grpc_rb_call_close(VALUE self) {
grpc_call *call = NULL; grpc_rb_call *call = NULL;
TypedData_Get_Struct(self, grpc_call, &grpc_call_data_type, call); TypedData_Get_Struct(self, grpc_rb_call, &grpc_call_data_type, call);
if(call != NULL) { if(call != NULL) {
grpc_call_destroy(call); destroy_call(call);
RTYPEDDATA_DATA(self) = NULL; RTYPEDDATA_DATA(self) = NULL;
} }
return Qnil; return Qnil;
@ -201,14 +201,14 @@ static VALUE grpc_rb_call_close(VALUE self) {
/* Called to obtain the peer that this call is connected to. */ /* Called to obtain the peer that this call is connected to. */
static VALUE grpc_rb_call_get_peer(VALUE self) { static VALUE grpc_rb_call_get_peer(VALUE self) {
VALUE res = Qnil; VALUE res = Qnil;
grpc_call *call = NULL; grpc_rb_call *call = NULL;
char *peer = NULL; char *peer = NULL;
if (RTYPEDDATA_DATA(self) == NULL) { if (RTYPEDDATA_DATA(self) == NULL) {
rb_raise(grpc_rb_eCallError, "Cannot get peer value on closed call"); rb_raise(grpc_rb_eCallError, "Cannot get peer value on closed call");
return Qnil; return Qnil;
} }
TypedData_Get_Struct(self, grpc_call, &grpc_call_data_type, call); TypedData_Get_Struct(self, grpc_rb_call, &grpc_call_data_type, call);
peer = grpc_call_get_peer(call); peer = grpc_call_get_peer(call->wrapped);
res = rb_str_new2(peer); res = rb_str_new2(peer);
gpr_free(peer); gpr_free(peer);
@ -217,16 +217,16 @@ static VALUE grpc_rb_call_get_peer(VALUE self) {
/* Called to obtain the x509 cert of an authenticated peer. */ /* Called to obtain the x509 cert of an authenticated peer. */
static VALUE grpc_rb_call_get_peer_cert(VALUE self) { static VALUE grpc_rb_call_get_peer_cert(VALUE self) {
grpc_call *call = NULL; grpc_rb_call *call = NULL;
VALUE res = Qnil; VALUE res = Qnil;
grpc_auth_context *ctx = NULL; grpc_auth_context *ctx = NULL;
if (RTYPEDDATA_DATA(self) == NULL) { if (RTYPEDDATA_DATA(self) == NULL) {
rb_raise(grpc_rb_eCallError, "Cannot get peer cert on closed call"); rb_raise(grpc_rb_eCallError, "Cannot get peer cert on closed call");
return Qnil; return Qnil;
} }
TypedData_Get_Struct(self, grpc_call, &grpc_call_data_type, call); TypedData_Get_Struct(self, grpc_rb_call, &grpc_call_data_type, call);
ctx = grpc_call_auth_context(call); ctx = grpc_call_auth_context(call->wrapped);
if (!ctx || !grpc_auth_context_peer_is_authenticated(ctx)) { if (!ctx || !grpc_auth_context_peer_is_authenticated(ctx)) {
return Qnil; return Qnil;
@ -326,21 +326,23 @@ static VALUE grpc_rb_call_set_write_flag(VALUE self, VALUE write_flag) {
Sets credentials on a call */ Sets credentials on a call */
static VALUE grpc_rb_call_set_credentials(VALUE self, VALUE credentials) { static VALUE grpc_rb_call_set_credentials(VALUE self, VALUE credentials) {
grpc_call *call = NULL; grpc_rb_call *call = NULL;
grpc_call_credentials *creds; grpc_call_credentials *creds;
grpc_call_error err; grpc_call_error err;
if (RTYPEDDATA_DATA(self) == NULL) { if (RTYPEDDATA_DATA(self) == NULL) {
rb_raise(grpc_rb_eCallError, "Cannot set credentials of closed call"); rb_raise(grpc_rb_eCallError, "Cannot set credentials of closed call");
return Qnil; return Qnil;
} }
TypedData_Get_Struct(self, grpc_call, &grpc_call_data_type, call); TypedData_Get_Struct(self, grpc_rb_call, &grpc_call_data_type, call);
creds = grpc_rb_get_wrapped_call_credentials(credentials); creds = grpc_rb_get_wrapped_call_credentials(credentials);
err = grpc_call_set_credentials(call, creds); err = grpc_call_set_credentials(call->wrapped, creds);
if (err != GRPC_CALL_OK) { if (err != GRPC_CALL_OK) {
rb_raise(grpc_rb_eCallError, rb_raise(grpc_rb_eCallError,
"grpc_call_set_credentials failed with %s (code=%d)", "grpc_call_set_credentials failed with %s (code=%d)",
grpc_call_error_detail_of(err), err); grpc_call_error_detail_of(err), err);
} }
/* We need the credentials to be alive for as long as the call is alive,
but we don't care about destruction order. */
rb_ivar_set(self, id_credentials, credentials); rb_ivar_set(self, id_credentials, credentials);
return Qnil; return Qnil;
} }
@ -733,7 +735,6 @@ static VALUE grpc_run_batch_stack_build_result(run_batch_stack *st) {
} }
/* call-seq: /* call-seq:
cq = CompletionQueue.new
ops = { ops = {
GRPC::Core::CallOps::SEND_INITIAL_METADATA => <op_value>, GRPC::Core::CallOps::SEND_INITIAL_METADATA => <op_value>,
GRPC::Core::CallOps::SEND_MESSAGE => <op_value>, GRPC::Core::CallOps::SEND_MESSAGE => <op_value>,
@ -741,7 +742,7 @@ static VALUE grpc_run_batch_stack_build_result(run_batch_stack *st) {
} }
tag = Object.new tag = Object.new
timeout = 10 timeout = 10
call.start_batch(cq, tag, timeout, ops) call.start_batch(tag, timeout, ops)
Start a batch of operations defined in the array ops; when complete, post a Start a batch of operations defined in the array ops; when complete, post a
completion of type 'tag' to the completion queue bound to the call. completion of type 'tag' to the completion queue bound to the call.
@ -750,20 +751,20 @@ static VALUE grpc_run_batch_stack_build_result(run_batch_stack *st) {
The order of ops specified in the batch has no significance. The order of ops specified in the batch has no significance.
Only one operation of each type can be active at once in any given Only one operation of each type can be active at once in any given
batch */ batch */
static VALUE grpc_rb_call_run_batch(VALUE self, VALUE cqueue, VALUE tag, static VALUE grpc_rb_call_run_batch(VALUE self, VALUE ops_hash) {
VALUE timeout, VALUE ops_hash) {
run_batch_stack st; run_batch_stack st;
grpc_call *call = NULL; grpc_rb_call *call = NULL;
grpc_event ev; grpc_event ev;
grpc_call_error err; grpc_call_error err;
VALUE result = Qnil; VALUE result = Qnil;
VALUE rb_write_flag = rb_ivar_get(self, id_write_flag); VALUE rb_write_flag = rb_ivar_get(self, id_write_flag);
unsigned write_flag = 0; unsigned write_flag = 0;
void *tag = (void*)&st;
if (RTYPEDDATA_DATA(self) == NULL) { if (RTYPEDDATA_DATA(self) == NULL) {
rb_raise(grpc_rb_eCallError, "Cannot run batch on closed call"); rb_raise(grpc_rb_eCallError, "Cannot run batch on closed call");
return Qnil; return Qnil;
} }
TypedData_Get_Struct(self, grpc_call, &grpc_call_data_type, call); TypedData_Get_Struct(self, grpc_rb_call, &grpc_call_data_type, call);
/* Validate the ops args, adding them to a ruby array */ /* Validate the ops args, adding them to a ruby array */
if (TYPE(ops_hash) != T_HASH) { if (TYPE(ops_hash) != T_HASH) {
@ -778,7 +779,7 @@ static VALUE grpc_rb_call_run_batch(VALUE self, VALUE cqueue, VALUE tag,
/* call grpc_call_start_batch, then wait for it to complete using /* call grpc_call_start_batch, then wait for it to complete using
* pluck_event */ * pluck_event */
err = grpc_call_start_batch(call, st.ops, st.op_num, ROBJECT(tag), NULL); err = grpc_call_start_batch(call->wrapped, st.ops, st.op_num, tag, NULL);
if (err != GRPC_CALL_OK) { if (err != GRPC_CALL_OK) {
grpc_run_batch_stack_cleanup(&st); grpc_run_batch_stack_cleanup(&st);
rb_raise(grpc_rb_eCallError, rb_raise(grpc_rb_eCallError,
@ -786,13 +787,11 @@ static VALUE grpc_rb_call_run_batch(VALUE self, VALUE cqueue, VALUE tag,
grpc_call_error_detail_of(err), err); grpc_call_error_detail_of(err), err);
return Qnil; return Qnil;
} }
ev = grpc_rb_completion_queue_pluck_event(cqueue, tag, timeout); ev = rb_completion_queue_pluck(call->queue, tag,
if (ev.type == GRPC_QUEUE_TIMEOUT) { gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
grpc_run_batch_stack_cleanup(&st); if (!ev.success) {
rb_raise(grpc_rb_eOutOfTime, "grpc_call_start_batch timed out"); rb_raise(grpc_rb_eCallError, "call#run_batch failed somehow");
return Qnil;
} }
/* Build and return the BatchResult struct result, /* Build and return the BatchResult struct result,
if there is an error, it's reflected in the status */ if there is an error, it's reflected in the status */
result = grpc_run_batch_stack_build_result(&st); result = grpc_run_batch_stack_build_result(&st);
@ -900,7 +899,7 @@ void Init_grpc_call() {
1); 1);
/* Add ruby analogues of the Call methods. */ /* Add ruby analogues of the Call methods. */
rb_define_method(grpc_rb_cCall, "run_batch", grpc_rb_call_run_batch, 4); rb_define_method(grpc_rb_cCall, "run_batch", grpc_rb_call_run_batch, 1);
rb_define_method(grpc_rb_cCall, "cancel", grpc_rb_call_cancel, 0); rb_define_method(grpc_rb_cCall, "cancel", grpc_rb_call_cancel, 0);
rb_define_method(grpc_rb_cCall, "close", grpc_rb_call_close, 0); rb_define_method(grpc_rb_cCall, "close", grpc_rb_call_close, 0);
rb_define_method(grpc_rb_cCall, "peer", grpc_rb_call_get_peer, 0); rb_define_method(grpc_rb_cCall, "peer", grpc_rb_call_get_peer, 0);
@ -921,9 +920,6 @@ void Init_grpc_call() {
id_write_flag = rb_intern("write_flag"); id_write_flag = rb_intern("write_flag");
/* Ids used by the c wrapping internals. */ /* Ids used by the c wrapping internals. */
id_cq = rb_intern("__cq");
id_flags = rb_intern("__flags");
id_input_md = rb_intern("__input_md");
id_credentials = rb_intern("__credentials"); id_credentials = rb_intern("__credentials");
/* Ids used in constructing the batch result. */ /* Ids used in constructing the batch result. */
@ -947,15 +943,19 @@ void Init_grpc_call() {
/* Gets the call from the ruby object */ /* Gets the call from the ruby object */
grpc_call *grpc_rb_get_wrapped_call(VALUE v) { grpc_call *grpc_rb_get_wrapped_call(VALUE v) {
grpc_call *c = NULL; grpc_rb_call *call = NULL;
TypedData_Get_Struct(v, grpc_call, &grpc_call_data_type, c); TypedData_Get_Struct(v, grpc_rb_call, &grpc_call_data_type, call);
return c; return call->wrapped;
} }
/* Obtains the wrapped object for a given call */ /* Obtains the wrapped object for a given call */
VALUE grpc_rb_wrap_call(grpc_call *c) { VALUE grpc_rb_wrap_call(grpc_call *c, grpc_completion_queue *q) {
if (c == NULL) { grpc_rb_call *wrapper;
if (c == NULL || q == NULL) {
return Qnil; return Qnil;
} }
return TypedData_Wrap_Struct(grpc_rb_cCall, &grpc_call_data_type, c); wrapper = ALLOC(grpc_rb_call);
wrapper->wrapped = c;
wrapper->queue = q;
return TypedData_Wrap_Struct(grpc_rb_cCall, &grpc_call_data_type, wrapper);
} }

@ -42,7 +42,7 @@
grpc_call* grpc_rb_get_wrapped_call(VALUE v); grpc_call* grpc_rb_get_wrapped_call(VALUE v);
/* Gets the VALUE corresponding to given grpc_call. */ /* Gets the VALUE corresponding to given grpc_call. */
VALUE grpc_rb_wrap_call(grpc_call* c); VALUE grpc_rb_wrap_call(grpc_call *c, grpc_completion_queue *q);
/* Provides the details of an call error */ /* Provides the details of an call error */
const char* grpc_call_error_detail_of(grpc_call_error err); const char* grpc_call_error_detail_of(grpc_call_error err);

@ -211,35 +211,6 @@ VALUE grpc_rb_wrap_call_credentials(grpc_call_credentials *c, VALUE mark) {
return rb_wrapper; return rb_wrapper;
} }
/* Clones CallCredentials instances.
Gives CallCredentials a consistent implementation of Ruby's object copy/dup
protocol. */
static VALUE grpc_rb_call_credentials_init_copy(VALUE copy, VALUE orig) {
grpc_rb_call_credentials *orig_cred = NULL;
grpc_rb_call_credentials *copy_cred = NULL;
if (copy == orig) {
return copy;
}
/* Raise an error if orig is not a credentials object or a subclass. */
if (TYPE(orig) != T_DATA ||
RDATA(orig)->dfree != (RUBY_DATA_FUNC)grpc_rb_call_credentials_free) {
rb_raise(rb_eTypeError, "not a %s",
rb_obj_classname(grpc_rb_cCallCredentials));
}
TypedData_Get_Struct(orig, grpc_rb_call_credentials,
&grpc_rb_call_credentials_data_type, orig_cred);
TypedData_Get_Struct(copy, grpc_rb_call_credentials,
&grpc_rb_call_credentials_data_type, copy_cred);
/* use ruby's MEMCPY to make a byte-for-byte copy of the credentials
* wrapper object. */
MEMCPY(copy_cred, orig_cred, grpc_rb_call_credentials, 1);
return copy;
}
/* The attribute used on the mark object to hold the callback */ /* The attribute used on the mark object to hold the callback */
static ID id_callback; static ID id_callback;
@ -308,7 +279,7 @@ void Init_grpc_call_credentials() {
rb_define_method(grpc_rb_cCallCredentials, "initialize", rb_define_method(grpc_rb_cCallCredentials, "initialize",
grpc_rb_call_credentials_init, 1); grpc_rb_call_credentials_init, 1);
rb_define_method(grpc_rb_cCallCredentials, "initialize_copy", rb_define_method(grpc_rb_cCallCredentials, "initialize_copy",
grpc_rb_call_credentials_init_copy, 1); grpc_rb_cannot_init_copy, 1);
rb_define_method(grpc_rb_cCallCredentials, "compose", rb_define_method(grpc_rb_cCallCredentials, "compose",
grpc_rb_call_credentials_compose, -1); grpc_rb_call_credentials_compose, -1);

@ -39,6 +39,7 @@
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/grpc_security.h> #include <grpc/grpc_security.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include "rb_grpc.h" #include "rb_grpc.h"
#include "rb_call.h" #include "rb_call.h"
#include "rb_channel_args.h" #include "rb_channel_args.h"
@ -55,11 +56,6 @@ static ID id_channel;
* GCed before the channel */ * GCed before the channel */
static ID id_target; static ID id_target;
/* id_cqueue is the name of the hidden ivar that preserves a reference to the
* completion queue used to create the call, preserved so that it does not get
* GCed before the channel */
static ID id_cqueue;
/* id_insecure_channel is used to indicate that a channel is insecure */ /* id_insecure_channel is used to indicate that a channel is insecure */
static VALUE id_insecure_channel; static VALUE id_insecure_channel;
@ -231,40 +227,11 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self,
return Qnil; return Qnil;
} }
/* Clones Channel instances.
Gives Channel a consistent implementation of Ruby's object copy/dup
protocol. */
static VALUE grpc_rb_channel_init_copy(VALUE copy, VALUE orig) {
grpc_rb_channel *orig_ch = NULL;
grpc_rb_channel *copy_ch = NULL;
if (copy == orig) {
return copy;
}
/* Raise an error if orig is not a channel object or a subclass. */
if (TYPE(orig) != T_DATA ||
RDATA(orig)->dfree != (RUBY_DATA_FUNC)grpc_rb_channel_free) {
rb_raise(rb_eTypeError, "not a %s", rb_obj_classname(grpc_rb_cChannel));
return Qnil;
}
TypedData_Get_Struct(orig, grpc_rb_channel, &grpc_channel_data_type, orig_ch);
TypedData_Get_Struct(copy, grpc_rb_channel, &grpc_channel_data_type, copy_ch);
/* use ruby's MEMCPY to make a byte-for-byte copy of the channel wrapper
* object. */
MEMCPY(copy_ch, orig_ch, grpc_rb_channel, 1);
return copy;
}
/* Create a call given a grpc_channel, in order to call method. The request /* Create a call given a grpc_channel, in order to call method. The request
is not sent until grpc_call_invoke is called. */ is not sent until grpc_call_invoke is called. */
static VALUE grpc_rb_channel_create_call(VALUE self, VALUE cqueue, static VALUE grpc_rb_channel_create_call(VALUE self, VALUE parent,
VALUE parent, VALUE mask, VALUE mask, VALUE method,
VALUE method, VALUE host, VALUE host, VALUE deadline) {
VALUE deadline) {
VALUE res = Qnil; VALUE res = Qnil;
grpc_rb_channel *wrapper = NULL; grpc_rb_channel *wrapper = NULL;
grpc_call *call = NULL; grpc_call *call = NULL;
@ -284,7 +251,7 @@ static VALUE grpc_rb_channel_create_call(VALUE self, VALUE cqueue,
parent_call = grpc_rb_get_wrapped_call(parent); parent_call = grpc_rb_get_wrapped_call(parent);
} }
cq = grpc_rb_get_wrapped_completion_queue(cqueue); cq = grpc_completion_queue_create(NULL);
TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper);
ch = wrapper->wrapped; ch = wrapper->wrapped;
if (ch == NULL) { if (ch == NULL) {
@ -301,15 +268,11 @@ static VALUE grpc_rb_channel_create_call(VALUE self, VALUE cqueue,
method_chars); method_chars);
return Qnil; return Qnil;
} }
res = grpc_rb_wrap_call(call); res = grpc_rb_wrap_call(call, cq);
/* Make this channel an instance attribute of the call so that it is not GCed /* Make this channel an instance attribute of the call so that it is not GCed
* before the call. */ * before the call. */
rb_ivar_set(res, id_channel, self); rb_ivar_set(res, id_channel, self);
/* Make the completion queue an instance attribute of the call so that it is
* not GCed before the call. */
rb_ivar_set(res, id_cqueue, cqueue);
return res; return res;
} }
@ -387,7 +350,7 @@ void Init_grpc_channel() {
/* Provides a ruby constructor and support for dup/clone. */ /* Provides a ruby constructor and support for dup/clone. */
rb_define_method(grpc_rb_cChannel, "initialize", grpc_rb_channel_init, -1); rb_define_method(grpc_rb_cChannel, "initialize", grpc_rb_channel_init, -1);
rb_define_method(grpc_rb_cChannel, "initialize_copy", rb_define_method(grpc_rb_cChannel, "initialize_copy",
grpc_rb_channel_init_copy, 1); grpc_rb_cannot_init_copy, 1);
/* Add ruby analogues of the Channel methods. */ /* Add ruby analogues of the Channel methods. */
rb_define_method(grpc_rb_cChannel, "connectivity_state", rb_define_method(grpc_rb_cChannel, "connectivity_state",
@ -396,13 +359,12 @@ void Init_grpc_channel() {
rb_define_method(grpc_rb_cChannel, "watch_connectivity_state", rb_define_method(grpc_rb_cChannel, "watch_connectivity_state",
grpc_rb_channel_watch_connectivity_state, 4); grpc_rb_channel_watch_connectivity_state, 4);
rb_define_method(grpc_rb_cChannel, "create_call", rb_define_method(grpc_rb_cChannel, "create_call",
grpc_rb_channel_create_call, 6); grpc_rb_channel_create_call, 5);
rb_define_method(grpc_rb_cChannel, "target", grpc_rb_channel_get_target, 0); rb_define_method(grpc_rb_cChannel, "target", grpc_rb_channel_get_target, 0);
rb_define_method(grpc_rb_cChannel, "destroy", grpc_rb_channel_destroy, 0); rb_define_method(grpc_rb_cChannel, "destroy", grpc_rb_channel_destroy, 0);
rb_define_alias(grpc_rb_cChannel, "close", "destroy"); rb_define_alias(grpc_rb_cChannel, "close", "destroy");
id_channel = rb_intern("__channel"); id_channel = rb_intern("__channel");
id_cqueue = rb_intern("__cqueue");
id_target = rb_intern("__target"); id_target = rb_intern("__target");
rb_define_const(grpc_rb_cChannel, "SSL_TARGET", rb_define_const(grpc_rb_cChannel, "SSL_TARGET",
ID2SYM(rb_intern(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG))); ID2SYM(rb_intern(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG)));

@ -126,36 +126,6 @@ VALUE grpc_rb_wrap_channel_credentials(grpc_channel_credentials *c, VALUE mark)
return rb_wrapper; return rb_wrapper;
} }
/* Clones ChannelCredentials instances.
Gives ChannelCredentials a consistent implementation of Ruby's object copy/dup
protocol. */
static VALUE grpc_rb_channel_credentials_init_copy(VALUE copy, VALUE orig) {
grpc_rb_channel_credentials *orig_cred = NULL;
grpc_rb_channel_credentials *copy_cred = NULL;
if (copy == orig) {
return copy;
}
/* Raise an error if orig is not a credentials object or a subclass. */
if (TYPE(orig) != T_DATA ||
RDATA(orig)->dfree != (RUBY_DATA_FUNC)grpc_rb_channel_credentials_free) {
rb_raise(rb_eTypeError, "not a %s",
rb_obj_classname(grpc_rb_cChannelCredentials));
}
TypedData_Get_Struct(orig, grpc_rb_channel_credentials,
&grpc_rb_channel_credentials_data_type, orig_cred);
TypedData_Get_Struct(copy, grpc_rb_channel_credentials,
&grpc_rb_channel_credentials_data_type, copy_cred);
/* use ruby's MEMCPY to make a byte-for-byte copy of the credentials
* wrapper object. */
MEMCPY(copy_cred, orig_cred, grpc_rb_channel_credentials, 1);
return copy;
}
/* The attribute used on the mark object to hold the pem_root_certs. */ /* The attribute used on the mark object to hold the pem_root_certs. */
static ID id_pem_root_certs; static ID id_pem_root_certs;
@ -271,7 +241,7 @@ void Init_grpc_channel_credentials() {
rb_define_method(grpc_rb_cChannelCredentials, "initialize", rb_define_method(grpc_rb_cChannelCredentials, "initialize",
grpc_rb_channel_credentials_init, -1); grpc_rb_channel_credentials_init, -1);
rb_define_method(grpc_rb_cChannelCredentials, "initialize_copy", rb_define_method(grpc_rb_cChannelCredentials, "initialize_copy",
grpc_rb_channel_credentials_init_copy, 1); grpc_rb_cannot_init_copy, 1);
rb_define_method(grpc_rb_cChannelCredentials, "compose", rb_define_method(grpc_rb_cChannelCredentials, "compose",
grpc_rb_channel_credentials_compose, -1); grpc_rb_channel_credentials_compose, -1);
rb_define_module_function(grpc_rb_cChannelCredentials, rb_define_module_function(grpc_rb_cChannelCredentials,

@ -40,12 +40,9 @@
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/support/time.h> #include <grpc/support/time.h>
#include <grpc/support/log.h>
#include "rb_grpc.h" #include "rb_grpc.h"
/* grpc_rb_cCompletionQueue is the ruby class that proxies
* grpc_completion_queue. */
static VALUE grpc_rb_cCompletionQueue = Qnil;
/* Used to allow grpc_completion_queue_next call to release the GIL */ /* Used to allow grpc_completion_queue_next call to release the GIL */
typedef struct next_call_stack { typedef struct next_call_stack {
grpc_completion_queue *cq; grpc_completion_queue *cq;
@ -55,23 +52,6 @@ typedef struct next_call_stack {
volatile int interrupted; volatile int interrupted;
} next_call_stack; } next_call_stack;
/* Calls grpc_completion_queue_next without holding the ruby GIL */
static void *grpc_rb_completion_queue_next_no_gil(void *param) {
next_call_stack *const next_call = (next_call_stack*)param;
gpr_timespec increment = gpr_time_from_millis(20, GPR_TIMESPAN);
gpr_timespec deadline;
do {
deadline = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), increment);
next_call->event = grpc_completion_queue_next(next_call->cq,
deadline, NULL);
if (next_call->event.type != GRPC_QUEUE_TIMEOUT ||
gpr_time_cmp(deadline, next_call->timeout) > 0) {
break;
}
} while (!next_call->interrupted);
return NULL;
}
/* Calls grpc_completion_queue_pluck without holding the ruby GIL */ /* Calls grpc_completion_queue_pluck without holding the ruby GIL */
static void *grpc_rb_completion_queue_pluck_no_gil(void *param) { static void *grpc_rb_completion_queue_pluck_no_gil(void *param) {
next_call_stack *const next_call = (next_call_stack*)param; next_call_stack *const next_call = (next_call_stack*)param;
@ -90,107 +70,32 @@ static void *grpc_rb_completion_queue_pluck_no_gil(void *param) {
return NULL; return NULL;
} }
/* Shuts down and drains the completion queue if necessary.
*
* This is done when the ruby completion queue object is about to be GCed.
*/
static void grpc_rb_completion_queue_shutdown_drain(grpc_completion_queue *cq) {
next_call_stack next_call;
grpc_completion_type type;
int drained = 0;
MEMZERO(&next_call, next_call_stack, 1);
grpc_completion_queue_shutdown(cq);
next_call.cq = cq;
next_call.event.type = GRPC_QUEUE_TIMEOUT;
/* TODO: the timeout should be a module level constant that defaults
* to gpr_inf_future(GPR_CLOCK_REALTIME).
*
* - at the moment this does not work, it stalls. Using a small timeout like
* this one works, and leads to fast test run times; a longer timeout was
* causing unnecessary delays in the test runs.
*
* - investigate further, this is probably another example of C-level cleanup
* not working consistently in all cases.
*/
next_call.timeout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
gpr_time_from_micros(5e3, GPR_TIMESPAN));
do {
rb_thread_call_without_gvl(grpc_rb_completion_queue_next_no_gil,
(void *)&next_call, NULL, NULL);
type = next_call.event.type;
if (type == GRPC_QUEUE_TIMEOUT) break;
if (type != GRPC_QUEUE_SHUTDOWN) {
++drained;
rb_warning("completion queue shutdown: %d undrained events", drained);
}
} while (type != GRPC_QUEUE_SHUTDOWN);
}
/* Helper function to free a completion queue. */ /* Helper function to free a completion queue. */
static void grpc_rb_completion_queue_destroy(void *p) { void grpc_rb_completion_queue_destroy(grpc_completion_queue *cq) {
grpc_completion_queue *cq = NULL; /* Every function that adds an event to a queue also synchronously plucks
if (p == NULL) { that event from the queue, and holds a reference to the Ruby object that
return; holds the queue, so we only get to this point if all of those functions
} have completed, and the queue is empty */
cq = (grpc_completion_queue *)p; grpc_completion_queue_shutdown(cq);
grpc_rb_completion_queue_shutdown_drain(cq);
grpc_completion_queue_destroy(cq); grpc_completion_queue_destroy(cq);
} }
static rb_data_type_t grpc_rb_completion_queue_data_type = {
"grpc_completion_queue",
{GRPC_RB_GC_NOT_MARKED, grpc_rb_completion_queue_destroy,
GRPC_RB_MEMSIZE_UNAVAILABLE, {NULL, NULL}},
NULL, NULL,
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
/* cannot immediately free because grpc_rb_completion_queue_shutdown_drain
* calls rb_thread_call_without_gvl. */
0,
#endif
};
/* Releases the c-level resources associated with a completion queue */
static VALUE grpc_rb_completion_queue_close(VALUE self) {
grpc_completion_queue* cq = grpc_rb_get_wrapped_completion_queue(self);
grpc_rb_completion_queue_destroy(cq);
RTYPEDDATA_DATA(self) = NULL;
return Qnil;
}
/* Allocates a completion queue. */
static VALUE grpc_rb_completion_queue_alloc(VALUE cls) {
grpc_completion_queue *cq = grpc_completion_queue_create(NULL);
if (cq == NULL) {
rb_raise(rb_eArgError, "could not create a completion queue: not sure why");
}
return TypedData_Wrap_Struct(cls, &grpc_rb_completion_queue_data_type, cq);
}
static void unblock_func(void *param) { static void unblock_func(void *param) {
next_call_stack *const next_call = (next_call_stack*)param; next_call_stack *const next_call = (next_call_stack*)param;
next_call->interrupted = 1; next_call->interrupted = 1;
} }
/* Blocks until the next event for given tag is available, and returns the /* Does the same thing as grpc_completion_queue_pluck, while properly releasing
* event. */ the GVL and handling interrupts */
grpc_event grpc_rb_completion_queue_pluck_event(VALUE self, VALUE tag, grpc_event rb_completion_queue_pluck(grpc_completion_queue *queue, void *tag,
VALUE timeout) { gpr_timespec deadline, void *reserved) {
next_call_stack next_call; next_call_stack next_call;
MEMZERO(&next_call, next_call_stack, 1); MEMZERO(&next_call, next_call_stack, 1);
TypedData_Get_Struct(self, grpc_completion_queue, next_call.cq = queue;
&grpc_rb_completion_queue_data_type, next_call.cq); next_call.timeout = deadline;
if (TYPE(timeout) == T_NIL) { next_call.tag = tag;
next_call.timeout = gpr_inf_future(GPR_CLOCK_REALTIME);
} else {
next_call.timeout = grpc_rb_time_timeval(timeout, /* absolute time*/ 0);
}
if (TYPE(tag) == T_NIL) {
next_call.tag = NULL;
} else {
next_call.tag = ROBJECT(tag);
}
next_call.event.type = GRPC_QUEUE_TIMEOUT; next_call.event.type = GRPC_QUEUE_TIMEOUT;
(void)reserved;
/* Loop until we finish a pluck without an interruption. The internal /* Loop until we finish a pluck without an interruption. The internal
pluck function runs either until it is interrupted or it gets an pluck function runs either until it is interrupted or it gets an
event, or time runs out. event, or time runs out.
@ -210,27 +115,3 @@ grpc_event grpc_rb_completion_queue_pluck_event(VALUE self, VALUE tag,
next_call.event.type == GRPC_QUEUE_TIMEOUT); next_call.event.type == GRPC_QUEUE_TIMEOUT);
return next_call.event; return next_call.event;
} }
void Init_grpc_completion_queue() {
grpc_rb_cCompletionQueue =
rb_define_class_under(grpc_rb_mGrpcCore, "CompletionQueue", rb_cObject);
/* constructor: uses an alloc func without an initializer. Using a simple
alloc func works here as the grpc header does not specify any args for
this func, so no separate initialization step is necessary. */
rb_define_alloc_func(grpc_rb_cCompletionQueue,
grpc_rb_completion_queue_alloc);
/* close: Provides a way to close the underlying file descriptor without
waiting for ruby garbage collection. */
rb_define_method(grpc_rb_cCompletionQueue, "close",
grpc_rb_completion_queue_close, 0);
}
/* Gets the wrapped completion queue from the ruby wrapper */
grpc_completion_queue *grpc_rb_get_wrapped_completion_queue(VALUE v) {
grpc_completion_queue *cq = NULL;
TypedData_Get_Struct(v, grpc_completion_queue,
&grpc_rb_completion_queue_data_type, cq);
return cq;
}

@ -41,15 +41,14 @@
/* Gets the wrapped completion queue from the ruby wrapper */ /* Gets the wrapped completion queue from the ruby wrapper */
grpc_completion_queue *grpc_rb_get_wrapped_completion_queue(VALUE v); grpc_completion_queue *grpc_rb_get_wrapped_completion_queue(VALUE v);
void grpc_rb_completion_queue_destroy(grpc_completion_queue *cq);
/** /**
* Makes the implementation of CompletionQueue#pluck available in other files * Makes the implementation of CompletionQueue#pluck available in other files
* *
* This avoids having code that holds the GIL repeated at multiple sites. * This avoids having code that holds the GIL repeated at multiple sites.
*/ */
grpc_event grpc_rb_completion_queue_pluck_event(VALUE self, VALUE tag, grpc_event rb_completion_queue_pluck(grpc_completion_queue *queue, void *tag,
VALUE timeout); gpr_timespec deadline, void *reserved);
/* Initializes the CompletionQueue class. */
void Init_grpc_completion_queue();
#endif /* GRPC_RB_COMPLETION_QUEUE_H_ */ #endif /* GRPC_RB_COMPLETION_QUEUE_H_ */

@ -46,7 +46,6 @@
#include "rb_call_credentials.h" #include "rb_call_credentials.h"
#include "rb_channel.h" #include "rb_channel.h"
#include "rb_channel_credentials.h" #include "rb_channel_credentials.h"
#include "rb_completion_queue.h"
#include "rb_loader.h" #include "rb_loader.h"
#include "rb_server.h" #include "rb_server.h"
#include "rb_server_credentials.h" #include "rb_server_credentials.h"
@ -85,7 +84,7 @@ VALUE grpc_rb_cannot_init(VALUE self) {
VALUE grpc_rb_cannot_init_copy(VALUE copy, VALUE self) { VALUE grpc_rb_cannot_init_copy(VALUE copy, VALUE self) {
(void)self; (void)self;
rb_raise(rb_eTypeError, rb_raise(rb_eTypeError,
"initialization of %s only allowed from the gRPC native layer", "Copy initialization of %s is not supported",
rb_obj_classname(copy)); rb_obj_classname(copy));
return Qnil; return Qnil;
} }
@ -318,7 +317,7 @@ void Init_grpc_c() {
grpc_rb_mGrpcCore = rb_define_module_under(grpc_rb_mGRPC, "Core"); grpc_rb_mGrpcCore = rb_define_module_under(grpc_rb_mGRPC, "Core");
grpc_rb_sNewServerRpc = grpc_rb_sNewServerRpc =
rb_struct_define("NewServerRpc", "method", "host", rb_struct_define("NewServerRpc", "method", "host",
"deadline", "metadata", "call", "cq", NULL); "deadline", "metadata", "call", NULL);
grpc_rb_sStatus = grpc_rb_sStatus =
rb_struct_define("Status", "code", "details", "metadata", NULL); rb_struct_define("Status", "code", "details", "metadata", NULL);
sym_code = ID2SYM(rb_intern("code")); sym_code = ID2SYM(rb_intern("code"));
@ -326,7 +325,6 @@ void Init_grpc_c() {
sym_metadata = ID2SYM(rb_intern("metadata")); sym_metadata = ID2SYM(rb_intern("metadata"));
Init_grpc_channel(); Init_grpc_channel();
Init_grpc_completion_queue();
Init_grpc_call(); Init_grpc_call();
Init_grpc_call_credentials(); Init_grpc_call_credentials();
Init_grpc_channel_credentials(); Init_grpc_channel_credentials();

@ -38,6 +38,7 @@
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/grpc_security.h> #include <grpc/grpc_security.h>
#include <grpc/support/log.h>
#include "rb_call.h" #include "rb_call.h"
#include "rb_channel_args.h" #include "rb_channel_args.h"
#include "rb_completion_queue.h" #include "rb_completion_queue.h"
@ -53,53 +54,51 @@ static ID id_at;
/* id_insecure_server is used to indicate that a server is insecure */ /* id_insecure_server is used to indicate that a server is insecure */
static VALUE id_insecure_server; static VALUE id_insecure_server;
/* grpc_rb_server wraps a grpc_server. It provides a peer ruby object, /* grpc_rb_server wraps a grpc_server. */
'mark' to minimize copying when a server is created from ruby. */
typedef struct grpc_rb_server { typedef struct grpc_rb_server {
/* Holder of ruby objects involved in constructing the server */
VALUE mark;
/* The actual server */ /* The actual server */
grpc_server *wrapped; grpc_server *wrapped;
grpc_completion_queue *queue; grpc_completion_queue *queue;
} grpc_rb_server; } grpc_rb_server;
static void destroy_server(grpc_rb_server *server, gpr_timespec deadline) {
grpc_event ev;
if (server->wrapped != NULL) {
grpc_server_shutdown_and_notify(server->wrapped, server->queue, NULL);
ev = rb_completion_queue_pluck(server->queue, NULL, deadline, NULL);
if (ev.type == GRPC_QUEUE_TIMEOUT) {
grpc_server_cancel_all_calls(server->wrapped);
rb_completion_queue_pluck(server->queue, NULL,
gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
}
grpc_server_destroy(server->wrapped);
grpc_rb_completion_queue_destroy(server->queue);
server->wrapped = NULL;
server->queue = NULL;
}
}
/* Destroys server instances. */ /* Destroys server instances. */
static void grpc_rb_server_free(void *p) { static void grpc_rb_server_free(void *p) {
grpc_rb_server *svr = NULL; grpc_rb_server *svr = NULL;
gpr_timespec deadline;
if (p == NULL) { if (p == NULL) {
return; return;
}; };
svr = (grpc_rb_server *)p; svr = (grpc_rb_server *)p;
/* Deletes the wrapped object if the mark object is Qnil, which indicates deadline = gpr_time_add(
that no other object is the actual owner. */ gpr_now(GPR_CLOCK_REALTIME),
/* grpc_server_shutdown does not exist. Change this to something that does gpr_time_from_seconds(2, GPR_TIMESPAN));
or delete it */
if (svr->wrapped != NULL && svr->mark == Qnil) {
// grpc_server_shutdown(svr->wrapped);
// Aborting to indicate a bug
abort();
grpc_server_destroy(svr->wrapped);
}
xfree(p); destroy_server(svr, deadline);
}
/* Protects the mark object from GC */ xfree(p);
static void grpc_rb_server_mark(void *p) {
grpc_rb_server *server = NULL;
if (p == NULL) {
return;
}
server = (grpc_rb_server *)p;
if (server->mark != Qnil) {
rb_gc_mark(server->mark);
}
} }
static const rb_data_type_t grpc_rb_server_data_type = { static const rb_data_type_t grpc_rb_server_data_type = {
"grpc_server", "grpc_server",
{grpc_rb_server_mark, grpc_rb_server_free, GRPC_RB_MEMSIZE_UNAVAILABLE, {GRPC_RB_GC_NOT_MARKED, grpc_rb_server_free, GRPC_RB_MEMSIZE_UNAVAILABLE,
{NULL, NULL}}, {NULL, NULL}},
NULL, NULL,
NULL, NULL,
@ -116,23 +115,20 @@ static const rb_data_type_t grpc_rb_server_data_type = {
static VALUE grpc_rb_server_alloc(VALUE cls) { static VALUE grpc_rb_server_alloc(VALUE cls) {
grpc_rb_server *wrapper = ALLOC(grpc_rb_server); grpc_rb_server *wrapper = ALLOC(grpc_rb_server);
wrapper->wrapped = NULL; wrapper->wrapped = NULL;
wrapper->mark = Qnil;
return TypedData_Wrap_Struct(cls, &grpc_rb_server_data_type, wrapper); return TypedData_Wrap_Struct(cls, &grpc_rb_server_data_type, wrapper);
} }
/* /*
call-seq: call-seq:
cq = CompletionQueue.new server = Server.new({'arg1': 'value1'})
server = Server.new(cq, {'arg1': 'value1'})
Initializes server instances. */ Initializes server instances. */
static VALUE grpc_rb_server_init(VALUE self, VALUE cqueue, VALUE channel_args) { static VALUE grpc_rb_server_init(VALUE self, VALUE channel_args) {
grpc_completion_queue *cq = NULL; grpc_completion_queue *cq = grpc_completion_queue_create(NULL);
grpc_rb_server *wrapper = NULL; grpc_rb_server *wrapper = NULL;
grpc_server *srv = NULL; grpc_server *srv = NULL;
grpc_channel_args args; grpc_channel_args args;
MEMZERO(&args, grpc_channel_args, 1); MEMZERO(&args, grpc_channel_args, 1);
cq = grpc_rb_get_wrapped_completion_queue(cqueue);
TypedData_Get_Struct(self, grpc_rb_server, &grpc_rb_server_data_type, TypedData_Get_Struct(self, grpc_rb_server, &grpc_rb_server_data_type,
wrapper); wrapper);
grpc_rb_hash_convert_to_channel_args(channel_args, &args); grpc_rb_hash_convert_to_channel_args(channel_args, &args);
@ -148,41 +144,9 @@ static VALUE grpc_rb_server_init(VALUE self, VALUE cqueue, VALUE channel_args) {
wrapper->wrapped = srv; wrapper->wrapped = srv;
wrapper->queue = cq; wrapper->queue = cq;
/* Add the cq as the server's mark object. This ensures the ruby cq can't be
GCed before the server */
wrapper->mark = cqueue;
return self; return self;
} }
/* Clones Server instances.
Gives Server a consistent implementation of Ruby's object copy/dup
protocol. */
static VALUE grpc_rb_server_init_copy(VALUE copy, VALUE orig) {
grpc_rb_server *orig_srv = NULL;
grpc_rb_server *copy_srv = NULL;
if (copy == orig) {
return copy;
}
/* Raise an error if orig is not a server object or a subclass. */
if (TYPE(orig) != T_DATA ||
RDATA(orig)->dfree != (RUBY_DATA_FUNC)grpc_rb_server_free) {
rb_raise(rb_eTypeError, "not a %s", rb_obj_classname(grpc_rb_cServer));
}
TypedData_Get_Struct(orig, grpc_rb_server, &grpc_rb_server_data_type,
orig_srv);
TypedData_Get_Struct(copy, grpc_rb_server, &grpc_rb_server_data_type,
copy_srv);
/* use ruby's MEMCPY to make a byte-for-byte copy of the server wrapper
object. */
MEMCPY(copy_srv, orig_srv, grpc_rb_server, 1);
return copy;
}
/* request_call_stack holds various values used by the /* request_call_stack holds various values used by the
* grpc_rb_server_request_call function */ * grpc_rb_server_request_call function */
typedef struct request_call_stack { typedef struct request_call_stack {
@ -208,65 +172,57 @@ static void grpc_request_call_stack_cleanup(request_call_stack* st) {
} }
/* call-seq: /* call-seq:
cq = CompletionQueue.new server.request_call
tag = Object.new
timeout = 10
server.request_call(cqueue, tag, timeout)
Requests notification of a new call on a server. */ Requests notification of a new call on a server. */
static VALUE grpc_rb_server_request_call(VALUE self, VALUE cqueue, static VALUE grpc_rb_server_request_call(VALUE self) {
VALUE tag_new, VALUE timeout) {
grpc_rb_server *s = NULL; grpc_rb_server *s = NULL;
grpc_call *call = NULL; grpc_call *call = NULL;
grpc_event ev; grpc_event ev;
grpc_call_error err; grpc_call_error err;
request_call_stack st; request_call_stack st;
VALUE result; VALUE result;
void *tag = (void*)&st;
grpc_completion_queue *call_queue = grpc_completion_queue_create(NULL);
gpr_timespec deadline; gpr_timespec deadline;
TypedData_Get_Struct(self, grpc_rb_server, &grpc_rb_server_data_type, s); TypedData_Get_Struct(self, grpc_rb_server, &grpc_rb_server_data_type, s);
if (s->wrapped == NULL) { if (s->wrapped == NULL) {
rb_raise(rb_eRuntimeError, "destroyed!"); rb_raise(rb_eRuntimeError, "destroyed!");
return Qnil; return Qnil;
} else { }
grpc_request_call_stack_init(&st); grpc_request_call_stack_init(&st);
/* call grpc_server_request_call, then wait for it to complete using /* call grpc_server_request_call, then wait for it to complete using
* pluck_event */ * pluck_event */
err = grpc_server_request_call( err = grpc_server_request_call(
s->wrapped, &call, &st.details, &st.md_ary, s->wrapped, &call, &st.details, &st.md_ary,
grpc_rb_get_wrapped_completion_queue(cqueue), call_queue, s->queue, tag);
grpc_rb_get_wrapped_completion_queue(s->mark), if (err != GRPC_CALL_OK) {
ROBJECT(tag_new)); grpc_request_call_stack_cleanup(&st);
if (err != GRPC_CALL_OK) { rb_raise(grpc_rb_eCallError,
grpc_request_call_stack_cleanup(&st); "grpc_server_request_call failed: %s (code=%d)",
rb_raise(grpc_rb_eCallError, grpc_call_error_detail_of(err), err);
"grpc_server_request_call failed: %s (code=%d)", return Qnil;
grpc_call_error_detail_of(err), err); }
return Qnil;
}
ev = grpc_rb_completion_queue_pluck_event(s->mark, tag_new, timeout);
if (ev.type == GRPC_QUEUE_TIMEOUT) {
grpc_request_call_stack_cleanup(&st);
return Qnil;
}
if (!ev.success) {
grpc_request_call_stack_cleanup(&st);
rb_raise(grpc_rb_eCallError, "request_call completion failed");
return Qnil;
}
/* build the NewServerRpc struct result */ ev = rb_completion_queue_pluck(s->queue, tag,
deadline = gpr_convert_clock_type(st.details.deadline, GPR_CLOCK_REALTIME); gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
result = rb_struct_new( if (!ev.success) {
grpc_rb_sNewServerRpc, rb_str_new2(st.details.method),
rb_str_new2(st.details.host),
rb_funcall(rb_cTime, id_at, 2, INT2NUM(deadline.tv_sec),
INT2NUM(deadline.tv_nsec)),
grpc_rb_md_ary_to_h(&st.md_ary), grpc_rb_wrap_call(call), cqueue, NULL);
grpc_request_call_stack_cleanup(&st); grpc_request_call_stack_cleanup(&st);
return result; rb_raise(grpc_rb_eCallError, "request_call completion failed");
return Qnil;
} }
return Qnil;
/* build the NewServerRpc struct result */
deadline = gpr_convert_clock_type(st.details.deadline, GPR_CLOCK_REALTIME);
result = rb_struct_new(
grpc_rb_sNewServerRpc, rb_str_new2(st.details.method),
rb_str_new2(st.details.host),
rb_funcall(rb_cTime, id_at, 2, INT2NUM(deadline.tv_sec),
INT2NUM(deadline.tv_nsec)),
grpc_rb_md_ary_to_h(&st.md_ary), grpc_rb_wrap_call(call, call_queue),
NULL);
grpc_request_call_stack_cleanup(&st);
return result;
} }
static VALUE grpc_rb_server_start(VALUE self) { static VALUE grpc_rb_server_start(VALUE self) {
@ -282,41 +238,33 @@ static VALUE grpc_rb_server_start(VALUE self) {
/* /*
call-seq: call-seq:
cq = CompletionQueue.new server = Server.new({'arg1': 'value1'})
server = Server.new(cq, {'arg1': 'value1'})
... // do stuff with server ... // do stuff with server
... ...
... // to shutdown the server ... // to shutdown the server
server.destroy(cq) server.destroy()
... // to shutdown the server with a timeout ... // to shutdown the server with a timeout
server.destroy(cq, timeout) server.destroy(timeout)
Destroys server instances. */ Destroys server instances. */
static VALUE grpc_rb_server_destroy(int argc, VALUE *argv, VALUE self) { static VALUE grpc_rb_server_destroy(int argc, VALUE *argv, VALUE self) {
VALUE cqueue = Qnil;
VALUE timeout = Qnil; VALUE timeout = Qnil;
grpc_completion_queue *cq = NULL; gpr_timespec deadline;
grpc_event ev;
grpc_rb_server *s = NULL; grpc_rb_server *s = NULL;
/* "11" == 1 mandatory args, 1 (timeout) is optional */ /* "01" == 0 mandatory args, 1 (timeout) is optional */
rb_scan_args(argc, argv, "11", &cqueue, &timeout); rb_scan_args(argc, argv, "01", &timeout);
cq = grpc_rb_get_wrapped_completion_queue(cqueue);
TypedData_Get_Struct(self, grpc_rb_server, &grpc_rb_server_data_type, s); TypedData_Get_Struct(self, grpc_rb_server, &grpc_rb_server_data_type, s);
if (TYPE(timeout) == T_NIL) {
if (s->wrapped != NULL) { deadline = gpr_inf_future(GPR_CLOCK_REALTIME);
grpc_server_shutdown_and_notify(s->wrapped, cq, NULL); } else {
ev = grpc_rb_completion_queue_pluck_event(cqueue, Qnil, timeout); deadline = grpc_rb_time_timeval(timeout, /* absolute time*/ 0);
if (!ev.success) {
rb_warn("server shutdown failed, cancelling the calls, objects may leak");
grpc_server_cancel_all_calls(s->wrapped);
return Qfalse;
}
grpc_server_destroy(s->wrapped);
s->wrapped = NULL;
} }
return Qtrue;
destroy_server(s, deadline);
return Qnil;
} }
/* /*
@ -376,13 +324,13 @@ void Init_grpc_server() {
rb_define_alloc_func(grpc_rb_cServer, grpc_rb_server_alloc); rb_define_alloc_func(grpc_rb_cServer, grpc_rb_server_alloc);
/* Provides a ruby constructor and support for dup/clone. */ /* Provides a ruby constructor and support for dup/clone. */
rb_define_method(grpc_rb_cServer, "initialize", grpc_rb_server_init, 2); rb_define_method(grpc_rb_cServer, "initialize", grpc_rb_server_init, 1);
rb_define_method(grpc_rb_cServer, "initialize_copy", rb_define_method(grpc_rb_cServer, "initialize_copy",
grpc_rb_server_init_copy, 1); grpc_rb_cannot_init_copy, 1);
/* Add the server methods. */ /* Add the server methods. */
rb_define_method(grpc_rb_cServer, "request_call", rb_define_method(grpc_rb_cServer, "request_call",
grpc_rb_server_request_call, 3); grpc_rb_server_request_call, 0);
rb_define_method(grpc_rb_cServer, "start", grpc_rb_server_start, 0); rb_define_method(grpc_rb_cServer, "start", grpc_rb_server_start, 0);
rb_define_method(grpc_rb_cServer, "destroy", grpc_rb_server_destroy, -1); rb_define_method(grpc_rb_cServer, "destroy", grpc_rb_server_destroy, -1);
rb_define_alias(grpc_rb_cServer, "close", "destroy"); rb_define_alias(grpc_rb_cServer, "close", "destroy");

@ -38,6 +38,7 @@
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/grpc_security.h> #include <grpc/grpc_security.h>
#include <grpc/support/log.h>
#include "rb_grpc.h" #include "rb_grpc.h"
@ -46,8 +47,8 @@
static VALUE grpc_rb_cServerCredentials = Qnil; static VALUE grpc_rb_cServerCredentials = Qnil;
/* grpc_rb_server_credentials wraps a grpc_server_credentials. It provides a /* grpc_rb_server_credentials wraps a grpc_server_credentials. It provides a
peer ruby object, 'mark' to minimize copying when a server credential is peer ruby object, 'mark' to hold references to objects involved in
created from ruby. */ constructing the server credentials. */
typedef struct grpc_rb_server_credentials { typedef struct grpc_rb_server_credentials {
/* Holder of ruby objects involved in constructing the server credentials */ /* Holder of ruby objects involved in constructing the server credentials */
VALUE mark; VALUE mark;
@ -111,36 +112,6 @@ static VALUE grpc_rb_server_credentials_alloc(VALUE cls) {
wrapper); wrapper);
} }
/* Clones ServerCredentials instances.
Gives ServerCredentials a consistent implementation of Ruby's object copy/dup
protocol. */
static VALUE grpc_rb_server_credentials_init_copy(VALUE copy, VALUE orig) {
grpc_rb_server_credentials *orig_ch = NULL;
grpc_rb_server_credentials *copy_ch = NULL;
if (copy == orig) {
return copy;
}
/* Raise an error if orig is not a server_credentials object or a subclass. */
if (TYPE(orig) != T_DATA ||
RDATA(orig)->dfree != (RUBY_DATA_FUNC)grpc_rb_server_credentials_free) {
rb_raise(rb_eTypeError, "not a %s",
rb_obj_classname(grpc_rb_cServerCredentials));
}
TypedData_Get_Struct(orig, grpc_rb_server_credentials,
&grpc_rb_server_credentials_data_type, orig_ch);
TypedData_Get_Struct(copy, grpc_rb_server_credentials,
&grpc_rb_server_credentials_data_type, copy_ch);
/* use ruby's MEMCPY to make a byte-for-byte copy of the server_credentials
wrapper object. */
MEMCPY(copy_ch, orig_ch, grpc_rb_server_credentials, 1);
return copy;
}
/* The attribute used on the mark object to preserve the pem_root_certs. */ /* The attribute used on the mark object to preserve the pem_root_certs. */
static ID id_pem_root_certs; static ID id_pem_root_certs;
@ -270,7 +241,7 @@ void Init_grpc_server_credentials() {
rb_define_method(grpc_rb_cServerCredentials, "initialize", rb_define_method(grpc_rb_cServerCredentials, "initialize",
grpc_rb_server_credentials_init, 3); grpc_rb_server_credentials_init, 3);
rb_define_method(grpc_rb_cServerCredentials, "initialize_copy", rb_define_method(grpc_rb_cServerCredentials, "initialize_copy",
grpc_rb_server_credentials_init_copy, 1); grpc_rb_cannot_init_copy, 1);
id_pem_key_certs = rb_intern("__pem_key_certs"); id_pem_key_certs = rb_intern("__pem_key_certs");
id_pem_root_certs = rb_intern("__pem_root_certs"); id_pem_root_certs = rb_intern("__pem_root_certs");

@ -75,17 +75,10 @@ module GRPC
# if a keyword value is a list, multiple metadata for it's key are sent # if a keyword value is a list, multiple metadata for it's key are sent
# #
# @param call [Call] a call on which to start and invocation # @param call [Call] a call on which to start and invocation
# @param q [CompletionQueue] the completion queue
# @param metadata [Hash] the metadata # @param metadata [Hash] the metadata
def self.client_invoke(call, q, metadata = {}) def self.client_invoke(call, metadata = {})
fail(TypeError, '!Core::Call') unless call.is_a? Core::Call fail(TypeError, '!Core::Call') unless call.is_a? Core::Call
unless q.is_a? Core::CompletionQueue call.run_batch(SEND_INITIAL_METADATA => metadata)
fail(TypeError, '!Core::CompletionQueue')
end
metadata_tag = Object.new
call.run_batch(q, metadata_tag, INFINITE_FUTURE,
SEND_INITIAL_METADATA => metadata)
metadata_tag
end end
# Creates an ActiveCall. # Creates an ActiveCall.
@ -102,26 +95,21 @@ module GRPC
# deadline is the absolute deadline for the call. # deadline is the absolute deadline for the call.
# #
# @param call [Call] the call used by the ActiveCall # @param call [Call] the call used by the ActiveCall
# @param q [CompletionQueue] the completion queue used to accept
# the call. This queue will be closed on call completion.
# @param marshal [Function] f(obj)->string that marshal requests # @param marshal [Function] f(obj)->string that marshal requests
# @param unmarshal [Function] f(string)->obj that unmarshals responses # @param unmarshal [Function] f(string)->obj that unmarshals responses
# @param deadline [Fixnum] the deadline for the call to complete # @param deadline [Fixnum] the deadline for the call to complete
# @param metadata_tag [Object] the object use obtain metadata for clients # @param started [true|false] indicates that metadata was sent
# @param started [true|false] indicates if the call has begun # @param metadata_received [true|false] indicates if metadata has already
def initialize(call, q, marshal, unmarshal, deadline, started: true, # been received. Should always be true for server calls
metadata_tag: nil) def initialize(call, marshal, unmarshal, deadline, started: true,
metadata_received: false)
fail(TypeError, '!Core::Call') unless call.is_a? Core::Call fail(TypeError, '!Core::Call') unless call.is_a? Core::Call
unless q.is_a? Core::CompletionQueue
fail(TypeError, '!Core::CompletionQueue')
end
@call = call @call = call
@cq = q
@deadline = deadline @deadline = deadline
@marshal = marshal @marshal = marshal
@started = started
@unmarshal = unmarshal @unmarshal = unmarshal
@metadata_tag = metadata_tag @metadata_received = metadata_received
@metadata_sent = started
@op_notifier = nil @op_notifier = nil
end end
@ -168,7 +156,7 @@ module GRPC
SEND_CLOSE_FROM_CLIENT => nil SEND_CLOSE_FROM_CLIENT => nil
} }
ops[RECV_STATUS_ON_CLIENT] = nil if assert_finished ops[RECV_STATUS_ON_CLIENT] = nil if assert_finished
batch_result = @call.run_batch(@cq, self, INFINITE_FUTURE, ops) batch_result = @call.run_batch(ops)
return unless assert_finished return unless assert_finished
@call.status = batch_result.status @call.status = batch_result.status
op_is_done op_is_done
@ -179,8 +167,7 @@ module GRPC
# #
# It blocks until the remote endpoint acknowledges by sending a status. # It blocks until the remote endpoint acknowledges by sending a status.
def finished def finished
batch_result = @call.run_batch(@cq, self, INFINITE_FUTURE, batch_result = @call.run_batch(RECV_STATUS_ON_CLIENT => nil)
RECV_STATUS_ON_CLIENT => nil)
unless batch_result.status.nil? unless batch_result.status.nil?
if @call.metadata.nil? if @call.metadata.nil?
@call.metadata = batch_result.status.metadata @call.metadata = batch_result.status.metadata
@ -192,7 +179,6 @@ module GRPC
op_is_done op_is_done
batch_result.check_status batch_result.check_status
@call.close @call.close
@cq.close
end end
# remote_send sends a request to the remote endpoint. # remote_send sends a request to the remote endpoint.
@ -203,9 +189,10 @@ module GRPC
# @param marshalled [false, true] indicates if the object is already # @param marshalled [false, true] indicates if the object is already
# marshalled. # marshalled.
def remote_send(req, marshalled = false) def remote_send(req, marshalled = false)
# TODO(murgatroid99): ensure metadata was sent
GRPC.logger.debug("sending #{req}, marshalled? #{marshalled}") GRPC.logger.debug("sending #{req}, marshalled? #{marshalled}")
payload = marshalled ? req : @marshal.call(req) payload = marshalled ? req : @marshal.call(req)
@call.run_batch(@cq, self, INFINITE_FUTURE, SEND_MESSAGE => payload) @call.run_batch(SEND_MESSAGE => payload)
end end
# send_status sends a status to the remote endpoint. # send_status sends a status to the remote endpoint.
@ -222,7 +209,7 @@ module GRPC
SEND_STATUS_FROM_SERVER => Struct::Status.new(code, details, metadata) SEND_STATUS_FROM_SERVER => Struct::Status.new(code, details, metadata)
} }
ops[RECV_CLOSE_ON_SERVER] = nil if assert_finished ops[RECV_CLOSE_ON_SERVER] = nil if assert_finished
@call.run_batch(@cq, self, INFINITE_FUTURE, ops) @call.run_batch(ops)
nil nil
end end
@ -234,11 +221,11 @@ module GRPC
# raising BadStatus # raising BadStatus
def remote_read def remote_read
ops = { RECV_MESSAGE => nil } ops = { RECV_MESSAGE => nil }
ops[RECV_INITIAL_METADATA] = nil unless @metadata_tag.nil? ops[RECV_INITIAL_METADATA] = nil unless @metadata_received
batch_result = @call.run_batch(@cq, self, INFINITE_FUTURE, ops) batch_result = @call.run_batch(ops)
unless @metadata_tag.nil? unless @metadata_received
@call.metadata = batch_result.metadata @call.metadata = batch_result.metadata
@metadata_tag = nil @metadata_received = true
end end
GRPC.logger.debug("received req: #{batch_result}") GRPC.logger.debug("received req: #{batch_result}")
unless batch_result.nil? || batch_result.message.nil? unless batch_result.nil? || batch_result.message.nil?
@ -318,7 +305,7 @@ module GRPC
# a list, multiple metadata for its key are sent # a list, multiple metadata for its key are sent
# @return [Object] the response received from the server # @return [Object] the response received from the server
def request_response(req, metadata: {}) def request_response(req, metadata: {})
start_call(metadata) unless @started start_call(metadata)
remote_send(req) remote_send(req)
writes_done(false) writes_done(false)
response = remote_read response = remote_read
@ -342,7 +329,7 @@ module GRPC
# a list, multiple metadata for its key are sent # a list, multiple metadata for its key are sent
# @return [Object] the response received from the server # @return [Object] the response received from the server
def client_streamer(requests, metadata: {}) def client_streamer(requests, metadata: {})
start_call(metadata) unless @started start_call(metadata)
requests.each { |r| remote_send(r) } requests.each { |r| remote_send(r) }
writes_done(false) writes_done(false)
response = remote_read response = remote_read
@ -368,7 +355,7 @@ module GRPC
# a list, multiple metadata for its key are sent # a list, multiple metadata for its key are sent
# @return [Enumerator|nil] a response Enumerator # @return [Enumerator|nil] a response Enumerator
def server_streamer(req, metadata: {}) def server_streamer(req, metadata: {})
start_call(metadata) unless @started start_call(metadata)
remote_send(req) remote_send(req)
writes_done(false) writes_done(false)
replies = enum_for(:each_remote_read_then_finish) replies = enum_for(:each_remote_read_then_finish)
@ -407,10 +394,9 @@ module GRPC
# a list, multiple metadata for its key are sent # a list, multiple metadata for its key are sent
# @return [Enumerator, nil] a response Enumerator # @return [Enumerator, nil] a response Enumerator
def bidi_streamer(requests, metadata: {}, &blk) def bidi_streamer(requests, metadata: {}, &blk)
start_call(metadata) unless @started start_call(metadata)
bd = BidiCall.new(@call, @cq, @marshal, @unmarshal, bd = BidiCall.new(@call, @marshal, @unmarshal,
metadata_tag: @metadata_tag) metadata_received: @metadata_received)
@metadata_tag = nil # run_on_client ensures metadata is read
bd.run_on_client(requests, @op_notifier, &blk) bd.run_on_client(requests, @op_notifier, &blk)
end end
@ -426,7 +412,8 @@ module GRPC
# #
# @param gen_each_reply [Proc] generates the BiDi stream replies # @param gen_each_reply [Proc] generates the BiDi stream replies
def run_server_bidi(gen_each_reply) def run_server_bidi(gen_each_reply)
bd = BidiCall.new(@call, @cq, @marshal, @unmarshal) bd = BidiCall.new(@call, @marshal, @unmarshal,
metadata_received: @metadata_received)
bd.run_on_server(gen_each_reply) bd.run_on_server(gen_each_reply)
end end
@ -449,9 +436,9 @@ module GRPC
# @param metadata [Hash] metadata to be sent to the server. If a value is # @param metadata [Hash] metadata to be sent to the server. If a value is
# a list, multiple metadata for its key are sent # a list, multiple metadata for its key are sent
def start_call(metadata = {}) def start_call(metadata = {})
return if @started return if @metadata_sent
@metadata_tag = ActiveCall.client_invoke(@call, @cq, metadata) @metadata_tag = ActiveCall.client_invoke(@call, metadata)
@started = true @metadata_sent = true
end end
def self.view_class(*visible_methods) def self.view_class(*visible_methods)

@ -52,23 +52,18 @@ module GRPC
# deadline is the absolute deadline for the call. # deadline is the absolute deadline for the call.
# #
# @param call [Call] the call used by the ActiveCall # @param call [Call] the call used by the ActiveCall
# @param q [CompletionQueue] the completion queue used to accept
# the call
# @param marshal [Function] f(obj)->string that marshal requests # @param marshal [Function] f(obj)->string that marshal requests
# @param unmarshal [Function] f(string)->obj that unmarshals responses # @param unmarshal [Function] f(string)->obj that unmarshals responses
# @param metadata_tag [Object] tag object used to collect metadata # @param metadata_received [true|false] indicates if metadata has already
def initialize(call, q, marshal, unmarshal, metadata_tag: nil) # been received. Should always be true for server calls
def initialize(call, marshal, unmarshal, metadata_received: false)
fail(ArgumentError, 'not a call') unless call.is_a? Core::Call fail(ArgumentError, 'not a call') unless call.is_a? Core::Call
unless q.is_a? Core::CompletionQueue
fail(ArgumentError, 'not a CompletionQueue')
end
@call = call @call = call
@cq = q
@marshal = marshal @marshal = marshal
@op_notifier = nil # signals completion on clients @op_notifier = nil # signals completion on clients
@readq = Queue.new @readq = Queue.new
@unmarshal = unmarshal @unmarshal = unmarshal
@metadata_tag = metadata_tag @metadata_received = metadata_received
@reads_complete = false @reads_complete = false
@writes_complete = false @writes_complete = false
@complete = false @complete = false
@ -124,7 +119,6 @@ module GRPC
@done_mutex.synchronize do @done_mutex.synchronize do
return unless @reads_complete && @writes_complete && !@complete return unless @reads_complete && @writes_complete && !@complete
@call.close @call.close
@cq.close
@complete = true @complete = true
end end
end end
@ -132,11 +126,11 @@ module GRPC
# performs a read using @call.run_batch, ensures metadata is set up # performs a read using @call.run_batch, ensures metadata is set up
def read_using_run_batch def read_using_run_batch
ops = { RECV_MESSAGE => nil } ops = { RECV_MESSAGE => nil }
ops[RECV_INITIAL_METADATA] = nil unless @metadata_tag.nil? ops[RECV_INITIAL_METADATA] = nil unless @metadata_received
batch_result = @call.run_batch(@cq, self, INFINITE_FUTURE, ops) batch_result = @call.run_batch(ops)
unless @metadata_tag.nil? unless @metadata_received
@call.metadata = batch_result.metadata @call.metadata = batch_result.metadata
@metadata_tag = nil @metadata_received = true
end end
batch_result batch_result
end end
@ -161,20 +155,26 @@ module GRPC
def write_loop(requests, is_client: true) def write_loop(requests, is_client: true)
GRPC.logger.debug('bidi-write-loop: starting') GRPC.logger.debug('bidi-write-loop: starting')
write_tag = Object.new
count = 0 count = 0
requests.each do |req| requests.each do |req|
GRPC.logger.debug("bidi-write-loop: #{count}") GRPC.logger.debug("bidi-write-loop: #{count}")
count += 1 count += 1
payload = @marshal.call(req) payload = @marshal.call(req)
@call.run_batch(@cq, write_tag, INFINITE_FUTURE, # Fails if status already received
SEND_MESSAGE => payload) begin
@call.run_batch(SEND_MESSAGE => payload)
rescue GRPC::Core::CallError => e
# This is almost definitely caused by a status arriving while still
# writing. Don't re-throw the error
GRPC.logger.warn('bidi-write-loop: ended with error')
GRPC.logger.warn(e)
break
end
end end
GRPC.logger.debug("bidi-write-loop: #{count} writes done") GRPC.logger.debug("bidi-write-loop: #{count} writes done")
if is_client if is_client
GRPC.logger.debug("bidi-write-loop: client sent #{count}, waiting") GRPC.logger.debug("bidi-write-loop: client sent #{count}, waiting")
@call.run_batch(@cq, write_tag, INFINITE_FUTURE, @call.run_batch(SEND_CLOSE_FROM_CLIENT => nil)
SEND_CLOSE_FROM_CLIENT => nil)
GRPC.logger.debug('bidi-write-loop: done') GRPC.logger.debug('bidi-write-loop: done')
notify_done notify_done
@writes_complete = true @writes_complete = true
@ -195,7 +195,6 @@ module GRPC
Thread.new do Thread.new do
GRPC.logger.debug('bidi-read-loop: starting') GRPC.logger.debug('bidi-read-loop: starting')
begin begin
read_tag = Object.new
count = 0 count = 0
# queue the initial read before beginning the loop # queue the initial read before beginning the loop
loop do loop do
@ -208,8 +207,7 @@ module GRPC
GRPC.logger.debug("bidi-read-loop: null batch #{batch_result}") GRPC.logger.debug("bidi-read-loop: null batch #{batch_result}")
if is_client if is_client
batch_result = @call.run_batch(@cq, read_tag, INFINITE_FUTURE, batch_result = @call.run_batch(RECV_STATUS_ON_CLIENT => nil)
RECV_STATUS_ON_CLIENT => nil)
@call.status = batch_result.status @call.status = batch_result.status
batch_result.check_status batch_result.check_status
GRPC.logger.debug("bidi-read-loop: done status #{@call.status}") GRPC.logger.debug("bidi-read-loop: done status #{@call.status}")

@ -90,19 +90,16 @@ module GRPC
# when present, this is the default timeout used for calls # when present, this is the default timeout used for calls
# #
# @param host [String] the host the stub connects to # @param host [String] the host the stub connects to
# @param q [Core::CompletionQueue] used to wait for events - now deprecated
# since each new active call gets its own separately
# @param creds [Core::ChannelCredentials|Symbol] the channel credentials, or # @param creds [Core::ChannelCredentials|Symbol] the channel credentials, or
# :this_channel_is_insecure # :this_channel_is_insecure
# @param channel_override [Core::Channel] a pre-created channel # @param channel_override [Core::Channel] a pre-created channel
# @param timeout [Number] the default timeout to use in requests # @param timeout [Number] the default timeout to use in requests
# @param channel_args [Hash] the channel arguments # @param channel_args [Hash] the channel arguments
def initialize(host, q, creds, def initialize(host, creds,
channel_override: nil, channel_override: nil,
timeout: nil, timeout: nil,
propagate_mask: nil, propagate_mask: nil,
channel_args: {}) channel_args: {})
fail(TypeError, '!CompletionQueue') unless q.is_a?(Core::CompletionQueue)
@ch = ClientStub.setup_channel(channel_override, host, creds, @ch = ClientStub.setup_channel(channel_override, host, creds,
channel_args) channel_args)
alt_host = channel_args[Core::Channel::SSL_TARGET] alt_host = channel_args[Core::Channel::SSL_TARGET]
@ -441,15 +438,13 @@ module GRPC
deadline = from_relative_time(@timeout) if deadline.nil? deadline = from_relative_time(@timeout) if deadline.nil?
# Provide each new client call with its own completion queue # Provide each new client call with its own completion queue
call_queue = Core::CompletionQueue.new call = @ch.create_call(parent, # parent call
call = @ch.create_call(call_queue,
parent, # parent call
@propagate_mask, # propagation options @propagate_mask, # propagation options
method, method,
nil, # host use nil, nil, # host use nil,
deadline) deadline)
call.set_credentials! credentials unless credentials.nil? call.set_credentials! credentials unless credentials.nil?
ActiveCall.new(call, call_queue, marshal, unmarshal, deadline, ActiveCall.new(call, marshal, unmarshal, deadline,
started: false) started: false)
end end
end end

@ -159,16 +159,6 @@ module GRPC
# Signal check period is 0.25s # Signal check period is 0.25s
SIGNAL_CHECK_PERIOD = 0.25 SIGNAL_CHECK_PERIOD = 0.25
# setup_cq is used by #initialize to constuct a Core::CompletionQueue from
# its arguments.
def self.setup_cq(alt_cq)
return Core::CompletionQueue.new if alt_cq.nil?
unless alt_cq.is_a? Core::CompletionQueue
fail(TypeError, '!CompletionQueue')
end
alt_cq
end
# setup_connect_md_proc is used by #initialize to validate the # setup_connect_md_proc is used by #initialize to validate the
# connect_md_proc. # connect_md_proc.
def self.setup_connect_md_proc(a_proc) def self.setup_connect_md_proc(a_proc)
@ -191,10 +181,6 @@ module GRPC
# * pool_size: the size of the thread pool the server uses to run its # * pool_size: the size of the thread pool the server uses to run its
# threads # threads
# #
# * completion_queue_override: when supplied, this will be used as the
# completion_queue that the server uses to receive network events,
# otherwise its creates a new instance itself
#
# * creds: [GRPC::Core::ServerCredentials] # * creds: [GRPC::Core::ServerCredentials]
# the credentials used to secure the server # the credentials used to secure the server
# #
@ -212,11 +198,9 @@ module GRPC
def initialize(pool_size:DEFAULT_POOL_SIZE, def initialize(pool_size:DEFAULT_POOL_SIZE,
max_waiting_requests:DEFAULT_MAX_WAITING_REQUESTS, max_waiting_requests:DEFAULT_MAX_WAITING_REQUESTS,
poll_period:DEFAULT_POLL_PERIOD, poll_period:DEFAULT_POLL_PERIOD,
completion_queue_override:nil,
connect_md_proc:nil, connect_md_proc:nil,
server_args:{}) server_args:{})
@connect_md_proc = RpcServer.setup_connect_md_proc(connect_md_proc) @connect_md_proc = RpcServer.setup_connect_md_proc(connect_md_proc)
@cq = RpcServer.setup_cq(completion_queue_override)
@max_waiting_requests = max_waiting_requests @max_waiting_requests = max_waiting_requests
@poll_period = poll_period @poll_period = poll_period
@pool_size = pool_size @pool_size = pool_size
@ -226,7 +210,7 @@ module GRPC
# running_state can take 4 values: :not_started, :running, :stopping, and # running_state can take 4 values: :not_started, :running, :stopping, and
# :stopped. State transitions can only proceed in that order. # :stopped. State transitions can only proceed in that order.
@running_state = :not_started @running_state = :not_started
@server = Core::Server.new(@cq, server_args) @server = Core::Server.new(server_args)
end end
# stops a running server # stops a running server
@ -240,7 +224,7 @@ module GRPC
transition_running_state(:stopping) transition_running_state(:stopping)
end end
deadline = from_relative_time(@poll_period) deadline = from_relative_time(@poll_period)
@server.close(@cq, deadline) @server.close(deadline)
@pool.stop @pool.stop
end end
@ -355,7 +339,8 @@ module GRPC
return an_rpc if @pool.jobs_waiting <= @max_waiting_requests return an_rpc if @pool.jobs_waiting <= @max_waiting_requests
GRPC.logger.warn("NOT AVAILABLE: too many jobs_waiting: #{an_rpc}") GRPC.logger.warn("NOT AVAILABLE: too many jobs_waiting: #{an_rpc}")
noop = proc { |x| x } noop = proc { |x| x }
c = ActiveCall.new(an_rpc.call, an_rpc.cq, noop, noop, an_rpc.deadline) c = ActiveCall.new(an_rpc.call, noop, noop, an_rpc.deadline,
metadata_received: true)
c.send_status(GRPC::Core::StatusCodes::RESOURCE_EXHAUSTED, '') c.send_status(GRPC::Core::StatusCodes::RESOURCE_EXHAUSTED, '')
nil nil
end end
@ -366,7 +351,8 @@ module GRPC
return an_rpc if rpc_descs.key?(mth) return an_rpc if rpc_descs.key?(mth)
GRPC.logger.warn("UNIMPLEMENTED: #{an_rpc}") GRPC.logger.warn("UNIMPLEMENTED: #{an_rpc}")
noop = proc { |x| x } noop = proc { |x| x }
c = ActiveCall.new(an_rpc.call, an_rpc.cq, noop, noop, an_rpc.deadline) c = ActiveCall.new(an_rpc.call, noop, noop, an_rpc.deadline,
metadata_received: true)
c.send_status(GRPC::Core::StatusCodes::UNIMPLEMENTED, '') c.send_status(GRPC::Core::StatusCodes::UNIMPLEMENTED, '')
nil nil
end end
@ -374,11 +360,9 @@ module GRPC
# handles calls to the server # handles calls to the server
def loop_handle_server_calls def loop_handle_server_calls
fail 'not started' if running_state == :not_started fail 'not started' if running_state == :not_started
loop_tag = Object.new
while running_state == :running while running_state == :running
begin begin
comp_queue = Core::CompletionQueue.new an_rpc = @server.request_call
an_rpc = @server.request_call(comp_queue, loop_tag, INFINITE_FUTURE)
break if (!an_rpc.nil?) && an_rpc.call.nil? break if (!an_rpc.nil?) && an_rpc.call.nil?
active_call = new_active_server_call(an_rpc) active_call = new_active_server_call(an_rpc)
unless active_call.nil? unless active_call.nil?
@ -410,15 +394,13 @@ module GRPC
return nil if an_rpc.nil? || an_rpc.call.nil? return nil if an_rpc.nil? || an_rpc.call.nil?
# allow the metadata to be accessed from the call # allow the metadata to be accessed from the call
handle_call_tag = Object.new
an_rpc.call.metadata = an_rpc.metadata # attaches md to call for handlers an_rpc.call.metadata = an_rpc.metadata # attaches md to call for handlers
GRPC.logger.debug("call md is #{an_rpc.metadata}") GRPC.logger.debug("call md is #{an_rpc.metadata}")
connect_md = nil connect_md = nil
unless @connect_md_proc.nil? unless @connect_md_proc.nil?
connect_md = @connect_md_proc.call(an_rpc.method, an_rpc.metadata) connect_md = @connect_md_proc.call(an_rpc.method, an_rpc.metadata)
end end
an_rpc.call.run_batch(an_rpc.cq, handle_call_tag, INFINITE_FUTURE, an_rpc.call.run_batch(SEND_INITIAL_METADATA => connect_md)
SEND_INITIAL_METADATA => connect_md)
return nil unless available?(an_rpc) return nil unless available?(an_rpc)
return nil unless implemented?(an_rpc) return nil unless implemented?(an_rpc)
@ -426,9 +408,9 @@ module GRPC
# Create the ActiveCall # Create the ActiveCall
GRPC.logger.info("deadline is #{an_rpc.deadline}; (now=#{Time.now})") GRPC.logger.info("deadline is #{an_rpc.deadline}; (now=#{Time.now})")
rpc_desc = rpc_descs[an_rpc.method.to_sym] rpc_desc = rpc_descs[an_rpc.method.to_sym]
c = ActiveCall.new(an_rpc.call, an_rpc.cq, c = ActiveCall.new(an_rpc.call, rpc_desc.marshal_proc,
rpc_desc.marshal_proc, rpc_desc.unmarshal_proc(:input), rpc_desc.unmarshal_proc(:input), an_rpc.deadline,
an_rpc.deadline) metadata_received: true)
mth = an_rpc.method.to_sym mth = an_rpc.method.to_sym
[c, mth] [c, mth]
end end

@ -168,7 +168,7 @@ module GRPC
# @param kw [KeywordArgs] the channel arguments, plus any optional # @param kw [KeywordArgs] the channel arguments, plus any optional
# args for configuring the client's channel # args for configuring the client's channel
def initialize(host, creds, **kw) def initialize(host, creds, **kw)
super(host, Core::CompletionQueue.new, creds, **kw) super(host, creds, **kw)
end end
# Used define_method to add a method for each rpc_desc. Each method # Used define_method to add a method for each rpc_desc. Each method

@ -197,6 +197,25 @@ class PingPongPlayer
end end
end end
class BlockingEnumerator
include Grpc::Testing
include Grpc::Testing::PayloadType
def initialize(req_size, sleep_time)
@req_size = req_size
@sleep_time = sleep_time
end
def each_item
return enum_for(:each_item) unless block_given?
req_cls = StreamingOutputCallRequest
req = req_cls.new(payload: Payload.new(body: nulls(@req_size)))
yield req
# Sleep until after the deadline should have passed
sleep(@sleep_time)
end
end
# defines methods corresponding to each interop test case. # defines methods corresponding to each interop test case.
class NamedTests class NamedTests
include Grpc::Testing include Grpc::Testing
@ -315,11 +334,10 @@ class NamedTests
end end
def timeout_on_sleeping_server def timeout_on_sleeping_server
msg_sizes = [[27_182, 31_415]] enum = BlockingEnumerator.new(27_182, 2)
ppp = PingPongPlayer.new(msg_sizes) deadline = GRPC::Core::TimeConsts::from_relative_time(1)
deadline = GRPC::Core::TimeConsts::from_relative_time(0.001) resps = @stub.full_duplex_call(enum.each_item, deadline: deadline)
resps = @stub.full_duplex_call(ppp.each_item, deadline: deadline) resps.each { } # wait to receive each request (or timeout)
resps.each { |r| ppp.queue.push(r) }
fail 'Should have raised GRPC::BadStatus(DEADLINE_EXCEEDED)' fail 'Should have raised GRPC::BadStatus(DEADLINE_EXCEEDED)'
rescue GRPC::BadStatus => e rescue GRPC::BadStatus => e
assert("#{__callee__}: status was wrong") do assert("#{__callee__}: status was wrong") do

@ -188,11 +188,13 @@ class TestTarget < Grpc::Testing::TestService::Service
begin begin
GRPC.logger.info('interop-server: started receiving') GRPC.logger.info('interop-server: started receiving')
reqs.each do |req| reqs.each do |req|
resp_size = req.response_parameters[0].size req.response_parameters.each do |params|
GRPC.logger.info("read a req, response size is #{resp_size}") resp_size = params.size
resp = cls.new(payload: Payload.new(type: req.response_type, GRPC.logger.info("read a req, response size is #{resp_size}")
body: nulls(resp_size))) resp = cls.new(payload: Payload.new(type: req.response_type,
q.push(resp) body: nulls(resp_size)))
q.push(resp)
end
end end
GRPC.logger.info('interop-server: finished receiving') GRPC.logger.info('interop-server: finished receiving')
q.push(self) q.push(self)

@ -96,7 +96,6 @@ describe GRPC::Core::CallOps do
end end
describe GRPC::Core::Call do describe GRPC::Core::Call do
let(:client_queue) { GRPC::Core::CompletionQueue.new }
let(:test_tag) { Object.new } let(:test_tag) { Object.new }
let(:fake_host) { 'localhost:10101' } let(:fake_host) { 'localhost:10101' }
@ -154,7 +153,7 @@ describe GRPC::Core::Call do
end end
def make_test_call def make_test_call
@ch.create_call(client_queue, nil, nil, 'dummy_method', nil, deadline) @ch.create_call(nil, nil, 'dummy_method', nil, deadline)
end end
def deadline def deadline

@ -37,7 +37,6 @@ end
describe GRPC::Core::Channel do describe GRPC::Core::Channel do
let(:fake_host) { 'localhost:0' } let(:fake_host) { 'localhost:0' }
let(:cq) { GRPC::Core::CompletionQueue.new }
def create_test_cert def create_test_cert
GRPC::Core::ChannelCredentials.new(load_test_certs[0]) GRPC::Core::ChannelCredentials.new(load_test_certs[0])
@ -122,7 +121,7 @@ describe GRPC::Core::Channel do
deadline = Time.now + 5 deadline = Time.now + 5
blk = proc do blk = proc do
ch.create_call(cq, nil, nil, 'dummy_method', nil, deadline) ch.create_call(nil, nil, 'dummy_method', nil, deadline)
end end
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
end end
@ -133,7 +132,7 @@ describe GRPC::Core::Channel do
deadline = Time.now + 5 deadline = Time.now + 5
blk = proc do blk = proc do
ch.create_call(cq, nil, nil, 'dummy_method', nil, deadline) ch.create_call(nil, nil, 'dummy_method', nil, deadline)
end end
expect(&blk).to raise_error(RuntimeError) expect(&blk).to raise_error(RuntimeError)
end end

@ -34,27 +34,23 @@ include GRPC::Core
shared_context 'setup: tags' do shared_context 'setup: tags' do
let(:sent_message) { 'sent message' } let(:sent_message) { 'sent message' }
let(:reply_text) { 'the reply' } let(:reply_text) { 'the reply' }
before(:example) do
@client_tag = Object.new
@server_tag = Object.new
end
def deadline def deadline
Time.now + 5 Time.now + 5
end end
def server_allows_client_to_proceed(metadata = {}) def server_allows_client_to_proceed(metadata = {})
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
expect(recvd_rpc).to_not eq nil expect(recvd_rpc).to_not eq nil
server_call = recvd_rpc.call server_call = recvd_rpc.call
ops = { CallOps::SEND_INITIAL_METADATA => metadata } ops = { CallOps::SEND_INITIAL_METADATA => metadata }
svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline, ops) svr_batch = server_call.run_batch(ops)
expect(svr_batch.send_metadata).to be true expect(svr_batch.send_metadata).to be true
server_call server_call
end end
def new_client_call def new_client_call
@ch.create_call(@client_queue, nil, nil, '/method', nil, deadline) @ch.create_call(nil, nil, '/method', nil, deadline)
end end
end end
@ -91,8 +87,7 @@ shared_examples 'basic GRPC message delivery is OK' do
CallOps::SEND_INITIAL_METADATA => {}, CallOps::SEND_INITIAL_METADATA => {},
CallOps::SEND_MESSAGE => sent_message CallOps::SEND_MESSAGE => sent_message
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
expect(batch_result.send_metadata).to be true expect(batch_result.send_metadata).to be true
expect(batch_result.send_message).to be true expect(batch_result.send_message).to be true
@ -101,8 +96,7 @@ shared_examples 'basic GRPC message delivery is OK' do
server_ops = { server_ops = {
CallOps::RECV_MESSAGE => nil CallOps::RECV_MESSAGE => nil
} }
svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline, svr_batch = server_call.run_batch(server_ops)
server_ops)
expect(svr_batch.message).to eq(sent_message) expect(svr_batch.message).to eq(sent_message)
end end
@ -118,8 +112,7 @@ shared_examples 'basic GRPC message delivery is OK' do
CallOps::SEND_INITIAL_METADATA => {}, CallOps::SEND_INITIAL_METADATA => {},
CallOps::SEND_MESSAGE => sent_message CallOps::SEND_MESSAGE => sent_message
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
expect(batch_result.send_metadata).to be true expect(batch_result.send_metadata).to be true
expect(batch_result.send_message).to be true expect(batch_result.send_message).to be true
@ -129,8 +122,7 @@ shared_examples 'basic GRPC message delivery is OK' do
CallOps::RECV_MESSAGE => nil, CallOps::RECV_MESSAGE => nil,
CallOps::SEND_MESSAGE => reply_text CallOps::SEND_MESSAGE => reply_text
} }
svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline, svr_batch = server_call.run_batch(server_ops)
server_ops)
expect(svr_batch.message).to eq(sent_message) expect(svr_batch.message).to eq(sent_message)
expect(svr_batch.send_message).to be true expect(svr_batch.send_message).to be true
end end
@ -150,8 +142,7 @@ shared_examples 'basic GRPC message delivery is OK' do
CallOps::SEND_INITIAL_METADATA => md, CallOps::SEND_INITIAL_METADATA => md,
CallOps::SEND_MESSAGE => long_request_str CallOps::SEND_MESSAGE => long_request_str
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
expect(batch_result.send_metadata).to be true expect(batch_result.send_metadata).to be true
expect(batch_result.send_message).to be true expect(batch_result.send_message).to be true
@ -161,8 +152,7 @@ shared_examples 'basic GRPC message delivery is OK' do
CallOps::RECV_MESSAGE => nil, CallOps::RECV_MESSAGE => nil,
CallOps::SEND_MESSAGE => long_response_str CallOps::SEND_MESSAGE => long_response_str
} }
svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline, svr_batch = server_call.run_batch(server_ops)
server_ops)
expect(svr_batch.message).to eq(long_request_str) expect(svr_batch.message).to eq(long_request_str)
expect(svr_batch.send_message).to be true expect(svr_batch.send_message).to be true
@ -171,8 +161,7 @@ shared_examples 'basic GRPC message delivery is OK' do
CallOps::RECV_INITIAL_METADATA => nil, CallOps::RECV_INITIAL_METADATA => nil,
CallOps::RECV_MESSAGE => nil CallOps::RECV_MESSAGE => nil
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
expect(batch_result.send_close).to be true expect(batch_result.send_close).to be true
expect(batch_result.message).to eq long_response_str expect(batch_result.message).to eq long_response_str
end end
@ -189,8 +178,7 @@ shared_examples 'basic GRPC message delivery is OK' do
CallOps::SEND_INITIAL_METADATA => {}, CallOps::SEND_INITIAL_METADATA => {},
CallOps::SEND_MESSAGE => sent_message CallOps::SEND_MESSAGE => sent_message
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
expect(batch_result.send_metadata).to be true expect(batch_result.send_metadata).to be true
expect(batch_result.send_message).to be true expect(batch_result.send_message).to be true
@ -200,8 +188,7 @@ shared_examples 'basic GRPC message delivery is OK' do
server_ops = { server_ops = {
CallOps::SEND_STATUS_FROM_SERVER => the_status CallOps::SEND_STATUS_FROM_SERVER => the_status
} }
svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline, svr_batch = server_call.run_batch(server_ops)
server_ops)
expect(svr_batch.message).to eq nil expect(svr_batch.message).to eq nil
expect(svr_batch.send_status).to be true expect(svr_batch.send_status).to be true
end end
@ -218,8 +205,7 @@ shared_examples 'basic GRPC message delivery is OK' do
CallOps::SEND_INITIAL_METADATA => {}, CallOps::SEND_INITIAL_METADATA => {},
CallOps::SEND_MESSAGE => sent_message CallOps::SEND_MESSAGE => sent_message
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
expect(batch_result.send_metadata).to be true expect(batch_result.send_metadata).to be true
expect(batch_result.send_message).to be true expect(batch_result.send_message).to be true
@ -231,8 +217,7 @@ shared_examples 'basic GRPC message delivery is OK' do
CallOps::SEND_MESSAGE => reply_text, CallOps::SEND_MESSAGE => reply_text,
CallOps::SEND_STATUS_FROM_SERVER => the_status CallOps::SEND_STATUS_FROM_SERVER => the_status
} }
svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline, svr_batch = server_call.run_batch(server_ops)
server_ops)
expect(svr_batch.message).to eq sent_message expect(svr_batch.message).to eq sent_message
expect(svr_batch.send_status).to be true expect(svr_batch.send_status).to be true
expect(svr_batch.send_message).to be true expect(svr_batch.send_message).to be true
@ -244,8 +229,7 @@ shared_examples 'basic GRPC message delivery is OK' do
CallOps::RECV_MESSAGE => nil, CallOps::RECV_MESSAGE => nil,
CallOps::RECV_STATUS_ON_CLIENT => nil CallOps::RECV_STATUS_ON_CLIENT => nil
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
expect(batch_result.send_close).to be true expect(batch_result.send_close).to be true
expect(batch_result.message).to eq reply_text expect(batch_result.message).to eq reply_text
expect(batch_result.status).to eq the_status expect(batch_result.status).to eq the_status
@ -254,8 +238,7 @@ shared_examples 'basic GRPC message delivery is OK' do
server_ops = { server_ops = {
CallOps::RECV_CLOSE_ON_SERVER => nil CallOps::RECV_CLOSE_ON_SERVER => nil
} }
svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline, svr_batch = server_call.run_batch(server_ops)
server_ops)
expect(svr_batch.send_close).to be true expect(svr_batch.send_close).to be true
end end
end end
@ -286,8 +269,7 @@ shared_examples 'GRPC metadata delivery works OK' do
CallOps::SEND_INITIAL_METADATA => md CallOps::SEND_INITIAL_METADATA => md
} }
blk = proc do blk = proc do
call.run_batch(@client_queue, @client_tag, deadline, call.run_batch(client_ops)
client_ops)
end end
expect(&blk).to raise_error expect(&blk).to raise_error
end end
@ -297,15 +279,14 @@ shared_examples 'GRPC metadata delivery works OK' do
@valid_metadata.each do |md| @valid_metadata.each do |md|
recvd_rpc = nil recvd_rpc = nil
rcv_thread = Thread.new do rcv_thread = Thread.new do
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
end end
call = new_client_call call = new_client_call
client_ops = { client_ops = {
CallOps::SEND_INITIAL_METADATA => md CallOps::SEND_INITIAL_METADATA => md
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
expect(batch_result.send_metadata).to be true expect(batch_result.send_metadata).to be true
# confirm the server can receive the client metadata # confirm the server can receive the client metadata
@ -338,7 +319,7 @@ shared_examples 'GRPC metadata delivery works OK' do
@bad_keys.each do |md| @bad_keys.each do |md|
recvd_rpc = nil recvd_rpc = nil
rcv_thread = Thread.new do rcv_thread = Thread.new do
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
end end
call = new_client_call call = new_client_call
@ -347,7 +328,7 @@ shared_examples 'GRPC metadata delivery works OK' do
client_ops = { client_ops = {
CallOps::SEND_INITIAL_METADATA => nil CallOps::SEND_INITIAL_METADATA => nil
} }
call.run_batch(@client_queue, @client_tag, deadline, client_ops) call.run_batch(client_ops)
# server gets the invocation # server gets the invocation
rcv_thread.join rcv_thread.join
@ -356,8 +337,7 @@ shared_examples 'GRPC metadata delivery works OK' do
CallOps::SEND_INITIAL_METADATA => md CallOps::SEND_INITIAL_METADATA => md
} }
blk = proc do blk = proc do
recvd_rpc.call.run_batch(@server_queue, @server_tag, deadline, recvd_rpc.call.run_batch(server_ops)
server_ops)
end end
expect(&blk).to raise_error expect(&blk).to raise_error
end end
@ -366,7 +346,7 @@ shared_examples 'GRPC metadata delivery works OK' do
it 'sends an empty hash if no metadata is added' do it 'sends an empty hash if no metadata is added' do
recvd_rpc = nil recvd_rpc = nil
rcv_thread = Thread.new do rcv_thread = Thread.new do
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
end end
call = new_client_call call = new_client_call
@ -375,7 +355,7 @@ shared_examples 'GRPC metadata delivery works OK' do
client_ops = { client_ops = {
CallOps::SEND_INITIAL_METADATA => nil CallOps::SEND_INITIAL_METADATA => nil
} }
call.run_batch(@client_queue, @client_tag, deadline, client_ops) call.run_batch(client_ops)
# server gets the invocation but sends no metadata back # server gets the invocation but sends no metadata back
rcv_thread.join rcv_thread.join
@ -384,14 +364,13 @@ shared_examples 'GRPC metadata delivery works OK' do
server_ops = { server_ops = {
CallOps::SEND_INITIAL_METADATA => nil CallOps::SEND_INITIAL_METADATA => nil
} }
server_call.run_batch(@server_queue, @server_tag, deadline, server_ops) server_call.run_batch(server_ops)
# client receives nothing as expected # client receives nothing as expected
client_ops = { client_ops = {
CallOps::RECV_INITIAL_METADATA => nil CallOps::RECV_INITIAL_METADATA => nil
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
expect(batch_result.metadata).to eq({}) expect(batch_result.metadata).to eq({})
end end
@ -399,7 +378,7 @@ shared_examples 'GRPC metadata delivery works OK' do
@valid_metadata.each do |md| @valid_metadata.each do |md|
recvd_rpc = nil recvd_rpc = nil
rcv_thread = Thread.new do rcv_thread = Thread.new do
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
end end
call = new_client_call call = new_client_call
@ -408,7 +387,7 @@ shared_examples 'GRPC metadata delivery works OK' do
client_ops = { client_ops = {
CallOps::SEND_INITIAL_METADATA => nil CallOps::SEND_INITIAL_METADATA => nil
} }
call.run_batch(@client_queue, @client_tag, deadline, client_ops) call.run_batch(client_ops)
# server gets the invocation but sends no metadata back # server gets the invocation but sends no metadata back
rcv_thread.join rcv_thread.join
@ -417,14 +396,13 @@ shared_examples 'GRPC metadata delivery works OK' do
server_ops = { server_ops = {
CallOps::SEND_INITIAL_METADATA => md CallOps::SEND_INITIAL_METADATA => md
} }
server_call.run_batch(@server_queue, @server_tag, deadline, server_ops) server_call.run_batch(server_ops)
# client receives nothing as expected # client receives nothing as expected
client_ops = { client_ops = {
CallOps::RECV_INITIAL_METADATA => nil CallOps::RECV_INITIAL_METADATA => nil
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
replace_symbols = Hash[md.each_pair.collect { |x, y| [x.to_s, y] }] replace_symbols = Hash[md.each_pair.collect { |x, y| [x.to_s, y] }]
expect(batch_result.metadata).to eq(replace_symbols) expect(batch_result.metadata).to eq(replace_symbols)
end end
@ -435,9 +413,7 @@ end
describe 'the http client/server' do describe 'the http client/server' do
before(:example) do before(:example) do
server_host = '0.0.0.0:0' server_host = '0.0.0.0:0'
@client_queue = GRPC::Core::CompletionQueue.new @server = GRPC::Core::Server.new(nil)
@server_queue = GRPC::Core::CompletionQueue.new
@server = GRPC::Core::Server.new(@server_queue, nil)
server_port = @server.add_http2_port(server_host, :this_port_is_insecure) server_port = @server.add_http2_port(server_host, :this_port_is_insecure)
@server.start @server.start
@ch = Channel.new("0.0.0.0:#{server_port}", nil, :this_channel_is_insecure) @ch = Channel.new("0.0.0.0:#{server_port}", nil, :this_channel_is_insecure)
@ -445,7 +421,7 @@ describe 'the http client/server' do
after(:example) do after(:example) do
@ch.close @ch.close
@server.close(@server_queue, deadline) @server.close(deadline)
end end
it_behaves_like 'basic GRPC message delivery is OK' do it_behaves_like 'basic GRPC message delivery is OK' do
@ -467,11 +443,9 @@ describe 'the secure http client/server' do
before(:example) do before(:example) do
certs = load_test_certs certs = load_test_certs
server_host = '0.0.0.0:0' server_host = '0.0.0.0:0'
@client_queue = GRPC::Core::CompletionQueue.new
@server_queue = GRPC::Core::CompletionQueue.new
server_creds = GRPC::Core::ServerCredentials.new( server_creds = GRPC::Core::ServerCredentials.new(
nil, [{ private_key: certs[1], cert_chain: certs[2] }], false) nil, [{ private_key: certs[1], cert_chain: certs[2] }], false)
@server = GRPC::Core::Server.new(@server_queue, nil) @server = GRPC::Core::Server.new(nil)
server_port = @server.add_http2_port(server_host, server_creds) server_port = @server.add_http2_port(server_host, server_creds)
@server.start @server.start
args = { Channel::SSL_TARGET => 'foo.test.google.fr' } args = { Channel::SSL_TARGET => 'foo.test.google.fr' }
@ -480,7 +454,7 @@ describe 'the secure http client/server' do
end end
after(:example) do after(:example) do
@server.close(@server_queue, deadline) @server.close(deadline)
end end
it_behaves_like 'basic GRPC message delivery is OK' do it_behaves_like 'basic GRPC message delivery is OK' do
@ -496,7 +470,7 @@ describe 'the secure http client/server' do
expected_md = { 'k1' => 'updated-v1', 'k2' => 'v2' } expected_md = { 'k1' => 'updated-v1', 'k2' => 'v2' }
recvd_rpc = nil recvd_rpc = nil
rcv_thread = Thread.new do rcv_thread = Thread.new do
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
end end
call = new_client_call call = new_client_call
@ -504,8 +478,7 @@ describe 'the secure http client/server' do
client_ops = { client_ops = {
CallOps::SEND_INITIAL_METADATA => md CallOps::SEND_INITIAL_METADATA => md
} }
batch_result = call.run_batch(@client_queue, @client_tag, deadline, batch_result = call.run_batch(client_ops)
client_ops)
expect(batch_result.send_metadata).to be true expect(batch_result.send_metadata).to be true
# confirm the server can receive the client metadata # confirm the server can receive the client metadata

@ -1,42 +0,0 @@
# Copyright 2015, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
require 'grpc'
describe GRPC::Core::CompletionQueue do
before(:example) do
@cq = GRPC::Core::CompletionQueue.new
end
describe '#new' do
it 'is constructed successufully' do
expect { GRPC::Core::CompletionQueue.new }.not_to raise_error
end
end
end

@ -39,13 +39,8 @@ describe GRPC::ActiveCall do
before(:each) do before(:each) do
@pass_through = proc { |x| x } @pass_through = proc { |x| x }
@server_tag = Object.new
@tag = Object.new
@client_queue = GRPC::Core::CompletionQueue.new
@server_queue = GRPC::Core::CompletionQueue.new
host = '0.0.0.0:0' host = '0.0.0.0:0'
@server = GRPC::Core::Server.new(@server_queue, nil) @server = GRPC::Core::Server.new(nil)
server_port = @server.add_http2_port(host, :this_port_is_insecure) server_port = @server.add_http2_port(host, :this_port_is_insecure)
@server.start @server.start
@ch = GRPC::Core::Channel.new("0.0.0.0:#{server_port}", nil, @ch = GRPC::Core::Channel.new("0.0.0.0:#{server_port}", nil,
@ -53,16 +48,15 @@ describe GRPC::ActiveCall do
end end
after(:each) do after(:each) do
@server.close(@server_queue, deadline) @server.close(deadline)
end end
describe 'restricted view methods' do describe 'restricted view methods' do
before(:each) do before(:each) do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
@client_call = ActiveCall.new(call, @client_queue, @pass_through, @client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
end end
describe '#multi_req_view' do describe '#multi_req_view' do
@ -89,46 +83,42 @@ describe GRPC::ActiveCall do
describe '#remote_send' do describe '#remote_send' do
it 'allows a client to send a payload to the server' do it 'allows a client to send a payload to the server' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
@client_call = ActiveCall.new(call, @client_queue, @pass_through, @client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
msg = 'message is a string' msg = 'message is a string'
@client_call.remote_send(msg) @client_call.remote_send(msg)
# check that server rpc new was received # check that server rpc new was received
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
expect(recvd_rpc).to_not eq nil expect(recvd_rpc).to_not eq nil
recvd_call = recvd_rpc.call recvd_call = recvd_rpc.call
# Accept the call, and verify that the server reads the response ok. # Accept the call, and verify that the server reads the response ok.
server_ops = { server_call = ActiveCall.new(recvd_call, @pass_through,
CallOps::SEND_INITIAL_METADATA => {} @pass_through, deadline,
} metadata_received: true)
recvd_call.run_batch(@server_queue, @server_tag, deadline, server_ops)
server_call = ActiveCall.new(recvd_call, @server_queue, @pass_through,
@pass_through, deadline)
expect(server_call.remote_read).to eq(msg) expect(server_call.remote_read).to eq(msg)
end end
it 'marshals the payload using the marshal func' do it 'marshals the payload using the marshal func' do
call = make_test_call call = make_test_call
ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
marshal = proc { |x| 'marshalled:' + x } marshal = proc { |x| 'marshalled:' + x }
client_call = ActiveCall.new(call, @client_queue, marshal, client_call = ActiveCall.new(call, marshal, @pass_through, deadline)
@pass_through, deadline)
msg = 'message is a string' msg = 'message is a string'
client_call.remote_send(msg) client_call.remote_send(msg)
# confirm that the message was marshalled # confirm that the message was marshalled
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
recvd_call = recvd_rpc.call recvd_call = recvd_rpc.call
server_ops = { server_ops = {
CallOps::SEND_INITIAL_METADATA => nil CallOps::SEND_INITIAL_METADATA => nil
} }
recvd_call.run_batch(@server_queue, @server_tag, deadline, server_ops) recvd_call.run_batch(server_ops)
server_call = ActiveCall.new(recvd_call, @server_queue, @pass_through, server_call = ActiveCall.new(recvd_call, @pass_through,
@pass_through, deadline) @pass_through, deadline,
metadata_received: true)
expect(server_call.remote_read).to eq('marshalled:' + msg) expect(server_call.remote_read).to eq('marshalled:' + msg)
end end
@ -136,23 +126,24 @@ describe GRPC::ActiveCall do
TEST_WRITE_FLAGS.each do |f| TEST_WRITE_FLAGS.each do |f|
it "successfully makes calls with write_flag set to #{f}" do it "successfully makes calls with write_flag set to #{f}" do
call = make_test_call call = make_test_call
ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
marshal = proc { |x| 'marshalled:' + x } marshal = proc { |x| 'marshalled:' + x }
client_call = ActiveCall.new(call, @client_queue, marshal, client_call = ActiveCall.new(call, marshal,
@pass_through, deadline) @pass_through, deadline)
msg = 'message is a string' msg = 'message is a string'
client_call.write_flag = f client_call.write_flag = f
client_call.remote_send(msg) client_call.remote_send(msg)
# confirm that the message was marshalled # confirm that the message was marshalled
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
recvd_call = recvd_rpc.call recvd_call = recvd_rpc.call
server_ops = { server_ops = {
CallOps::SEND_INITIAL_METADATA => nil CallOps::SEND_INITIAL_METADATA => nil
} }
recvd_call.run_batch(@server_queue, @server_tag, deadline, server_ops) recvd_call.run_batch(server_ops)
server_call = ActiveCall.new(recvd_call, @server_queue, @pass_through, server_call = ActiveCall.new(recvd_call, @pass_through,
@pass_through, deadline) @pass_through, deadline,
metadata_received: true)
expect(server_call.remote_read).to eq('marshalled:' + msg) expect(server_call.remote_read).to eq('marshalled:' + msg)
end end
end end
@ -162,8 +153,8 @@ describe GRPC::ActiveCall do
it 'sends metadata to the server when present' do it 'sends metadata to the server when present' do
call = make_test_call call = make_test_call
metadata = { k1: 'v1', k2: 'v2' } metadata = { k1: 'v1', k2: 'v2' }
ActiveCall.client_invoke(call, @client_queue, metadata) ActiveCall.client_invoke(call, metadata)
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
recvd_call = recvd_rpc.call recvd_call = recvd_rpc.call
expect(recvd_call).to_not be_nil expect(recvd_call).to_not be_nil
expect(recvd_rpc.metadata).to_not be_nil expect(recvd_rpc.metadata).to_not be_nil
@ -175,10 +166,9 @@ describe GRPC::ActiveCall do
describe '#remote_read' do describe '#remote_read' do
it 'reads the response sent by a server' do it 'reads the response sent by a server' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
msg = 'message is a string' msg = 'message is a string'
client_call.remote_send(msg) client_call.remote_send(msg)
server_call = expect_server_to_receive(msg) server_call = expect_server_to_receive(msg)
@ -188,10 +178,9 @@ describe GRPC::ActiveCall do
it 'saves no metadata when the server adds no metadata' do it 'saves no metadata when the server adds no metadata' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
msg = 'message is a string' msg = 'message is a string'
client_call.remote_send(msg) client_call.remote_send(msg)
server_call = expect_server_to_receive(msg) server_call = expect_server_to_receive(msg)
@ -203,10 +192,9 @@ describe GRPC::ActiveCall do
it 'saves metadata add by the server' do it 'saves metadata add by the server' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
msg = 'message is a string' msg = 'message is a string'
client_call.remote_send(msg) client_call.remote_send(msg)
server_call = expect_server_to_receive(msg, k1: 'v1', k2: 'v2') server_call = expect_server_to_receive(msg, k1: 'v1', k2: 'v2')
@ -219,10 +207,9 @@ describe GRPC::ActiveCall do
it 'get a nil msg before a status when an OK status is sent' do it 'get a nil msg before a status when an OK status is sent' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
msg = 'message is a string' msg = 'message is a string'
client_call.remote_send(msg) client_call.remote_send(msg)
client_call.writes_done(false) client_call.writes_done(false)
@ -236,11 +223,10 @@ describe GRPC::ActiveCall do
it 'unmarshals the response using the unmarshal func' do it 'unmarshals the response using the unmarshal func' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
unmarshal = proc { |x| 'unmarshalled:' + x } unmarshal = proc { |x| 'unmarshalled:' + x }
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
unmarshal, deadline, unmarshal, deadline)
metadata_tag: md_tag)
# confirm the client receives the unmarshalled message # confirm the client receives the unmarshalled message
msg = 'message is a string' msg = 'message is a string'
@ -254,17 +240,16 @@ describe GRPC::ActiveCall do
describe '#each_remote_read' do describe '#each_remote_read' do
it 'creates an Enumerator' do it 'creates an Enumerator' do
call = make_test_call call = make_test_call
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline) @pass_through, deadline)
expect(client_call.each_remote_read).to be_a(Enumerator) expect(client_call.each_remote_read).to be_a(Enumerator)
end end
it 'the returns an enumerator that can read n responses' do it 'the returns an enumerator that can read n responses' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
msg = 'message is a string' msg = 'message is a string'
reply = 'server_response' reply = 'server_response'
client_call.remote_send(msg) client_call.remote_send(msg)
@ -279,10 +264,9 @@ describe GRPC::ActiveCall do
it 'the returns an enumerator that stops after an OK Status' do it 'the returns an enumerator that stops after an OK Status' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
msg = 'message is a string' msg = 'message is a string'
reply = 'server_response' reply = 'server_response'
client_call.remote_send(msg) client_call.remote_send(msg)
@ -302,10 +286,9 @@ describe GRPC::ActiveCall do
describe '#writes_done' do describe '#writes_done' do
it 'finishes ok if the server sends a status response' do it 'finishes ok if the server sends a status response' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
msg = 'message is a string' msg = 'message is a string'
client_call.remote_send(msg) client_call.remote_send(msg)
expect { client_call.writes_done(false) }.to_not raise_error expect { client_call.writes_done(false) }.to_not raise_error
@ -318,10 +301,9 @@ describe GRPC::ActiveCall do
it 'finishes ok if the server sends an early status response' do it 'finishes ok if the server sends an early status response' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
msg = 'message is a string' msg = 'message is a string'
client_call.remote_send(msg) client_call.remote_send(msg)
server_call = expect_server_to_receive(msg) server_call = expect_server_to_receive(msg)
@ -334,10 +316,9 @@ describe GRPC::ActiveCall do
it 'finishes ok if writes_done is true' do it 'finishes ok if writes_done is true' do
call = make_test_call call = make_test_call
md_tag = ActiveCall.client_invoke(call, @client_queue) ActiveCall.client_invoke(call)
client_call = ActiveCall.new(call, @client_queue, @pass_through, client_call = ActiveCall.new(call, @pass_through,
@pass_through, deadline, @pass_through, deadline)
metadata_tag: md_tag)
msg = 'message is a string' msg = 'message is a string'
client_call.remote_send(msg) client_call.remote_send(msg)
server_call = expect_server_to_receive(msg) server_call = expect_server_to_receive(msg)
@ -355,17 +336,16 @@ describe GRPC::ActiveCall do
end end
def expect_server_to_be_invoked(**kw) def expect_server_to_be_invoked(**kw)
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline) recvd_rpc = @server.request_call
expect(recvd_rpc).to_not eq nil expect(recvd_rpc).to_not eq nil
recvd_call = recvd_rpc.call recvd_call = recvd_rpc.call
recvd_call.run_batch(@server_queue, @server_tag, deadline, recvd_call.run_batch(CallOps::SEND_INITIAL_METADATA => kw)
CallOps::SEND_INITIAL_METADATA => kw) ActiveCall.new(recvd_call, @pass_through, @pass_through, deadline,
ActiveCall.new(recvd_call, @server_queue, @pass_through, metadata_received: true, started: true)
@pass_through, deadline)
end end
def make_test_call def make_test_call
@ch.create_call(@client_queue, nil, nil, '/method', nil, deadline) @ch.create_call(nil, nil, '/method', nil, deadline)
end end
def deadline def deadline

@ -29,11 +29,14 @@
require 'grpc' require 'grpc'
Thread.abort_on_exception = true
def wakey_thread(&blk) def wakey_thread(&blk)
n = GRPC::Notifier.new n = GRPC::Notifier.new
t = Thread.new do t = Thread.new do
blk.call(n) blk.call(n)
end end
t.abort_on_exception = true
n.wait n.wait
t t
end end
@ -54,15 +57,13 @@ describe 'ClientStub' do
before(:each) do before(:each) do
Thread.abort_on_exception = true Thread.abort_on_exception = true
@server = nil @server = nil
@server_queue = nil
@method = 'an_rpc_method' @method = 'an_rpc_method'
@pass = OK @pass = OK
@fail = INTERNAL @fail = INTERNAL
@cq = GRPC::Core::CompletionQueue.new
end end
after(:each) do after(:each) do
@server.close(@server_queue) unless @server_queue.nil? @server.close(from_relative_time(2)) unless @server.nil?
end end
describe '#new' do describe '#new' do
@ -70,7 +71,7 @@ describe 'ClientStub' do
it 'can be created from a host and args' do it 'can be created from a host and args' do
opts = { channel_args: { a_channel_arg: 'an_arg' } } opts = { channel_args: { a_channel_arg: 'an_arg' } }
blk = proc do blk = proc do
GRPC::ClientStub.new(fake_host, @cq, :this_channel_is_insecure, **opts) GRPC::ClientStub.new(fake_host, :this_channel_is_insecure, **opts)
end end
expect(&blk).not_to raise_error expect(&blk).not_to raise_error
end end
@ -81,7 +82,7 @@ describe 'ClientStub' do
channel_override: @ch channel_override: @ch
} }
blk = proc do blk = proc do
GRPC::ClientStub.new(fake_host, @cq, :this_channel_is_insecure, **opts) GRPC::ClientStub.new(fake_host, :this_channel_is_insecure, **opts)
end end
expect(&blk).not_to raise_error expect(&blk).not_to raise_error
end end
@ -92,7 +93,7 @@ describe 'ClientStub' do
channel_args: { a_channel_arg: 'an_arg' }, channel_args: { a_channel_arg: 'an_arg' },
channel_override: Object.new channel_override: Object.new
} }
GRPC::ClientStub.new(fake_host, @cq, :this_channel_is_insecure, **opts) GRPC::ClientStub.new(fake_host, :this_channel_is_insecure, **opts)
end end
expect(&blk).to raise_error expect(&blk).to raise_error
end end
@ -100,7 +101,7 @@ describe 'ClientStub' do
it 'cannot be created with bad credentials' do it 'cannot be created with bad credentials' do
blk = proc do blk = proc do
opts = { channel_args: { a_channel_arg: 'an_arg' } } opts = { channel_args: { a_channel_arg: 'an_arg' } }
GRPC::ClientStub.new(fake_host, @cq, Object.new, **opts) GRPC::ClientStub.new(fake_host, Object.new, **opts)
end end
expect(&blk).to raise_error expect(&blk).to raise_error
end end
@ -115,7 +116,7 @@ describe 'ClientStub' do
} }
} }
creds = GRPC::Core::ChannelCredentials.new(certs[0], nil, nil) creds = GRPC::Core::ChannelCredentials.new(certs[0], nil, nil)
GRPC::ClientStub.new(fake_host, @cq, creds, **opts) GRPC::ClientStub.new(fake_host, creds, **opts)
end end
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
end end
@ -130,7 +131,7 @@ describe 'ClientStub' do
it 'should send a request to/receive a reply from a server' do it 'should send a request to/receive a reply from a server' do
server_port = create_test_server server_port = create_test_server
th = run_request_response(@sent_msg, @resp, @pass) th = run_request_response(@sent_msg, @resp, @pass)
stub = GRPC::ClientStub.new("localhost:#{server_port}", @cq, stub = GRPC::ClientStub.new("localhost:#{server_port}",
:this_channel_is_insecure) :this_channel_is_insecure)
expect(get_response(stub)).to eq(@resp) expect(get_response(stub)).to eq(@resp)
th.join th.join
@ -141,7 +142,7 @@ describe 'ClientStub' do
host = "localhost:#{server_port}" host = "localhost:#{server_port}"
th = run_request_response(@sent_msg, @resp, @pass, th = run_request_response(@sent_msg, @resp, @pass,
k1: 'v1', k2: 'v2') k1: 'v1', k2: 'v2')
stub = GRPC::ClientStub.new(host, @cq, :this_channel_is_insecure) stub = GRPC::ClientStub.new(host, :this_channel_is_insecure)
expect(get_response(stub)).to eq(@resp) expect(get_response(stub)).to eq(@resp)
th.join th.join
end end
@ -151,7 +152,7 @@ describe 'ClientStub' do
alt_host = "localhost:#{server_port}" alt_host = "localhost:#{server_port}"
th = run_request_response(@sent_msg, @resp, @pass) th = run_request_response(@sent_msg, @resp, @pass)
ch = GRPC::Core::Channel.new(alt_host, nil, :this_channel_is_insecure) ch = GRPC::Core::Channel.new(alt_host, nil, :this_channel_is_insecure)
stub = GRPC::ClientStub.new('ignored-host', @cq, stub = GRPC::ClientStub.new('ignored-host',
:this_channel_is_insecure, :this_channel_is_insecure,
channel_override: ch) channel_override: ch)
expect(get_response(stub)).to eq(@resp) expect(get_response(stub)).to eq(@resp)
@ -162,7 +163,7 @@ describe 'ClientStub' do
server_port = create_test_server server_port = create_test_server
host = "localhost:#{server_port}" host = "localhost:#{server_port}"
th = run_request_response(@sent_msg, @resp, @fail) th = run_request_response(@sent_msg, @resp, @fail)
stub = GRPC::ClientStub.new(host, @cq, :this_channel_is_insecure) stub = GRPC::ClientStub.new(host, :this_channel_is_insecure)
blk = proc { get_response(stub) } blk = proc { get_response(stub) }
expect(&blk).to raise_error(GRPC::BadStatus) expect(&blk).to raise_error(GRPC::BadStatus)
th.join th.join
@ -182,7 +183,8 @@ describe 'ClientStub' do
def get_response(stub) def get_response(stub)
op = stub.request_response(@method, @sent_msg, noop, noop, op = stub.request_response(@method, @sent_msg, noop, noop,
return_op: true, return_op: true,
metadata: { k1: 'v1', k2: 'v2' }) metadata: { k1: 'v1', k2: 'v2' },
deadline: from_relative_time(2))
expect(op).to be_a(GRPC::ActiveCall::Operation) expect(op).to be_a(GRPC::ActiveCall::Operation)
op.execute op.execute
end end
@ -196,7 +198,7 @@ describe 'ClientStub' do
before(:each) do before(:each) do
server_port = create_test_server server_port = create_test_server
host = "localhost:#{server_port}" host = "localhost:#{server_port}"
@stub = GRPC::ClientStub.new(host, @cq, :this_channel_is_insecure) @stub = GRPC::ClientStub.new(host, :this_channel_is_insecure)
@metadata = { k1: 'v1', k2: 'v2' } @metadata = { k1: 'v1', k2: 'v2' }
@sent_msgs = Array.new(3) { |i| 'msg_' + (i + 1).to_s } @sent_msgs = Array.new(3) { |i| 'msg_' + (i + 1).to_s }
@resp = 'a_reply' @resp = 'a_reply'
@ -262,7 +264,7 @@ describe 'ClientStub' do
server_port = create_test_server server_port = create_test_server
host = "localhost:#{server_port}" host = "localhost:#{server_port}"
th = run_server_streamer(@sent_msg, @replys, @pass) th = run_server_streamer(@sent_msg, @replys, @pass)
stub = GRPC::ClientStub.new(host, @cq, :this_channel_is_insecure) stub = GRPC::ClientStub.new(host, :this_channel_is_insecure)
expect(get_responses(stub).collect { |r| r }).to eq(@replys) expect(get_responses(stub).collect { |r| r }).to eq(@replys)
th.join th.join
end end
@ -271,7 +273,7 @@ describe 'ClientStub' do
server_port = create_test_server server_port = create_test_server
host = "localhost:#{server_port}" host = "localhost:#{server_port}"
th = run_server_streamer(@sent_msg, @replys, @fail) th = run_server_streamer(@sent_msg, @replys, @fail)
stub = GRPC::ClientStub.new(host, @cq, :this_channel_is_insecure) stub = GRPC::ClientStub.new(host, :this_channel_is_insecure)
e = get_responses(stub) e = get_responses(stub)
expect { e.collect { |r| r } }.to raise_error(GRPC::BadStatus) expect { e.collect { |r| r } }.to raise_error(GRPC::BadStatus)
th.join th.join
@ -282,7 +284,7 @@ describe 'ClientStub' do
host = "localhost:#{server_port}" host = "localhost:#{server_port}"
th = run_server_streamer(@sent_msg, @replys, @fail, th = run_server_streamer(@sent_msg, @replys, @fail,
k1: 'v1', k2: 'v2') k1: 'v1', k2: 'v2')
stub = GRPC::ClientStub.new(host, @cq, :this_channel_is_insecure) stub = GRPC::ClientStub.new(host, :this_channel_is_insecure)
e = get_responses(stub) e = get_responses(stub)
expect { e.collect { |r| r } }.to raise_error(GRPC::BadStatus) expect { e.collect { |r| r } }.to raise_error(GRPC::BadStatus)
th.join th.join
@ -327,7 +329,7 @@ describe 'ClientStub' do
it 'supports sending all the requests first', bidi: true do it 'supports sending all the requests first', bidi: true do
th = run_bidi_streamer_handle_inputs_first(@sent_msgs, @replys, th = run_bidi_streamer_handle_inputs_first(@sent_msgs, @replys,
@pass) @pass)
stub = GRPC::ClientStub.new(@host, @cq, :this_channel_is_insecure) stub = GRPC::ClientStub.new(@host, :this_channel_is_insecure)
e = get_responses(stub) e = get_responses(stub)
expect(e.collect { |r| r }).to eq(@replys) expect(e.collect { |r| r }).to eq(@replys)
th.join th.join
@ -335,7 +337,7 @@ describe 'ClientStub' do
it 'supports client-initiated ping pong', bidi: true do it 'supports client-initiated ping pong', bidi: true do
th = run_bidi_streamer_echo_ping_pong(@sent_msgs, @pass, true) th = run_bidi_streamer_echo_ping_pong(@sent_msgs, @pass, true)
stub = GRPC::ClientStub.new(@host, @cq, :this_channel_is_insecure) stub = GRPC::ClientStub.new(@host, :this_channel_is_insecure)
e = get_responses(stub) e = get_responses(stub)
expect(e.collect { |r| r }).to eq(@sent_msgs) expect(e.collect { |r| r }).to eq(@sent_msgs)
th.join th.join
@ -343,7 +345,7 @@ describe 'ClientStub' do
it 'supports a server-initiated ping pong', bidi: true do it 'supports a server-initiated ping pong', bidi: true do
th = run_bidi_streamer_echo_ping_pong(@sent_msgs, @pass, false) th = run_bidi_streamer_echo_ping_pong(@sent_msgs, @pass, false)
stub = GRPC::ClientStub.new(@host, @cq, :this_channel_is_insecure) stub = GRPC::ClientStub.new(@host, :this_channel_is_insecure)
e = get_responses(stub) e = get_responses(stub)
expect(e.collect { |r| r }).to eq(@sent_msgs) expect(e.collect { |r| r }).to eq(@sent_msgs)
th.join th.join
@ -372,26 +374,6 @@ describe 'ClientStub' do
it_behaves_like 'bidi streaming' it_behaves_like 'bidi streaming'
end end
describe 'without enough time to run' do
before(:each) do
@sent_msgs = Array.new(3) { |i| 'msg_' + (i + 1).to_s }
@replys = Array.new(3) { |i| 'reply_' + (i + 1).to_s }
server_port = create_test_server
@host = "localhost:#{server_port}"
end
it 'should fail with DeadlineExceeded', bidi: true do
@server.start
stub = GRPC::ClientStub.new(@host, @cq, :this_channel_is_insecure)
blk = proc do
e = stub.bidi_streamer(@method, @sent_msgs, noop, noop,
deadline: from_relative_time(0.001))
e.collect { |r| r }
end
expect(&blk).to raise_error GRPC::BadStatus, /Deadline Exceeded/
end
end
end end
def run_server_streamer(expected_input, replys, status, **kw) def run_server_streamer(expected_input, replys, status, **kw)
@ -460,21 +442,18 @@ describe 'ClientStub' do
end end
def create_test_server def create_test_server
@server_queue = GRPC::Core::CompletionQueue.new @server = GRPC::Core::Server.new(nil)
@server = GRPC::Core::Server.new(@server_queue, nil)
@server.add_http2_port('0.0.0.0:0', :this_port_is_insecure) @server.add_http2_port('0.0.0.0:0', :this_port_is_insecure)
end end
def expect_server_to_be_invoked(notifier) def expect_server_to_be_invoked(notifier)
@server.start @server.start
notifier.notify(nil) notifier.notify(nil)
server_tag = Object.new recvd_rpc = @server.request_call
recvd_rpc = @server.request_call(@server_queue, server_tag,
INFINITE_FUTURE)
recvd_call = recvd_rpc.call recvd_call = recvd_rpc.call
recvd_call.metadata = recvd_rpc.metadata recvd_call.metadata = recvd_rpc.metadata
recvd_call.run_batch(@server_queue, server_tag, Time.now + 2, recvd_call.run_batch(SEND_INITIAL_METADATA => nil)
SEND_INITIAL_METADATA => nil) GRPC::ActiveCall.new(recvd_call, noop, noop, INFINITE_FUTURE,
GRPC::ActiveCall.new(recvd_call, @server_queue, noop, noop, INFINITE_FUTURE) metadata_received: true)
end end
end end

@ -135,8 +135,6 @@ describe GRPC::RpcServer do
@pass = 0 @pass = 0
@fail = 1 @fail = 1
@noop = proc { |x| x } @noop = proc { |x| x }
@server_queue = GRPC::Core::CompletionQueue.new
end end
describe '#new' do describe '#new' do
@ -148,28 +146,6 @@ describe GRPC::RpcServer do
expect(&blk).not_to raise_error expect(&blk).not_to raise_error
end end
it 'can be created with a completion queue override' do
opts = {
server_args: { a_channel_arg: 'an_arg' },
completion_queue_override: @server_queue
}
blk = proc do
RpcServer.new(**opts)
end
expect(&blk).not_to raise_error
end
it 'cannot be created with a bad completion queue override' do
blk = proc do
opts = {
server_args: { a_channel_arg: 'an_arg' },
completion_queue_override: Object.new
}
RpcServer.new(**opts)
end
expect(&blk).to raise_error
end
it 'cannot be created with invalid ServerCredentials' do it 'cannot be created with invalid ServerCredentials' do
blk = proc do blk = proc do
opts = { opts = {
@ -294,7 +270,6 @@ describe GRPC::RpcServer do
context 'with no connect_metadata' do context 'with no connect_metadata' do
before(:each) do before(:each) do
server_opts = { server_opts = {
completion_queue_override: @server_queue,
poll_period: 1 poll_period: 1
} }
@srv = RpcServer.new(**server_opts) @srv = RpcServer.new(**server_opts)
@ -309,8 +284,7 @@ describe GRPC::RpcServer do
@srv.wait_till_running @srv.wait_till_running
req = EchoMsg.new req = EchoMsg.new
blk = proc do blk = proc do
cq = GRPC::Core::CompletionQueue.new stub = GRPC::ClientStub.new(@host, :this_channel_is_insecure,
stub = GRPC::ClientStub.new(@host, cq, :this_channel_is_insecure,
**client_opts) **client_opts)
stub.request_response('/unknown', req, marshal, unmarshal) stub.request_response('/unknown', req, marshal, unmarshal)
end end
@ -325,8 +299,7 @@ describe GRPC::RpcServer do
@srv.wait_till_running @srv.wait_till_running
req = EchoMsg.new req = EchoMsg.new
blk = proc do blk = proc do
cq = GRPC::Core::CompletionQueue.new stub = GRPC::ClientStub.new(@host, :this_channel_is_insecure,
stub = GRPC::ClientStub.new(@host, cq, :this_channel_is_insecure,
**client_opts) **client_opts)
stub.request_response('/an_rpc', req, marshal, unmarshal) stub.request_response('/an_rpc', req, marshal, unmarshal)
end end
@ -422,7 +395,6 @@ describe GRPC::RpcServer do
it 'should return RESOURCE_EXHAUSTED on too many jobs', server: true do it 'should return RESOURCE_EXHAUSTED on too many jobs', server: true do
opts = { opts = {
server_args: { a_channel_arg: 'an_arg' }, server_args: { a_channel_arg: 'an_arg' },
completion_queue_override: @server_queue,
pool_size: 1, pool_size: 1,
poll_period: 1, poll_period: 1,
max_waiting_requests: 0 max_waiting_requests: 0
@ -466,7 +438,6 @@ describe GRPC::RpcServer do
end end
before(:each) do before(:each) do
server_opts = { server_opts = {
completion_queue_override: @server_queue,
poll_period: 1, poll_period: 1,
connect_md_proc: test_md_proc connect_md_proc: test_md_proc
} }
@ -502,7 +473,6 @@ describe GRPC::RpcServer do
context 'with trailing metadata' do context 'with trailing metadata' do
before(:each) do before(:each) do
server_opts = { server_opts = {
completion_queue_override: @server_queue,
poll_period: 1 poll_period: 1
} }
@srv = RpcServer.new(**server_opts) @srv = RpcServer.new(**server_opts)

@ -168,11 +168,9 @@ describe Grpc::Health::Checker do
CheckerStub = Grpc::Health::Checker.rpc_stub_class CheckerStub = Grpc::Health::Checker.rpc_stub_class
before(:each) do before(:each) do
@server_queue = GRPC::Core::CompletionQueue.new
server_host = '0.0.0.0:0' server_host = '0.0.0.0:0'
@client_opts = { channel_override: @ch } @client_opts = { channel_override: @ch }
server_opts = { server_opts = {
completion_queue_override: @server_queue,
poll_period: 1 poll_period: 1
} }
@srv = RpcServer.new(**server_opts) @srv = RpcServer.new(**server_opts)

@ -43,19 +43,15 @@ describe Server do
GRPC::Core::ServerCredentials.new(*load_test_certs) GRPC::Core::ServerCredentials.new(*load_test_certs)
end end
before(:each) do
@cq = GRPC::Core::CompletionQueue.new
end
describe '#start' do describe '#start' do
it 'runs without failing' do it 'runs without failing' do
blk = proc { Server.new(@cq, nil).start } blk = proc { Server.new(nil).start }
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
end end
it 'fails if the server is closed' do it 'fails if the server is closed' do
s = Server.new(@cq, nil) s = Server.new(nil)
s.close(@cq) s.close
expect { s.start }.to raise_error(RuntimeError) expect { s.start }.to raise_error(RuntimeError)
end end
end end
@ -63,19 +59,19 @@ describe Server do
describe '#destroy' do describe '#destroy' do
it 'destroys a server ok' do it 'destroys a server ok' do
s = start_a_server s = start_a_server
blk = proc { s.destroy(@cq) } blk = proc { s.destroy }
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
end end
it 'can be called more than once without error' do it 'can be called more than once without error' do
s = start_a_server s = start_a_server
begin begin
blk = proc { s.destroy(@cq) } blk = proc { s.destroy }
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
blk.call blk.call
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
ensure ensure
s.close(@cq) s.close
end end
end end
end end
@ -84,7 +80,7 @@ describe Server do
it 'closes a server ok' do it 'closes a server ok' do
s = start_a_server s = start_a_server
begin begin
blk = proc { s.close(@cq) } blk = proc { s.close }
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
ensure ensure
s.close(@cq) s.close(@cq)
@ -93,7 +89,7 @@ describe Server do
it 'can be called more than once without error' do it 'can be called more than once without error' do
s = start_a_server s = start_a_server
blk = proc { s.close(@cq) } blk = proc { s.close }
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
blk.call blk.call
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
@ -104,16 +100,16 @@ describe Server do
describe 'for insecure servers' do describe 'for insecure servers' do
it 'runs without failing' do it 'runs without failing' do
blk = proc do blk = proc do
s = Server.new(@cq, nil) s = Server.new(nil)
s.add_http2_port('localhost:0', :this_port_is_insecure) s.add_http2_port('localhost:0', :this_port_is_insecure)
s.close(@cq) s.close
end end
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
end end
it 'fails if the server is closed' do it 'fails if the server is closed' do
s = Server.new(@cq, nil) s = Server.new(nil)
s.close(@cq) s.close
blk = proc do blk = proc do
s.add_http2_port('localhost:0', :this_port_is_insecure) s.add_http2_port('localhost:0', :this_port_is_insecure)
end end
@ -125,16 +121,16 @@ describe Server do
let(:cert) { create_test_cert } let(:cert) { create_test_cert }
it 'runs without failing' do it 'runs without failing' do
blk = proc do blk = proc do
s = Server.new(@cq, nil) s = Server.new(nil)
s.add_http2_port('localhost:0', cert) s.add_http2_port('localhost:0', cert)
s.close(@cq) s.close
end end
expect(&blk).to_not raise_error expect(&blk).to_not raise_error
end end
it 'fails if the server is closed' do it 'fails if the server is closed' do
s = Server.new(@cq, nil) s = Server.new(nil)
s.close(@cq) s.close
blk = proc { s.add_http2_port('localhost:0', cert) } blk = proc { s.add_http2_port('localhost:0', cert) }
expect(&blk).to raise_error(RuntimeError) expect(&blk).to raise_error(RuntimeError)
end end
@ -142,8 +138,8 @@ describe Server do
end end
shared_examples '#new' do shared_examples '#new' do
it 'takes a completion queue with nil channel args' do it 'takes nil channel args' do
expect { Server.new(@cq, nil) }.to_not raise_error expect { Server.new(nil) }.to_not raise_error
end end
it 'does not take a hash with bad keys as channel args' do it 'does not take a hash with bad keys as channel args' do
@ -194,14 +190,14 @@ describe Server do
describe '#new with an insecure channel' do describe '#new with an insecure channel' do
def construct_with_args(a) def construct_with_args(a)
proc { Server.new(@cq, a) } proc { Server.new(a) }
end end
it_behaves_like '#new' it_behaves_like '#new'
end end
def start_a_server def start_a_server
s = Server.new(@cq, nil) s = Server.new(nil)
s.add_http2_port('0.0.0.0:0', :this_port_is_insecure) s.add_http2_port('0.0.0.0:0', :this_port_is_insecure)
s.start s.start
s s

@ -857,7 +857,15 @@ include/grpc/impl/codegen/sync.h \
include/grpc/impl/codegen/sync_generic.h \ include/grpc/impl/codegen/sync_generic.h \
include/grpc/impl/codegen/sync_posix.h \ include/grpc/impl/codegen/sync_posix.h \
include/grpc/impl/codegen/sync_windows.h \ include/grpc/impl/codegen/sync_windows.h \
include/grpc/impl/codegen/time.h include/grpc/impl/codegen/time.h \
include/grpc/byte_buffer.h \
include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \
include/grpc/grpc.h \
include/grpc/grpc_posix.h \
include/grpc/status.h \
include/grpc/grpc_security.h \
include/grpc/grpc_security_constants.h
# This tag can be used to specify the character encoding of the source files # This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses

@ -858,6 +858,14 @@ include/grpc/impl/codegen/sync_generic.h \
include/grpc/impl/codegen/sync_posix.h \ include/grpc/impl/codegen/sync_posix.h \
include/grpc/impl/codegen/sync_windows.h \ include/grpc/impl/codegen/sync_windows.h \
include/grpc/impl/codegen/time.h \ include/grpc/impl/codegen/time.h \
include/grpc/byte_buffer.h \
include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \
include/grpc/grpc.h \
include/grpc/grpc_posix.h \
include/grpc/status.h \
include/grpc/grpc_security.h \
include/grpc/grpc_security_constants.h \
include/grpc++/impl/codegen/core_codegen.h \ include/grpc++/impl/codegen/core_codegen.h \
src/cpp/client/secure_credentials.h \ src/cpp/client/secure_credentials.h \
src/cpp/common/secure_auth_context.h \ src/cpp/common/secure_auth_context.h \
@ -865,6 +873,109 @@ src/cpp/server/secure_server_credentials.h \
src/cpp/client/create_channel_internal.h \ src/cpp/client/create_channel_internal.h \
src/cpp/server/dynamic_thread_pool.h \ src/cpp/server/dynamic_thread_pool.h \
src/cpp/server/thread_pool_interface.h \ src/cpp/server/thread_pool_interface.h \
src/core/lib/channel/channel_args.h \
src/core/lib/channel/channel_stack.h \
src/core/lib/channel/channel_stack_builder.h \
src/core/lib/channel/compress_filter.h \
src/core/lib/channel/connected_channel.h \
src/core/lib/channel/context.h \
src/core/lib/channel/http_client_filter.h \
src/core/lib/channel/http_server_filter.h \
src/core/lib/compression/algorithm_metadata.h \
src/core/lib/compression/message_compress.h \
src/core/lib/debug/trace.h \
src/core/lib/http/format_request.h \
src/core/lib/http/httpcli.h \
src/core/lib/http/parser.h \
src/core/lib/iomgr/closure.h \
src/core/lib/iomgr/endpoint.h \
src/core/lib/iomgr/endpoint_pair.h \
src/core/lib/iomgr/error.h \
src/core/lib/iomgr/ev_epoll_linux.h \
src/core/lib/iomgr/ev_poll_and_epoll_posix.h \
src/core/lib/iomgr/ev_poll_posix.h \
src/core/lib/iomgr/ev_posix.h \
src/core/lib/iomgr/exec_ctx.h \
src/core/lib/iomgr/executor.h \
src/core/lib/iomgr/iocp_windows.h \
src/core/lib/iomgr/iomgr.h \
src/core/lib/iomgr/iomgr_internal.h \
src/core/lib/iomgr/iomgr_posix.h \
src/core/lib/iomgr/load_file.h \
src/core/lib/iomgr/network_status_tracker.h \
src/core/lib/iomgr/polling_entity.h \
src/core/lib/iomgr/pollset.h \
src/core/lib/iomgr/pollset_set.h \
src/core/lib/iomgr/pollset_set_windows.h \
src/core/lib/iomgr/pollset_windows.h \
src/core/lib/iomgr/resolve_address.h \
src/core/lib/iomgr/sockaddr.h \
src/core/lib/iomgr/sockaddr_posix.h \
src/core/lib/iomgr/sockaddr_utils.h \
src/core/lib/iomgr/sockaddr_windows.h \
src/core/lib/iomgr/socket_utils_posix.h \
src/core/lib/iomgr/socket_windows.h \
src/core/lib/iomgr/tcp_client.h \
src/core/lib/iomgr/tcp_posix.h \
src/core/lib/iomgr/tcp_server.h \
src/core/lib/iomgr/tcp_windows.h \
src/core/lib/iomgr/time_averaged_stats.h \
src/core/lib/iomgr/timer.h \
src/core/lib/iomgr/timer_heap.h \
src/core/lib/iomgr/udp_server.h \
src/core/lib/iomgr/unix_sockets_posix.h \
src/core/lib/iomgr/wakeup_fd_pipe.h \
src/core/lib/iomgr/wakeup_fd_posix.h \
src/core/lib/iomgr/workqueue.h \
src/core/lib/iomgr/workqueue_posix.h \
src/core/lib/iomgr/workqueue_windows.h \
src/core/lib/json/json.h \
src/core/lib/json/json_common.h \
src/core/lib/json/json_reader.h \
src/core/lib/json/json_writer.h \
src/core/lib/surface/api_trace.h \
src/core/lib/surface/call.h \
src/core/lib/surface/call_test_only.h \
src/core/lib/surface/channel.h \
src/core/lib/surface/channel_init.h \
src/core/lib/surface/channel_stack_type.h \
src/core/lib/surface/completion_queue.h \
src/core/lib/surface/event_string.h \
src/core/lib/surface/init.h \
src/core/lib/surface/lame_client.h \
src/core/lib/surface/server.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/static_metadata.h \
src/core/lib/transport/transport.h \
src/core/lib/transport/transport_impl.h \
src/core/lib/security/context/security_context.h \
src/core/lib/security/credentials/composite/composite_credentials.h \
src/core/lib/security/credentials/credentials.h \
src/core/lib/security/credentials/fake/fake_credentials.h \
src/core/lib/security/credentials/google_default/google_default_credentials.h \
src/core/lib/security/credentials/iam/iam_credentials.h \
src/core/lib/security/credentials/jwt/json_token.h \
src/core/lib/security/credentials/jwt/jwt_credentials.h \
src/core/lib/security/credentials/jwt/jwt_verifier.h \
src/core/lib/security/credentials/oauth2/oauth2_credentials.h \
src/core/lib/security/credentials/plugin/plugin_credentials.h \
src/core/lib/security/credentials/ssl/ssl_credentials.h \
src/core/lib/security/transport/auth_filters.h \
src/core/lib/security/transport/handshake.h \
src/core/lib/security/transport/secure_endpoint.h \
src/core/lib/security/transport/security_connector.h \
src/core/lib/security/transport/tsi_error.h \
src/core/lib/security/util/b64.h \
src/core/lib/security/util/json_util.h \
src/core/ext/transport/chttp2/alpn/alpn.h \
src/core/lib/tsi/fake_transport_security.h \
src/core/lib/tsi/ssl_transport_security.h \
src/core/lib/tsi/ssl_types.h \
src/core/lib/tsi/transport_security.h \
src/core/lib/tsi/transport_security_interface.h \
src/cpp/client/secure_credentials.cc \ src/cpp/client/secure_credentials.cc \
src/cpp/common/auth_property_iterator.cc \ src/cpp/common/auth_property_iterator.cc \
src/cpp/common/secure_auth_context.cc \ src/cpp/common/secure_auth_context.cc \
@ -897,6 +1008,122 @@ src/cpp/util/slice.cc \
src/cpp/util/status.cc \ src/cpp/util/status.cc \
src/cpp/util/string_ref.cc \ src/cpp/util/string_ref.cc \
src/cpp/util/time.cc \ src/cpp/util/time.cc \
src/core/lib/channel/channel_args.c \
src/core/lib/channel/channel_stack.c \
src/core/lib/channel/channel_stack_builder.c \
src/core/lib/channel/compress_filter.c \
src/core/lib/channel/connected_channel.c \
src/core/lib/channel/http_client_filter.c \
src/core/lib/channel/http_server_filter.c \
src/core/lib/compression/compression.c \
src/core/lib/compression/message_compress.c \
src/core/lib/debug/trace.c \
src/core/lib/http/format_request.c \
src/core/lib/http/httpcli.c \
src/core/lib/http/parser.c \
src/core/lib/iomgr/closure.c \
src/core/lib/iomgr/endpoint.c \
src/core/lib/iomgr/endpoint_pair_posix.c \
src/core/lib/iomgr/endpoint_pair_windows.c \
src/core/lib/iomgr/error.c \
src/core/lib/iomgr/ev_epoll_linux.c \
src/core/lib/iomgr/ev_poll_and_epoll_posix.c \
src/core/lib/iomgr/ev_poll_posix.c \
src/core/lib/iomgr/ev_posix.c \
src/core/lib/iomgr/exec_ctx.c \
src/core/lib/iomgr/executor.c \
src/core/lib/iomgr/iocp_windows.c \
src/core/lib/iomgr/iomgr.c \
src/core/lib/iomgr/iomgr_posix.c \
src/core/lib/iomgr/iomgr_windows.c \
src/core/lib/iomgr/load_file.c \
src/core/lib/iomgr/network_status_tracker.c \
src/core/lib/iomgr/polling_entity.c \
src/core/lib/iomgr/pollset_set_windows.c \
src/core/lib/iomgr/pollset_windows.c \
src/core/lib/iomgr/resolve_address_posix.c \
src/core/lib/iomgr/resolve_address_windows.c \
src/core/lib/iomgr/sockaddr_utils.c \
src/core/lib/iomgr/socket_utils_common_posix.c \
src/core/lib/iomgr/socket_utils_linux.c \
src/core/lib/iomgr/socket_utils_posix.c \
src/core/lib/iomgr/socket_windows.c \
src/core/lib/iomgr/tcp_client_posix.c \
src/core/lib/iomgr/tcp_client_windows.c \
src/core/lib/iomgr/tcp_posix.c \
src/core/lib/iomgr/tcp_server_posix.c \
src/core/lib/iomgr/tcp_server_windows.c \
src/core/lib/iomgr/tcp_windows.c \
src/core/lib/iomgr/time_averaged_stats.c \
src/core/lib/iomgr/timer.c \
src/core/lib/iomgr/timer_heap.c \
src/core/lib/iomgr/udp_server.c \
src/core/lib/iomgr/unix_sockets_posix.c \
src/core/lib/iomgr/unix_sockets_posix_noop.c \
src/core/lib/iomgr/wakeup_fd_eventfd.c \
src/core/lib/iomgr/wakeup_fd_nospecial.c \
src/core/lib/iomgr/wakeup_fd_pipe.c \
src/core/lib/iomgr/wakeup_fd_posix.c \
src/core/lib/iomgr/workqueue_posix.c \
src/core/lib/iomgr/workqueue_windows.c \
src/core/lib/json/json.c \
src/core/lib/json/json_reader.c \
src/core/lib/json/json_string.c \
src/core/lib/json/json_writer.c \
src/core/lib/surface/alarm.c \
src/core/lib/surface/api_trace.c \
src/core/lib/surface/byte_buffer.c \
src/core/lib/surface/byte_buffer_reader.c \
src/core/lib/surface/call.c \
src/core/lib/surface/call_details.c \
src/core/lib/surface/call_log_batch.c \
src/core/lib/surface/channel.c \
src/core/lib/surface/channel_init.c \
src/core/lib/surface/channel_ping.c \
src/core/lib/surface/channel_stack_type.c \
src/core/lib/surface/completion_queue.c \
src/core/lib/surface/event_string.c \
src/core/lib/surface/lame_client.c \
src/core/lib/surface/metadata_array.c \
src/core/lib/surface/server.c \
src/core/lib/surface/validate_metadata.c \
src/core/lib/surface/version.c \
src/core/lib/transport/byte_stream.c \
src/core/lib/transport/connectivity_state.c \
src/core/lib/transport/metadata.c \
src/core/lib/transport/metadata_batch.c \
src/core/lib/transport/static_metadata.c \
src/core/lib/transport/transport.c \
src/core/lib/transport/transport_op_string.c \
src/core/lib/http/httpcli_security_connector.c \
src/core/lib/security/context/security_context.c \
src/core/lib/security/credentials/composite/composite_credentials.c \
src/core/lib/security/credentials/credentials.c \
src/core/lib/security/credentials/credentials_metadata.c \
src/core/lib/security/credentials/fake/fake_credentials.c \
src/core/lib/security/credentials/google_default/credentials_posix.c \
src/core/lib/security/credentials/google_default/credentials_windows.c \
src/core/lib/security/credentials/google_default/google_default_credentials.c \
src/core/lib/security/credentials/iam/iam_credentials.c \
src/core/lib/security/credentials/jwt/json_token.c \
src/core/lib/security/credentials/jwt/jwt_credentials.c \
src/core/lib/security/credentials/jwt/jwt_verifier.c \
src/core/lib/security/credentials/oauth2/oauth2_credentials.c \
src/core/lib/security/credentials/plugin/plugin_credentials.c \
src/core/lib/security/credentials/ssl/ssl_credentials.c \
src/core/lib/security/transport/client_auth_filter.c \
src/core/lib/security/transport/handshake.c \
src/core/lib/security/transport/secure_endpoint.c \
src/core/lib/security/transport/security_connector.c \
src/core/lib/security/transport/server_auth_filter.c \
src/core/lib/security/transport/tsi_error.c \
src/core/lib/security/util/b64.c \
src/core/lib/security/util/json_util.c \
src/core/lib/surface/init_secure.c \
src/core/ext/transport/chttp2/alpn/alpn.c \
src/core/lib/tsi/fake_transport_security.c \
src/core/lib/tsi/ssl_transport_security.c \
src/core/lib/tsi/transport_security.c \
src/cpp/codegen/codegen_init.cc src/cpp/codegen/codegen_init.cc
# This tag can be used to specify the character encoding of the source files # This tag can be used to specify the character encoding of the source files

@ -4345,6 +4345,7 @@
}, },
{ {
"deps": [ "deps": [
"gpr",
"grpc", "grpc",
"grpc++_base", "grpc++_base",
"grpc++_codegen_base", "grpc++_codegen_base",
@ -6514,7 +6515,10 @@
}, },
{ {
"deps": [ "deps": [
"grpc++_codegen_base" "gpr",
"grpc++_codegen_base",
"grpc_base",
"grpc_secure"
], ],
"headers": [ "headers": [
"include/grpc++/alarm.h", "include/grpc++/alarm.h",

@ -49,6 +49,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpc++", "vcxproj\.\grpc++\
EndProjectSection EndProjectSection
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{29D16885-7228-4C31-81ED-5F9187C7F2A9} = {29D16885-7228-4C31-81ED-5F9187C7F2A9} {29D16885-7228-4C31-81ED-5F9187C7F2A9} = {29D16885-7228-4C31-81ED-5F9187C7F2A9}
{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}
EndProjectSection EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpc++_reflection", "vcxproj\.\grpc++_reflection\grpc++_reflection.vcxproj", "{5F575402-3F89-5D1A-6910-9DB8BF5D2BAB}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpc++_reflection", "vcxproj\.\grpc++_reflection\grpc++_reflection.vcxproj", "{5F575402-3F89-5D1A-6910-9DB8BF5D2BAB}"

@ -356,6 +356,14 @@
<ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_posix.h" /> <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_posix.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_windows.h" /> <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_windows.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\time.h" /> <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\time.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\byte_buffer.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\byte_buffer_reader.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\compression.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_posix.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\status.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security_constants.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\core_codegen.h" /> <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\core_codegen.h" />
@ -365,6 +373,109 @@
<ClInclude Include="$(SolutionDir)\..\src\cpp\client\create_channel_internal.h" /> <ClInclude Include="$(SolutionDir)\..\src\cpp\client\create_channel_internal.h" />
<ClInclude Include="$(SolutionDir)\..\src\cpp\server\dynamic_thread_pool.h" /> <ClInclude Include="$(SolutionDir)\..\src\cpp\server\dynamic_thread_pool.h" />
<ClInclude Include="$(SolutionDir)\..\src\cpp\server\thread_pool_interface.h" /> <ClInclude Include="$(SolutionDir)\..\src\cpp\server\thread_pool_interface.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_args.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack_builder.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\compress_filter.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\connected_channel.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\context.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_client_filter.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_server_filter.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\compression\algorithm_metadata.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\compression\message_compress.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\debug\trace.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\format_request.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\httpcli.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\parser.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\closure.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\error.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_epoll_linux.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\executor.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iocp_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_internal.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_utils.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\time_averaged_stats.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\timer.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\timer_heap.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\udp_server.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_pipe.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_common.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_reader.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_writer.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\api_trace.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\call.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\call_test_only.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel_init.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel_stack_type.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\completion_queue.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\event_string.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\init.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\lame_client.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\server.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\byte_stream.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\connectivity_state.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\metadata.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\metadata_batch.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\static_metadata.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\transport.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\transport_impl.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\context\security_context.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\composite\composite_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\fake\fake_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\google_default_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\iam\iam_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\json_token.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_verifier.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\oauth2\oauth2_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\plugin\plugin_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\ssl\ssl_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\auth_filters.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\handshake.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\secure_endpoint.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\security_connector.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\tsi_error.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\util\b64.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\util\json_util.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\ext\transport\chttp2\alpn\alpn.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\fake_transport_security.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_transport_security.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_types.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security_interface.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="$(SolutionDir)\..\src\cpp\client\secure_credentials.cc"> <ClCompile Include="$(SolutionDir)\..\src\cpp\client\secure_credentials.cc">
@ -431,6 +542,238 @@
</ClCompile> </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\cpp\util\time.cc"> <ClCompile Include="$(SolutionDir)\..\src\cpp\util\time.cc">
</ClCompile> </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_args.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack_builder.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\compress_filter.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\connected_channel.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\http_client_filter.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\http_server_filter.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\compression\compression.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\compression\message_compress.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\debug\trace.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\format_request.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\httpcli.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\parser.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\closure.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\error.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_epoll_linux.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\executor.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iocp_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_utils.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_common_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_linux.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\time_averaged_stats.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\timer.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\timer_heap.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\udp_server.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix_noop.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_eventfd.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_nospecial.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_pipe.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_reader.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_string.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_writer.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\alarm.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\api_trace.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\byte_buffer.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\byte_buffer_reader.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call_details.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call_log_batch.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_init.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_ping.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_stack_type.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\completion_queue.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\event_string.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\lame_client.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\metadata_array.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\server.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\validate_metadata.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\version.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\byte_stream.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\connectivity_state.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\metadata.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\metadata_batch.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\static_metadata.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\transport.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\transport_op_string.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\httpcli_security_connector.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\context\security_context.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\composite\composite_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials_metadata.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\fake\fake_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\credentials_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\credentials_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\google_default_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\iam\iam_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\json_token.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_verifier.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\oauth2\oauth2_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\plugin\plugin_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\ssl\ssl_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\client_auth_filter.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\handshake.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\secure_endpoint.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\security_connector.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\server_auth_filter.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\tsi_error.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\util\b64.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\util\json_util.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\init_secure.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\chttp2\alpn\alpn.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\fake_transport_security.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_transport_security.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\cpp\codegen\codegen_init.cc"> <ClCompile Include="$(SolutionDir)\..\src\cpp\codegen\codegen_init.cc">
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
@ -438,6 +781,9 @@
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc\grpc.vcxproj"> <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc\grpc.vcxproj">
<Project>{29D16885-7228-4C31-81ED-5F9187C7F2A9}</Project> <Project>{29D16885-7228-4C31-81ED-5F9187C7F2A9}</Project>
</ProjectReference> </ProjectReference>
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr\gpr.vcxproj">
<Project>{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}</Project>
</ProjectReference>
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

@ -97,6 +97,354 @@
<ClCompile Include="$(SolutionDir)\..\src\cpp\util\time.cc"> <ClCompile Include="$(SolutionDir)\..\src\cpp\util\time.cc">
<Filter>src\cpp\util</Filter> <Filter>src\cpp\util</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_args.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack_builder.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\compress_filter.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\connected_channel.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\http_client_filter.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\http_server_filter.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\compression\compression.c">
<Filter>src\core\lib\compression</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\compression\message_compress.c">
<Filter>src\core\lib\compression</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\debug\trace.c">
<Filter>src\core\lib\debug</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\format_request.c">
<Filter>src\core\lib\http</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\httpcli.c">
<Filter>src\core\lib\http</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\parser.c">
<Filter>src\core\lib\http</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\closure.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\error.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_epoll_linux.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\executor.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iocp_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_utils.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_common_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_linux.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\time_averaged_stats.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\timer.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\timer_heap.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\udp_server.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix_noop.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_eventfd.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_nospecial.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_pipe.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json.c">
<Filter>src\core\lib\json</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_reader.c">
<Filter>src\core\lib\json</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_string.c">
<Filter>src\core\lib\json</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_writer.c">
<Filter>src\core\lib\json</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\alarm.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\api_trace.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\byte_buffer.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\byte_buffer_reader.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call_details.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call_log_batch.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_init.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_ping.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_stack_type.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\completion_queue.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\event_string.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\lame_client.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\metadata_array.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\server.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\validate_metadata.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\version.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\byte_stream.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\connectivity_state.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\metadata.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\metadata_batch.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\static_metadata.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\transport.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\transport_op_string.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\httpcli_security_connector.c">
<Filter>src\core\lib\http</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\context\security_context.c">
<Filter>src\core\lib\security\context</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\composite\composite_credentials.c">
<Filter>src\core\lib\security\credentials\composite</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials.c">
<Filter>src\core\lib\security\credentials</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials_metadata.c">
<Filter>src\core\lib\security\credentials</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\fake\fake_credentials.c">
<Filter>src\core\lib\security\credentials\fake</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\credentials_posix.c">
<Filter>src\core\lib\security\credentials\google_default</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\credentials_windows.c">
<Filter>src\core\lib\security\credentials\google_default</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\google_default_credentials.c">
<Filter>src\core\lib\security\credentials\google_default</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\iam\iam_credentials.c">
<Filter>src\core\lib\security\credentials\iam</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\json_token.c">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_credentials.c">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_verifier.c">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\oauth2\oauth2_credentials.c">
<Filter>src\core\lib\security\credentials\oauth2</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\plugin\plugin_credentials.c">
<Filter>src\core\lib\security\credentials\plugin</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\ssl\ssl_credentials.c">
<Filter>src\core\lib\security\credentials\ssl</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\client_auth_filter.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\handshake.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\secure_endpoint.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\security_connector.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\server_auth_filter.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\tsi_error.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\util\b64.c">
<Filter>src\core\lib\security\util</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\util\json_util.c">
<Filter>src\core\lib\security\util</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\init_secure.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\chttp2\alpn\alpn.c">
<Filter>src\core\ext\transport\chttp2\alpn</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\fake_transport_security.c">
<Filter>src\core\lib\tsi</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_transport_security.c">
<Filter>src\core\lib\tsi</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security.c">
<Filter>src\core\lib\tsi</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\cpp\codegen\codegen_init.cc"> <ClCompile Include="$(SolutionDir)\..\src\cpp\codegen\codegen_init.cc">
<Filter>src\cpp\codegen</Filter> <Filter>src\cpp\codegen</Filter>
</ClCompile> </ClCompile>
@ -396,6 +744,30 @@
<ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\time.h"> <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\time.h">
<Filter>include\grpc\impl\codegen</Filter> <Filter>include\grpc\impl\codegen</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\byte_buffer.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\byte_buffer_reader.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\compression.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_posix.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\status.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security_constants.h">
<Filter>include\grpc</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\core_codegen.h"> <ClInclude Include="$(SolutionDir)\..\include\grpc++\impl\codegen\core_codegen.h">
@ -419,6 +791,315 @@
<ClInclude Include="$(SolutionDir)\..\src\cpp\server\thread_pool_interface.h"> <ClInclude Include="$(SolutionDir)\..\src\cpp\server\thread_pool_interface.h">
<Filter>src\cpp\server</Filter> <Filter>src\cpp\server</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_args.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack_builder.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\compress_filter.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\connected_channel.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\context.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_client_filter.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_server_filter.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\compression\algorithm_metadata.h">
<Filter>src\core\lib\compression</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\compression\message_compress.h">
<Filter>src\core\lib\compression</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\debug\trace.h">
<Filter>src\core\lib\debug</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\format_request.h">
<Filter>src\core\lib\http</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\httpcli.h">
<Filter>src\core\lib\http</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\parser.h">
<Filter>src\core\lib\http</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\closure.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\error.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_epoll_linux.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\executor.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iocp_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_internal.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_utils.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\time_averaged_stats.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\timer.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\timer_heap.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\udp_server.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_pipe.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json.h">
<Filter>src\core\lib\json</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_common.h">
<Filter>src\core\lib\json</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_reader.h">
<Filter>src\core\lib\json</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_writer.h">
<Filter>src\core\lib\json</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\api_trace.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\call.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\call_test_only.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel_init.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel_stack_type.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\completion_queue.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\event_string.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\init.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\lame_client.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\server.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\byte_stream.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\connectivity_state.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\metadata.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\metadata_batch.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\static_metadata.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\transport.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\transport_impl.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\context\security_context.h">
<Filter>src\core\lib\security\context</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\composite\composite_credentials.h">
<Filter>src\core\lib\security\credentials\composite</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials.h">
<Filter>src\core\lib\security\credentials</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\fake\fake_credentials.h">
<Filter>src\core\lib\security\credentials\fake</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\google_default_credentials.h">
<Filter>src\core\lib\security\credentials\google_default</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\iam\iam_credentials.h">
<Filter>src\core\lib\security\credentials\iam</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\json_token.h">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_credentials.h">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_verifier.h">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\oauth2\oauth2_credentials.h">
<Filter>src\core\lib\security\credentials\oauth2</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\plugin\plugin_credentials.h">
<Filter>src\core\lib\security\credentials\plugin</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\ssl\ssl_credentials.h">
<Filter>src\core\lib\security\credentials\ssl</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\auth_filters.h">
<Filter>src\core\lib\security\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\handshake.h">
<Filter>src\core\lib\security\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\secure_endpoint.h">
<Filter>src\core\lib\security\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\security_connector.h">
<Filter>src\core\lib\security\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\tsi_error.h">
<Filter>src\core\lib\security\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\util\b64.h">
<Filter>src\core\lib\security\util</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\util\json_util.h">
<Filter>src\core\lib\security\util</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\ext\transport\chttp2\alpn\alpn.h">
<Filter>src\core\ext\transport\chttp2\alpn</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\fake_transport_security.h">
<Filter>src\core\lib\tsi</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_transport_security.h">
<Filter>src\core\lib\tsi</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_types.h">
<Filter>src\core\lib\tsi</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security.h">
<Filter>src\core\lib\tsi</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security_interface.h">
<Filter>src\core\lib\tsi</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -458,6 +1139,90 @@
<Filter Include="src"> <Filter Include="src">
<UniqueIdentifier>{328ff211-2886-406e-56f9-18ba1686f363}</UniqueIdentifier> <UniqueIdentifier>{328ff211-2886-406e-56f9-18ba1686f363}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="src\core">
<UniqueIdentifier>{d02f1155-7e7e-3736-3c69-dc9146dc523d}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\ext">
<UniqueIdentifier>{96d09c4a-59f9-3486-6c2f-cbf695b285d8}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\ext\transport">
<UniqueIdentifier>{202b1172-189f-afc4-f16c-4ca12677b480}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\ext\transport\chttp2">
<UniqueIdentifier>{9de393b8-4b6e-6c34-122a-940419ca9989}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\ext\transport\chttp2\alpn">
<UniqueIdentifier>{efb6b3e6-8c7b-c2a0-12c6-486c68cdb8ec}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib">
<UniqueIdentifier>{80567a8f-622f-a3ce-c12d-aebb63984b07}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\channel">
<UniqueIdentifier>{e769265c-8abd-cd64-2cc2-a52da484fe7b}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\compression">
<UniqueIdentifier>{701b2d46-11c6-3640-b189-45287f00bee3}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\debug">
<UniqueIdentifier>{ada68fd5-8e51-98cb-71a7-baf7989d8ffa}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\http">
<UniqueIdentifier>{e770844e-61d4-555e-59be-81288e21a35f}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\iomgr">
<UniqueIdentifier>{04dfa1c8-7ffe-4f06-4a7c-37441dc75764}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\json">
<UniqueIdentifier>{a5d5bddf-6f19-b655-a03a-f30ff5c253a5}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security">
<UniqueIdentifier>{dbd8cbb6-6308-d6fe-7a36-06cc7045c037}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\context">
<UniqueIdentifier>{ecd2c264-808d-0041-2f69-a5200543de91}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials">
<UniqueIdentifier>{0015e481-7e80-8936-a25c-c3fa260cc095}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\composite">
<UniqueIdentifier>{fad200df-a5e2-1648-7442-cea0f07edd4d}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\fake">
<UniqueIdentifier>{397464b3-9bbd-15a5-041b-c7deef1662ec}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\google_default">
<UniqueIdentifier>{567691b4-6a06-cc5a-c6ad-e8c080b89ecf}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\iam">
<UniqueIdentifier>{d5930113-d396-7a70-d273-d07a1feae0ff}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\jwt">
<UniqueIdentifier>{0f6afb67-4b51-6344-9de7-2b1a18a19e7d}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\oauth2">
<UniqueIdentifier>{99faa051-ca9f-cb4f-36d5-95f042fb22bc}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\plugin">
<UniqueIdentifier>{b7a9e7e5-2445-6b0f-4677-5095ca10e760}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\ssl">
<UniqueIdentifier>{436bc65a-0c1b-d85a-2c91-6474588c5cb6}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\transport">
<UniqueIdentifier>{e6a9bf58-3b0f-0b3d-3a35-3ded80d27695}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\util">
<UniqueIdentifier>{b4a1cab8-5c2c-909a-8097-7a5c8f0aa9f7}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\surface">
<UniqueIdentifier>{fb2276d7-5a11-f1d9-82c3-e7c7f1155523}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\transport">
<UniqueIdentifier>{4bd7971a-68f7-0d5a-f502-6dea3099caaa}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\tsi">
<UniqueIdentifier>{aa0153b8-c9b6-ae1d-ebdd-89754d8579f1}</UniqueIdentifier>
</Filter>
<Filter Include="src\cpp"> <Filter Include="src\cpp">
<UniqueIdentifier>{2420a905-e4f1-a5aa-a364-6a112878a39e}</UniqueIdentifier> <UniqueIdentifier>{2420a905-e4f1-a5aa-a364-6a112878a39e}</UniqueIdentifier>
</Filter> </Filter>

@ -356,11 +356,122 @@
<ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_posix.h" /> <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_posix.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_windows.h" /> <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\sync_windows.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\time.h" /> <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\time.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\byte_buffer.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\byte_buffer_reader.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\compression.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_posix.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\status.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security.h" />
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security_constants.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="$(SolutionDir)\..\src\cpp\client\create_channel_internal.h" /> <ClInclude Include="$(SolutionDir)\..\src\cpp\client\create_channel_internal.h" />
<ClInclude Include="$(SolutionDir)\..\src\cpp\server\dynamic_thread_pool.h" /> <ClInclude Include="$(SolutionDir)\..\src\cpp\server\dynamic_thread_pool.h" />
<ClInclude Include="$(SolutionDir)\..\src\cpp\server\thread_pool_interface.h" /> <ClInclude Include="$(SolutionDir)\..\src\cpp\server\thread_pool_interface.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_args.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack_builder.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\compress_filter.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\connected_channel.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\context.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_client_filter.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_server_filter.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\compression\algorithm_metadata.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\compression\message_compress.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\debug\trace.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\format_request.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\httpcli.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\parser.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\closure.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\error.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_epoll_linux.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\executor.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iocp_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_internal.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_utils.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\time_averaged_stats.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\timer.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\timer_heap.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\udp_server.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_pipe.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_posix.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_windows.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_common.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_reader.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_writer.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\api_trace.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\call.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\call_test_only.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel_init.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel_stack_type.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\completion_queue.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\event_string.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\init.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\lame_client.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\server.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\byte_stream.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\connectivity_state.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\metadata.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\metadata_batch.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\static_metadata.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\transport.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\transport_impl.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\context\security_context.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\composite\composite_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\fake\fake_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\google_default_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\iam\iam_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\json_token.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_verifier.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\oauth2\oauth2_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\plugin\plugin_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\ssl\ssl_credentials.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\auth_filters.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\handshake.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\secure_endpoint.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\security_connector.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\tsi_error.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\util\b64.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\util\json_util.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\ext\transport\chttp2\alpn\alpn.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\fake_transport_security.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_transport_security.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_types.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security_interface.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="$(SolutionDir)\..\src\cpp\common\insecure_create_auth_context.cc"> <ClCompile Include="$(SolutionDir)\..\src\cpp\common\insecure_create_auth_context.cc">
@ -417,6 +528,238 @@
</ClCompile> </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\cpp\util\time.cc"> <ClCompile Include="$(SolutionDir)\..\src\cpp\util\time.cc">
</ClCompile> </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_args.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack_builder.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\compress_filter.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\connected_channel.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\http_client_filter.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\http_server_filter.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\compression\compression.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\compression\message_compress.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\debug\trace.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\format_request.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\httpcli.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\parser.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\closure.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\error.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_epoll_linux.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\executor.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iocp_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_utils.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_common_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_linux.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\time_averaged_stats.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\timer.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\timer_heap.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\udp_server.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix_noop.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_eventfd.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_nospecial.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_pipe.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_reader.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_string.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_writer.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\alarm.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\api_trace.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\byte_buffer.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\byte_buffer_reader.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call_details.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call_log_batch.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_init.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_ping.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_stack_type.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\completion_queue.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\event_string.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\lame_client.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\metadata_array.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\server.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\validate_metadata.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\version.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\byte_stream.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\connectivity_state.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\metadata.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\metadata_batch.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\static_metadata.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\transport.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\transport_op_string.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\httpcli_security_connector.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\context\security_context.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\composite\composite_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials_metadata.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\fake\fake_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\credentials_posix.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\credentials_windows.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\google_default_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\iam\iam_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\json_token.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_verifier.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\oauth2\oauth2_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\plugin\plugin_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\ssl\ssl_credentials.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\client_auth_filter.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\handshake.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\secure_endpoint.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\security_connector.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\server_auth_filter.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\tsi_error.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\util\b64.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\util\json_util.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\init_secure.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\chttp2\alpn\alpn.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\fake_transport_security.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_transport_security.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\cpp\codegen\codegen_init.cc"> <ClCompile Include="$(SolutionDir)\..\src\cpp\codegen\codegen_init.cc">
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>

@ -82,6 +82,354 @@
<ClCompile Include="$(SolutionDir)\..\src\cpp\util\time.cc"> <ClCompile Include="$(SolutionDir)\..\src\cpp\util\time.cc">
<Filter>src\cpp\util</Filter> <Filter>src\cpp\util</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_args.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack_builder.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\compress_filter.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\connected_channel.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\http_client_filter.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\http_server_filter.c">
<Filter>src\core\lib\channel</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\compression\compression.c">
<Filter>src\core\lib\compression</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\compression\message_compress.c">
<Filter>src\core\lib\compression</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\debug\trace.c">
<Filter>src\core\lib\debug</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\format_request.c">
<Filter>src\core\lib\http</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\httpcli.c">
<Filter>src\core\lib\http</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\parser.c">
<Filter>src\core\lib\http</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\closure.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\error.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_epoll_linux.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\executor.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iocp_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_utils.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_common_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_linux.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\time_averaged_stats.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\timer.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\timer_heap.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\udp_server.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix_noop.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_eventfd.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_nospecial.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_pipe.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_posix.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_windows.c">
<Filter>src\core\lib\iomgr</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json.c">
<Filter>src\core\lib\json</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_reader.c">
<Filter>src\core\lib\json</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_string.c">
<Filter>src\core\lib\json</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\json\json_writer.c">
<Filter>src\core\lib\json</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\alarm.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\api_trace.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\byte_buffer.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\byte_buffer_reader.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call_details.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\call_log_batch.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_init.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_ping.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\channel_stack_type.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\completion_queue.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\event_string.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\lame_client.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\metadata_array.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\server.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\validate_metadata.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\version.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\byte_stream.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\connectivity_state.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\metadata.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\metadata_batch.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\static_metadata.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\transport.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\transport\transport_op_string.c">
<Filter>src\core\lib\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\http\httpcli_security_connector.c">
<Filter>src\core\lib\http</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\context\security_context.c">
<Filter>src\core\lib\security\context</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\composite\composite_credentials.c">
<Filter>src\core\lib\security\credentials\composite</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials.c">
<Filter>src\core\lib\security\credentials</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials_metadata.c">
<Filter>src\core\lib\security\credentials</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\fake\fake_credentials.c">
<Filter>src\core\lib\security\credentials\fake</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\credentials_posix.c">
<Filter>src\core\lib\security\credentials\google_default</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\credentials_windows.c">
<Filter>src\core\lib\security\credentials\google_default</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\google_default_credentials.c">
<Filter>src\core\lib\security\credentials\google_default</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\iam\iam_credentials.c">
<Filter>src\core\lib\security\credentials\iam</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\json_token.c">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_credentials.c">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_verifier.c">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\oauth2\oauth2_credentials.c">
<Filter>src\core\lib\security\credentials\oauth2</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\plugin\plugin_credentials.c">
<Filter>src\core\lib\security\credentials\plugin</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\credentials\ssl\ssl_credentials.c">
<Filter>src\core\lib\security\credentials\ssl</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\client_auth_filter.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\handshake.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\secure_endpoint.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\security_connector.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\server_auth_filter.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\transport\tsi_error.c">
<Filter>src\core\lib\security\transport</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\util\b64.c">
<Filter>src\core\lib\security\util</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\security\util\json_util.c">
<Filter>src\core\lib\security\util</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\surface\init_secure.c">
<Filter>src\core\lib\surface</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\ext\transport\chttp2\alpn\alpn.c">
<Filter>src\core\ext\transport\chttp2\alpn</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\fake_transport_security.c">
<Filter>src\core\lib\tsi</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_transport_security.c">
<Filter>src\core\lib\tsi</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security.c">
<Filter>src\core\lib\tsi</Filter>
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\cpp\codegen\codegen_init.cc"> <ClCompile Include="$(SolutionDir)\..\src\cpp\codegen\codegen_init.cc">
<Filter>src\cpp\codegen</Filter> <Filter>src\cpp\codegen</Filter>
</ClCompile> </ClCompile>
@ -381,6 +729,30 @@
<ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\time.h"> <ClInclude Include="$(SolutionDir)\..\include\grpc\impl\codegen\time.h">
<Filter>include\grpc\impl\codegen</Filter> <Filter>include\grpc\impl\codegen</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\byte_buffer.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\byte_buffer_reader.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\compression.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_posix.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\status.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security.h">
<Filter>include\grpc</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security_constants.h">
<Filter>include\grpc</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="$(SolutionDir)\..\src\cpp\client\create_channel_internal.h"> <ClInclude Include="$(SolutionDir)\..\src\cpp\client\create_channel_internal.h">
@ -392,6 +764,315 @@
<ClInclude Include="$(SolutionDir)\..\src\cpp\server\thread_pool_interface.h"> <ClInclude Include="$(SolutionDir)\..\src\cpp\server\thread_pool_interface.h">
<Filter>src\cpp\server</Filter> <Filter>src\cpp\server</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_args.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\channel_stack_builder.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\compress_filter.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\connected_channel.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\context.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_client_filter.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_server_filter.h">
<Filter>src\core\lib\channel</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\compression\algorithm_metadata.h">
<Filter>src\core\lib\compression</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\compression\message_compress.h">
<Filter>src\core\lib\compression</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\debug\trace.h">
<Filter>src\core\lib\debug</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\format_request.h">
<Filter>src\core\lib\http</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\httpcli.h">
<Filter>src\core\lib\http</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\http\parser.h">
<Filter>src\core\lib\http</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\closure.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\endpoint_pair.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\error.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_epoll_linux.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_and_epoll_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_poll_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\ev_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\exec_ctx.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\executor.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iocp_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_internal.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\iomgr_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_set_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\resolve_address.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_utils.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\sockaddr_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_utils_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\socket_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_client.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_server.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\tcp_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\time_averaged_stats.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\timer.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\timer_heap.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\udp_server.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\unix_sockets_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_pipe.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\wakeup_fd_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_posix.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\workqueue_windows.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json.h">
<Filter>src\core\lib\json</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_common.h">
<Filter>src\core\lib\json</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_reader.h">
<Filter>src\core\lib\json</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\json\json_writer.h">
<Filter>src\core\lib\json</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\api_trace.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\call.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\call_test_only.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel_init.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\channel_stack_type.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\completion_queue.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\event_string.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\init.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\lame_client.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\surface\server.h">
<Filter>src\core\lib\surface</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\byte_stream.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\connectivity_state.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\metadata.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\metadata_batch.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\static_metadata.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\transport.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\transport\transport_impl.h">
<Filter>src\core\lib\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\context\security_context.h">
<Filter>src\core\lib\security\context</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\composite\composite_credentials.h">
<Filter>src\core\lib\security\credentials\composite</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\credentials.h">
<Filter>src\core\lib\security\credentials</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\fake\fake_credentials.h">
<Filter>src\core\lib\security\credentials\fake</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\google_default\google_default_credentials.h">
<Filter>src\core\lib\security\credentials\google_default</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\iam\iam_credentials.h">
<Filter>src\core\lib\security\credentials\iam</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\json_token.h">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_credentials.h">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\jwt\jwt_verifier.h">
<Filter>src\core\lib\security\credentials\jwt</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\oauth2\oauth2_credentials.h">
<Filter>src\core\lib\security\credentials\oauth2</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\plugin\plugin_credentials.h">
<Filter>src\core\lib\security\credentials\plugin</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\credentials\ssl\ssl_credentials.h">
<Filter>src\core\lib\security\credentials\ssl</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\auth_filters.h">
<Filter>src\core\lib\security\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\handshake.h">
<Filter>src\core\lib\security\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\secure_endpoint.h">
<Filter>src\core\lib\security\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\security_connector.h">
<Filter>src\core\lib\security\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\transport\tsi_error.h">
<Filter>src\core\lib\security\transport</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\util\b64.h">
<Filter>src\core\lib\security\util</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\security\util\json_util.h">
<Filter>src\core\lib\security\util</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\ext\transport\chttp2\alpn\alpn.h">
<Filter>src\core\ext\transport\chttp2\alpn</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\fake_transport_security.h">
<Filter>src\core\lib\tsi</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_transport_security.h">
<Filter>src\core\lib\tsi</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\ssl_types.h">
<Filter>src\core\lib\tsi</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security.h">
<Filter>src\core\lib\tsi</Filter>
</ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\tsi\transport_security_interface.h">
<Filter>src\core\lib\tsi</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -431,6 +1112,90 @@
<Filter Include="src"> <Filter Include="src">
<UniqueIdentifier>{cce6a85d-1111-3834-6825-31e170d93cff}</UniqueIdentifier> <UniqueIdentifier>{cce6a85d-1111-3834-6825-31e170d93cff}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="src\core">
<UniqueIdentifier>{595f2ea0-aafb-87e5-c938-db3ff0b0c69a}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\ext">
<UniqueIdentifier>{52eca76b-9502-3d96-9064-6415226a860f}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\ext\transport">
<UniqueIdentifier>{8e70201f-3b54-d3cb-8b30-ebe0d96a9b2a}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\ext\transport\chttp2">
<UniqueIdentifier>{d505ab7b-5e44-f307-5361-500128965cdc}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\ext\transport\chttp2\alpn">
<UniqueIdentifier>{d54bab94-cab9-803d-2737-5120774f1893}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib">
<UniqueIdentifier>{cf8fd5d8-ff54-331d-2d20-36d6cae0e14b}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\channel">
<UniqueIdentifier>{7e0225af-000b-4873-1c16-caffffbfd084}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\compression">
<UniqueIdentifier>{0bbdbf56-83ad-bb4b-c4e2-a6d38c342179}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\debug">
<UniqueIdentifier>{3875f7d7-ff11-c91d-0f98-810260cb554b}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\http">
<UniqueIdentifier>{4bd405b9-af65-f0a6-d67a-433f75900668}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\iomgr">
<UniqueIdentifier>{f4b146e4-8fba-83a6-1cc1-1262ebb785e8}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\json">
<UniqueIdentifier>{b83c8e70-e491-f6f9-a08c-85f632bb61d2}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security">
<UniqueIdentifier>{7e21ce26-45e2-6baf-037d-8ab4374077a9}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\context">
<UniqueIdentifier>{613e655a-e5c0-9f0c-2bb4-62310a7329c0}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials">
<UniqueIdentifier>{30bddf3f-0eda-9f2f-8171-d86b1e4896fc}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\composite">
<UniqueIdentifier>{b34f8fa3-0fb9-4916-be6d-2a14a0794882}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\fake">
<UniqueIdentifier>{7e11872b-bfbb-7d23-4783-e56909c520e8}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\google_default">
<UniqueIdentifier>{212855e8-b7bc-d5bb-0734-dd28996f28de}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\iam">
<UniqueIdentifier>{6d3828d0-5e5f-15c2-7d46-5d4039a88aad}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\jwt">
<UniqueIdentifier>{b31e7015-364c-5701-31d0-644b1a8ae8c9}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\oauth2">
<UniqueIdentifier>{43e3cb91-4101-1fee-6833-20f77ab7f4e5}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\plugin">
<UniqueIdentifier>{727c0b51-4544-957f-45f2-00bf42ff7db9}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\credentials\ssl">
<UniqueIdentifier>{606a441b-0d57-85d8-8079-1e6e502d18f1}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\transport">
<UniqueIdentifier>{5b0b16ae-a8ad-81c3-afe4-8ac0b9e15311}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\security\util">
<UniqueIdentifier>{56333427-0f81-b88b-bf49-a1b2f462023d}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\surface">
<UniqueIdentifier>{1d59dcef-3358-d0ab-fa42-64da74065785}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\transport">
<UniqueIdentifier>{ba865739-5dd9-6731-6772-48c25d45134f}</UniqueIdentifier>
</Filter>
<Filter Include="src\core\lib\tsi">
<UniqueIdentifier>{dd4e4960-5bc8-395b-09c4-f2cbd6f6432b}</UniqueIdentifier>
</Filter>
<Filter Include="src\cpp"> <Filter Include="src\cpp">
<UniqueIdentifier>{1e5fd68c-bd87-e803-42b0-75a7fa19b91d}</UniqueIdentifier> <UniqueIdentifier>{1e5fd68c-bd87-e803-42b0-75a7fa19b91d}</UniqueIdentifier>
</Filter> </Filter>

Loading…
Cancel
Save