Merge github.com:grpc/grpc into poll-wakeup

pull/9984/head
Craig Tiller 8 years ago
commit 3fd238a2c6
  1. 14
      .pylintrc
  2. 61
      CMakeLists.txt
  3. 76
      Makefile
  4. 21
      bazel/cc_grpc_library.bzl
  5. 3
      bazel/grpc_build_system.bzl
  6. 20
      binding.gyp
  7. 25
      build.yaml
  8. 2
      doc/PROTOCOL-WEB.md
  9. 2
      setup.py
  10. 4
      src/compiler/cpp_generator.cc
  11. 2
      src/core/ext/client_channel/client_channel_plugin.c
  12. 10
      src/core/ext/client_channel/http_proxy.c
  13. 28
      src/core/ext/client_channel/parse_address.c
  14. 22
      src/core/ext/client_channel/resolver_registry.c
  15. 5
      src/core/ext/client_channel/resolver_registry.h
  16. 11
      src/core/ext/client_channel/subchannel.c
  17. 3
      src/core/ext/client_channel/subchannel.h
  18. 37
      src/core/ext/client_channel/uri_parser.c
  19. 4
      src/core/ext/client_channel/uri_parser.h
  20. 2
      src/core/ext/lb_policy/grpclb/grpclb.c
  21. 2
      src/core/ext/transport/chttp2/client/chttp2_connector.c
  22. 3
      src/core/ext/transport/chttp2/client/insecure/channel_create.c
  23. 7
      src/core/ext/transport/chttp2/client/secure/secure_channel_create.c
  24. 12
      src/core/lib/iomgr/sockaddr_utils.c
  25. 19
      src/core/lib/iomgr/tcp_server_posix.c
  26. 8
      src/core/lib/support/sync.c
  27. 4
      src/core/lib/surface/call.c
  28. 35
      src/core/lib/transport/transport.c
  29. 6
      src/core/lib/transport/transport.h
  30. 26
      src/csharp/Grpc.Auth/Grpc.Auth.csproj
  31. 10
      src/csharp/Grpc.Auth/packages.config
  32. 2
      src/csharp/Grpc.Auth/project.json
  33. 86
      src/csharp/Grpc.Core.Tests/AuthContextTest.cs
  34. 82
      src/csharp/Grpc.Core.Tests/AuthPropertyTest.cs
  35. 12
      src/csharp/Grpc.Core.Tests/ClientServerTest.cs
  36. 19
      src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
  37. 7
      src/csharp/Grpc.Core.Tests/packages.config
  38. 8
      src/csharp/Grpc.Core.Tests/project.json
  39. 128
      src/csharp/Grpc.Core/AuthContext.cs
  40. 126
      src/csharp/Grpc.Core/AuthProperty.cs
  41. 4
      src/csharp/Grpc.Core/Grpc.Core.csproj
  42. 119
      src/csharp/Grpc.Core/Internal/AuthContextSafeHandle.cs
  43. 10
      src/csharp/Grpc.Core/Internal/BatchContextSafeHandle.cs
  44. 8
      src/csharp/Grpc.Core/Internal/CallSafeHandle.cs
  45. 67
      src/csharp/Grpc.Core/Internal/MarshalUtils.cs
  46. 18
      src/csharp/Grpc.Core/Internal/NativeMethods.cs
  47. 13
      src/csharp/Grpc.Core/Metadata.cs
  48. 23
      src/csharp/Grpc.Core/ServerCallContext.cs
  49. 12
      src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj
  50. 6
      src/csharp/Grpc.Examples.Tests/packages.config
  51. 4
      src/csharp/Grpc.Examples.Tests/project.json
  52. 14
      src/csharp/Grpc.Examples/Grpc.Examples.csproj
  53. 4
      src/csharp/Grpc.Examples/packages.config
  54. 9
      src/csharp/Grpc.Examples/project.json
  55. 10
      src/csharp/Grpc.HealthCheck.Tests/Grpc.HealthCheck.Tests.csproj
  56. 6
      src/csharp/Grpc.HealthCheck.Tests/packages.config
  57. 4
      src/csharp/Grpc.HealthCheck.Tests/project.json
  58. 6
      src/csharp/Grpc.HealthCheck/Grpc.HealthCheck.csproj
  59. 2
      src/csharp/Grpc.HealthCheck/packages.config
  60. 9
      src/csharp/Grpc.HealthCheck/project.json
  61. 28
      src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj
  62. 10
      src/csharp/Grpc.IntegrationTesting.Client/packages.config
  63. 3
      src/csharp/Grpc.IntegrationTesting.QpsWorker/packages.config
  64. 28
      src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj
  65. 10
      src/csharp/Grpc.IntegrationTesting.Server/packages.config
  66. 3
      src/csharp/Grpc.IntegrationTesting.StressClient/packages.config
  67. 497
      src/csharp/Grpc.IntegrationTesting/Control.cs
  68. 12
      src/csharp/Grpc.IntegrationTesting/Empty.cs
  69. 52
      src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
  70. 128
      src/csharp/Grpc.IntegrationTesting/Messages.cs
  71. 4
      src/csharp/Grpc.IntegrationTesting/Metrics.cs
  72. 4
      src/csharp/Grpc.IntegrationTesting/Payloads.cs
  73. 38
      src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs
  74. 26
      src/csharp/Grpc.IntegrationTesting/Stats.cs
  75. 22
      src/csharp/Grpc.IntegrationTesting/packages.config
  76. 15
      src/csharp/Grpc.IntegrationTesting/project.json
  77. 16
      src/csharp/Grpc.Reflection.Tests/Grpc.Reflection.Tests.csproj
  78. 6
      src/csharp/Grpc.Reflection.Tests/packages.config
  79. 4
      src/csharp/Grpc.Reflection.Tests/project.json
  80. 6
      src/csharp/Grpc.Reflection/Grpc.Reflection.csproj
  81. 98
      src/csharp/Grpc.Reflection/Reflection.cs
  82. 2
      src/csharp/Grpc.Reflection/packages.config
  83. 9
      src/csharp/Grpc.Reflection/project.json
  84. 25
      src/csharp/ext/grpc_csharp_ext.c
  85. 3
      src/csharp/tests.json
  86. 10
      src/python/grpcio/grpc/_channel.py
  87. 2
      src/python/grpcio/grpc/beta/_client_adaptations.py
  88. 4
      src/python/grpcio/grpc/beta/_server_adaptations.py
  89. 2
      src/python/grpcio/grpc/beta/implementations.py
  90. 25
      src/python/grpcio/grpc/framework/interfaces/base/base.py
  91. 2
      src/python/grpcio/grpc/framework/interfaces/face/face.py
  92. 2
      src/python/grpcio_health_checking/setup.py
  93. 2
      src/python/grpcio_reflection/setup.py
  94. 2
      src/python/grpcio_tests/setup.py
  95. 5
      src/ruby/ext/grpc/extconf.rb
  96. 20
      templates/binding.gyp.template
  97. 2
      templates/src/csharp/Grpc.Auth/project.json.template
  98. 8
      templates/src/csharp/Grpc.Core.Tests/project.json.template
  99. 4
      templates/src/csharp/Grpc.Examples.Tests/project.json.template
  100. 9
      templates/src/csharp/Grpc.Examples/project.json.template
  101. Some files were not shown because too many files have changed in this diff Show More

@ -3,6 +3,12 @@
# not include "unused_" and "ignored_" by default? # not include "unused_" and "ignored_" by default?
dummy-variables-rgx=^ignored_|^unused_ dummy-variables-rgx=^ignored_|^unused_
[DESIGN]
# NOTE(nathaniel): Not particularly attached to this value; it just seems to
# be what works for us at the moment (excepting the dead-code-walking Beta
# API).
max-args=6
[MISCELLANEOUS] [MISCELLANEOUS]
# NOTE(nathaniel): We are big fans of "TODO(<issue link>): " and # NOTE(nathaniel): We are big fans of "TODO(<issue link>): " and
# "NOTE(<username or issue link>): ". We do not allow "TODO:", # "NOTE(<username or issue link>): ". We do not allow "TODO:",
@ -13,28 +19,22 @@ notes=FIXME,XXX
#TODO: Enable missing-docstring #TODO: Enable missing-docstring
#TODO: Enable too-few-public-methods #TODO: Enable too-few-public-methods
#TODO: Enable too-many-arguments
#TODO: Enable no-init #TODO: Enable no-init
#TODO: Enable duplicate-code #TODO: Enable duplicate-code
#TODO: Enable invalid-name #TODO: Enable invalid-name
#TODO: Enable suppressed-message
#TODO: Enable locally-disabled #TODO: Enable locally-disabled
#TODO: Enable protected-access #TODO: Enable protected-access
#TODO: Enable no-name-in-module #TODO: Enable no-name-in-module
#TODO: Enable unused-argument
#TODO: Enable wrong-import-order #TODO: Enable wrong-import-order
# TODO(https://github.com/PyCQA/pylint/issues/59#issuecomment-283774279): # TODO(https://github.com/PyCQA/pylint/issues/59#issuecomment-283774279):
# enable cyclic-import after a 1.7-or-later pylint release that recognizes our # enable cyclic-import after a 1.7-or-later pylint release that recognizes our
# disable=cyclic-import suppressions. # disable=cyclic-import suppressions.
#TODO: Enable too-many-instance-attributes #TODO: Enable too-many-instance-attributes
#TODO: Enable too-many-locals
#TODO: Enable too-many-lines #TODO: Enable too-many-lines
#TODO: Enable redefined-variable-type #TODO: Enable redefined-variable-type
#TODO: Enable next-method-called #TODO: Enable next-method-called
#TODO: Enable import-error #TODO: Enable import-error
#TODO: Enable useless-else-on-loop #TODO: Enable useless-else-on-loop
#TODO: Enable too-many-return-statements
#TODO: Enable too-many-nested-blocks #TODO: Enable too-many-nested-blocks
#TODO: Enable super-init-not-called
disable=missing-docstring,too-few-public-methods,too-many-arguments,no-init,duplicate-code,invalid-name,suppressed-message,locally-disabled,protected-access,no-name-in-module,unused-argument,wrong-import-order,cyclic-import,too-many-instance-attributes,too-many-locals,too-many-lines,redefined-variable-type,next-method-called,import-error,useless-else-on-loop,too-many-return-statements,too-many-nested-blocks,super-init-not-called disable=missing-docstring,too-few-public-methods,no-init,duplicate-code,invalid-name,locally-disabled,protected-access,no-name-in-module,wrong-import-order,cyclic-import,too-many-instance-attributes,too-many-lines,redefined-variable-type,next-method-called,import-error,useless-else-on-loop,too-many-nested-blocks

@ -440,6 +440,7 @@ add_dependencies(buildtests_c mlog_test)
add_dependencies(buildtests_c multiple_server_queues_test) add_dependencies(buildtests_c multiple_server_queues_test)
add_dependencies(buildtests_c murmur_hash_test) add_dependencies(buildtests_c murmur_hash_test)
add_dependencies(buildtests_c no_server_test) add_dependencies(buildtests_c no_server_test)
add_dependencies(buildtests_c parse_address_test)
add_dependencies(buildtests_c percent_encoding_test) add_dependencies(buildtests_c percent_encoding_test)
if(_gRPC_PLATFORM_LINUX) if(_gRPC_PLATFORM_LINUX)
add_dependencies(buildtests_c pollset_set_test) add_dependencies(buildtests_c pollset_set_test)
@ -464,6 +465,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_c socket_utils_test) add_dependencies(buildtests_c socket_utils_test)
endif() endif()
add_dependencies(buildtests_c status_conversion_test) add_dependencies(buildtests_c status_conversion_test)
add_dependencies(buildtests_c stream_owned_slice_test)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_c tcp_client_posix_test) add_dependencies(buildtests_c tcp_client_posix_test)
endif() endif()
@ -1450,7 +1452,7 @@ add_library(grpc_test_util
test/core/security/oauth2_utils.c test/core/security/oauth2_utils.c
test/core/end2end/cq_verifier.c test/core/end2end/cq_verifier.c
test/core/end2end/fake_resolver.c test/core/end2end/fake_resolver.c
test/core/end2end/fixtures/http_proxy.c test/core/end2end/fixtures/http_proxy_fixture.c
test/core/end2end/fixtures/proxy.c test/core/end2end/fixtures/proxy.c
test/core/iomgr/endpoint_tests.c test/core/iomgr/endpoint_tests.c
test/core/util/debugger_macros.c test/core/util/debugger_macros.c
@ -1657,7 +1659,7 @@ if (gRPC_BUILD_TESTS)
add_library(grpc_test_util_unsecure add_library(grpc_test_util_unsecure
test/core/end2end/cq_verifier.c test/core/end2end/cq_verifier.c
test/core/end2end/fake_resolver.c test/core/end2end/fake_resolver.c
test/core/end2end/fixtures/http_proxy.c test/core/end2end/fixtures/http_proxy_fixture.c
test/core/end2end/fixtures/proxy.c test/core/end2end/fixtures/proxy.c
test/core/iomgr/endpoint_tests.c test/core/iomgr/endpoint_tests.c
test/core/util/debugger_macros.c test/core/util/debugger_macros.c
@ -3143,6 +3145,7 @@ target_link_libraries(grpc_benchmark
${_gRPC_ALLTARGETS_LIBRARIES} ${_gRPC_ALLTARGETS_LIBRARIES}
benchmark benchmark
grpc++ grpc++
grpc_test_util
grpc grpc
${_gRPC_GFLAGS_LIBRARIES} ${_gRPC_GFLAGS_LIBRARIES}
) )
@ -6494,6 +6497,33 @@ target_link_libraries(no_server_test
endif (gRPC_BUILD_TESTS) endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS)
add_executable(parse_address_test
test/core/client_channel/parse_address_test.c
)
target_include_directories(parse_address_test
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
PRIVATE ${BORINGSSL_ROOT_DIR}/include
PRIVATE ${PROTOBUF_ROOT_DIR}/src
PRIVATE ${BENCHMARK_ROOT_DIR}/include
PRIVATE ${ZLIB_ROOT_DIR}
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
)
target_link_libraries(parse_address_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
grpc
gpr_test_util
gpr
)
endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS)
add_executable(percent_encoding_test add_executable(percent_encoding_test
test/core/slice/percent_encoding_test.c test/core/slice/percent_encoding_test.c
) )
@ -6984,6 +7014,33 @@ target_link_libraries(status_conversion_test
gpr gpr
) )
endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS)
add_executable(stream_owned_slice_test
test/core/transport/stream_owned_slice_test.c
)
target_include_directories(stream_owned_slice_test
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
PRIVATE ${BORINGSSL_ROOT_DIR}/include
PRIVATE ${PROTOBUF_ROOT_DIR}/src
PRIVATE ${BENCHMARK_ROOT_DIR}/include
PRIVATE ${ZLIB_ROOT_DIR}
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
)
target_link_libraries(stream_owned_slice_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
grpc
gpr_test_util
gpr
)
endif (gRPC_BUILD_TESTS) endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)

@ -1002,6 +1002,7 @@ murmur_hash_test: $(BINDIR)/$(CONFIG)/murmur_hash_test
nanopb_fuzzer_response_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test nanopb_fuzzer_response_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test
nanopb_fuzzer_serverlist_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test nanopb_fuzzer_serverlist_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test
no_server_test: $(BINDIR)/$(CONFIG)/no_server_test no_server_test: $(BINDIR)/$(CONFIG)/no_server_test
parse_address_test: $(BINDIR)/$(CONFIG)/parse_address_test
percent_decode_fuzzer: $(BINDIR)/$(CONFIG)/percent_decode_fuzzer percent_decode_fuzzer: $(BINDIR)/$(CONFIG)/percent_decode_fuzzer
percent_encode_fuzzer: $(BINDIR)/$(CONFIG)/percent_encode_fuzzer percent_encode_fuzzer: $(BINDIR)/$(CONFIG)/percent_encode_fuzzer
percent_encoding_test: $(BINDIR)/$(CONFIG)/percent_encoding_test percent_encoding_test: $(BINDIR)/$(CONFIG)/percent_encoding_test
@ -1024,6 +1025,7 @@ sockaddr_utils_test: $(BINDIR)/$(CONFIG)/sockaddr_utils_test
socket_utils_test: $(BINDIR)/$(CONFIG)/socket_utils_test socket_utils_test: $(BINDIR)/$(CONFIG)/socket_utils_test
ssl_server_fuzzer: $(BINDIR)/$(CONFIG)/ssl_server_fuzzer ssl_server_fuzzer: $(BINDIR)/$(CONFIG)/ssl_server_fuzzer
status_conversion_test: $(BINDIR)/$(CONFIG)/status_conversion_test status_conversion_test: $(BINDIR)/$(CONFIG)/status_conversion_test
stream_owned_slice_test: $(BINDIR)/$(CONFIG)/stream_owned_slice_test
tcp_client_posix_test: $(BINDIR)/$(CONFIG)/tcp_client_posix_test tcp_client_posix_test: $(BINDIR)/$(CONFIG)/tcp_client_posix_test
tcp_client_uv_test: $(BINDIR)/$(CONFIG)/tcp_client_uv_test tcp_client_uv_test: $(BINDIR)/$(CONFIG)/tcp_client_uv_test
tcp_posix_test: $(BINDIR)/$(CONFIG)/tcp_posix_test tcp_posix_test: $(BINDIR)/$(CONFIG)/tcp_posix_test
@ -1364,6 +1366,7 @@ buildtests_c: privatelibs_c \
$(BINDIR)/$(CONFIG)/multiple_server_queues_test \ $(BINDIR)/$(CONFIG)/multiple_server_queues_test \
$(BINDIR)/$(CONFIG)/murmur_hash_test \ $(BINDIR)/$(CONFIG)/murmur_hash_test \
$(BINDIR)/$(CONFIG)/no_server_test \ $(BINDIR)/$(CONFIG)/no_server_test \
$(BINDIR)/$(CONFIG)/parse_address_test \
$(BINDIR)/$(CONFIG)/percent_encoding_test \ $(BINDIR)/$(CONFIG)/percent_encoding_test \
$(BINDIR)/$(CONFIG)/pollset_set_test \ $(BINDIR)/$(CONFIG)/pollset_set_test \
$(BINDIR)/$(CONFIG)/resolve_address_posix_test \ $(BINDIR)/$(CONFIG)/resolve_address_posix_test \
@ -1382,6 +1385,7 @@ buildtests_c: privatelibs_c \
$(BINDIR)/$(CONFIG)/sockaddr_utils_test \ $(BINDIR)/$(CONFIG)/sockaddr_utils_test \
$(BINDIR)/$(CONFIG)/socket_utils_test \ $(BINDIR)/$(CONFIG)/socket_utils_test \
$(BINDIR)/$(CONFIG)/status_conversion_test \ $(BINDIR)/$(CONFIG)/status_conversion_test \
$(BINDIR)/$(CONFIG)/stream_owned_slice_test \
$(BINDIR)/$(CONFIG)/tcp_client_posix_test \ $(BINDIR)/$(CONFIG)/tcp_client_posix_test \
$(BINDIR)/$(CONFIG)/tcp_client_uv_test \ $(BINDIR)/$(CONFIG)/tcp_client_uv_test \
$(BINDIR)/$(CONFIG)/tcp_posix_test \ $(BINDIR)/$(CONFIG)/tcp_posix_test \
@ -1805,6 +1809,8 @@ test_c: buildtests_c
$(Q) $(BINDIR)/$(CONFIG)/murmur_hash_test || ( echo test murmur_hash_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/murmur_hash_test || ( echo test murmur_hash_test failed ; exit 1 )
$(E) "[RUN] Testing no_server_test" $(E) "[RUN] Testing no_server_test"
$(Q) $(BINDIR)/$(CONFIG)/no_server_test || ( echo test no_server_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/no_server_test || ( echo test no_server_test failed ; exit 1 )
$(E) "[RUN] Testing parse_address_test"
$(Q) $(BINDIR)/$(CONFIG)/parse_address_test || ( echo test parse_address_test failed ; exit 1 )
$(E) "[RUN] Testing percent_encoding_test" $(E) "[RUN] Testing percent_encoding_test"
$(Q) $(BINDIR)/$(CONFIG)/percent_encoding_test || ( echo test percent_encoding_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/percent_encoding_test || ( echo test percent_encoding_test failed ; exit 1 )
$(E) "[RUN] Testing pollset_set_test" $(E) "[RUN] Testing pollset_set_test"
@ -1841,6 +1847,8 @@ test_c: buildtests_c
$(Q) $(BINDIR)/$(CONFIG)/socket_utils_test || ( echo test socket_utils_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/socket_utils_test || ( echo test socket_utils_test failed ; exit 1 )
$(E) "[RUN] Testing status_conversion_test" $(E) "[RUN] Testing status_conversion_test"
$(Q) $(BINDIR)/$(CONFIG)/status_conversion_test || ( echo test status_conversion_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/status_conversion_test || ( echo test status_conversion_test failed ; exit 1 )
$(E) "[RUN] Testing stream_owned_slice_test"
$(Q) $(BINDIR)/$(CONFIG)/stream_owned_slice_test || ( echo test stream_owned_slice_test failed ; exit 1 )
$(E) "[RUN] Testing tcp_client_posix_test" $(E) "[RUN] Testing tcp_client_posix_test"
$(Q) $(BINDIR)/$(CONFIG)/tcp_client_posix_test || ( echo test tcp_client_posix_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/tcp_client_posix_test || ( echo test tcp_client_posix_test failed ; exit 1 )
$(E) "[RUN] Testing tcp_client_uv_test" $(E) "[RUN] Testing tcp_client_uv_test"
@ -3330,7 +3338,7 @@ LIBGRPC_TEST_UTIL_SRC = \
test/core/security/oauth2_utils.c \ test/core/security/oauth2_utils.c \
test/core/end2end/cq_verifier.c \ test/core/end2end/cq_verifier.c \
test/core/end2end/fake_resolver.c \ test/core/end2end/fake_resolver.c \
test/core/end2end/fixtures/http_proxy.c \ test/core/end2end/fixtures/http_proxy_fixture.c \
test/core/end2end/fixtures/proxy.c \ test/core/end2end/fixtures/proxy.c \
test/core/iomgr/endpoint_tests.c \ test/core/iomgr/endpoint_tests.c \
test/core/util/debugger_macros.c \ test/core/util/debugger_macros.c \
@ -3530,7 +3538,7 @@ endif
LIBGRPC_TEST_UTIL_UNSECURE_SRC = \ LIBGRPC_TEST_UTIL_UNSECURE_SRC = \
test/core/end2end/cq_verifier.c \ test/core/end2end/cq_verifier.c \
test/core/end2end/fake_resolver.c \ test/core/end2end/fake_resolver.c \
test/core/end2end/fixtures/http_proxy.c \ test/core/end2end/fixtures/http_proxy_fixture.c \
test/core/end2end/fixtures/proxy.c \ test/core/end2end/fixtures/proxy.c \
test/core/iomgr/endpoint_tests.c \ test/core/iomgr/endpoint_tests.c \
test/core/util/debugger_macros.c \ test/core/util/debugger_macros.c \
@ -11148,6 +11156,38 @@ endif
endif endif
PARSE_ADDRESS_TEST_SRC = \
test/core/client_channel/parse_address_test.c \
PARSE_ADDRESS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PARSE_ADDRESS_TEST_SRC))))
ifeq ($(NO_SECURE),true)
# You can't build secure targets if you don't have OpenSSL.
$(BINDIR)/$(CONFIG)/parse_address_test: openssl_dep_error
else
$(BINDIR)/$(CONFIG)/parse_address_test: $(PARSE_ADDRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
$(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@`
$(Q) $(LD) $(LDFLAGS) $(PARSE_ADDRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/parse_address_test
endif
$(OBJDIR)/$(CONFIG)/test/core/client_channel/parse_address_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
deps_parse_address_test: $(PARSE_ADDRESS_TEST_OBJS:.o=.dep)
ifneq ($(NO_SECURE),true)
ifneq ($(NO_DEPS),true)
-include $(PARSE_ADDRESS_TEST_OBJS:.o=.dep)
endif
endif
PERCENT_DECODE_FUZZER_SRC = \ PERCENT_DECODE_FUZZER_SRC = \
test/core/slice/percent_decode_fuzzer.c \ test/core/slice/percent_decode_fuzzer.c \
@ -11852,6 +11892,38 @@ endif
endif endif
STREAM_OWNED_SLICE_TEST_SRC = \
test/core/transport/stream_owned_slice_test.c \
STREAM_OWNED_SLICE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STREAM_OWNED_SLICE_TEST_SRC))))
ifeq ($(NO_SECURE),true)
# You can't build secure targets if you don't have OpenSSL.
$(BINDIR)/$(CONFIG)/stream_owned_slice_test: openssl_dep_error
else
$(BINDIR)/$(CONFIG)/stream_owned_slice_test: $(STREAM_OWNED_SLICE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
$(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@`
$(Q) $(LD) $(LDFLAGS) $(STREAM_OWNED_SLICE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/stream_owned_slice_test
endif
$(OBJDIR)/$(CONFIG)/test/core/transport/stream_owned_slice_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
deps_stream_owned_slice_test: $(STREAM_OWNED_SLICE_TEST_OBJS:.o=.dep)
ifneq ($(NO_SECURE),true)
ifneq ($(NO_DEPS),true)
-include $(STREAM_OWNED_SLICE_TEST_OBJS:.o=.dep)
endif
endif
TCP_CLIENT_POSIX_TEST_SRC = \ TCP_CLIENT_POSIX_TEST_SRC = \
test/core/iomgr/tcp_client_posix_test.c \ test/core/iomgr/tcp_client_posix_test.c \

@ -2,7 +2,7 @@
load("//:bazel/generate_cc.bzl", "generate_cc") load("//:bazel/generate_cc.bzl", "generate_cc")
def cc_grpc_library(name, srcs, deps, proto_only, **kwargs): def cc_grpc_library(name, srcs, deps, proto_only, use_external = False, **kwargs):
"""Generates C++ grpc classes from a .proto file. """Generates C++ grpc classes from a .proto file.
Assumes the generated classes will be used in cc_api_version = 2. Assumes the generated classes will be used in cc_api_version = 2.
@ -12,6 +12,8 @@ def cc_grpc_library(name, srcs, deps, proto_only, **kwargs):
srcs: a single proto_library, which wraps the .proto files with services. srcs: a single proto_library, which wraps the .proto files with services.
deps: a list of C++ proto_library (or cc_proto_library) which provides deps: a list of C++ proto_library (or cc_proto_library) which provides
the compiled code of any message that the services depend on. the compiled code of any message that the services depend on.
use_external: When True the grpc deps are prefixed with //external. This
allows grpc to be used as a dependency in other bazel projects.
**kwargs: rest of arguments, e.g., compatible_with and visibility. **kwargs: rest of arguments, e.g., compatible_with and visibility.
""" """
if len(srcs) > 1: if len(srcs) > 1:
@ -37,18 +39,31 @@ def cc_grpc_library(name, srcs, deps, proto_only, **kwargs):
) )
if not proto_only: if not proto_only:
if use_external:
# when this file is used by non-grpc projects
plugin = "//external:grpc_cpp_plugin"
else:
plugin = "//:grpc_cpp_plugin"
generate_cc( generate_cc(
name = codegen_grpc_target, name = codegen_grpc_target,
srcs = [proto_target], srcs = [proto_target],
plugin = "//:grpc_cpp_plugin", plugin = plugin,
**kwargs **kwargs
) )
if use_external:
# when this file is used by non-grpc projects
grpc_deps = ["//external:grpc++", "//external:grpc++_codegen_proto",
"//external:protobuf"]
else:
grpc_deps = ["//:grpc++", "//:grpc++_codegen_proto", "//external:protobuf"]
native.cc_library( native.cc_library(
name = name, name = name,
srcs = [":" + codegen_grpc_target, ":" + codegen_target], srcs = [":" + codegen_grpc_target, ":" + codegen_target],
hdrs = [":" + codegen_grpc_target, ":" + codegen_target], hdrs = [":" + codegen_grpc_target, ":" + codegen_target],
deps = deps + ["//:grpc++", "//:grpc++_codegen_proto", "//external:protobuf"], deps = deps + grpc_deps,
**kwargs **kwargs
) )
else: else:

@ -58,11 +58,12 @@ def grpc_proto_plugin(name, srcs = [], deps = []):
load("//:bazel/cc_grpc_library.bzl", "cc_grpc_library") load("//:bazel/cc_grpc_library.bzl", "cc_grpc_library")
def grpc_proto_library(name, srcs = [], deps = [], well_known_deps = [], has_services = True): def grpc_proto_library(name, srcs = [], deps = [], well_known_deps = [], has_services = True, use_external = False):
cc_grpc_library( cc_grpc_library(
name = name, name = name,
srcs = srcs, srcs = srcs,
deps = deps, deps = deps,
proto_only = not has_services, proto_only = not has_services,
use_external = use_external,
) )

@ -43,7 +43,11 @@
# out. It can be re-enabled for one build by setting the npm config # out. It can be re-enabled for one build by setting the npm config
# variable grpc_uv to true, and it can be re-enabled permanently by # variable grpc_uv to true, and it can be re-enabled permanently by
# setting it to true here. # setting it to true here.
'grpc_uv%': 'false' 'grpc_uv%': 'false',
# Some Node installations use the system installation of OpenSSL, and on
# some systems, the system OpenSSL still does not have ALPN support. This
# will let users recompile gRPC to work without ALPN.
'grpc_alpn%': 'true'
}, },
'target_defaults': { 'target_defaults': {
'include_dirs': [ 'include_dirs': [
@ -73,10 +77,16 @@
'OPENSSL_NO_ASM' 'OPENSSL_NO_ASM'
] ]
}, { }, {
# As of the beginning of 2017, we only support versions of Node with 'conditions': [
# embedded versions of OpenSSL that support ALPN ['grpc_alpn=="true"', {
'defines': [ 'defines': [
'TSI_OPENSSL_ALPN_SUPPORT=1' 'TSI_OPENSSL_ALPN_SUPPORT=1'
],
}, {
'defines': [
'TSI_OPENSSL_ALPN_SUPPORT=0'
],
}]
], ],
'include_dirs': [ 'include_dirs': [
'<(node_root_dir)/deps/openssl/openssl/include', '<(node_root_dir)/deps/openssl/openssl/include',

@ -586,7 +586,7 @@ filegroups:
headers: headers:
- test/core/end2end/cq_verifier.h - test/core/end2end/cq_verifier.h
- test/core/end2end/fake_resolver.h - test/core/end2end/fake_resolver.h
- test/core/end2end/fixtures/http_proxy.h - test/core/end2end/fixtures/http_proxy_fixture.h
- test/core/end2end/fixtures/proxy.h - test/core/end2end/fixtures/proxy.h
- test/core/iomgr/endpoint_tests.h - test/core/iomgr/endpoint_tests.h
- test/core/util/debugger_macros.h - test/core/util/debugger_macros.h
@ -602,7 +602,7 @@ filegroups:
src: src:
- test/core/end2end/cq_verifier.c - test/core/end2end/cq_verifier.c
- test/core/end2end/fake_resolver.c - test/core/end2end/fake_resolver.c
- test/core/end2end/fixtures/http_proxy.c - test/core/end2end/fixtures/http_proxy_fixture.c
- test/core/end2end/fixtures/proxy.c - test/core/end2end/fixtures/proxy.c
- test/core/iomgr/endpoint_tests.c - test/core/iomgr/endpoint_tests.c
- test/core/util/debugger_macros.c - test/core/util/debugger_macros.c
@ -1226,6 +1226,7 @@ libs:
deps: deps:
- benchmark - benchmark
- grpc++ - grpc++
- grpc_test_util
- grpc - grpc
- name: grpc_cli_libs - name: grpc_cli_libs
build: private build: private
@ -2505,6 +2506,16 @@ targets:
- grpc - grpc
- gpr_test_util - gpr_test_util
- gpr - gpr
- name: parse_address_test
build: test
language: c
src:
- test/core/client_channel/parse_address_test.c
deps:
- grpc_test_util
- grpc
- gpr_test_util
- gpr
- name: percent_decode_fuzzer - name: percent_decode_fuzzer
build: fuzzer build: fuzzer
language: c language: c
@ -2761,6 +2772,16 @@ targets:
- grpc - grpc
- gpr_test_util - gpr_test_util
- gpr - gpr
- name: stream_owned_slice_test
build: test
language: c
src:
- test/core/transport/stream_owned_slice_test.c
deps:
- grpc_test_util
- grpc
- gpr_test_util
- gpr
- name: tcp_client_posix_test - name: tcp_client_posix_test
cpu_cost: 0.5 cpu_cost: 0.5
build: test build: test

@ -94,8 +94,6 @@ the response stream needs to be text encoded e.g. when XHR is used or due
to security policies with XHR to security policies with XHR
* Accept: application/grpc-web-text * Accept: application/grpc-web-text
2. The default text encoding is base64 2. The default text encoding is base64
* Text encoding may be specified with Content-Type or Accept headers as
* application/grpc-web-text-base64
* Note that “Content-Transfer-Encoding: base64” should not be used. * Note that “Content-Transfer-Encoding: base64” should not be used.
Due to in-stream base64 padding when delimiting messages, the entire Due to in-stream base64 padding when delimiting messages, the entire
response body is not necessarily a valid base64-encoded entity response body is not necessarily a valid base64-encoded entity

@ -209,7 +209,7 @@ INSTALL_REQUIRES = (
'enum34>=1.0.4', 'enum34>=1.0.4',
# TODO(atash): eventually split the grpcio package into a metapackage # TODO(atash): eventually split the grpcio package into a metapackage
# depending on protobuf and the runtime component (independent of protobuf) # depending on protobuf and the runtime component (independent of protobuf)
'protobuf>=3.0.0', 'protobuf>=3.2.0',
) )
if not PY3: if not PY3:

@ -102,7 +102,7 @@ grpc::string GetHeaderPrologue(File *file, const Parameters & /*params*/) {
vars["filename_base"] = file->filename_without_ext(); vars["filename_base"] = file->filename_without_ext();
vars["message_header_ext"] = file->message_header_ext(); vars["message_header_ext"] = file->message_header_ext();
printer->Print(vars, "// Generated by the gRPC protobuf plugin.\n"); printer->Print(vars, "// Generated by the gRPC C++ plugin.\n");
printer->Print(vars, printer->Print(vars,
"// If you make any local change, they will be lost.\n"); "// If you make any local change, they will be lost.\n");
printer->Print(vars, "// source: $filename$\n"); printer->Print(vars, "// source: $filename$\n");
@ -1010,7 +1010,7 @@ grpc::string GetSourcePrologue(File *file, const Parameters & /*params*/) {
vars["message_header_ext"] = file->message_header_ext(); vars["message_header_ext"] = file->message_header_ext();
vars["service_header_ext"] = file->service_header_ext(); vars["service_header_ext"] = file->service_header_ext();
printer->Print(vars, "// Generated by the gRPC protobuf plugin.\n"); printer->Print(vars, "// Generated by the gRPC C++ plugin.\n");
printer->Print(vars, printer->Print(vars,
"// If you make any local change, they will be lost.\n"); "// If you make any local change, they will be lost.\n");
printer->Print(vars, "// source: $filename$\n\n"); printer->Print(vars, "// source: $filename$\n\n");

@ -64,7 +64,7 @@ static bool set_default_host_if_unset(grpc_exec_ctx *exec_ctx,
} }
} }
char *default_authority = grpc_get_default_authority( char *default_authority = grpc_get_default_authority(
grpc_channel_stack_builder_get_target(builder)); exec_ctx, grpc_channel_stack_builder_get_target(builder));
if (default_authority != NULL) { if (default_authority != NULL) {
grpc_arg arg; grpc_arg arg;
arg.type = GRPC_ARG_STRING; arg.type = GRPC_ARG_STRING;

@ -46,10 +46,11 @@
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/support/env.h" #include "src/core/lib/support/env.h"
static char* grpc_get_http_proxy_server() { static char* grpc_get_http_proxy_server(grpc_exec_ctx* exec_ctx) {
char* uri_str = gpr_getenv("http_proxy"); char* uri_str = gpr_getenv("http_proxy");
if (uri_str == NULL) return NULL; if (uri_str == NULL) return NULL;
grpc_uri* uri = grpc_uri_parse(uri_str, false /* suppress_errors */); grpc_uri* uri =
grpc_uri_parse(exec_ctx, uri_str, false /* suppress_errors */);
char* proxy_name = NULL; char* proxy_name = NULL;
if (uri == NULL || uri->authority == NULL) { if (uri == NULL || uri->authority == NULL) {
gpr_log(GPR_ERROR, "cannot parse value of 'http_proxy' env var"); gpr_log(GPR_ERROR, "cannot parse value of 'http_proxy' env var");
@ -76,9 +77,10 @@ static bool proxy_mapper_map_name(grpc_exec_ctx* exec_ctx,
const grpc_channel_args* args, const grpc_channel_args* args,
char** name_to_resolve, char** name_to_resolve,
grpc_channel_args** new_args) { grpc_channel_args** new_args) {
*name_to_resolve = grpc_get_http_proxy_server(); *name_to_resolve = grpc_get_http_proxy_server(exec_ctx);
if (*name_to_resolve == NULL) return false; if (*name_to_resolve == NULL) return false;
grpc_uri* uri = grpc_uri_parse(server_uri, false /* suppress_errors */); grpc_uri* uri =
grpc_uri_parse(exec_ctx, server_uri, false /* suppress_errors */);
if (uri == NULL || uri->path[0] == '\0') { if (uri == NULL || uri->path[0] == '\0') {
gpr_log(GPR_ERROR, gpr_log(GPR_ERROR,
"'http_proxy' environment variable set, but cannot " "'http_proxy' environment variable set, but cannot "

@ -44,6 +44,7 @@
#include <grpc/support/host_port.h> #include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include "src/core/lib/support/string.h"
#ifdef GRPC_HAVE_UNIX_SOCKET #ifdef GRPC_HAVE_UNIX_SOCKET
@ -120,9 +121,30 @@ int parse_ipv6(grpc_uri *uri, grpc_resolved_address *resolved_addr) {
memset(in6, 0, sizeof(*in6)); memset(in6, 0, sizeof(*in6));
resolved_addr->len = sizeof(*in6); resolved_addr->len = sizeof(*in6);
in6->sin6_family = AF_INET6; in6->sin6_family = AF_INET6;
if (inet_pton(AF_INET6, host, &in6->sin6_addr) == 0) {
gpr_log(GPR_ERROR, "invalid ipv6 address: '%s'", host); /* Handle the RFC6874 syntax for IPv6 zone identifiers. */
goto done; char *host_end = (char *)gpr_memrchr(host, '%', strlen(host));
if (host_end != NULL) {
GPR_ASSERT(host_end >= host);
char host_without_scope[INET6_ADDRSTRLEN];
size_t host_without_scope_len = (size_t)(host_end - host);
strncpy(host_without_scope, host, host_without_scope_len);
host_without_scope[host_without_scope_len] = '\0';
if (inet_pton(AF_INET6, host_without_scope, &in6->sin6_addr) == 0) {
gpr_log(GPR_ERROR, "invalid ipv6 address: '%s'", host_without_scope);
goto done;
}
if (gpr_parse_bytes_to_uint32(host_end + 1,
strlen(host) - host_without_scope_len - 1,
&in6->sin6_scope_id) == 0) {
gpr_log(GPR_ERROR, "invalid ipv6 scope id: '%s'", host_end + 1);
goto done;
}
} else {
if (inet_pton(AF_INET6, host, &in6->sin6_addr) == 0) {
gpr_log(GPR_ERROR, "invalid ipv6 address: '%s'", host);
goto done;
}
} }
if (port != NULL) { if (port != NULL) {

@ -108,22 +108,23 @@ static grpc_resolver_factory *lookup_factory_by_uri(grpc_uri *uri) {
return lookup_factory(uri->scheme); return lookup_factory(uri->scheme);
} }
static grpc_resolver_factory *resolve_factory(const char *target, static grpc_resolver_factory *resolve_factory(grpc_exec_ctx *exec_ctx,
const char *target,
grpc_uri **uri, grpc_uri **uri,
char **canonical_target) { char **canonical_target) {
grpc_resolver_factory *factory = NULL; grpc_resolver_factory *factory = NULL;
GPR_ASSERT(uri != NULL); GPR_ASSERT(uri != NULL);
*uri = grpc_uri_parse(target, 1); *uri = grpc_uri_parse(exec_ctx, target, 1);
factory = lookup_factory_by_uri(*uri); factory = lookup_factory_by_uri(*uri);
if (factory == NULL) { if (factory == NULL) {
grpc_uri_destroy(*uri); grpc_uri_destroy(*uri);
gpr_asprintf(canonical_target, "%s%s", g_default_resolver_prefix, target); gpr_asprintf(canonical_target, "%s%s", g_default_resolver_prefix, target);
*uri = grpc_uri_parse(*canonical_target, 1); *uri = grpc_uri_parse(exec_ctx, *canonical_target, 1);
factory = lookup_factory_by_uri(*uri); factory = lookup_factory_by_uri(*uri);
if (factory == NULL) { if (factory == NULL) {
grpc_uri_destroy(grpc_uri_parse(target, 0)); grpc_uri_destroy(grpc_uri_parse(exec_ctx, target, 0));
grpc_uri_destroy(grpc_uri_parse(*canonical_target, 0)); grpc_uri_destroy(grpc_uri_parse(exec_ctx, *canonical_target, 0));
gpr_log(GPR_ERROR, "don't know how to resolve '%s' or '%s'", target, gpr_log(GPR_ERROR, "don't know how to resolve '%s' or '%s'", target,
*canonical_target); *canonical_target);
} }
@ -138,7 +139,7 @@ grpc_resolver *grpc_resolver_create(grpc_exec_ctx *exec_ctx, const char *target,
grpc_uri *uri = NULL; grpc_uri *uri = NULL;
char *canonical_target = NULL; char *canonical_target = NULL;
grpc_resolver_factory *factory = grpc_resolver_factory *factory =
resolve_factory(target, &uri, &canonical_target); resolve_factory(exec_ctx, target, &uri, &canonical_target);
grpc_resolver *resolver; grpc_resolver *resolver;
grpc_resolver_args resolver_args; grpc_resolver_args resolver_args;
memset(&resolver_args, 0, sizeof(resolver_args)); memset(&resolver_args, 0, sizeof(resolver_args));
@ -153,21 +154,22 @@ grpc_resolver *grpc_resolver_create(grpc_exec_ctx *exec_ctx, const char *target,
return resolver; return resolver;
} }
char *grpc_get_default_authority(const char *target) { char *grpc_get_default_authority(grpc_exec_ctx *exec_ctx, const char *target) {
grpc_uri *uri = NULL; grpc_uri *uri = NULL;
char *canonical_target = NULL; char *canonical_target = NULL;
grpc_resolver_factory *factory = grpc_resolver_factory *factory =
resolve_factory(target, &uri, &canonical_target); resolve_factory(exec_ctx, target, &uri, &canonical_target);
char *authority = grpc_resolver_factory_get_default_authority(factory, uri); char *authority = grpc_resolver_factory_get_default_authority(factory, uri);
grpc_uri_destroy(uri); grpc_uri_destroy(uri);
gpr_free(canonical_target); gpr_free(canonical_target);
return authority; return authority;
} }
char *grpc_resolver_factory_add_default_prefix_if_needed(const char *target) { char *grpc_resolver_factory_add_default_prefix_if_needed(
grpc_exec_ctx *exec_ctx, const char *target) {
grpc_uri *uri = NULL; grpc_uri *uri = NULL;
char *canonical_target = NULL; char *canonical_target = NULL;
resolve_factory(target, &uri, &canonical_target); resolve_factory(exec_ctx, target, &uri, &canonical_target);
grpc_uri_destroy(uri); grpc_uri_destroy(uri);
return canonical_target == NULL ? gpr_strdup(target) : canonical_target; return canonical_target == NULL ? gpr_strdup(target) : canonical_target;
} }

@ -74,10 +74,11 @@ grpc_resolver_factory *grpc_resolver_factory_lookup(const char *name);
/** Given a target, return a (freshly allocated with gpr_malloc) string /** Given a target, return a (freshly allocated with gpr_malloc) string
representing the default authority to pass from a client. */ representing the default authority to pass from a client. */
char *grpc_get_default_authority(const char *target); char *grpc_get_default_authority(grpc_exec_ctx *exec_ctx, const char *target);
/** Returns a newly allocated string containing \a target, adding the /** Returns a newly allocated string containing \a target, adding the
default prefix if needed. */ default prefix if needed. */
char *grpc_resolver_factory_add_default_prefix_if_needed(const char *target); char *grpc_resolver_factory_add_default_prefix_if_needed(
grpc_exec_ctx *exec_ctx, const char *target);
#endif /* GRPC_CORE_EXT_CLIENT_CHANNEL_RESOLVER_REGISTRY_H */ #endif /* GRPC_CORE_EXT_CLIENT_CHANNEL_RESOLVER_REGISTRY_H */

@ -331,7 +331,7 @@ grpc_subchannel *grpc_subchannel_create(grpc_exec_ctx *exec_ctx,
} }
c->pollset_set = grpc_pollset_set_create(); c->pollset_set = grpc_pollset_set_create();
grpc_resolved_address *addr = gpr_malloc(sizeof(*addr)); grpc_resolved_address *addr = gpr_malloc(sizeof(*addr));
grpc_get_subchannel_address_arg(args->args, addr); grpc_get_subchannel_address_arg(exec_ctx, args->args, addr);
grpc_set_initial_connect_string(&addr, &c->initial_connect_string); grpc_set_initial_connect_string(&addr, &c->initial_connect_string);
grpc_resolved_address *new_address = NULL; grpc_resolved_address *new_address = NULL;
grpc_channel_args *new_args = NULL; grpc_channel_args *new_args = NULL;
@ -787,9 +787,9 @@ grpc_call_stack *grpc_subchannel_call_get_call_stack(
return SUBCHANNEL_CALL_TO_CALL_STACK(subchannel_call); return SUBCHANNEL_CALL_TO_CALL_STACK(subchannel_call);
} }
static void grpc_uri_to_sockaddr(const char *uri_str, static void grpc_uri_to_sockaddr(grpc_exec_ctx *exec_ctx, const char *uri_str,
grpc_resolved_address *addr) { grpc_resolved_address *addr) {
grpc_uri *uri = grpc_uri_parse(uri_str, 0 /* suppress_errors */); grpc_uri *uri = grpc_uri_parse(exec_ctx, uri_str, 0 /* suppress_errors */);
GPR_ASSERT(uri != NULL); GPR_ASSERT(uri != NULL);
if (strcmp(uri->scheme, "ipv4") == 0) { if (strcmp(uri->scheme, "ipv4") == 0) {
GPR_ASSERT(parse_ipv4(uri, addr)); GPR_ASSERT(parse_ipv4(uri, addr));
@ -801,12 +801,13 @@ static void grpc_uri_to_sockaddr(const char *uri_str,
grpc_uri_destroy(uri); grpc_uri_destroy(uri);
} }
void grpc_get_subchannel_address_arg(const grpc_channel_args *args, void grpc_get_subchannel_address_arg(grpc_exec_ctx *exec_ctx,
const grpc_channel_args *args,
grpc_resolved_address *addr) { grpc_resolved_address *addr) {
const char *addr_uri_str = grpc_get_subchannel_address_uri_arg(args); const char *addr_uri_str = grpc_get_subchannel_address_uri_arg(args);
memset(addr, 0, sizeof(*addr)); memset(addr, 0, sizeof(*addr));
if (*addr_uri_str != '\0') { if (*addr_uri_str != '\0') {
grpc_uri_to_sockaddr(addr_uri_str, addr); grpc_uri_to_sockaddr(exec_ctx, addr_uri_str, addr);
} }
} }

@ -175,7 +175,8 @@ grpc_subchannel *grpc_subchannel_create(grpc_exec_ctx *exec_ctx,
const grpc_subchannel_args *args); const grpc_subchannel_args *args);
/// Sets \a addr from \a args. /// Sets \a addr from \a args.
void grpc_get_subchannel_address_arg(const grpc_channel_args *args, void grpc_get_subchannel_address_arg(grpc_exec_ctx *exec_ctx,
const grpc_channel_args *args,
grpc_resolved_address *addr); grpc_resolved_address *addr);
/// Returns the URI string for the address to connect to. /// Returns the URI string for the address to connect to.

@ -35,13 +35,15 @@
#include <string.h> #include <string.h>
#include <grpc/slice.h>
#include <grpc/slice_buffer.h> #include <grpc/slice_buffer.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include "src/core/lib/slice/percent_encoding.h"
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h" #include "src/core/lib/support/string.h"
/** a size_t default value... maps to all 1's */ /** a size_t default value... maps to all 1's */
@ -68,11 +70,16 @@ static grpc_uri *bad_uri(const char *uri_text, size_t pos, const char *section,
return NULL; return NULL;
} }
/** Returns a copy of \a src[begin, end) */ /** Returns a copy of percent decoded \a src[begin, end) */
static char *copy_component(const char *src, size_t begin, size_t end) { static char *decode_and_copy_component(grpc_exec_ctx *exec_ctx, const char *src,
char *out = gpr_malloc(end - begin + 1); size_t begin, size_t end) {
memcpy(out, src + begin, end - begin); grpc_slice component =
out[end - begin] = 0; grpc_slice_from_copied_buffer(src + begin, end - begin);
grpc_slice decoded_component =
grpc_permissive_percent_decode_slice(component);
char *out = grpc_dump_slice(decoded_component, GPR_DUMP_ASCII);
grpc_slice_unref_internal(exec_ctx, component);
grpc_slice_unref_internal(exec_ctx, decoded_component);
return out; return out;
} }
@ -175,7 +182,8 @@ static void parse_query_parts(grpc_uri *uri) {
} }
} }
grpc_uri *grpc_uri_parse(const char *uri_text, int suppress_errors) { grpc_uri *grpc_uri_parse(grpc_exec_ctx *exec_ctx, const char *uri_text,
int suppress_errors) {
grpc_uri *uri; grpc_uri *uri;
size_t scheme_begin = 0; size_t scheme_begin = 0;
size_t scheme_end = NOT_SET; size_t scheme_end = NOT_SET;
@ -263,11 +271,16 @@ grpc_uri *grpc_uri_parse(const char *uri_text, int suppress_errors) {
} }
uri = gpr_zalloc(sizeof(*uri)); uri = gpr_zalloc(sizeof(*uri));
uri->scheme = copy_component(uri_text, scheme_begin, scheme_end); uri->scheme =
uri->authority = copy_component(uri_text, authority_begin, authority_end); decode_and_copy_component(exec_ctx, uri_text, scheme_begin, scheme_end);
uri->path = copy_component(uri_text, path_begin, path_end); uri->authority = decode_and_copy_component(exec_ctx, uri_text,
uri->query = copy_component(uri_text, query_begin, query_end); authority_begin, authority_end);
uri->fragment = copy_component(uri_text, fragment_begin, fragment_end); uri->path =
decode_and_copy_component(exec_ctx, uri_text, path_begin, path_end);
uri->query =
decode_and_copy_component(exec_ctx, uri_text, query_begin, query_end);
uri->fragment = decode_and_copy_component(exec_ctx, uri_text, fragment_begin,
fragment_end);
parse_query_parts(uri); parse_query_parts(uri);
return uri; return uri;

@ -35,6 +35,7 @@
#define GRPC_CORE_EXT_CLIENT_CHANNEL_URI_PARSER_H #define GRPC_CORE_EXT_CLIENT_CHANNEL_URI_PARSER_H
#include <stddef.h> #include <stddef.h>
#include "src/core/lib/iomgr/exec_ctx.h"
typedef struct { typedef struct {
char *scheme; char *scheme;
@ -51,7 +52,8 @@ typedef struct {
} grpc_uri; } grpc_uri;
/** parse a uri, return NULL on failure */ /** parse a uri, return NULL on failure */
grpc_uri *grpc_uri_parse(const char *uri_text, int suppress_errors); grpc_uri *grpc_uri_parse(grpc_exec_ctx *exec_ctx, const char *uri_text,
int suppress_errors);
/** return the part of a query string after the '=' in "?key=xxx&...", or NULL /** return the part of a query string after the '=' in "?key=xxx&...", or NULL
* if key is not present */ * if key is not present */

@ -861,7 +861,7 @@ static grpc_lb_policy *glb_create(grpc_exec_ctx *exec_ctx,
arg = grpc_channel_args_find(args->args, GRPC_ARG_SERVER_URI); arg = grpc_channel_args_find(args->args, GRPC_ARG_SERVER_URI);
GPR_ASSERT(arg != NULL); GPR_ASSERT(arg != NULL);
GPR_ASSERT(arg->type == GRPC_ARG_STRING); GPR_ASSERT(arg->type == GRPC_ARG_STRING);
grpc_uri *uri = grpc_uri_parse(arg->value.string, true); grpc_uri *uri = grpc_uri_parse(exec_ctx, arg->value.string, true);
GPR_ASSERT(uri->path[0] != '\0'); GPR_ASSERT(uri->path[0] != '\0');
glb_policy->server_name = glb_policy->server_name =
gpr_strdup(uri->path[0] == '/' ? uri->path + 1 : uri->path); gpr_strdup(uri->path[0] == '/' ? uri->path + 1 : uri->path);

@ -226,7 +226,7 @@ static void chttp2_connector_connect(grpc_exec_ctx *exec_ctx,
grpc_closure *notify) { grpc_closure *notify) {
chttp2_connector *c = (chttp2_connector *)con; chttp2_connector *c = (chttp2_connector *)con;
grpc_resolved_address addr; grpc_resolved_address addr;
grpc_get_subchannel_address_arg(args->channel_args, &addr); grpc_get_subchannel_address_arg(exec_ctx, args->channel_args, &addr);
gpr_mu_lock(&c->mu); gpr_mu_lock(&c->mu);
GPR_ASSERT(c->notify == NULL); GPR_ASSERT(c->notify == NULL);
c->notify = notify; c->notify = notify;

@ -72,7 +72,8 @@ static grpc_channel *client_channel_factory_create_channel(
grpc_arg arg; grpc_arg arg;
arg.type = GRPC_ARG_STRING; arg.type = GRPC_ARG_STRING;
arg.key = GRPC_ARG_SERVER_URI; arg.key = GRPC_ARG_SERVER_URI;
arg.value.string = grpc_resolver_factory_add_default_prefix_if_needed(target); arg.value.string =
grpc_resolver_factory_add_default_prefix_if_needed(exec_ctx, target);
const char *to_remove[] = {GRPC_ARG_SERVER_URI}; const char *to_remove[] = {GRPC_ARG_SERVER_URI};
grpc_channel_args *new_args = grpc_channel_args *new_args =
grpc_channel_args_copy_and_add_and_remove(args, to_remove, 1, &arg, 1); grpc_channel_args_copy_and_add_and_remove(args, to_remove, 1, &arg, 1);

@ -83,7 +83,7 @@ static grpc_subchannel_args *get_secure_naming_subchannel_args(
const char *server_uri_str = server_uri_arg->value.string; const char *server_uri_str = server_uri_arg->value.string;
GPR_ASSERT(server_uri_str != NULL); GPR_ASSERT(server_uri_str != NULL);
grpc_uri *server_uri = grpc_uri *server_uri =
grpc_uri_parse(server_uri_str, true /* supress errors */); grpc_uri_parse(exec_ctx, server_uri_str, true /* supress errors */);
GPR_ASSERT(server_uri != NULL); GPR_ASSERT(server_uri != NULL);
const char *server_uri_path; const char *server_uri_path;
server_uri_path = server_uri_path =
@ -96,7 +96,7 @@ static grpc_subchannel_args *get_secure_naming_subchannel_args(
const char *target_uri_str = const char *target_uri_str =
grpc_get_subchannel_address_uri_arg(args->args); grpc_get_subchannel_address_uri_arg(args->args);
grpc_uri *target_uri = grpc_uri *target_uri =
grpc_uri_parse(target_uri_str, false /* suppress errors */); grpc_uri_parse(exec_ctx, target_uri_str, false /* suppress errors */);
GPR_ASSERT(target_uri != NULL); GPR_ASSERT(target_uri != NULL);
if (target_uri->path[0] != '\0') { // "path" may be empty if (target_uri->path[0] != '\0') { // "path" may be empty
const grpc_slice key = grpc_slice_from_static_string( const grpc_slice key = grpc_slice_from_static_string(
@ -181,7 +181,8 @@ static grpc_channel *client_channel_factory_create_channel(
grpc_arg arg; grpc_arg arg;
arg.type = GRPC_ARG_STRING; arg.type = GRPC_ARG_STRING;
arg.key = GRPC_ARG_SERVER_URI; arg.key = GRPC_ARG_SERVER_URI;
arg.value.string = grpc_resolver_factory_add_default_prefix_if_needed(target); arg.value.string =
grpc_resolver_factory_add_default_prefix_if_needed(exec_ctx, target);
const char *to_remove[] = {GRPC_ARG_SERVER_URI}; const char *to_remove[] = {GRPC_ARG_SERVER_URI};
grpc_channel_args *new_args = grpc_channel_args *new_args =
grpc_channel_args_copy_and_add_and_remove(args, to_remove, 1, &arg, 1); grpc_channel_args_copy_and_add_and_remove(args, to_remove, 1, &arg, 1);

@ -162,6 +162,7 @@ int grpc_sockaddr_to_string(char **out,
char ntop_buf[INET6_ADDRSTRLEN]; char ntop_buf[INET6_ADDRSTRLEN];
const void *ip = NULL; const void *ip = NULL;
int port; int port;
uint32_t sin6_scope_id = 0;
int ret; int ret;
*out = NULL; *out = NULL;
@ -177,10 +178,19 @@ int grpc_sockaddr_to_string(char **out,
const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr; const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr;
ip = &addr6->sin6_addr; ip = &addr6->sin6_addr;
port = ntohs(addr6->sin6_port); port = ntohs(addr6->sin6_port);
sin6_scope_id = addr6->sin6_scope_id;
} }
if (ip != NULL && if (ip != NULL &&
grpc_inet_ntop(addr->sa_family, ip, ntop_buf, sizeof(ntop_buf)) != NULL) { grpc_inet_ntop(addr->sa_family, ip, ntop_buf, sizeof(ntop_buf)) != NULL) {
ret = gpr_join_host_port(out, ntop_buf, port); if (sin6_scope_id != 0) {
char *host_with_scope;
/* Enclose sin6_scope_id with the format defined in RFC 6784 section 2. */
gpr_asprintf(&host_with_scope, "%s%%25%" PRIu32, ntop_buf, sin6_scope_id);
ret = gpr_join_host_port(out, host_with_scope, port);
gpr_free(host_with_scope);
} else {
ret = gpr_join_host_port(out, ntop_buf, port);
}
} else { } else {
ret = gpr_asprintf(out, "(sockaddr family=%d)", addr->sa_family); ret = gpr_asprintf(out, "(sockaddr family=%d)", addr->sa_family);
} }

@ -114,6 +114,8 @@ struct grpc_tcp_server {
/* is this server shutting down? */ /* is this server shutting down? */
bool shutdown; bool shutdown;
/* have listeners been shutdown? */
bool shutdown_listeners;
/* use SO_REUSEPORT */ /* use SO_REUSEPORT */
bool so_reuseport; bool so_reuseport;
/* expand wildcard addresses to a list of all local addresses */ /* expand wildcard addresses to a list of all local addresses */
@ -161,7 +163,7 @@ grpc_error *grpc_tcp_server_create(grpc_exec_ctx *exec_ctx,
grpc_tcp_server **server) { grpc_tcp_server **server) {
gpr_once_init(&check_init, init); gpr_once_init(&check_init, init);
grpc_tcp_server *s = gpr_malloc(sizeof(grpc_tcp_server)); grpc_tcp_server *s = gpr_zalloc(sizeof(grpc_tcp_server));
s->so_reuseport = has_so_reuseport; s->so_reuseport = has_so_reuseport;
s->resource_quota = grpc_resource_quota_create(NULL); s->resource_quota = grpc_resource_quota_create(NULL);
s->expand_wildcard_addrs = false; s->expand_wildcard_addrs = false;
@ -422,7 +424,14 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *err) {
grpc_fd_notify_on_read(exec_ctx, sp->emfd, &sp->read_closure); grpc_fd_notify_on_read(exec_ctx, sp->emfd, &sp->read_closure);
return; return;
default: default:
gpr_log(GPR_ERROR, "Failed accept4: %s", strerror(errno)); gpr_mu_lock(&sp->server->mu);
if (!sp->server->shutdown_listeners) {
gpr_log(GPR_ERROR, "Failed accept4: %s", strerror(errno));
} else {
/* if we have shutdown listeners, accept4 could fail, and we
needn't notify users */
}
gpr_mu_unlock(&sp->server->mu);
goto error; goto error;
} }
} }
@ -438,11 +447,6 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *err) {
grpc_fd *fdobj = grpc_fd_create(fd, name); grpc_fd *fdobj = grpc_fd_create(fd, name);
if (read_notifier_pollset == NULL) {
gpr_log(GPR_ERROR, "Read notifier pollset is not set on the fd");
goto error;
}
grpc_pollset_add_fd(exec_ctx, read_notifier_pollset, fdobj); grpc_pollset_add_fd(exec_ctx, read_notifier_pollset, fdobj);
// Create acceptor. // Create acceptor.
@ -941,6 +945,7 @@ void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
void grpc_tcp_server_shutdown_listeners(grpc_exec_ctx *exec_ctx, void grpc_tcp_server_shutdown_listeners(grpc_exec_ctx *exec_ctx,
grpc_tcp_server *s) { grpc_tcp_server *s) {
gpr_mu_lock(&s->mu); gpr_mu_lock(&s->mu);
s->shutdown_listeners = true;
/* shutdown all fd's */ /* shutdown all fd's */
if (s->active_ports) { if (s->active_ports) {
grpc_tcp_listener *sp; grpc_tcp_listener *sp;

@ -37,6 +37,8 @@
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/sync.h> #include <grpc/support/sync.h>
#include <assert.h>
/* Number of mutexes to allocate for events, to avoid lock contention. /* Number of mutexes to allocate for events, to avoid lock contention.
Should be a prime. */ Should be a prime. */
enum { event_sync_partitions = 31 }; enum { event_sync_partitions = 31 };
@ -99,8 +101,12 @@ void gpr_ref_init(gpr_refcount *r, int n) { gpr_atm_rel_store(&r->count, n); }
void gpr_ref(gpr_refcount *r) { gpr_atm_no_barrier_fetch_add(&r->count, 1); } void gpr_ref(gpr_refcount *r) { gpr_atm_no_barrier_fetch_add(&r->count, 1); }
void gpr_ref_non_zero(gpr_refcount *r) { void gpr_ref_non_zero(gpr_refcount *r) {
#ifndef NDEBUG
gpr_atm prior = gpr_atm_no_barrier_fetch_add(&r->count, 1); gpr_atm prior = gpr_atm_no_barrier_fetch_add(&r->count, 1);
GPR_ASSERT(prior > 0); assert(prior > 0);
#else
gpr_ref(r);
#endif
} }
void gpr_refn(gpr_refcount *r, int n) { void gpr_refn(gpr_refcount *r, int n) {

@ -161,6 +161,7 @@ struct grpc_call {
bool receiving_message; bool receiving_message;
bool requested_final_op; bool requested_final_op;
bool received_final_op; bool received_final_op;
bool sent_any_op;
/* have we received initial metadata */ /* have we received initial metadata */
bool has_initial_md_been_received; bool has_initial_md_been_received;
@ -488,7 +489,7 @@ void grpc_call_destroy(grpc_call *c) {
gpr_mu_lock(&c->mu); gpr_mu_lock(&c->mu);
GPR_ASSERT(!c->destroy_called); GPR_ASSERT(!c->destroy_called);
c->destroy_called = 1; c->destroy_called = 1;
cancel = !c->received_final_op; cancel = c->sent_any_op && !c->received_final_op;
gpr_mu_unlock(&c->mu); gpr_mu_unlock(&c->mu);
if (cancel) { if (cancel) {
cancel_with_error(&exec_ctx, c, STATUS_FROM_API_OVERRIDE, cancel_with_error(&exec_ctx, c, STATUS_FROM_API_OVERRIDE,
@ -1678,6 +1679,7 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx,
grpc_closure_init(&bctl->finish_batch, finish_batch, bctl, grpc_closure_init(&bctl->finish_batch, finish_batch, bctl,
grpc_schedule_on_exec_ctx); grpc_schedule_on_exec_ctx);
stream_op->on_complete = &bctl->finish_batch; stream_op->on_complete = &bctl->finish_batch;
call->sent_any_op = true;
gpr_mu_unlock(&call->mu); gpr_mu_unlock(&call->mu);
execute_op(exec_ctx, call, stream_op); execute_op(exec_ctx, call, stream_op);

@ -84,6 +84,39 @@ void grpc_stream_unref(grpc_exec_ctx *exec_ctx,
} }
} }
#define STREAM_REF_FROM_SLICE_REF(p) \
((grpc_stream_refcount *)(((uint8_t *)p) - \
offsetof(grpc_stream_refcount, slice_refcount)))
static void slice_stream_ref(void *p) {
#ifdef GRPC_STREAM_REFCOUNT_DEBUG
grpc_stream_ref(STREAM_REF_FROM_SLICE_REF(p), "slice");
#else
grpc_stream_ref(STREAM_REF_FROM_SLICE_REF(p));
#endif
}
static void slice_stream_unref(grpc_exec_ctx *exec_ctx, void *p) {
#ifdef GRPC_STREAM_REFCOUNT_DEBUG
grpc_stream_unref(exec_ctx, STREAM_REF_FROM_SLICE_REF(p), "slice");
#else
grpc_stream_unref(exec_ctx, STREAM_REF_FROM_SLICE_REF(p));
#endif
}
grpc_slice grpc_slice_from_stream_owned_buffer(grpc_stream_refcount *refcount,
void *buffer, size_t length) {
slice_stream_ref(&refcount->slice_refcount);
return (grpc_slice){.refcount = &refcount->slice_refcount,
.data.refcounted = {.bytes = buffer, .length = length}};
}
static const grpc_slice_refcount_vtable stream_ref_slice_vtable = {
.ref = slice_stream_ref,
.unref = slice_stream_unref,
.eq = grpc_slice_default_eq_impl,
.hash = grpc_slice_default_hash_impl};
#ifdef GRPC_STREAM_REFCOUNT_DEBUG #ifdef GRPC_STREAM_REFCOUNT_DEBUG
void grpc_stream_ref_init(grpc_stream_refcount *refcount, int initial_refs, void grpc_stream_ref_init(grpc_stream_refcount *refcount, int initial_refs,
grpc_iomgr_cb_func cb, void *cb_arg, grpc_iomgr_cb_func cb, void *cb_arg,
@ -95,6 +128,8 @@ void grpc_stream_ref_init(grpc_stream_refcount *refcount, int initial_refs,
#endif #endif
gpr_ref_init(&refcount->refs, initial_refs); gpr_ref_init(&refcount->refs, initial_refs);
grpc_closure_init(&refcount->destroy, cb, cb_arg, grpc_schedule_on_exec_ctx); grpc_closure_init(&refcount->destroy, cb, cb_arg, grpc_schedule_on_exec_ctx);
refcount->slice_refcount.vtable = &stream_ref_slice_vtable;
refcount->slice_refcount.sub_refcount = &refcount->slice_refcount;
} }
static void move64(uint64_t *from, uint64_t *to) { static void move64(uint64_t *from, uint64_t *to) {

@ -64,6 +64,7 @@ typedef struct grpc_stream_refcount {
#ifdef GRPC_STREAM_REFCOUNT_DEBUG #ifdef GRPC_STREAM_REFCOUNT_DEBUG
const char *object_type; const char *object_type;
#endif #endif
grpc_slice_refcount slice_refcount;
} grpc_stream_refcount; } grpc_stream_refcount;
#ifdef GRPC_STREAM_REFCOUNT_DEBUG #ifdef GRPC_STREAM_REFCOUNT_DEBUG
@ -84,6 +85,11 @@ void grpc_stream_unref(grpc_exec_ctx *exec_ctx, grpc_stream_refcount *refcount);
grpc_stream_ref_init(rc, ir, cb, cb_arg) grpc_stream_ref_init(rc, ir, cb, cb_arg)
#endif #endif
/* Wrap a buffer that is owned by some stream object into a slice that shares
the same refcount */
grpc_slice grpc_slice_from_stream_owned_buffer(grpc_stream_refcount *refcount,
void *buffer, size_t length);
typedef struct { typedef struct {
uint64_t framing_bytes; uint64_t framing_bytes;
uint64_t data_bytes; uint64_t data_bytes;

@ -34,32 +34,26 @@
<Reference Include="System.Net" /> <Reference Include="System.Net" />
<Reference Include="System.Net.Http" /> <Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.WebRequest" /> <Reference Include="System.Net.Http.WebRequest" />
<Reference Include="BouncyCastle.Crypto">
<HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.Core">
<HintPath>..\packages\Google.Apis.Core.1.16.0\lib\net45\Google.Apis.Core.dll</HintPath>
</Reference>
<Reference Include="Zlib.Portable"> <Reference Include="Zlib.Portable">
<HintPath>..\packages\Zlib.Portable.Signed.1.11.0\lib\portable-net4+sl5+wp8+win8+wpa81+MonoTouch+MonoAndroid\Zlib.Portable.dll</HintPath> <HintPath>..\packages\Zlib.Portable.Signed.1.11.0\lib\portable-net4+sl5+wp8+win8+wpa81+MonoTouch+MonoAndroid\Zlib.Portable.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Apis.Core">
<HintPath>..\packages\Google.Apis.Core.1.21.0\lib\net45\Google.Apis.Core.dll</HintPath>
</Reference>
<Reference Include="Google.Apis"> <Reference Include="Google.Apis">
<HintPath>..\packages\Google.Apis.1.16.0\lib\net45\Google.Apis.dll</HintPath> <HintPath>..\packages\Google.Apis.1.21.0\lib\net45\Google.Apis.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Apis.PlatformServices"> <Reference Include="Google.Apis.PlatformServices">
<HintPath>..\packages\Google.Apis.1.16.0\lib\net45\Google.Apis.PlatformServices.dll</HintPath> <HintPath>..\packages\Google.Apis.1.21.0\lib\net45\Google.Apis.PlatformServices.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Apis.Auth"> <Reference Include="Google.Apis.Auth">
<HintPath>..\packages\Google.Apis.Auth.1.16.0\lib\net45\Google.Apis.Auth.dll</HintPath> <HintPath>..\packages\Google.Apis.Auth.1.21.0\lib\net45\Google.Apis.Auth.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Apis.Auth.PlatformServices"> <Reference Include="Google.Apis.Auth.PlatformServices">
<HintPath>..\packages\Google.Apis.Auth.1.16.0\lib\net45\Google.Apis.Auth.PlatformServices.dll</HintPath> <HintPath>..\packages\Google.Apis.Auth.1.21.0\lib\net45\Google.Apis.Auth.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="BouncyCastle" version="1.7.0" targetFramework="net45" /> <package id="Google.Apis" version="1.21.0" targetFramework="net45" />
<package id="Google.Apis" version="1.16.0" targetFramework="net45" /> <package id="Google.Apis.Auth" version="1.21.0" targetFramework="net45" />
<package id="Google.Apis.Auth" version="1.16.0" targetFramework="net45" /> <package id="Google.Apis.Core" version="1.21.0" targetFramework="net45" />
<package id="Google.Apis.Core" version="1.16.0" targetFramework="net45" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
<package id="log4net" version="2.0.3" targetFramework="net45" />
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
<package id="Zlib.Portable.Signed" version="1.11.0" targetFramework="net45" /> <package id="Zlib.Portable.Signed" version="1.11.0" targetFramework="net45" />
</packages> </packages>

@ -22,7 +22,7 @@
}, },
"dependencies": { "dependencies": {
"Grpc.Core": "1.2.0-dev", "Grpc.Core": "1.2.0-dev",
"Google.Apis.Auth": "1.16.0" "Google.Apis.Auth": "1.21.0"
}, },
"frameworks": { "frameworks": {
"net45": { }, "net45": { },

@ -0,0 +1,86 @@
#region Copyright notice and license
// 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.
#endregion
using System;
using System.Collections.Generic;
using NUnit.Framework;
using Grpc.Core;
using System.Linq;
namespace Grpc.Core.Tests
{
public class AuthContextTest
{
[Test]
public void EmptyContext()
{
var context = new AuthContext(null, new Dictionary<string, List<AuthProperty>>());
Assert.IsFalse(context.IsPeerAuthenticated);
Assert.IsNull(context.PeerIdentityPropertyName);
Assert.AreEqual(0, context.PeerIdentity.Count());
Assert.AreEqual(0, context.Properties.Count());
Assert.AreEqual(0, context.FindPropertiesByName("nonexistent").Count());
}
[Test]
public void AuthenticatedContext()
{
var property1 = AuthProperty.Create("abc", new byte[] { 68, 69, 70 });
var context = new AuthContext("some_identity", new Dictionary<string, List<AuthProperty>>
{
{"some_identity", new List<AuthProperty> {property1}}
});
Assert.IsTrue(context.IsPeerAuthenticated);
Assert.AreEqual("some_identity", context.PeerIdentityPropertyName);
Assert.AreEqual(1, context.PeerIdentity.Count());
}
[Test]
public void FindPropertiesByName()
{
var property1 = AuthProperty.Create("abc", new byte[] {68, 69, 70});
var property2 = AuthProperty.Create("abc", new byte[] {71, 72, 73 });
var property3 = AuthProperty.Create("abc", new byte[] {});
var context = new AuthContext(null, new Dictionary<string, List<AuthProperty>>
{
{"existent", new List<AuthProperty> {property1, property2}},
{"foobar", new List<AuthProperty> {property3}},
});
Assert.AreEqual(3, context.Properties.Count());
Assert.AreEqual(0, context.FindPropertiesByName("nonexistent").Count());
var existentProperties = new List<AuthProperty>(context.FindPropertiesByName("existent"));
Assert.AreEqual(2, existentProperties.Count);
}
}
}

@ -0,0 +1,82 @@
#region Copyright notice and license
// 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.
#endregion
using System;
using NUnit.Framework;
namespace Grpc.Core.Tests
{
public class AuthPropertyTest
{
[Test]
public void Create_NameIsNotNull()
{
Assert.Throws(typeof(ArgumentNullException), () => AuthProperty.Create(null, new byte[0]));
Assert.Throws(typeof(ArgumentNullException), () => AuthProperty.CreateUnsafe(null, new byte[0]));
}
[Test]
public void Create_ValueIsNotNull()
{
Assert.Throws(typeof(ArgumentNullException), () => AuthProperty.Create("abc", null));
Assert.Throws(typeof(ArgumentNullException), () => AuthProperty.CreateUnsafe("abc", null));
}
[Test]
public void Create()
{
var valueBytes = new byte[] { 68, 69, 70 };
var authProperty = AuthProperty.Create("abc", valueBytes);
Assert.AreEqual("abc", authProperty.Name);
Assert.AreNotSame(valueBytes, authProperty.ValueBytesUnsafe);
CollectionAssert.AreEqual(valueBytes, authProperty.ValueBytes);
CollectionAssert.AreEqual(valueBytes, authProperty.ValueBytesUnsafe);
Assert.AreEqual("DEF", authProperty.Value);
}
[Test]
public void CreateUnsafe()
{
var valueBytes = new byte[] { 68, 69, 70 };
var authProperty = AuthProperty.CreateUnsafe("abc", valueBytes);
Assert.AreEqual("abc", authProperty.Name);
Assert.AreSame(valueBytes, authProperty.ValueBytesUnsafe);
Assert.AreNotSame(valueBytes, authProperty.ValueBytes);
CollectionAssert.AreEqual(valueBytes, authProperty.ValueBytes);
CollectionAssert.AreEqual(valueBytes, authProperty.ValueBytesUnsafe);
Assert.AreEqual("DEF", authProperty.Value);
}
}
}

@ -375,6 +375,18 @@ namespace Grpc.Core.Tests
Assert.AreEqual("PASS", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "abc")); Assert.AreEqual("PASS", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "abc"));
} }
[Test]
public void ServerCallContext_AuthContextNotPopulated()
{
helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
{
Assert.IsFalse(context.AuthContext.IsPeerAuthenticated);
Assert.AreEqual(0, context.AuthContext.Properties.Count());
return "PASS";
});
Assert.AreEqual("PASS", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "abc"));
}
[Test] [Test]
public async Task Channel_WaitForStateChangedAsync() public async Task Channel_WaitForStateChangedAsync()
{ {

@ -27,17 +27,17 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="nunit.framework"> <Reference Include="System.Interactive.Async">
<HintPath>..\packages\NUnit.3.2.0\lib\net45\nunit.framework.dll</HintPath> <HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath>
</Reference>
<Reference Include="nunitlite">
<HintPath>..\packages\NUnitLite.3.2.0\lib\net45\nunitlite.dll</HintPath>
</Reference> </Reference>
<Reference Include="Newtonsoft.Json"> <Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Interactive.Async"> <Reference Include="nunit.framework">
<HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath> <HintPath>..\packages\NUnit.3.6.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="nunitlite">
<HintPath>..\packages\NUnitLite.3.6.0\lib\net45\nunitlite.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -64,7 +64,6 @@
<Compile Include="ChannelOptionsTest.cs" /> <Compile Include="ChannelOptionsTest.cs" />
<Compile Include="Internal\TimespecTest.cs" /> <Compile Include="Internal\TimespecTest.cs" />
<Compile Include="TimeoutsTest.cs" /> <Compile Include="TimeoutsTest.cs" />
<Compile Include="NUnitVersionTest.cs" />
<Compile Include="ChannelTest.cs" /> <Compile Include="ChannelTest.cs" />
<Compile Include="MockServiceHelper.cs" /> <Compile Include="MockServiceHelper.cs" />
<Compile Include="ResponseHeadersTest.cs" /> <Compile Include="ResponseHeadersTest.cs" />
@ -81,6 +80,8 @@
<Compile Include="ShutdownHookPendingCallTest.cs" /> <Compile Include="ShutdownHookPendingCallTest.cs" />
<Compile Include="ShutdownHookClientTest.cs" /> <Compile Include="ShutdownHookClientTest.cs" />
<Compile Include="AppDomainUnloadTest.cs" /> <Compile Include="AppDomainUnloadTest.cs" />
<Compile Include="AuthContextTest.cs" />
<Compile Include="AuthPropertyTest.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup> <ItemGroup>

@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
<package id="NUnit" version="3.2.0" targetFramework="net45" /> <package id="NUnit" version="3.6.0" targetFramework="net45" />
<package id="NUnit.ConsoleRunner" version="3.2.0" /> <package id="NUnitLite" version="3.6.0" targetFramework="net45" />
<package id="NUnitLite" version="3.2.0" targetFramework="net45" />
<package id="OpenCover" version="4.6.519" /> <package id="OpenCover" version="4.6.519" />
<package id="ReportGenerator" version="2.4.4.0" /> <package id="ReportGenerator" version="2.4.4.0" />
<package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" /> <package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" />

@ -45,10 +45,10 @@
"Grpc.Core": { "Grpc.Core": {
"target": "project" "target": "project"
}, },
"Newtonsoft.Json": "8.0.3", "Newtonsoft.Json": "9.0.1",
"NUnit": "3.2.0", "NUnit": "3.6.0",
"NUnitLite": "3.2.0-*", "NUnitLite": "3.6.0",
"NUnit.ConsoleRunner": "3.2.0", "NUnit.ConsoleRunner": "3.6.0",
"OpenCover": "4.6.519", "OpenCover": "4.6.519",
"ReportGenerator": "2.4.4.0" "ReportGenerator": "2.4.4.0"
}, },

@ -0,0 +1,128 @@
#region Copyright notice and license
// 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.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using Grpc.Core.Internal;
using Grpc.Core.Utils;
namespace Grpc.Core
{
/// <summary>
/// Authentication context for a call.
/// AuthContext is the only reliable source of truth when it comes to authenticating calls.
/// Using any other call/context properties for authentication purposes is wrong and inherently unsafe.
/// Note: experimental API that can change or be removed without any prior notice.
/// </summary>
public class AuthContext
{
string peerIdentityPropertyName;
Dictionary<string, List<AuthProperty>> properties;
/// <summary>
/// Initializes a new instance of the <see cref="T:Grpc.Core.AuthContext"/> class.
/// </summary>
/// <param name="peerIdentityPropertyName">Peer identity property name.</param>
/// <param name="properties">Multimap of auth properties by name.</param>
internal AuthContext(string peerIdentityPropertyName, Dictionary<string, List<AuthProperty>> properties)
{
this.peerIdentityPropertyName = peerIdentityPropertyName;
this.properties = GrpcPreconditions.CheckNotNull(properties);
}
/// <summary>
/// Returns <c>true</c> if the peer is authenticated.
/// </summary>
public bool IsPeerAuthenticated
{
get
{
return peerIdentityPropertyName != null;
}
}
/// <summary>
/// Gets the name of the property that indicates the peer identity. Returns <c>null</c>
/// if the peer is not authenticated.
/// </summary>
public string PeerIdentityPropertyName
{
get
{
return peerIdentityPropertyName;
}
}
/// <summary>
/// Gets properties that represent the peer identity (there can be more than one). Returns an empty collection
/// if the peer is not authenticated.
/// </summary>
public IEnumerable<AuthProperty> PeerIdentity
{
get
{
if (peerIdentityPropertyName == null)
{
return Enumerable.Empty<AuthProperty>();
}
return properties[peerIdentityPropertyName];
}
}
/// <summary>
/// Gets the auth properties of this context.
/// </summary>
public IEnumerable<AuthProperty> Properties
{
get
{
return properties.Values.SelectMany(v => v);
}
}
/// <summary>
/// Returns the auth properties with given name (there can be more than one).
/// If no properties of given name exist, an empty collection will be returned.
/// </summary>
public IEnumerable<AuthProperty> FindPropertiesByName(string propertyName)
{
List<AuthProperty> result;
if (!properties.TryGetValue(propertyName, out result))
{
return Enumerable.Empty<AuthProperty>();
}
return result;
}
}
}

@ -0,0 +1,126 @@
#region Copyright notice and license
// 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.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using Grpc.Core.Internal;
using Grpc.Core.Utils;
namespace Grpc.Core
{
/// <summary>
/// A property of an <see cref="AuthContext"/>.
/// Note: experimental API that can change or be removed without any prior notice.
/// </summary>
public class AuthProperty
{
string name;
byte[] valueBytes;
Lazy<string> value;
private AuthProperty(string name, byte[] valueBytes)
{
this.name = GrpcPreconditions.CheckNotNull(name);
this.valueBytes = GrpcPreconditions.CheckNotNull(valueBytes);
this.value = new Lazy<string>(() => MarshalUtils.GetStringUTF8(this.valueBytes));
}
/// <summary>
/// Gets the name of the property.
/// </summary>
public string Name
{
get
{
return name;
}
}
/// <summary>
/// Gets the string value of the property.
/// </summary>
public string Value
{
get
{
return value.Value;
}
}
/// <summary>
/// Gets the binary value of the property.
/// </summary>
public byte[] ValueBytes
{
get
{
var valueCopy = new byte[valueBytes.Length];
Buffer.BlockCopy(valueBytes, 0, valueCopy, 0, valueBytes.Length);
return valueCopy;
}
}
/// <summary>
/// Creates an instance of <c>AuthProperty</c>.
/// </summary>
/// <param name="name">the name</param>
/// <param name="valueBytes">the binary value of the property</param>
public static AuthProperty Create(string name, byte[] valueBytes)
{
GrpcPreconditions.CheckNotNull(valueBytes);
var valueCopy = new byte[valueBytes.Length];
Buffer.BlockCopy(valueBytes, 0, valueCopy, 0, valueBytes.Length);
return new AuthProperty(name, valueCopy);
}
/// <summary>
/// Gets the binary value of the property (without making a defensive copy).
/// </summary>
internal byte[] ValueBytesUnsafe
{
get
{
return valueBytes;
}
}
/// <summary>
/// Creates and instance of <c>AuthProperty</c> without making a defensive copy of <c>valueBytes</c>.
/// </summary>
internal static AuthProperty CreateUnsafe(string name, byte[] valueBytes)
{
return new AuthProperty(name, valueBytes);
}
}
}

@ -131,6 +131,10 @@
<Compile Include="Internal\RequestCallContextSafeHandle.cs" /> <Compile Include="Internal\RequestCallContextSafeHandle.cs" />
<Compile Include="Utils\TaskUtils.cs" /> <Compile Include="Utils\TaskUtils.cs" />
<Compile Include="Internal\CallFlags.cs" /> <Compile Include="Internal\CallFlags.cs" />
<Compile Include="AuthContext.cs" />
<Compile Include="Internal\AuthContextSafeHandle.cs" />
<Compile Include="Internal\MarshalUtils.cs" />
<Compile Include="AuthProperty.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Grpc.Core.project.json" /> <None Include="Grpc.Core.project.json" />

@ -0,0 +1,119 @@
#region Copyright notice and license
// Copyright 2017, 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.
#endregion
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using Grpc.Core;
using Grpc.Core.Utils;
namespace Grpc.Core.Internal
{
/// <summary>
/// grpc_auth_context
/// </summary>
internal class AuthContextSafeHandle : SafeHandleZeroIsInvalid
{
static readonly NativeMethods Native = NativeMethods.Get();
private AuthContextSafeHandle()
{
}
/// <summary>
/// Copies contents of the native auth context into a new <c>AuthContext</c> instance.
/// </summary>
public AuthContext ToAuthContext()
{
if (IsInvalid)
{
return new AuthContext(null, new Dictionary<string, List<AuthProperty>>());
}
var peerIdentityPropertyName = Marshal.PtrToStringAnsi(Native.grpcsharp_auth_context_peer_identity_property_name(this));
var propertiesDict = new Dictionary<string, List<AuthProperty>>();
var it = Native.grpcsharp_auth_context_property_iterator(this);
IntPtr authPropertyPtr = IntPtr.Zero;
while ((authPropertyPtr = Native.grpcsharp_auth_property_iterator_next(ref it)) != IntPtr.Zero)
{
var authProperty = PtrToAuthProperty(authPropertyPtr);
if (!propertiesDict.ContainsKey(authProperty.Name))
{
propertiesDict[authProperty.Name] = new List<AuthProperty>();
}
propertiesDict[authProperty.Name].Add(authProperty);
}
return new AuthContext(peerIdentityPropertyName, propertiesDict);
}
protected override bool ReleaseHandle()
{
Native.grpcsharp_auth_context_release(handle);
return true;
}
private AuthProperty PtrToAuthProperty(IntPtr authPropertyPtr)
{
var nativeAuthProperty = (NativeAuthProperty) Marshal.PtrToStructure(authPropertyPtr, typeof(NativeAuthProperty));
var name = Marshal.PtrToStringAnsi(nativeAuthProperty.Name);
var valueBytes = new byte[(int) nativeAuthProperty.ValueLength];
Marshal.Copy(nativeAuthProperty.Value, valueBytes, 0, (int)nativeAuthProperty.ValueLength);
return AuthProperty.CreateUnsafe(name, valueBytes);
}
/// <summary>
/// grpc_auth_property
/// </summary>
internal struct NativeAuthProperty
{
public IntPtr Name;
public IntPtr Value;
public UIntPtr ValueLength;
}
/// <summary>
/// grpc_auth_property_iterator
/// </summary>
internal struct NativeAuthPropertyIterator
{
public IntPtr AuthContext;
public UIntPtr Index;
public IntPtr Name;
}
}
}

@ -43,7 +43,6 @@ namespace Grpc.Core.Internal
/// </summary> /// </summary>
internal class BatchContextSafeHandle : SafeHandleZeroIsInvalid internal class BatchContextSafeHandle : SafeHandleZeroIsInvalid
{ {
static readonly Encoding EncodingUTF8 = System.Text.Encoding.UTF8;
static readonly NativeMethods Native = NativeMethods.Get(); static readonly NativeMethods Native = NativeMethods.Get();
private BatchContextSafeHandle() private BatchContextSafeHandle()
@ -75,7 +74,7 @@ namespace Grpc.Core.Internal
{ {
UIntPtr detailsLength; UIntPtr detailsLength;
IntPtr detailsPtr = Native.grpcsharp_batch_context_recv_status_on_client_details(this, out detailsLength); IntPtr detailsPtr = Native.grpcsharp_batch_context_recv_status_on_client_details(this, out detailsLength);
string details = PtrToStringUtf8(detailsPtr, (int) detailsLength.ToUInt32()); string details = MarshalUtils.PtrToStringUTF8(detailsPtr, (int) detailsLength.ToUInt32());
var status = new Status(Native.grpcsharp_batch_context_recv_status_on_client_status(this), details); var status = new Status(Native.grpcsharp_batch_context_recv_status_on_client_status(this), details);
IntPtr metadataArrayPtr = Native.grpcsharp_batch_context_recv_status_on_client_trailing_metadata(this); IntPtr metadataArrayPtr = Native.grpcsharp_batch_context_recv_status_on_client_trailing_metadata(this);
@ -108,12 +107,5 @@ namespace Grpc.Core.Internal
Native.grpcsharp_batch_context_destroy(handle); Native.grpcsharp_batch_context_destroy(handle);
return true; return true;
} }
string PtrToStringUtf8(IntPtr ptr, int len)
{
var bytes = new byte[len];
Marshal.Copy(ptr, bytes, 0, len);
return EncodingUTF8.GetString(bytes);
}
} }
} }

@ -45,7 +45,6 @@ namespace Grpc.Core.Internal
internal class CallSafeHandle : SafeHandleZeroIsInvalid, INativeCall internal class CallSafeHandle : SafeHandleZeroIsInvalid, INativeCall
{ {
public static readonly CallSafeHandle NullInstance = new CallSafeHandle(); public static readonly CallSafeHandle NullInstance = new CallSafeHandle();
static readonly Encoding EncodingUTF8 = System.Text.Encoding.UTF8;
static readonly NativeMethods Native = NativeMethods.Get(); static readonly NativeMethods Native = NativeMethods.Get();
const uint GRPC_WRITE_BUFFER_HINT = 1; const uint GRPC_WRITE_BUFFER_HINT = 1;
@ -140,7 +139,7 @@ namespace Grpc.Core.Internal
var ctx = BatchContextSafeHandle.Create(); var ctx = BatchContextSafeHandle.Create();
var optionalPayloadLength = optionalPayload != null ? new UIntPtr((ulong)optionalPayload.Length) : UIntPtr.Zero; var optionalPayloadLength = optionalPayload != null ? new UIntPtr((ulong)optionalPayload.Length) : UIntPtr.Zero;
completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success)); completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success));
var statusDetailBytes = EncodingUTF8.GetBytes(status.Detail); var statusDetailBytes = MarshalUtils.GetBytesUTF8(status.Detail);
Native.grpcsharp_call_send_status_from_server(this, ctx, status.StatusCode, statusDetailBytes, new UIntPtr((ulong)statusDetailBytes.Length), metadataArray, sendEmptyInitialMetadata, Native.grpcsharp_call_send_status_from_server(this, ctx, status.StatusCode, statusDetailBytes, new UIntPtr((ulong)statusDetailBytes.Length), metadataArray, sendEmptyInitialMetadata,
optionalPayload, optionalPayloadLength, writeFlags).CheckOk(); optionalPayload, optionalPayloadLength, writeFlags).CheckOk();
} }
@ -204,6 +203,11 @@ namespace Grpc.Core.Internal
} }
} }
public AuthContextSafeHandle GetAuthContext()
{
return Native.grpcsharp_call_auth_context(this);
}
protected override bool ReleaseHandle() protected override bool ReleaseHandle()
{ {
Native.grpcsharp_call_destroy(handle); Native.grpcsharp_call_destroy(handle);

@ -32,46 +32,59 @@
#endregion #endregion
using System; using System;
using System.Threading; using System.Runtime.InteropServices;
using System.Threading.Tasks; using System.Text;
using Grpc.Core;
using Grpc.Core.Internal;
using Grpc.Core.Utils;
using NUnit.Framework;
namespace Grpc.Core.Tests namespace Grpc.Core.Internal
{ {
/// <summary> /// <summary>
/// Tests if the version of nunit-console used is sufficient to run async tests. /// Useful methods for native/managed marshalling.
/// </summary> /// </summary>
public class NUnitVersionTest internal static class MarshalUtils
{ {
private int testRunCount = 0; static readonly Encoding EncodingUTF8 = System.Text.Encoding.UTF8;
static readonly Encoding EncodingASCII = System.Text.Encoding.ASCII;
[TestFixtureTearDown] /// <summary>
public void Cleanup() /// Converts <c>IntPtr</c> pointing to a UTF-8 encoded byte array to <c>string</c>.
/// </summary>
public static string PtrToStringUTF8(IntPtr ptr, int len)
{ {
if (testRunCount != 2) var bytes = new byte[len];
{ Marshal.Copy(ptr, bytes, 0, len);
Console.Error.WriteLine("You are using and old version of NUnit that doesn't support async tests and skips them instead. " + return EncodingUTF8.GetString(bytes);
"This test has failed to indicate that.");
Console.Error.Flush();
throw new Exception("NUnitVersionTest has failed.");
}
} }
[Test] /// <summary>
public void NUnitVersionTest1() /// Returns byte array containing UTF-8 encoding of given string.
/// </summary>
public static byte[] GetBytesUTF8(string str)
{ {
testRunCount++; return EncodingUTF8.GetBytes(str);
} }
// Old version of NUnit will skip this test /// <summary>
[Test] /// Get string from a UTF8 encoded byte array.
public async Task NUnitVersionTest2() /// </summary>
public static string GetStringUTF8(byte[] bytes)
{ {
testRunCount++; return EncodingUTF8.GetString(bytes);
await Task.Delay(10); }
/// <summary>
/// Returns byte array containing ASCII encoding of given string.
/// </summary>
public static byte[] GetBytesASCII(string str)
{
return EncodingASCII.GetBytes(str);
}
/// <summary>
/// Get string from an ASCII encoded byte array.
/// </summary>
public static string GetStringASCII(byte[] bytes)
{
return EncodingASCII.GetString(bytes);
} }
} }
} }

@ -148,6 +148,12 @@ namespace Grpc.Core.Internal
public readonly Delegates.grpcsharp_server_shutdown_and_notify_callback_delegate grpcsharp_server_shutdown_and_notify_callback; public readonly Delegates.grpcsharp_server_shutdown_and_notify_callback_delegate grpcsharp_server_shutdown_and_notify_callback;
public readonly Delegates.grpcsharp_server_destroy_delegate grpcsharp_server_destroy; public readonly Delegates.grpcsharp_server_destroy_delegate grpcsharp_server_destroy;
public readonly Delegates.grpcsharp_call_auth_context_delegate grpcsharp_call_auth_context;
public readonly Delegates.grpcsharp_auth_context_peer_identity_property_name_delegate grpcsharp_auth_context_peer_identity_property_name;
public readonly Delegates.grpcsharp_auth_context_property_iterator_delegate grpcsharp_auth_context_property_iterator;
public readonly Delegates.grpcsharp_auth_property_iterator_next_delegate grpcsharp_auth_property_iterator_next;
public readonly Delegates.grpcsharp_auth_context_release_delegate grpcsharp_auth_context_release;
public readonly Delegates.gprsharp_now_delegate gprsharp_now; public readonly Delegates.gprsharp_now_delegate gprsharp_now;
public readonly Delegates.gprsharp_inf_future_delegate gprsharp_inf_future; public readonly Delegates.gprsharp_inf_future_delegate gprsharp_inf_future;
public readonly Delegates.gprsharp_inf_past_delegate gprsharp_inf_past; public readonly Delegates.gprsharp_inf_past_delegate gprsharp_inf_past;
@ -256,6 +262,12 @@ namespace Grpc.Core.Internal
this.grpcsharp_server_shutdown_and_notify_callback = GetMethodDelegate<Delegates.grpcsharp_server_shutdown_and_notify_callback_delegate>(library); this.grpcsharp_server_shutdown_and_notify_callback = GetMethodDelegate<Delegates.grpcsharp_server_shutdown_and_notify_callback_delegate>(library);
this.grpcsharp_server_destroy = GetMethodDelegate<Delegates.grpcsharp_server_destroy_delegate>(library); this.grpcsharp_server_destroy = GetMethodDelegate<Delegates.grpcsharp_server_destroy_delegate>(library);
this.grpcsharp_call_auth_context = GetMethodDelegate<Delegates.grpcsharp_call_auth_context_delegate>(library);
this.grpcsharp_auth_context_peer_identity_property_name = GetMethodDelegate<Delegates.grpcsharp_auth_context_peer_identity_property_name_delegate>(library);
this.grpcsharp_auth_context_property_iterator = GetMethodDelegate<Delegates.grpcsharp_auth_context_property_iterator_delegate>(library);
this.grpcsharp_auth_property_iterator_next = GetMethodDelegate<Delegates.grpcsharp_auth_property_iterator_next_delegate>(library);
this.grpcsharp_auth_context_release = GetMethodDelegate<Delegates.grpcsharp_auth_context_release_delegate>(library);
this.gprsharp_now = GetMethodDelegate<Delegates.gprsharp_now_delegate>(library); this.gprsharp_now = GetMethodDelegate<Delegates.gprsharp_now_delegate>(library);
this.gprsharp_inf_future = GetMethodDelegate<Delegates.gprsharp_inf_future_delegate>(library); this.gprsharp_inf_future = GetMethodDelegate<Delegates.gprsharp_inf_future_delegate>(library);
this.gprsharp_inf_past = GetMethodDelegate<Delegates.gprsharp_inf_past_delegate>(library); this.gprsharp_inf_past = GetMethodDelegate<Delegates.gprsharp_inf_past_delegate>(library);
@ -404,6 +416,12 @@ namespace Grpc.Core.Internal
public delegate void grpcsharp_server_shutdown_and_notify_callback_delegate(ServerSafeHandle server, CompletionQueueSafeHandle cq, BatchContextSafeHandle ctx); public delegate void grpcsharp_server_shutdown_and_notify_callback_delegate(ServerSafeHandle server, CompletionQueueSafeHandle cq, BatchContextSafeHandle ctx);
public delegate void grpcsharp_server_destroy_delegate(IntPtr server); public delegate void grpcsharp_server_destroy_delegate(IntPtr server);
public delegate AuthContextSafeHandle grpcsharp_call_auth_context_delegate(CallSafeHandle call);
public delegate IntPtr grpcsharp_auth_context_peer_identity_property_name_delegate(AuthContextSafeHandle authContext); // returns const char*
public delegate AuthContextSafeHandle.NativeAuthPropertyIterator grpcsharp_auth_context_property_iterator_delegate(AuthContextSafeHandle authContext);
public delegate IntPtr grpcsharp_auth_property_iterator_next_delegate(ref AuthContextSafeHandle.NativeAuthPropertyIterator iterator); // returns const auth_property*
public delegate void grpcsharp_auth_context_release_delegate(IntPtr authContext);
public delegate Timespec gprsharp_now_delegate(ClockType clockType); public delegate Timespec gprsharp_now_delegate(ClockType clockType);
public delegate Timespec gprsharp_inf_future_delegate(ClockType clockType); public delegate Timespec gprsharp_inf_future_delegate(ClockType clockType);
public delegate Timespec gprsharp_inf_past_delegate(ClockType clockType); public delegate Timespec gprsharp_inf_past_delegate(ClockType clockType);

@ -32,12 +32,10 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Grpc.Core.Internal;
using Grpc.Core.Utils; using Grpc.Core.Utils;
namespace Grpc.Core namespace Grpc.Core
@ -242,7 +240,6 @@ namespace Grpc.Core
/// </summary> /// </summary>
public class Entry public class Entry
{ {
private static readonly Encoding Encoding = Encoding.ASCII;
private static readonly Regex ValidKeyRegex = new Regex("^[a-z0-9_-]+$"); private static readonly Regex ValidKeyRegex = new Regex("^[a-z0-9_-]+$");
readonly string key; readonly string key;
@ -306,7 +303,7 @@ namespace Grpc.Core
{ {
if (valueBytes == null) if (valueBytes == null)
{ {
return Encoding.GetBytes(value); return MarshalUtils.GetBytesASCII(value);
} }
// defensive copy to guarantee immutability // defensive copy to guarantee immutability
@ -324,7 +321,7 @@ namespace Grpc.Core
get get
{ {
GrpcPreconditions.CheckState(!IsBinary, "Cannot access string value of a binary metadata entry"); GrpcPreconditions.CheckState(!IsBinary, "Cannot access string value of a binary metadata entry");
return value ?? Encoding.GetString(valueBytes); return value ?? MarshalUtils.GetStringASCII(valueBytes);
} }
} }
@ -358,7 +355,7 @@ namespace Grpc.Core
/// </summary> /// </summary>
internal byte[] GetSerializedValueUnsafe() internal byte[] GetSerializedValueUnsafe()
{ {
return valueBytes ?? Encoding.GetBytes(value); return valueBytes ?? MarshalUtils.GetBytesASCII(value);
} }
/// <summary> /// <summary>
@ -371,7 +368,7 @@ namespace Grpc.Core
{ {
return new Entry(key, null, valueBytes); return new Entry(key, null, valueBytes);
} }
return new Entry(key, Encoding.GetString(valueBytes), null); return new Entry(key, MarshalUtils.GetStringASCII(valueBytes), null);
} }
private static string NormalizeKey(string key) private static string NormalizeKey(string key)

@ -32,7 +32,6 @@
#endregion #endregion
using System; using System;
using System.Runtime.CompilerServices;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -56,6 +55,7 @@ namespace Grpc.Core
private Status status = Status.DefaultSuccess; private Status status = Status.DefaultSuccess;
private Func<Metadata, Task> writeHeadersFunc; private Func<Metadata, Task> writeHeadersFunc;
private IHasWriteOptions writeOptionsHolder; private IHasWriteOptions writeOptionsHolder;
private Lazy<AuthContext> authContext;
internal ServerCallContext(CallSafeHandle callHandle, string method, string host, DateTime deadline, Metadata requestHeaders, CancellationToken cancellationToken, internal ServerCallContext(CallSafeHandle callHandle, string method, string host, DateTime deadline, Metadata requestHeaders, CancellationToken cancellationToken,
Func<Metadata, Task> writeHeadersFunc, IHasWriteOptions writeOptionsHolder) Func<Metadata, Task> writeHeadersFunc, IHasWriteOptions writeOptionsHolder)
@ -68,6 +68,7 @@ namespace Grpc.Core
this.cancellationToken = cancellationToken; this.cancellationToken = cancellationToken;
this.writeHeadersFunc = writeHeadersFunc; this.writeHeadersFunc = writeHeadersFunc;
this.writeOptionsHolder = writeOptionsHolder; this.writeOptionsHolder = writeOptionsHolder;
this.authContext = new Lazy<AuthContext>(GetAuthContextEager);
} }
/// <summary> /// <summary>
@ -187,6 +188,26 @@ namespace Grpc.Core
writeOptionsHolder.WriteOptions = value; writeOptionsHolder.WriteOptions = value;
} }
} }
/// <summary>
/// Gets the <c>AuthContext</c> associated with this call.
/// Note: Access to AuthContext is an experimental API that can change without any prior notice.
/// </summary>
public AuthContext AuthContext
{
get
{
return authContext.Value;
}
}
private AuthContext GetAuthContextEager()
{
using (var authContextNative = callHandle.GetAuthContext())
{
return authContextNative.ToAuthContext();
}
}
} }
/// <summary> /// <summary>

@ -27,17 +27,17 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Interactive.Async">
<HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath>
</Reference>
<Reference Include="nunit.framework"> <Reference Include="nunit.framework">
<HintPath>..\packages\NUnit.3.2.0\lib\net45\nunit.framework.dll</HintPath> <HintPath>..\packages\NUnit.3.6.0\lib\net45\nunit.framework.dll</HintPath>
</Reference> </Reference>
<Reference Include="nunitlite"> <Reference Include="nunitlite">
<HintPath>..\packages\NUnitLite.3.2.0\lib\net45\nunitlite.dll</HintPath> <HintPath>..\packages\NUnitLite.3.6.0\lib\net45\nunitlite.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Protobuf"> <Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll</HintPath> <HintPath>..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="System.Interactive.Async">
<HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Google.Protobuf" version="3.0.0" targetFramework="net45" /> <package id="Google.Protobuf" version="3.2.0" targetFramework="net45" />
<package id="NUnit" version="3.2.0" targetFramework="net45" /> <package id="NUnit" version="3.6.0" targetFramework="net45" />
<package id="NUnitLite" version="3.2.0" targetFramework="net45" /> <package id="NUnitLite" version="3.6.0" targetFramework="net45" />
<package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" /> <package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" />
</packages> </packages>

@ -45,8 +45,8 @@
"Grpc.Examples": { "Grpc.Examples": {
"target": "project" "target": "project"
}, },
"NUnit": "3.2.0", "NUnit": "3.6.0",
"NUnitLite": "3.2.0-*" "NUnitLite": "3.6.0"
}, },
"frameworks": { "frameworks": {
"net45": { }, "net45": { },

@ -3,8 +3,6 @@
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>10.0.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{7DC1433E-3225-42C7-B7EA-546D56E27A4B}</ProjectGuid> <ProjectGuid>{7DC1433E-3225-42C7-B7EA-546D56E27A4B}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<RootNamespace>Grpc.Examples</RootNamespace> <RootNamespace>Grpc.Examples</RootNamespace>
@ -28,17 +26,17 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="nunit.framework">
<HintPath>..\packages\NUnit.3.2.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data.Linq" /> <Reference Include="System.Data.Linq" />
<Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="System.Interactive.Async"> <Reference Include="System.Interactive.Async">
<HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath> <HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath>
</Reference> </Reference>
<Reference Include="nunit.framework">
<HintPath>..\packages\NUnit.3.6.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\Grpc.Core\Version.cs"> <Compile Include="..\Grpc.Core\Version.cs">

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Google.Protobuf" version="3.0.0" targetFramework="net45" /> <package id="Google.Protobuf" version="3.2.0" targetFramework="net45" />
<package id="NUnit" version="3.2.0" targetFramework="net45" /> <package id="NUnit" version="3.6.0" targetFramework="net45" />
<package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" /> <package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" />
</packages> </packages>

@ -6,15 +6,10 @@
"Grpc.Core": { "Grpc.Core": {
"target": "project" "target": "project"
}, },
"Google.Protobuf": "3.0.0" "Google.Protobuf": "3.2.0"
}, },
"frameworks": { "frameworks": {
"net45": { "net45": {},
"frameworkAssemblies": {
"System.Runtime": "",
"System.IO": ""
}
},
"netcoreapp1.0": { "netcoreapp1.0": {
"dependencies": { "dependencies": {
"Microsoft.NETCore.App": { "Microsoft.NETCore.App": {

@ -35,14 +35,14 @@
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="nunit.framework"> <Reference Include="nunit.framework">
<HintPath>..\packages\NUnit.3.2.0\lib\net45\nunit.framework.dll</HintPath> <HintPath>..\packages\NUnit.3.6.0\lib\net45\nunit.framework.dll</HintPath>
</Reference> </Reference>
<Reference Include="nunitlite"> <Reference Include="nunitlite">
<HintPath>..\packages\NUnitLite.3.2.0\lib\net45\nunitlite.dll</HintPath> <HintPath>..\packages\NUnitLite.3.6.0\lib\net45\nunitlite.dll</HintPath>
</Reference>
<Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Google.Protobuf" version="3.0.0" targetFramework="net45" /> <package id="Google.Protobuf" version="3.2.0" targetFramework="net45" />
<package id="NUnit" version="3.2.0" targetFramework="net45" /> <package id="NUnit" version="3.6.0" targetFramework="net45" />
<package id="NUnitLite" version="3.2.0" targetFramework="net45" /> <package id="NUnitLite" version="3.6.0" targetFramework="net45" />
</packages> </packages>

@ -45,8 +45,8 @@
"Grpc.HealthCheck": { "Grpc.HealthCheck": {
"target": "project" "target": "project"
}, },
"NUnit": "3.2.0", "NUnit": "3.6.0",
"NUnitLite": "3.2.0-*" "NUnitLite": "3.6.0"
}, },
"frameworks": { "frameworks": {
"net45": { }, "net45": { },

@ -36,12 +36,12 @@
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="System.Interactive.Async"> <Reference Include="System.Interactive.Async">
<HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath> <HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\Grpc.Core\Version.cs"> <Compile Include="..\Grpc.Core\Version.cs">

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Google.Protobuf" version="3.0.0" targetFramework="net45" /> <package id="Google.Protobuf" version="3.2.0" targetFramework="net45" />
<package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" /> <package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" />
</packages> </packages>

@ -22,15 +22,10 @@
}, },
"dependencies": { "dependencies": {
"Grpc.Core": "1.2.0-dev", "Grpc.Core": "1.2.0-dev",
"Google.Protobuf": "3.0.0" "Google.Protobuf": "3.2.0"
}, },
"frameworks": { "frameworks": {
"net45": { "net45": {},
"frameworkAssemblies": {
"System.Runtime": "",
"System.IO": ""
}
},
"netstandard1.5": { "netstandard1.5": {
"dependencies": { "dependencies": {
"NETStandard.Library": "1.6.0" "NETStandard.Library": "1.6.0"

@ -34,33 +34,6 @@
<Reference Include="System.Net" /> <Reference Include="System.Net" />
<Reference Include="System.Net.Http" /> <Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.WebRequest" /> <Reference Include="System.Net.Http.WebRequest" />
<Reference Include="BouncyCastle.Crypto">
<HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.Core">
<HintPath>..\packages\Google.Apis.Core.1.16.0\lib\net45\Google.Apis.Core.dll</HintPath>
</Reference>
<Reference Include="Zlib.Portable">
<HintPath>..\packages\Zlib.Portable.Signed.1.11.0\lib\portable-net4+sl5+wp8+win8+wpa81+MonoTouch+MonoAndroid\Zlib.Portable.dll</HintPath>
</Reference>
<Reference Include="Google.Apis">
<HintPath>..\packages\Google.Apis.1.16.0\lib\net45\Google.Apis.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.PlatformServices">
<HintPath>..\packages\Google.Apis.1.16.0\lib\net45\Google.Apis.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.Auth">
<HintPath>..\packages\Google.Apis.Auth.1.16.0\lib\net45\Google.Apis.Auth.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.Auth.PlatformServices">
<HintPath>..\packages\Google.Apis.Auth.1.16.0\lib\net45\Google.Apis.Auth.PlatformServices.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\Grpc.Core\Version.cs"> <Compile Include="..\Grpc.Core\Version.cs">
@ -82,6 +55,5 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Grpc.IntegrationTesting.Client.project.json" /> <None Include="Grpc.IntegrationTesting.Client.project.json" />
<None Include="packages.config" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="BouncyCastle" version="1.7.0" targetFramework="net45" />
<package id="Google.Apis" version="1.16.0" targetFramework="net45" />
<package id="Google.Apis.Auth" version="1.16.0" targetFramework="net45" />
<package id="Google.Apis.Core" version="1.16.0" targetFramework="net45" />
<package id="log4net" version="2.0.3" targetFramework="net45" />
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
<package id="Zlib.Portable.Signed" version="1.11.0" targetFramework="net45" />
</packages>

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
</packages>

@ -34,33 +34,6 @@
<Reference Include="System.Net" /> <Reference Include="System.Net" />
<Reference Include="System.Net.Http" /> <Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.WebRequest" /> <Reference Include="System.Net.Http.WebRequest" />
<Reference Include="BouncyCastle.Crypto">
<HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.Core">
<HintPath>..\packages\Google.Apis.Core.1.16.0\lib\net45\Google.Apis.Core.dll</HintPath>
</Reference>
<Reference Include="Zlib.Portable">
<HintPath>..\packages\Zlib.Portable.Signed.1.11.0\lib\portable-net4+sl5+wp8+win8+wpa81+MonoTouch+MonoAndroid\Zlib.Portable.dll</HintPath>
</Reference>
<Reference Include="Google.Apis">
<HintPath>..\packages\Google.Apis.1.16.0\lib\net45\Google.Apis.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.PlatformServices">
<HintPath>..\packages\Google.Apis.1.16.0\lib\net45\Google.Apis.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.Auth">
<HintPath>..\packages\Google.Apis.Auth.1.16.0\lib\net45\Google.Apis.Auth.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.Auth.PlatformServices">
<HintPath>..\packages\Google.Apis.Auth.1.16.0\lib\net45\Google.Apis.Auth.PlatformServices.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\Grpc.Core\Version.cs"> <Compile Include="..\Grpc.Core\Version.cs">
@ -82,6 +55,5 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Grpc.IntegrationTesting.Server.project.json" /> <None Include="Grpc.IntegrationTesting.Server.project.json" />
<None Include="packages.config" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="BouncyCastle" version="1.7.0" targetFramework="net45" />
<package id="Google.Apis" version="1.16.0" targetFramework="net45" />
<package id="Google.Apis.Auth" version="1.16.0" targetFramework="net45" />
<package id="Google.Apis.Core" version="1.16.0" targetFramework="net45" />
<package id="log4net" version="2.0.3" targetFramework="net45" />
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
<package id="Zlib.Portable.Signed" version="1.11.0" targetFramework="net45" />
</packages>

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
</packages>

@ -30,63 +30,66 @@ namespace Grpc.Testing {
"cnBjLnRlc3RpbmcuQ2xvc2VkTG9vcFBhcmFtc0gAEi4KB3BvaXNzb24YAiAB", "cnBjLnRlc3RpbmcuQ2xvc2VkTG9vcFBhcmFtc0gAEi4KB3BvaXNzb24YAiAB",
"KAsyGy5ncnBjLnRlc3RpbmcuUG9pc3NvblBhcmFtc0gAQgYKBGxvYWQiQwoO", "KAsyGy5ncnBjLnRlc3RpbmcuUG9pc3NvblBhcmFtc0gAQgYKBGxvYWQiQwoO",
"U2VjdXJpdHlQYXJhbXMSEwoLdXNlX3Rlc3RfY2EYASABKAgSHAoUc2VydmVy", "U2VjdXJpdHlQYXJhbXMSEwoLdXNlX3Rlc3RfY2EYASABKAgSHAoUc2VydmVy",
"X2hvc3Rfb3ZlcnJpZGUYAiABKAki8AMKDENsaWVudENvbmZpZxIWCg5zZXJ2", "X2hvc3Rfb3ZlcnJpZGUYAiABKAkiTQoKQ2hhbm5lbEFyZxIMCgRuYW1lGAEg",
"ZXJfdGFyZ2V0cxgBIAMoCRItCgtjbGllbnRfdHlwZRgCIAEoDjIYLmdycGMu", "ASgJEhMKCXN0cl92YWx1ZRgCIAEoCUgAEhMKCWludF92YWx1ZRgDIAEoBUgA",
"dGVzdGluZy5DbGllbnRUeXBlEjUKD3NlY3VyaXR5X3BhcmFtcxgDIAEoCzIc", "QgcKBXZhbHVlIqAECgxDbGllbnRDb25maWcSFgoOc2VydmVyX3RhcmdldHMY",
"LmdycGMudGVzdGluZy5TZWN1cml0eVBhcmFtcxIkChxvdXRzdGFuZGluZ19y", "ASADKAkSLQoLY2xpZW50X3R5cGUYAiABKA4yGC5ncnBjLnRlc3RpbmcuQ2xp",
"cGNzX3Blcl9jaGFubmVsGAQgASgFEhcKD2NsaWVudF9jaGFubmVscxgFIAEo", "ZW50VHlwZRI1Cg9zZWN1cml0eV9wYXJhbXMYAyABKAsyHC5ncnBjLnRlc3Rp",
"BRIcChRhc3luY19jbGllbnRfdGhyZWFkcxgHIAEoBRInCghycGNfdHlwZRgI", "bmcuU2VjdXJpdHlQYXJhbXMSJAocb3V0c3RhbmRpbmdfcnBjc19wZXJfY2hh",
"IAEoDjIVLmdycGMudGVzdGluZy5ScGNUeXBlEi0KC2xvYWRfcGFyYW1zGAog", "bm5lbBgEIAEoBRIXCg9jbGllbnRfY2hhbm5lbHMYBSABKAUSHAoUYXN5bmNf",
"ASgLMhguZ3JwYy50ZXN0aW5nLkxvYWRQYXJhbXMSMwoOcGF5bG9hZF9jb25m", "Y2xpZW50X3RocmVhZHMYByABKAUSJwoIcnBjX3R5cGUYCCABKA4yFS5ncnBj",
"aWcYCyABKAsyGy5ncnBjLnRlc3RpbmcuUGF5bG9hZENvbmZpZxI3ChBoaXN0", "LnRlc3RpbmcuUnBjVHlwZRItCgtsb2FkX3BhcmFtcxgKIAEoCzIYLmdycGMu",
"b2dyYW1fcGFyYW1zGAwgASgLMh0uZ3JwYy50ZXN0aW5nLkhpc3RvZ3JhbVBh", "dGVzdGluZy5Mb2FkUGFyYW1zEjMKDnBheWxvYWRfY29uZmlnGAsgASgLMhsu",
"cmFtcxIRCgljb3JlX2xpc3QYDSADKAUSEgoKY29yZV9saW1pdBgOIAEoBRIY", "Z3JwYy50ZXN0aW5nLlBheWxvYWRDb25maWcSNwoQaGlzdG9ncmFtX3BhcmFt",
"ChBvdGhlcl9jbGllbnRfYXBpGA8gASgJIjgKDENsaWVudFN0YXR1cxIoCgVz", "cxgMIAEoCzIdLmdycGMudGVzdGluZy5IaXN0b2dyYW1QYXJhbXMSEQoJY29y",
"dGF0cxgBIAEoCzIZLmdycGMudGVzdGluZy5DbGllbnRTdGF0cyIVCgRNYXJr", "ZV9saXN0GA0gAygFEhIKCmNvcmVfbGltaXQYDiABKAUSGAoQb3RoZXJfY2xp",
"Eg0KBXJlc2V0GAEgASgIImgKCkNsaWVudEFyZ3MSKwoFc2V0dXAYASABKAsy", "ZW50X2FwaRgPIAEoCRIuCgxjaGFubmVsX2FyZ3MYECADKAsyGC5ncnBjLnRl",
"Gi5ncnBjLnRlc3RpbmcuQ2xpZW50Q29uZmlnSAASIgoEbWFyaxgCIAEoCzIS", "c3RpbmcuQ2hhbm5lbEFyZyI4CgxDbGllbnRTdGF0dXMSKAoFc3RhdHMYASAB",
"LmdycGMudGVzdGluZy5NYXJrSABCCQoHYXJndHlwZSK0AgoMU2VydmVyQ29u", "KAsyGS5ncnBjLnRlc3RpbmcuQ2xpZW50U3RhdHMiFQoETWFyaxINCgVyZXNl",
"ZmlnEi0KC3NlcnZlcl90eXBlGAEgASgOMhguZ3JwYy50ZXN0aW5nLlNlcnZl", "dBgBIAEoCCJoCgpDbGllbnRBcmdzEisKBXNldHVwGAEgASgLMhouZ3JwYy50",
"clR5cGUSNQoPc2VjdXJpdHlfcGFyYW1zGAIgASgLMhwuZ3JwYy50ZXN0aW5n", "ZXN0aW5nLkNsaWVudENvbmZpZ0gAEiIKBG1hcmsYAiABKAsyEi5ncnBjLnRl",
"LlNlY3VyaXR5UGFyYW1zEgwKBHBvcnQYBCABKAUSHAoUYXN5bmNfc2VydmVy", "c3RpbmcuTWFya0gAQgkKB2FyZ3R5cGUitAIKDFNlcnZlckNvbmZpZxItCgtz",
"X3RocmVhZHMYByABKAUSEgoKY29yZV9saW1pdBgIIAEoBRIzCg5wYXlsb2Fk", "ZXJ2ZXJfdHlwZRgBIAEoDjIYLmdycGMudGVzdGluZy5TZXJ2ZXJUeXBlEjUK",
"X2NvbmZpZxgJIAEoCzIbLmdycGMudGVzdGluZy5QYXlsb2FkQ29uZmlnEhEK", "D3NlY3VyaXR5X3BhcmFtcxgCIAEoCzIcLmdycGMudGVzdGluZy5TZWN1cml0",
"CWNvcmVfbGlzdBgKIAMoBRIYChBvdGhlcl9zZXJ2ZXJfYXBpGAsgASgJEhwK", "eVBhcmFtcxIMCgRwb3J0GAQgASgFEhwKFGFzeW5jX3NlcnZlcl90aHJlYWRz",
"E3Jlc291cmNlX3F1b3RhX3NpemUY6QcgASgFImgKClNlcnZlckFyZ3MSKwoF", "GAcgASgFEhIKCmNvcmVfbGltaXQYCCABKAUSMwoOcGF5bG9hZF9jb25maWcY",
"c2V0dXAYASABKAsyGi5ncnBjLnRlc3RpbmcuU2VydmVyQ29uZmlnSAASIgoE", "CSABKAsyGy5ncnBjLnRlc3RpbmcuUGF5bG9hZENvbmZpZxIRCgljb3JlX2xp",
"bWFyaxgCIAEoCzISLmdycGMudGVzdGluZy5NYXJrSABCCQoHYXJndHlwZSJV", "c3QYCiADKAUSGAoQb3RoZXJfc2VydmVyX2FwaRgLIAEoCRIcChNyZXNvdXJj",
"CgxTZXJ2ZXJTdGF0dXMSKAoFc3RhdHMYASABKAsyGS5ncnBjLnRlc3Rpbmcu", "ZV9xdW90YV9zaXplGOkHIAEoBSJoCgpTZXJ2ZXJBcmdzEisKBXNldHVwGAEg",
"U2VydmVyU3RhdHMSDAoEcG9ydBgCIAEoBRINCgVjb3JlcxgDIAEoBSINCgtD", "ASgLMhouZ3JwYy50ZXN0aW5nLlNlcnZlckNvbmZpZ0gAEiIKBG1hcmsYAiAB",
"b3JlUmVxdWVzdCIdCgxDb3JlUmVzcG9uc2USDQoFY29yZXMYASABKAUiBgoE", "KAsyEi5ncnBjLnRlc3RpbmcuTWFya0gAQgkKB2FyZ3R5cGUiVQoMU2VydmVy",
"Vm9pZCL9AQoIU2NlbmFyaW8SDAoEbmFtZRgBIAEoCRIxCg1jbGllbnRfY29u", "U3RhdHVzEigKBXN0YXRzGAEgASgLMhkuZ3JwYy50ZXN0aW5nLlNlcnZlclN0",
"ZmlnGAIgASgLMhouZ3JwYy50ZXN0aW5nLkNsaWVudENvbmZpZxITCgtudW1f", "YXRzEgwKBHBvcnQYAiABKAUSDQoFY29yZXMYAyABKAUiDQoLQ29yZVJlcXVl",
"Y2xpZW50cxgDIAEoBRIxCg1zZXJ2ZXJfY29uZmlnGAQgASgLMhouZ3JwYy50", "c3QiHQoMQ29yZVJlc3BvbnNlEg0KBWNvcmVzGAEgASgFIgYKBFZvaWQi/QEK",
"ZXN0aW5nLlNlcnZlckNvbmZpZxITCgtudW1fc2VydmVycxgFIAEoBRIWCg53", "CFNjZW5hcmlvEgwKBG5hbWUYASABKAkSMQoNY2xpZW50X2NvbmZpZxgCIAEo",
"YXJtdXBfc2Vjb25kcxgGIAEoBRIZChFiZW5jaG1hcmtfc2Vjb25kcxgHIAEo", "CzIaLmdycGMudGVzdGluZy5DbGllbnRDb25maWcSEwoLbnVtX2NsaWVudHMY",
"BRIgChhzcGF3bl9sb2NhbF93b3JrZXJfY291bnQYCCABKAUiNgoJU2NlbmFy", "AyABKAUSMQoNc2VydmVyX2NvbmZpZxgEIAEoCzIaLmdycGMudGVzdGluZy5T",
"aW9zEikKCXNjZW5hcmlvcxgBIAMoCzIWLmdycGMudGVzdGluZy5TY2VuYXJp", "ZXJ2ZXJDb25maWcSEwoLbnVtX3NlcnZlcnMYBSABKAUSFgoOd2FybXVwX3Nl",
"byL4AgoVU2NlbmFyaW9SZXN1bHRTdW1tYXJ5EgsKA3FwcxgBIAEoARIbChNx", "Y29uZHMYBiABKAUSGQoRYmVuY2htYXJrX3NlY29uZHMYByABKAUSIAoYc3Bh",
"cHNfcGVyX3NlcnZlcl9jb3JlGAIgASgBEhoKEnNlcnZlcl9zeXN0ZW1fdGlt", "d25fbG9jYWxfd29ya2VyX2NvdW50GAggASgFIjYKCVNjZW5hcmlvcxIpCglz",
"ZRgDIAEoARIYChBzZXJ2ZXJfdXNlcl90aW1lGAQgASgBEhoKEmNsaWVudF9z", "Y2VuYXJpb3MYASADKAsyFi5ncnBjLnRlc3RpbmcuU2NlbmFyaW8i+AIKFVNj",
"eXN0ZW1fdGltZRgFIAEoARIYChBjbGllbnRfdXNlcl90aW1lGAYgASgBEhIK", "ZW5hcmlvUmVzdWx0U3VtbWFyeRILCgNxcHMYASABKAESGwoTcXBzX3Blcl9z",
"CmxhdGVuY3lfNTAYByABKAESEgoKbGF0ZW5jeV85MBgIIAEoARISCgpsYXRl", "ZXJ2ZXJfY29yZRgCIAEoARIaChJzZXJ2ZXJfc3lzdGVtX3RpbWUYAyABKAES",
"bmN5Xzk1GAkgASgBEhIKCmxhdGVuY3lfOTkYCiABKAESEwoLbGF0ZW5jeV85", "GAoQc2VydmVyX3VzZXJfdGltZRgEIAEoARIaChJjbGllbnRfc3lzdGVtX3Rp",
"OTkYCyABKAESGAoQc2VydmVyX2NwdV91c2FnZRgMIAEoARImCh5zdWNjZXNz", "bWUYBSABKAESGAoQY2xpZW50X3VzZXJfdGltZRgGIAEoARISCgpsYXRlbmN5",
"ZnVsX3JlcXVlc3RzX3Blcl9zZWNvbmQYDSABKAESIgoaZmFpbGVkX3JlcXVl", "XzUwGAcgASgBEhIKCmxhdGVuY3lfOTAYCCABKAESEgoKbGF0ZW5jeV85NRgJ",
"c3RzX3Blcl9zZWNvbmQYDiABKAEigwMKDlNjZW5hcmlvUmVzdWx0EigKCHNj", "IAEoARISCgpsYXRlbmN5Xzk5GAogASgBEhMKC2xhdGVuY3lfOTk5GAsgASgB",
"ZW5hcmlvGAEgASgLMhYuZ3JwYy50ZXN0aW5nLlNjZW5hcmlvEi4KCWxhdGVu", "EhgKEHNlcnZlcl9jcHVfdXNhZ2UYDCABKAESJgoec3VjY2Vzc2Z1bF9yZXF1",
"Y2llcxgCIAEoCzIbLmdycGMudGVzdGluZy5IaXN0b2dyYW1EYXRhEi8KDGNs", "ZXN0c19wZXJfc2Vjb25kGA0gASgBEiIKGmZhaWxlZF9yZXF1ZXN0c19wZXJf",
"aWVudF9zdGF0cxgDIAMoCzIZLmdycGMudGVzdGluZy5DbGllbnRTdGF0cxIv", "c2Vjb25kGA4gASgBIoMDCg5TY2VuYXJpb1Jlc3VsdBIoCghzY2VuYXJpbxgB",
"CgxzZXJ2ZXJfc3RhdHMYBCADKAsyGS5ncnBjLnRlc3RpbmcuU2VydmVyU3Rh", "IAEoCzIWLmdycGMudGVzdGluZy5TY2VuYXJpbxIuCglsYXRlbmNpZXMYAiAB",
"dHMSFAoMc2VydmVyX2NvcmVzGAUgAygFEjQKB3N1bW1hcnkYBiABKAsyIy5n", "KAsyGy5ncnBjLnRlc3RpbmcuSGlzdG9ncmFtRGF0YRIvCgxjbGllbnRfc3Rh",
"cnBjLnRlc3RpbmcuU2NlbmFyaW9SZXN1bHRTdW1tYXJ5EhYKDmNsaWVudF9z", "dHMYAyADKAsyGS5ncnBjLnRlc3RpbmcuQ2xpZW50U3RhdHMSLwoMc2VydmVy",
"dWNjZXNzGAcgAygIEhYKDnNlcnZlcl9zdWNjZXNzGAggAygIEjkKD3JlcXVl", "X3N0YXRzGAQgAygLMhkuZ3JwYy50ZXN0aW5nLlNlcnZlclN0YXRzEhQKDHNl",
"c3RfcmVzdWx0cxgJIAMoCzIgLmdycGMudGVzdGluZy5SZXF1ZXN0UmVzdWx0", "cnZlcl9jb3JlcxgFIAMoBRI0CgdzdW1tYXJ5GAYgASgLMiMuZ3JwYy50ZXN0",
"Q291bnQqQQoKQ2xpZW50VHlwZRIPCgtTWU5DX0NMSUVOVBAAEhAKDEFTWU5D", "aW5nLlNjZW5hcmlvUmVzdWx0U3VtbWFyeRIWCg5jbGllbnRfc3VjY2VzcxgH",
"X0NMSUVOVBABEhAKDE9USEVSX0NMSUVOVBACKlsKClNlcnZlclR5cGUSDwoL", "IAMoCBIWCg5zZXJ2ZXJfc3VjY2VzcxgIIAMoCBI5Cg9yZXF1ZXN0X3Jlc3Vs",
"U1lOQ19TRVJWRVIQABIQCgxBU1lOQ19TRVJWRVIQARIYChRBU1lOQ19HRU5F", "dHMYCSADKAsyIC5ncnBjLnRlc3RpbmcuUmVxdWVzdFJlc3VsdENvdW50KkEK",
"UklDX1NFUlZFUhACEhAKDE9USEVSX1NFUlZFUhADKiMKB1JwY1R5cGUSCQoF", "CkNsaWVudFR5cGUSDwoLU1lOQ19DTElFTlQQABIQCgxBU1lOQ19DTElFTlQQ",
"VU5BUlkQABINCglTVFJFQU1JTkcQAWIGcHJvdG8z")); "ARIQCgxPVEhFUl9DTElFTlQQAipbCgpTZXJ2ZXJUeXBlEg8KC1NZTkNfU0VS",
"VkVSEAASEAoMQVNZTkNfU0VSVkVSEAESGAoUQVNZTkNfR0VORVJJQ19TRVJW",
"RVIQAhIQCgxPVEhFUl9TRVJWRVIQAyojCgdScGNUeXBlEgkKBVVOQVJZEAAS",
"DQoJU1RSRUFNSU5HEAFiBnByb3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Grpc.Testing.PayloadsReflection.Descriptor, global::Grpc.Testing.StatsReflection.Descriptor, }, new pbr::FileDescriptor[] { global::Grpc.Testing.PayloadsReflection.Descriptor, global::Grpc.Testing.StatsReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Grpc.Testing.ClientType), typeof(global::Grpc.Testing.ServerType), typeof(global::Grpc.Testing.RpcType), }, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Grpc.Testing.ClientType), typeof(global::Grpc.Testing.ServerType), typeof(global::Grpc.Testing.RpcType), }, new pbr::GeneratedClrTypeInfo[] {
@ -94,7 +97,8 @@ namespace Grpc.Testing {
new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClosedLoopParams), global::Grpc.Testing.ClosedLoopParams.Parser, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClosedLoopParams), global::Grpc.Testing.ClosedLoopParams.Parser, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.LoadParams), global::Grpc.Testing.LoadParams.Parser, new[]{ "ClosedLoop", "Poisson" }, new[]{ "Load" }, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.LoadParams), global::Grpc.Testing.LoadParams.Parser, new[]{ "ClosedLoop", "Poisson" }, new[]{ "Load" }, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SecurityParams), global::Grpc.Testing.SecurityParams.Parser, new[]{ "UseTestCa", "ServerHostOverride" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SecurityParams), global::Grpc.Testing.SecurityParams.Parser, new[]{ "UseTestCa", "ServerHostOverride" }, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientConfig), global::Grpc.Testing.ClientConfig.Parser, new[]{ "ServerTargets", "ClientType", "SecurityParams", "OutstandingRpcsPerChannel", "ClientChannels", "AsyncClientThreads", "RpcType", "LoadParams", "PayloadConfig", "HistogramParams", "CoreList", "CoreLimit", "OtherClientApi" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ChannelArg), global::Grpc.Testing.ChannelArg.Parser, new[]{ "Name", "StrValue", "IntValue" }, new[]{ "Value" }, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientConfig), global::Grpc.Testing.ClientConfig.Parser, new[]{ "ServerTargets", "ClientType", "SecurityParams", "OutstandingRpcsPerChannel", "ClientChannels", "AsyncClientThreads", "RpcType", "LoadParams", "PayloadConfig", "HistogramParams", "CoreList", "CoreLimit", "OtherClientApi", "ChannelArgs" }, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientStatus), global::Grpc.Testing.ClientStatus.Parser, new[]{ "Stats" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientStatus), global::Grpc.Testing.ClientStatus.Parser, new[]{ "Stats" }, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.Mark), global::Grpc.Testing.Mark.Parser, new[]{ "Reset" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.Mark), global::Grpc.Testing.Mark.Parser, new[]{ "Reset" }, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientArgs), global::Grpc.Testing.ClientArgs.Parser, new[]{ "Setup", "Mark" }, new[]{ "Argtype" }, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientArgs), global::Grpc.Testing.ClientArgs.Parser, new[]{ "Setup", "Mark" }, new[]{ "Argtype" }, null, null),
@ -116,13 +120,13 @@ namespace Grpc.Testing {
#region Enums #region Enums
public enum ClientType { public enum ClientType {
/// <summary> /// <summary>
/// Many languages support a basic distinction between using /// Many languages support a basic distinction between using
/// sync or async client, and this allows the specification /// sync or async client, and this allows the specification
/// </summary> /// </summary>
[pbr::OriginalName("SYNC_CLIENT")] SyncClient = 0, [pbr::OriginalName("SYNC_CLIENT")] SyncClient = 0,
[pbr::OriginalName("ASYNC_CLIENT")] AsyncClient = 1, [pbr::OriginalName("ASYNC_CLIENT")] AsyncClient = 1,
/// <summary> /// <summary>
/// used for some language-specific variants /// used for some language-specific variants
/// </summary> /// </summary>
[pbr::OriginalName("OTHER_CLIENT")] OtherClient = 2, [pbr::OriginalName("OTHER_CLIENT")] OtherClient = 2,
} }
@ -132,7 +136,7 @@ namespace Grpc.Testing {
[pbr::OriginalName("ASYNC_SERVER")] AsyncServer = 1, [pbr::OriginalName("ASYNC_SERVER")] AsyncServer = 1,
[pbr::OriginalName("ASYNC_GENERIC_SERVER")] AsyncGenericServer = 2, [pbr::OriginalName("ASYNC_GENERIC_SERVER")] AsyncGenericServer = 2,
/// <summary> /// <summary>
/// used for some language-specific variants /// used for some language-specific variants
/// </summary> /// </summary>
[pbr::OriginalName("OTHER_SERVER")] OtherServer = 3, [pbr::OriginalName("OTHER_SERVER")] OtherServer = 3,
} }
@ -146,8 +150,8 @@ namespace Grpc.Testing {
#region Messages #region Messages
/// <summary> /// <summary>
/// Parameters of poisson process distribution, which is a good representation /// Parameters of poisson process distribution, which is a good representation
/// of activity coming in from independent identical stationary sources. /// of activity coming in from independent identical stationary sources.
/// </summary> /// </summary>
public sealed partial class PoissonParams : pb::IMessage<PoissonParams> { public sealed partial class PoissonParams : pb::IMessage<PoissonParams> {
private static readonly pb::MessageParser<PoissonParams> _parser = new pb::MessageParser<PoissonParams>(() => new PoissonParams()); private static readonly pb::MessageParser<PoissonParams> _parser = new pb::MessageParser<PoissonParams>(() => new PoissonParams());
@ -185,7 +189,7 @@ namespace Grpc.Testing {
public const int OfferedLoadFieldNumber = 1; public const int OfferedLoadFieldNumber = 1;
private double offeredLoad_; private double offeredLoad_;
/// <summary> /// <summary>
/// The rate of arrivals (a.k.a. lambda parameter of the exp distribution). /// The rate of arrivals (a.k.a. lambda parameter of the exp distribution).
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double OfferedLoad { public double OfferedLoad {
@ -270,8 +274,8 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Once an RPC finishes, immediately start a new one. /// Once an RPC finishes, immediately start a new one.
/// No configuration parameters needed. /// No configuration parameters needed.
/// </summary> /// </summary>
public sealed partial class ClosedLoopParams : pb::IMessage<ClosedLoopParams> { public sealed partial class ClosedLoopParams : pb::IMessage<ClosedLoopParams> {
private static readonly pb::MessageParser<ClosedLoopParams> _parser = new pb::MessageParser<ClosedLoopParams>(() => new ClosedLoopParams()); private static readonly pb::MessageParser<ClosedLoopParams> _parser = new pb::MessageParser<ClosedLoopParams>(() => new ClosedLoopParams());
@ -549,7 +553,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// presence of SecurityParams implies use of TLS /// presence of SecurityParams implies use of TLS
/// </summary> /// </summary>
public sealed partial class SecurityParams : pb::IMessage<SecurityParams> { public sealed partial class SecurityParams : pb::IMessage<SecurityParams> {
private static readonly pb::MessageParser<SecurityParams> _parser = new pb::MessageParser<SecurityParams>(() => new SecurityParams()); private static readonly pb::MessageParser<SecurityParams> _parser = new pb::MessageParser<SecurityParams>(() => new SecurityParams());
@ -696,6 +700,210 @@ namespace Grpc.Testing {
} }
public sealed partial class ChannelArg : pb::IMessage<ChannelArg> {
private static readonly pb::MessageParser<ChannelArg> _parser = new pb::MessageParser<ChannelArg>(() => new ChannelArg());
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser<ChannelArg> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[4]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ChannelArg() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ChannelArg(ChannelArg other) : this() {
name_ = other.name_;
switch (other.ValueCase) {
case ValueOneofCase.StrValue:
StrValue = other.StrValue;
break;
case ValueOneofCase.IntValue:
IntValue = other.IntValue;
break;
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ChannelArg Clone() {
return new ChannelArg(this);
}
/// <summary>Field number for the "name" field.</summary>
public const int NameFieldNumber = 1;
private string name_ = "";
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string Name {
get { return name_; }
set {
name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
/// <summary>Field number for the "str_value" field.</summary>
public const int StrValueFieldNumber = 2;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string StrValue {
get { return valueCase_ == ValueOneofCase.StrValue ? (string) value_ : ""; }
set {
value_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
valueCase_ = ValueOneofCase.StrValue;
}
}
/// <summary>Field number for the "int_value" field.</summary>
public const int IntValueFieldNumber = 3;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int IntValue {
get { return valueCase_ == ValueOneofCase.IntValue ? (int) value_ : 0; }
set {
value_ = value;
valueCase_ = ValueOneofCase.IntValue;
}
}
private object value_;
/// <summary>Enum of possible cases for the "value" oneof.</summary>
public enum ValueOneofCase {
None = 0,
StrValue = 2,
IntValue = 3,
}
private ValueOneofCase valueCase_ = ValueOneofCase.None;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ValueOneofCase ValueCase {
get { return valueCase_; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void ClearValue() {
valueCase_ = ValueOneofCase.None;
value_ = null;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as ChannelArg);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(ChannelArg other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if (Name != other.Name) return false;
if (StrValue != other.StrValue) return false;
if (IntValue != other.IntValue) return false;
if (ValueCase != other.ValueCase) return false;
return true;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
if (Name.Length != 0) hash ^= Name.GetHashCode();
if (valueCase_ == ValueOneofCase.StrValue) hash ^= StrValue.GetHashCode();
if (valueCase_ == ValueOneofCase.IntValue) hash ^= IntValue.GetHashCode();
hash ^= (int) valueCase_;
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
if (Name.Length != 0) {
output.WriteRawTag(10);
output.WriteString(Name);
}
if (valueCase_ == ValueOneofCase.StrValue) {
output.WriteRawTag(18);
output.WriteString(StrValue);
}
if (valueCase_ == ValueOneofCase.IntValue) {
output.WriteRawTag(24);
output.WriteInt32(IntValue);
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
if (Name.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
}
if (valueCase_ == ValueOneofCase.StrValue) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(StrValue);
}
if (valueCase_ == ValueOneofCase.IntValue) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(IntValue);
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(ChannelArg other) {
if (other == null) {
return;
}
if (other.Name.Length != 0) {
Name = other.Name;
}
switch (other.ValueCase) {
case ValueOneofCase.StrValue:
StrValue = other.StrValue;
break;
case ValueOneofCase.IntValue:
IntValue = other.IntValue;
break;
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
switch(tag) {
default:
input.SkipLastField();
break;
case 10: {
Name = input.ReadString();
break;
}
case 18: {
StrValue = input.ReadString();
break;
}
case 24: {
IntValue = input.ReadInt32();
break;
}
}
}
}
}
public sealed partial class ClientConfig : pb::IMessage<ClientConfig> { public sealed partial class ClientConfig : pb::IMessage<ClientConfig> {
private static readonly pb::MessageParser<ClientConfig> _parser = new pb::MessageParser<ClientConfig>(() => new ClientConfig()); private static readonly pb::MessageParser<ClientConfig> _parser = new pb::MessageParser<ClientConfig>(() => new ClientConfig());
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -703,7 +911,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[4]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[5]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -733,6 +941,7 @@ namespace Grpc.Testing {
coreList_ = other.coreList_.Clone(); coreList_ = other.coreList_.Clone();
coreLimit_ = other.coreLimit_; coreLimit_ = other.coreLimit_;
otherClientApi_ = other.otherClientApi_; otherClientApi_ = other.otherClientApi_;
channelArgs_ = other.channelArgs_.Clone();
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -746,7 +955,7 @@ namespace Grpc.Testing {
= pb::FieldCodec.ForString(10); = pb::FieldCodec.ForString(10);
private readonly pbc::RepeatedField<string> serverTargets_ = new pbc::RepeatedField<string>(); private readonly pbc::RepeatedField<string> serverTargets_ = new pbc::RepeatedField<string>();
/// <summary> /// <summary>
/// List of targets to connect to. At least one target needs to be specified. /// List of targets to connect to. At least one target needs to be specified.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<string> ServerTargets { public pbc::RepeatedField<string> ServerTargets {
@ -779,8 +988,8 @@ namespace Grpc.Testing {
public const int OutstandingRpcsPerChannelFieldNumber = 4; public const int OutstandingRpcsPerChannelFieldNumber = 4;
private int outstandingRpcsPerChannel_; private int outstandingRpcsPerChannel_;
/// <summary> /// <summary>
/// How many concurrent RPCs to start for each channel. /// How many concurrent RPCs to start for each channel.
/// For synchronous client, use a separate thread for each outstanding RPC. /// For synchronous client, use a separate thread for each outstanding RPC.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int OutstandingRpcsPerChannel { public int OutstandingRpcsPerChannel {
@ -794,8 +1003,8 @@ namespace Grpc.Testing {
public const int ClientChannelsFieldNumber = 5; public const int ClientChannelsFieldNumber = 5;
private int clientChannels_; private int clientChannels_;
/// <summary> /// <summary>
/// Number of independent client channels to create. /// Number of independent client channels to create.
/// i-th channel will connect to server_target[i % server_targets.size()] /// i-th channel will connect to server_target[i % server_targets.size()]
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int ClientChannels { public int ClientChannels {
@ -809,7 +1018,7 @@ namespace Grpc.Testing {
public const int AsyncClientThreadsFieldNumber = 7; public const int AsyncClientThreadsFieldNumber = 7;
private int asyncClientThreads_; private int asyncClientThreads_;
/// <summary> /// <summary>
/// Only for async client. Number of threads to use to start/manage RPCs. /// Only for async client. Number of threads to use to start/manage RPCs.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int AsyncClientThreads { public int AsyncClientThreads {
@ -834,7 +1043,7 @@ namespace Grpc.Testing {
public const int LoadParamsFieldNumber = 10; public const int LoadParamsFieldNumber = 10;
private global::Grpc.Testing.LoadParams loadParams_; private global::Grpc.Testing.LoadParams loadParams_;
/// <summary> /// <summary>
/// The requested load for the entire client (aggregated over all the threads). /// The requested load for the entire client (aggregated over all the threads).
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.LoadParams LoadParams { public global::Grpc.Testing.LoadParams LoadParams {
@ -872,7 +1081,7 @@ namespace Grpc.Testing {
= pb::FieldCodec.ForInt32(106); = pb::FieldCodec.ForInt32(106);
private readonly pbc::RepeatedField<int> coreList_ = new pbc::RepeatedField<int>(); private readonly pbc::RepeatedField<int> coreList_ = new pbc::RepeatedField<int>();
/// <summary> /// <summary>
/// Specify the cores we should run the client on, if desired /// Specify the cores we should run the client on, if desired
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<int> CoreList { public pbc::RepeatedField<int> CoreList {
@ -894,7 +1103,7 @@ namespace Grpc.Testing {
public const int OtherClientApiFieldNumber = 15; public const int OtherClientApiFieldNumber = 15;
private string otherClientApi_ = ""; private string otherClientApi_ = "";
/// <summary> /// <summary>
/// If we use an OTHER_CLIENT client_type, this string gives more detail /// If we use an OTHER_CLIENT client_type, this string gives more detail
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string OtherClientApi { public string OtherClientApi {
@ -904,6 +1113,16 @@ namespace Grpc.Testing {
} }
} }
/// <summary>Field number for the "channel_args" field.</summary>
public const int ChannelArgsFieldNumber = 16;
private static readonly pb::FieldCodec<global::Grpc.Testing.ChannelArg> _repeated_channelArgs_codec
= pb::FieldCodec.ForMessage(130, global::Grpc.Testing.ChannelArg.Parser);
private readonly pbc::RepeatedField<global::Grpc.Testing.ChannelArg> channelArgs_ = new pbc::RepeatedField<global::Grpc.Testing.ChannelArg>();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<global::Grpc.Testing.ChannelArg> ChannelArgs {
get { return channelArgs_; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) { public override bool Equals(object other) {
return Equals(other as ClientConfig); return Equals(other as ClientConfig);
@ -930,6 +1149,7 @@ namespace Grpc.Testing {
if(!coreList_.Equals(other.coreList_)) return false; if(!coreList_.Equals(other.coreList_)) return false;
if (CoreLimit != other.CoreLimit) return false; if (CoreLimit != other.CoreLimit) return false;
if (OtherClientApi != other.OtherClientApi) return false; if (OtherClientApi != other.OtherClientApi) return false;
if(!channelArgs_.Equals(other.channelArgs_)) return false;
return true; return true;
} }
@ -949,6 +1169,7 @@ namespace Grpc.Testing {
hash ^= coreList_.GetHashCode(); hash ^= coreList_.GetHashCode();
if (CoreLimit != 0) hash ^= CoreLimit.GetHashCode(); if (CoreLimit != 0) hash ^= CoreLimit.GetHashCode();
if (OtherClientApi.Length != 0) hash ^= OtherClientApi.GetHashCode(); if (OtherClientApi.Length != 0) hash ^= OtherClientApi.GetHashCode();
hash ^= channelArgs_.GetHashCode();
return hash; return hash;
} }
@ -1005,6 +1226,7 @@ namespace Grpc.Testing {
output.WriteRawTag(122); output.WriteRawTag(122);
output.WriteString(OtherClientApi); output.WriteString(OtherClientApi);
} }
channelArgs_.WriteTo(output, _repeated_channelArgs_codec);
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -1045,6 +1267,7 @@ namespace Grpc.Testing {
if (OtherClientApi.Length != 0) { if (OtherClientApi.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(OtherClientApi); size += 1 + pb::CodedOutputStream.ComputeStringSize(OtherClientApi);
} }
size += channelArgs_.CalculateSize(_repeated_channelArgs_codec);
return size; return size;
} }
@ -1100,6 +1323,7 @@ namespace Grpc.Testing {
if (other.OtherClientApi.Length != 0) { if (other.OtherClientApi.Length != 0) {
OtherClientApi = other.OtherClientApi; OtherClientApi = other.OtherClientApi;
} }
channelArgs_.Add(other.channelArgs_);
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -1175,6 +1399,10 @@ namespace Grpc.Testing {
OtherClientApi = input.ReadString(); OtherClientApi = input.ReadString();
break; break;
} }
case 130: {
channelArgs_.AddEntriesFrom(input, _repeated_channelArgs_codec);
break;
}
} }
} }
} }
@ -1188,7 +1416,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[5]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[6]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -1305,7 +1533,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Request current stats /// Request current stats
/// </summary> /// </summary>
public sealed partial class Mark : pb::IMessage<Mark> { public sealed partial class Mark : pb::IMessage<Mark> {
private static readonly pb::MessageParser<Mark> _parser = new pb::MessageParser<Mark>(() => new Mark()); private static readonly pb::MessageParser<Mark> _parser = new pb::MessageParser<Mark>(() => new Mark());
@ -1314,7 +1542,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[6]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[7]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -1343,7 +1571,7 @@ namespace Grpc.Testing {
public const int ResetFieldNumber = 1; public const int ResetFieldNumber = 1;
private bool reset_; private bool reset_;
/// <summary> /// <summary>
/// if true, the stats will be reset after taking their snapshot. /// if true, the stats will be reset after taking their snapshot.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Reset { public bool Reset {
@ -1434,7 +1662,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[7]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[8]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -1620,7 +1848,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[8]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[9]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -1679,7 +1907,7 @@ namespace Grpc.Testing {
public const int PortFieldNumber = 4; public const int PortFieldNumber = 4;
private int port_; private int port_;
/// <summary> /// <summary>
/// Port on which to listen. Zero means pick unused port. /// Port on which to listen. Zero means pick unused port.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int Port { public int Port {
@ -1693,7 +1921,7 @@ namespace Grpc.Testing {
public const int AsyncServerThreadsFieldNumber = 7; public const int AsyncServerThreadsFieldNumber = 7;
private int asyncServerThreads_; private int asyncServerThreads_;
/// <summary> /// <summary>
/// Only for async server. Number of threads used to serve the requests. /// Only for async server. Number of threads used to serve the requests.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int AsyncServerThreads { public int AsyncServerThreads {
@ -1707,7 +1935,7 @@ namespace Grpc.Testing {
public const int CoreLimitFieldNumber = 8; public const int CoreLimitFieldNumber = 8;
private int coreLimit_; private int coreLimit_;
/// <summary> /// <summary>
/// Specify the number of cores to limit server to, if desired /// Specify the number of cores to limit server to, if desired
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CoreLimit { public int CoreLimit {
@ -1721,7 +1949,10 @@ namespace Grpc.Testing {
public const int PayloadConfigFieldNumber = 9; public const int PayloadConfigFieldNumber = 9;
private global::Grpc.Testing.PayloadConfig payloadConfig_; private global::Grpc.Testing.PayloadConfig payloadConfig_;
/// <summary> /// <summary>
/// payload config, used in generic server /// payload config, used in generic server.
/// Note this must NOT be used in proto (non-generic) servers. For proto servers,
/// 'response sizes' must be configured from the 'response_size' field of the
/// 'SimpleRequest' objects in RPC requests.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.PayloadConfig PayloadConfig { public global::Grpc.Testing.PayloadConfig PayloadConfig {
@ -1737,7 +1968,7 @@ namespace Grpc.Testing {
= pb::FieldCodec.ForInt32(82); = pb::FieldCodec.ForInt32(82);
private readonly pbc::RepeatedField<int> coreList_ = new pbc::RepeatedField<int>(); private readonly pbc::RepeatedField<int> coreList_ = new pbc::RepeatedField<int>();
/// <summary> /// <summary>
/// Specify the cores we should run the server on, if desired /// Specify the cores we should run the server on, if desired
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<int> CoreList { public pbc::RepeatedField<int> CoreList {
@ -1748,7 +1979,7 @@ namespace Grpc.Testing {
public const int OtherServerApiFieldNumber = 11; public const int OtherServerApiFieldNumber = 11;
private string otherServerApi_ = ""; private string otherServerApi_ = "";
/// <summary> /// <summary>
/// If we use an OTHER_SERVER client_type, this string gives more detail /// If we use an OTHER_SERVER client_type, this string gives more detail
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string OtherServerApi { public string OtherServerApi {
@ -1762,7 +1993,7 @@ namespace Grpc.Testing {
public const int ResourceQuotaSizeFieldNumber = 1001; public const int ResourceQuotaSizeFieldNumber = 1001;
private int resourceQuotaSize_; private int resourceQuotaSize_;
/// <summary> /// <summary>
/// Buffer pool size (no buffer pool specified if unset) /// Buffer pool size (no buffer pool specified if unset)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int ResourceQuotaSize { public int ResourceQuotaSize {
@ -1987,7 +2218,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[9]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[10]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -2173,7 +2404,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[10]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[11]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -2215,7 +2446,7 @@ namespace Grpc.Testing {
public const int PortFieldNumber = 2; public const int PortFieldNumber = 2;
private int port_; private int port_;
/// <summary> /// <summary>
/// the port bound by the server /// the port bound by the server
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int Port { public int Port {
@ -2229,7 +2460,7 @@ namespace Grpc.Testing {
public const int CoresFieldNumber = 3; public const int CoresFieldNumber = 3;
private int cores_; private int cores_;
/// <summary> /// <summary>
/// Number of cores available to the server /// Number of cores available to the server
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int Cores { public int Cores {
@ -2358,7 +2589,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[11]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[12]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -2447,7 +2678,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[12]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[13]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -2476,7 +2707,7 @@ namespace Grpc.Testing {
public const int CoresFieldNumber = 1; public const int CoresFieldNumber = 1;
private int cores_; private int cores_;
/// <summary> /// <summary>
/// Number of cores available on the server /// Number of cores available on the server
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int Cores { public int Cores {
@ -2567,7 +2798,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[13]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[14]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -2650,7 +2881,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// A single performance scenario: input to qps_json_driver /// A single performance scenario: input to qps_json_driver
/// </summary> /// </summary>
public sealed partial class Scenario : pb::IMessage<Scenario> { public sealed partial class Scenario : pb::IMessage<Scenario> {
private static readonly pb::MessageParser<Scenario> _parser = new pb::MessageParser<Scenario>(() => new Scenario()); private static readonly pb::MessageParser<Scenario> _parser = new pb::MessageParser<Scenario>(() => new Scenario());
@ -2659,7 +2890,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[14]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[15]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -2695,7 +2926,7 @@ namespace Grpc.Testing {
public const int NameFieldNumber = 1; public const int NameFieldNumber = 1;
private string name_ = ""; private string name_ = "";
/// <summary> /// <summary>
/// Human readable name for this scenario /// Human readable name for this scenario
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string Name { public string Name {
@ -2709,7 +2940,7 @@ namespace Grpc.Testing {
public const int ClientConfigFieldNumber = 2; public const int ClientConfigFieldNumber = 2;
private global::Grpc.Testing.ClientConfig clientConfig_; private global::Grpc.Testing.ClientConfig clientConfig_;
/// <summary> /// <summary>
/// Client configuration /// Client configuration
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.ClientConfig ClientConfig { public global::Grpc.Testing.ClientConfig ClientConfig {
@ -2723,7 +2954,7 @@ namespace Grpc.Testing {
public const int NumClientsFieldNumber = 3; public const int NumClientsFieldNumber = 3;
private int numClients_; private int numClients_;
/// <summary> /// <summary>
/// Number of clients to start for the test /// Number of clients to start for the test
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int NumClients { public int NumClients {
@ -2737,7 +2968,7 @@ namespace Grpc.Testing {
public const int ServerConfigFieldNumber = 4; public const int ServerConfigFieldNumber = 4;
private global::Grpc.Testing.ServerConfig serverConfig_; private global::Grpc.Testing.ServerConfig serverConfig_;
/// <summary> /// <summary>
/// Server configuration /// Server configuration
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.ServerConfig ServerConfig { public global::Grpc.Testing.ServerConfig ServerConfig {
@ -2751,7 +2982,7 @@ namespace Grpc.Testing {
public const int NumServersFieldNumber = 5; public const int NumServersFieldNumber = 5;
private int numServers_; private int numServers_;
/// <summary> /// <summary>
/// Number of servers to start for the test /// Number of servers to start for the test
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int NumServers { public int NumServers {
@ -2765,7 +2996,7 @@ namespace Grpc.Testing {
public const int WarmupSecondsFieldNumber = 6; public const int WarmupSecondsFieldNumber = 6;
private int warmupSeconds_; private int warmupSeconds_;
/// <summary> /// <summary>
/// Warmup period, in seconds /// Warmup period, in seconds
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int WarmupSeconds { public int WarmupSeconds {
@ -2779,7 +3010,7 @@ namespace Grpc.Testing {
public const int BenchmarkSecondsFieldNumber = 7; public const int BenchmarkSecondsFieldNumber = 7;
private int benchmarkSeconds_; private int benchmarkSeconds_;
/// <summary> /// <summary>
/// Benchmark time, in seconds /// Benchmark time, in seconds
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int BenchmarkSeconds { public int BenchmarkSeconds {
@ -2793,7 +3024,7 @@ namespace Grpc.Testing {
public const int SpawnLocalWorkerCountFieldNumber = 8; public const int SpawnLocalWorkerCountFieldNumber = 8;
private int spawnLocalWorkerCount_; private int spawnLocalWorkerCount_;
/// <summary> /// <summary>
/// Number of workers to spawn locally (usually zero) /// Number of workers to spawn locally (usually zero)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int SpawnLocalWorkerCount { public int SpawnLocalWorkerCount {
@ -3002,7 +3233,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// A set of scenarios to be run with qps_json_driver /// A set of scenarios to be run with qps_json_driver
/// </summary> /// </summary>
public sealed partial class Scenarios : pb::IMessage<Scenarios> { public sealed partial class Scenarios : pb::IMessage<Scenarios> {
private static readonly pb::MessageParser<Scenarios> _parser = new pb::MessageParser<Scenarios>(() => new Scenarios()); private static readonly pb::MessageParser<Scenarios> _parser = new pb::MessageParser<Scenarios>(() => new Scenarios());
@ -3011,7 +3242,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[15]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[16]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -3114,8 +3345,8 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Basic summary that can be computed from ClientStats and ServerStats /// Basic summary that can be computed from ClientStats and ServerStats
/// once the scenario has finished. /// once the scenario has finished.
/// </summary> /// </summary>
public sealed partial class ScenarioResultSummary : pb::IMessage<ScenarioResultSummary> { public sealed partial class ScenarioResultSummary : pb::IMessage<ScenarioResultSummary> {
private static readonly pb::MessageParser<ScenarioResultSummary> _parser = new pb::MessageParser<ScenarioResultSummary>(() => new ScenarioResultSummary()); private static readonly pb::MessageParser<ScenarioResultSummary> _parser = new pb::MessageParser<ScenarioResultSummary>(() => new ScenarioResultSummary());
@ -3124,7 +3355,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[16]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[17]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -3166,7 +3397,7 @@ namespace Grpc.Testing {
public const int QpsFieldNumber = 1; public const int QpsFieldNumber = 1;
private double qps_; private double qps_;
/// <summary> /// <summary>
/// Total number of operations per second over all clients. /// Total number of operations per second over all clients.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double Qps { public double Qps {
@ -3180,7 +3411,7 @@ namespace Grpc.Testing {
public const int QpsPerServerCoreFieldNumber = 2; public const int QpsPerServerCoreFieldNumber = 2;
private double qpsPerServerCore_; private double qpsPerServerCore_;
/// <summary> /// <summary>
/// QPS per one server core. /// QPS per one server core.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double QpsPerServerCore { public double QpsPerServerCore {
@ -3194,7 +3425,7 @@ namespace Grpc.Testing {
public const int ServerSystemTimeFieldNumber = 3; public const int ServerSystemTimeFieldNumber = 3;
private double serverSystemTime_; private double serverSystemTime_;
/// <summary> /// <summary>
/// server load based on system_time (0.85 => 85%) /// server load based on system_time (0.85 => 85%)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double ServerSystemTime { public double ServerSystemTime {
@ -3208,7 +3439,7 @@ namespace Grpc.Testing {
public const int ServerUserTimeFieldNumber = 4; public const int ServerUserTimeFieldNumber = 4;
private double serverUserTime_; private double serverUserTime_;
/// <summary> /// <summary>
/// server load based on user_time (0.85 => 85%) /// server load based on user_time (0.85 => 85%)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double ServerUserTime { public double ServerUserTime {
@ -3222,7 +3453,7 @@ namespace Grpc.Testing {
public const int ClientSystemTimeFieldNumber = 5; public const int ClientSystemTimeFieldNumber = 5;
private double clientSystemTime_; private double clientSystemTime_;
/// <summary> /// <summary>
/// client load based on system_time (0.85 => 85%) /// client load based on system_time (0.85 => 85%)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double ClientSystemTime { public double ClientSystemTime {
@ -3236,7 +3467,7 @@ namespace Grpc.Testing {
public const int ClientUserTimeFieldNumber = 6; public const int ClientUserTimeFieldNumber = 6;
private double clientUserTime_; private double clientUserTime_;
/// <summary> /// <summary>
/// client load based on user_time (0.85 => 85%) /// client load based on user_time (0.85 => 85%)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double ClientUserTime { public double ClientUserTime {
@ -3250,7 +3481,7 @@ namespace Grpc.Testing {
public const int Latency50FieldNumber = 7; public const int Latency50FieldNumber = 7;
private double latency50_; private double latency50_;
/// <summary> /// <summary>
/// X% latency percentiles (in nanoseconds) /// X% latency percentiles (in nanoseconds)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double Latency50 { public double Latency50 {
@ -3308,7 +3539,7 @@ namespace Grpc.Testing {
public const int ServerCpuUsageFieldNumber = 12; public const int ServerCpuUsageFieldNumber = 12;
private double serverCpuUsage_; private double serverCpuUsage_;
/// <summary> /// <summary>
/// server cpu usage percentage /// server cpu usage percentage
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double ServerCpuUsage { public double ServerCpuUsage {
@ -3322,7 +3553,7 @@ namespace Grpc.Testing {
public const int SuccessfulRequestsPerSecondFieldNumber = 13; public const int SuccessfulRequestsPerSecondFieldNumber = 13;
private double successfulRequestsPerSecond_; private double successfulRequestsPerSecond_;
/// <summary> /// <summary>
/// Number of requests that succeeded/failed /// Number of requests that succeeded/failed
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double SuccessfulRequestsPerSecond { public double SuccessfulRequestsPerSecond {
@ -3626,7 +3857,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Results of a single benchmark scenario. /// Results of a single benchmark scenario.
/// </summary> /// </summary>
public sealed partial class ScenarioResult : pb::IMessage<ScenarioResult> { public sealed partial class ScenarioResult : pb::IMessage<ScenarioResult> {
private static readonly pb::MessageParser<ScenarioResult> _parser = new pb::MessageParser<ScenarioResult>(() => new ScenarioResult()); private static readonly pb::MessageParser<ScenarioResult> _parser = new pb::MessageParser<ScenarioResult>(() => new ScenarioResult());
@ -3635,7 +3866,7 @@ namespace Grpc.Testing {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor { public static pbr::MessageDescriptor Descriptor {
get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[17]; } get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[18]; }
} }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -3672,7 +3903,7 @@ namespace Grpc.Testing {
public const int ScenarioFieldNumber = 1; public const int ScenarioFieldNumber = 1;
private global::Grpc.Testing.Scenario scenario_; private global::Grpc.Testing.Scenario scenario_;
/// <summary> /// <summary>
/// Inputs used to run the scenario. /// Inputs used to run the scenario.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.Scenario Scenario { public global::Grpc.Testing.Scenario Scenario {
@ -3686,7 +3917,7 @@ namespace Grpc.Testing {
public const int LatenciesFieldNumber = 2; public const int LatenciesFieldNumber = 2;
private global::Grpc.Testing.HistogramData latencies_; private global::Grpc.Testing.HistogramData latencies_;
/// <summary> /// <summary>
/// Histograms from all clients merged into one histogram. /// Histograms from all clients merged into one histogram.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.HistogramData Latencies { public global::Grpc.Testing.HistogramData Latencies {
@ -3702,7 +3933,7 @@ namespace Grpc.Testing {
= pb::FieldCodec.ForMessage(26, global::Grpc.Testing.ClientStats.Parser); = pb::FieldCodec.ForMessage(26, global::Grpc.Testing.ClientStats.Parser);
private readonly pbc::RepeatedField<global::Grpc.Testing.ClientStats> clientStats_ = new pbc::RepeatedField<global::Grpc.Testing.ClientStats>(); private readonly pbc::RepeatedField<global::Grpc.Testing.ClientStats> clientStats_ = new pbc::RepeatedField<global::Grpc.Testing.ClientStats>();
/// <summary> /// <summary>
/// Client stats for each client /// Client stats for each client
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<global::Grpc.Testing.ClientStats> ClientStats { public pbc::RepeatedField<global::Grpc.Testing.ClientStats> ClientStats {
@ -3715,7 +3946,7 @@ namespace Grpc.Testing {
= pb::FieldCodec.ForMessage(34, global::Grpc.Testing.ServerStats.Parser); = pb::FieldCodec.ForMessage(34, global::Grpc.Testing.ServerStats.Parser);
private readonly pbc::RepeatedField<global::Grpc.Testing.ServerStats> serverStats_ = new pbc::RepeatedField<global::Grpc.Testing.ServerStats>(); private readonly pbc::RepeatedField<global::Grpc.Testing.ServerStats> serverStats_ = new pbc::RepeatedField<global::Grpc.Testing.ServerStats>();
/// <summary> /// <summary>
/// Server stats for each server /// Server stats for each server
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<global::Grpc.Testing.ServerStats> ServerStats { public pbc::RepeatedField<global::Grpc.Testing.ServerStats> ServerStats {
@ -3728,7 +3959,7 @@ namespace Grpc.Testing {
= pb::FieldCodec.ForInt32(42); = pb::FieldCodec.ForInt32(42);
private readonly pbc::RepeatedField<int> serverCores_ = new pbc::RepeatedField<int>(); private readonly pbc::RepeatedField<int> serverCores_ = new pbc::RepeatedField<int>();
/// <summary> /// <summary>
/// Number of cores available to each server /// Number of cores available to each server
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<int> ServerCores { public pbc::RepeatedField<int> ServerCores {
@ -3739,7 +3970,7 @@ namespace Grpc.Testing {
public const int SummaryFieldNumber = 6; public const int SummaryFieldNumber = 6;
private global::Grpc.Testing.ScenarioResultSummary summary_; private global::Grpc.Testing.ScenarioResultSummary summary_;
/// <summary> /// <summary>
/// An after-the-fact computed summary /// An after-the-fact computed summary
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.ScenarioResultSummary Summary { public global::Grpc.Testing.ScenarioResultSummary Summary {
@ -3755,7 +3986,7 @@ namespace Grpc.Testing {
= pb::FieldCodec.ForBool(58); = pb::FieldCodec.ForBool(58);
private readonly pbc::RepeatedField<bool> clientSuccess_ = new pbc::RepeatedField<bool>(); private readonly pbc::RepeatedField<bool> clientSuccess_ = new pbc::RepeatedField<bool>();
/// <summary> /// <summary>
/// Information on success or failure of each worker /// Information on success or failure of each worker
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<bool> ClientSuccess { public pbc::RepeatedField<bool> ClientSuccess {
@ -3778,7 +4009,7 @@ namespace Grpc.Testing {
= pb::FieldCodec.ForMessage(74, global::Grpc.Testing.RequestResultCount.Parser); = pb::FieldCodec.ForMessage(74, global::Grpc.Testing.RequestResultCount.Parser);
private readonly pbc::RepeatedField<global::Grpc.Testing.RequestResultCount> requestResults_ = new pbc::RepeatedField<global::Grpc.Testing.RequestResultCount>(); private readonly pbc::RepeatedField<global::Grpc.Testing.RequestResultCount> requestResults_ = new pbc::RepeatedField<global::Grpc.Testing.RequestResultCount>();
/// <summary> /// <summary>
/// Number of failed requests (one row per status code seen) /// Number of failed requests (one row per status code seen)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<global::Grpc.Testing.RequestResultCount> RequestResults { public pbc::RepeatedField<global::Grpc.Testing.RequestResultCount> RequestResults {

@ -35,13 +35,13 @@ namespace Grpc.Testing {
} }
#region Messages #region Messages
/// <summary> /// <summary>
/// An empty message that you can re-use to avoid defining duplicated empty /// An empty message that you can re-use to avoid defining duplicated empty
/// messages in your project. A typical example is to use it as argument or the /// messages in your project. A typical example is to use it as argument or the
/// return value of a service API. For instance: /// return value of a service API. For instance:
/// ///
/// service Foo { /// service Foo {
/// rpc Bar (grpc.testing.Empty) returns (grpc.testing.Empty) { }; /// rpc Bar (grpc.testing.Empty) returns (grpc.testing.Empty) { };
/// }; /// };
/// </summary> /// </summary>
public sealed partial class Empty : pb::IMessage<Empty> { public sealed partial class Empty : pb::IMessage<Empty> {
private static readonly pb::MessageParser<Empty> _parser = new pb::MessageParser<Empty>(() => new Empty()); private static readonly pb::MessageParser<Empty> _parser = new pb::MessageParser<Empty>(() => new Empty());

@ -33,53 +33,47 @@
<Reference Include="System.Net" /> <Reference Include="System.Net" />
<Reference Include="System.Net.Http" /> <Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.WebRequest" /> <Reference Include="System.Net.Http.WebRequest" />
<Reference Include="BouncyCastle.Crypto"> <Reference Include="Zlib.Portable">
<HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath> <HintPath>..\packages\Zlib.Portable.Signed.1.11.0\lib\portable-net4+sl5+wp8+win8+wpa81+MonoTouch+MonoAndroid\Zlib.Portable.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="nunit.framework">
<HintPath>..\packages\NUnit.3.2.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="nunitlite">
<HintPath>..\packages\NUnitLite.3.2.0\lib\net45\nunitlite.dll</HintPath>
</Reference>
<Reference Include="CommandLineParser.Unofficial">
<HintPath>..\packages\CommandLineParser.Unofficial.2.0.275\lib\net45\CommandLineParser.Unofficial.dll</HintPath>
</Reference> </Reference>
<Reference Include="log4net"> <Reference Include="System.Interactive.Async">
<HintPath>..\packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath> <HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Apis.Core"> <Reference Include="Google.Apis.Core">
<HintPath>..\packages\Google.Apis.Core.1.16.0\lib\net45\Google.Apis.Core.dll</HintPath> <HintPath>..\packages\Google.Apis.Core.1.21.0\lib\net45\Google.Apis.Core.dll</HintPath>
</Reference>
<Reference Include="Zlib.Portable">
<HintPath>..\packages\Zlib.Portable.Signed.1.11.0\lib\portable-net4+sl5+wp8+win8+wpa81+MonoTouch+MonoAndroid\Zlib.Portable.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Apis"> <Reference Include="Google.Apis">
<HintPath>..\packages\Google.Apis.1.16.0\lib\net45\Google.Apis.dll</HintPath> <HintPath>..\packages\Google.Apis.1.21.0\lib\net45\Google.Apis.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Apis.PlatformServices"> <Reference Include="Google.Apis.PlatformServices">
<HintPath>..\packages\Google.Apis.1.16.0\lib\net45\Google.Apis.PlatformServices.dll</HintPath> <HintPath>..\packages\Google.Apis.1.21.0\lib\net45\Google.Apis.PlatformServices.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Apis.Auth"> <Reference Include="Google.Apis.Auth">
<HintPath>..\packages\Google.Apis.Auth.1.16.0\lib\net45\Google.Apis.Auth.dll</HintPath> <HintPath>..\packages\Google.Apis.Auth.1.21.0\lib\net45\Google.Apis.Auth.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Apis.Auth.PlatformServices"> <Reference Include="Google.Apis.Auth.PlatformServices">
<HintPath>..\packages\Google.Apis.Auth.1.16.0\lib\net45\Google.Apis.Auth.PlatformServices.dll</HintPath> <HintPath>..\packages\Google.Apis.Auth.1.21.0\lib\net45\Google.Apis.Auth.PlatformServices.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Protobuf"> <Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll</HintPath> <HintPath>..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="nunit.framework">
<HintPath>..\packages\NUnit.3.6.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="nunitlite">
<HintPath>..\packages\NUnitLite.3.6.0\lib\net45\nunitlite.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="Castle.Core"> <Reference Include="Castle.Core">
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath> <HintPath>..\packages\Castle.Core.4.0.0\lib\net45\Castle.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="Moq"> <Reference Include="Moq">
<HintPath>..\packages\Moq.4.6.38-alpha\lib\net45\Moq.dll</HintPath> <HintPath>..\packages\Moq.4.7.0\lib\net45\Moq.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Interactive.Async"> <Reference Include="CommandLine">
<HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath> <HintPath>..\packages\CommandLineParser.2.1.1-beta\lib\net45\CommandLine.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -75,12 +75,12 @@ namespace Grpc.Testing {
} }
#region Enums #region Enums
/// <summary> /// <summary>
/// DEPRECATED, don't use. To be removed shortly. /// DEPRECATED, don't use. To be removed shortly.
/// The type of payload that should be returned. /// The type of payload that should be returned.
/// </summary> /// </summary>
public enum PayloadType { public enum PayloadType {
/// <summary> /// <summary>
/// Compressable text format. /// Compressable text format.
/// </summary> /// </summary>
[pbr::OriginalName("COMPRESSABLE")] Compressable = 0, [pbr::OriginalName("COMPRESSABLE")] Compressable = 0,
} }
@ -89,9 +89,9 @@ namespace Grpc.Testing {
#region Messages #region Messages
/// <summary> /// <summary>
/// TODO(dgq): Go back to using well-known types once /// TODO(dgq): Go back to using well-known types once
/// https://github.com/grpc/grpc/issues/6980 has been fixed. /// https://github.com/grpc/grpc/issues/6980 has been fixed.
/// import "google/protobuf/wrappers.proto"; /// import "google/protobuf/wrappers.proto";
/// </summary> /// </summary>
public sealed partial class BoolValue : pb::IMessage<BoolValue> { public sealed partial class BoolValue : pb::IMessage<BoolValue> {
private static readonly pb::MessageParser<BoolValue> _parser = new pb::MessageParser<BoolValue>(() => new BoolValue()); private static readonly pb::MessageParser<BoolValue> _parser = new pb::MessageParser<BoolValue>(() => new BoolValue());
@ -129,7 +129,7 @@ namespace Grpc.Testing {
public const int ValueFieldNumber = 1; public const int ValueFieldNumber = 1;
private bool value_; private bool value_;
/// <summary> /// <summary>
/// The bool value. /// The bool value.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Value { public bool Value {
@ -214,7 +214,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// A block of data, to simply increase gRPC message size. /// A block of data, to simply increase gRPC message size.
/// </summary> /// </summary>
public sealed partial class Payload : pb::IMessage<Payload> { public sealed partial class Payload : pb::IMessage<Payload> {
private static readonly pb::MessageParser<Payload> _parser = new pb::MessageParser<Payload>(() => new Payload()); private static readonly pb::MessageParser<Payload> _parser = new pb::MessageParser<Payload>(() => new Payload());
@ -253,8 +253,8 @@ namespace Grpc.Testing {
public const int TypeFieldNumber = 1; public const int TypeFieldNumber = 1;
private global::Grpc.Testing.PayloadType type_ = 0; private global::Grpc.Testing.PayloadType type_ = 0;
/// <summary> /// <summary>
/// DEPRECATED, don't use. To be removed shortly. /// DEPRECATED, don't use. To be removed shortly.
/// The type of data in body. /// The type of data in body.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.PayloadType Type { public global::Grpc.Testing.PayloadType Type {
@ -268,7 +268,7 @@ namespace Grpc.Testing {
public const int BodyFieldNumber = 2; public const int BodyFieldNumber = 2;
private pb::ByteString body_ = pb::ByteString.Empty; private pb::ByteString body_ = pb::ByteString.Empty;
/// <summary> /// <summary>
/// Primary contents of payload. /// Primary contents of payload.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pb::ByteString Body { public pb::ByteString Body {
@ -369,8 +369,8 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// A protobuf representation for grpc status. This is used by test /// A protobuf representation for grpc status. This is used by test
/// clients to specify a status that the server should attempt to return. /// clients to specify a status that the server should attempt to return.
/// </summary> /// </summary>
public sealed partial class EchoStatus : pb::IMessage<EchoStatus> { public sealed partial class EchoStatus : pb::IMessage<EchoStatus> {
private static readonly pb::MessageParser<EchoStatus> _parser = new pb::MessageParser<EchoStatus>(() => new EchoStatus()); private static readonly pb::MessageParser<EchoStatus> _parser = new pb::MessageParser<EchoStatus>(() => new EchoStatus());
@ -518,7 +518,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Unary request. /// Unary request.
/// </summary> /// </summary>
public sealed partial class SimpleRequest : pb::IMessage<SimpleRequest> { public sealed partial class SimpleRequest : pb::IMessage<SimpleRequest> {
private static readonly pb::MessageParser<SimpleRequest> _parser = new pb::MessageParser<SimpleRequest>(() => new SimpleRequest()); private static readonly pb::MessageParser<SimpleRequest> _parser = new pb::MessageParser<SimpleRequest>(() => new SimpleRequest());
@ -563,9 +563,9 @@ namespace Grpc.Testing {
public const int ResponseTypeFieldNumber = 1; public const int ResponseTypeFieldNumber = 1;
private global::Grpc.Testing.PayloadType responseType_ = 0; private global::Grpc.Testing.PayloadType responseType_ = 0;
/// <summary> /// <summary>
/// DEPRECATED, don't use. To be removed shortly. /// DEPRECATED, don't use. To be removed shortly.
/// Desired payload type in the response from the server. /// Desired payload type in the response from the server.
/// If response_type is RANDOM, server randomly chooses one from other formats. /// If response_type is RANDOM, server randomly chooses one from other formats.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.PayloadType ResponseType { public global::Grpc.Testing.PayloadType ResponseType {
@ -579,7 +579,7 @@ namespace Grpc.Testing {
public const int ResponseSizeFieldNumber = 2; public const int ResponseSizeFieldNumber = 2;
private int responseSize_; private int responseSize_;
/// <summary> /// <summary>
/// Desired payload size in the response from the server. /// Desired payload size in the response from the server.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int ResponseSize { public int ResponseSize {
@ -593,7 +593,7 @@ namespace Grpc.Testing {
public const int PayloadFieldNumber = 3; public const int PayloadFieldNumber = 3;
private global::Grpc.Testing.Payload payload_; private global::Grpc.Testing.Payload payload_;
/// <summary> /// <summary>
/// Optional input payload sent along with the request. /// Optional input payload sent along with the request.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.Payload Payload { public global::Grpc.Testing.Payload Payload {
@ -607,7 +607,7 @@ namespace Grpc.Testing {
public const int FillUsernameFieldNumber = 4; public const int FillUsernameFieldNumber = 4;
private bool fillUsername_; private bool fillUsername_;
/// <summary> /// <summary>
/// Whether SimpleResponse should include username. /// Whether SimpleResponse should include username.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool FillUsername { public bool FillUsername {
@ -621,7 +621,7 @@ namespace Grpc.Testing {
public const int FillOauthScopeFieldNumber = 5; public const int FillOauthScopeFieldNumber = 5;
private bool fillOauthScope_; private bool fillOauthScope_;
/// <summary> /// <summary>
/// Whether SimpleResponse should include OAuth scope. /// Whether SimpleResponse should include OAuth scope.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool FillOauthScope { public bool FillOauthScope {
@ -635,10 +635,10 @@ namespace Grpc.Testing {
public const int ResponseCompressedFieldNumber = 6; public const int ResponseCompressedFieldNumber = 6;
private global::Grpc.Testing.BoolValue responseCompressed_; private global::Grpc.Testing.BoolValue responseCompressed_;
/// <summary> /// <summary>
/// Whether to request the server to compress the response. This field is /// Whether to request the server to compress the response. This field is
/// "nullable" in order to interoperate seamlessly with clients not able to /// "nullable" in order to interoperate seamlessly with clients not able to
/// implement the full compression tests by introspecting the call to verify /// implement the full compression tests by introspecting the call to verify
/// the response's compression status. /// the response's compression status.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.BoolValue ResponseCompressed { public global::Grpc.Testing.BoolValue ResponseCompressed {
@ -652,7 +652,7 @@ namespace Grpc.Testing {
public const int ResponseStatusFieldNumber = 7; public const int ResponseStatusFieldNumber = 7;
private global::Grpc.Testing.EchoStatus responseStatus_; private global::Grpc.Testing.EchoStatus responseStatus_;
/// <summary> /// <summary>
/// Whether server should return a given status /// Whether server should return a given status
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.EchoStatus ResponseStatus { public global::Grpc.Testing.EchoStatus ResponseStatus {
@ -666,7 +666,7 @@ namespace Grpc.Testing {
public const int ExpectCompressedFieldNumber = 8; public const int ExpectCompressedFieldNumber = 8;
private global::Grpc.Testing.BoolValue expectCompressed_; private global::Grpc.Testing.BoolValue expectCompressed_;
/// <summary> /// <summary>
/// Whether the server should expect this request to be compressed. /// Whether the server should expect this request to be compressed.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.BoolValue ExpectCompressed { public global::Grpc.Testing.BoolValue ExpectCompressed {
@ -887,7 +887,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Unary response, as configured by the request. /// Unary response, as configured by the request.
/// </summary> /// </summary>
public sealed partial class SimpleResponse : pb::IMessage<SimpleResponse> { public sealed partial class SimpleResponse : pb::IMessage<SimpleResponse> {
private static readonly pb::MessageParser<SimpleResponse> _parser = new pb::MessageParser<SimpleResponse>(() => new SimpleResponse()); private static readonly pb::MessageParser<SimpleResponse> _parser = new pb::MessageParser<SimpleResponse>(() => new SimpleResponse());
@ -927,7 +927,7 @@ namespace Grpc.Testing {
public const int PayloadFieldNumber = 1; public const int PayloadFieldNumber = 1;
private global::Grpc.Testing.Payload payload_; private global::Grpc.Testing.Payload payload_;
/// <summary> /// <summary>
/// Payload to increase message size. /// Payload to increase message size.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.Payload Payload { public global::Grpc.Testing.Payload Payload {
@ -941,8 +941,8 @@ namespace Grpc.Testing {
public const int UsernameFieldNumber = 2; public const int UsernameFieldNumber = 2;
private string username_ = ""; private string username_ = "";
/// <summary> /// <summary>
/// The user the request came from, for verifying authentication was /// The user the request came from, for verifying authentication was
/// successful when the client expected it. /// successful when the client expected it.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string Username { public string Username {
@ -956,7 +956,7 @@ namespace Grpc.Testing {
public const int OauthScopeFieldNumber = 3; public const int OauthScopeFieldNumber = 3;
private string oauthScope_ = ""; private string oauthScope_ = "";
/// <summary> /// <summary>
/// OAuth scope. /// OAuth scope.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string OauthScope { public string OauthScope {
@ -1079,7 +1079,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Client-streaming request. /// Client-streaming request.
/// </summary> /// </summary>
public sealed partial class StreamingInputCallRequest : pb::IMessage<StreamingInputCallRequest> { public sealed partial class StreamingInputCallRequest : pb::IMessage<StreamingInputCallRequest> {
private static readonly pb::MessageParser<StreamingInputCallRequest> _parser = new pb::MessageParser<StreamingInputCallRequest>(() => new StreamingInputCallRequest()); private static readonly pb::MessageParser<StreamingInputCallRequest> _parser = new pb::MessageParser<StreamingInputCallRequest>(() => new StreamingInputCallRequest());
@ -1118,7 +1118,7 @@ namespace Grpc.Testing {
public const int PayloadFieldNumber = 1; public const int PayloadFieldNumber = 1;
private global::Grpc.Testing.Payload payload_; private global::Grpc.Testing.Payload payload_;
/// <summary> /// <summary>
/// Optional input payload sent along with the request. /// Optional input payload sent along with the request.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.Payload Payload { public global::Grpc.Testing.Payload Payload {
@ -1132,10 +1132,10 @@ namespace Grpc.Testing {
public const int ExpectCompressedFieldNumber = 2; public const int ExpectCompressedFieldNumber = 2;
private global::Grpc.Testing.BoolValue expectCompressed_; private global::Grpc.Testing.BoolValue expectCompressed_;
/// <summary> /// <summary>
/// Whether the server should expect this request to be compressed. This field /// Whether the server should expect this request to be compressed. This field
/// is "nullable" in order to interoperate seamlessly with servers not able to /// is "nullable" in order to interoperate seamlessly with servers not able to
/// implement the full compression tests by introspecting the call to verify /// implement the full compression tests by introspecting the call to verify
/// the request's compression status. /// the request's compression status.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.BoolValue ExpectCompressed { public global::Grpc.Testing.BoolValue ExpectCompressed {
@ -1248,7 +1248,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Client-streaming response. /// Client-streaming response.
/// </summary> /// </summary>
public sealed partial class StreamingInputCallResponse : pb::IMessage<StreamingInputCallResponse> { public sealed partial class StreamingInputCallResponse : pb::IMessage<StreamingInputCallResponse> {
private static readonly pb::MessageParser<StreamingInputCallResponse> _parser = new pb::MessageParser<StreamingInputCallResponse>(() => new StreamingInputCallResponse()); private static readonly pb::MessageParser<StreamingInputCallResponse> _parser = new pb::MessageParser<StreamingInputCallResponse>(() => new StreamingInputCallResponse());
@ -1286,7 +1286,7 @@ namespace Grpc.Testing {
public const int AggregatedPayloadSizeFieldNumber = 1; public const int AggregatedPayloadSizeFieldNumber = 1;
private int aggregatedPayloadSize_; private int aggregatedPayloadSize_;
/// <summary> /// <summary>
/// Aggregated size of payloads received from the client. /// Aggregated size of payloads received from the client.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int AggregatedPayloadSize { public int AggregatedPayloadSize {
@ -1371,7 +1371,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Configuration for a particular response. /// Configuration for a particular response.
/// </summary> /// </summary>
public sealed partial class ResponseParameters : pb::IMessage<ResponseParameters> { public sealed partial class ResponseParameters : pb::IMessage<ResponseParameters> {
private static readonly pb::MessageParser<ResponseParameters> _parser = new pb::MessageParser<ResponseParameters>(() => new ResponseParameters()); private static readonly pb::MessageParser<ResponseParameters> _parser = new pb::MessageParser<ResponseParameters>(() => new ResponseParameters());
@ -1411,7 +1411,7 @@ namespace Grpc.Testing {
public const int SizeFieldNumber = 1; public const int SizeFieldNumber = 1;
private int size_; private int size_;
/// <summary> /// <summary>
/// Desired payload sizes in responses from the server. /// Desired payload sizes in responses from the server.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int Size { public int Size {
@ -1425,8 +1425,8 @@ namespace Grpc.Testing {
public const int IntervalUsFieldNumber = 2; public const int IntervalUsFieldNumber = 2;
private int intervalUs_; private int intervalUs_;
/// <summary> /// <summary>
/// Desired interval between consecutive responses in the response stream in /// Desired interval between consecutive responses in the response stream in
/// microseconds. /// microseconds.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int IntervalUs { public int IntervalUs {
@ -1440,10 +1440,10 @@ namespace Grpc.Testing {
public const int CompressedFieldNumber = 3; public const int CompressedFieldNumber = 3;
private global::Grpc.Testing.BoolValue compressed_; private global::Grpc.Testing.BoolValue compressed_;
/// <summary> /// <summary>
/// Whether to request the server to compress the response. This field is /// Whether to request the server to compress the response. This field is
/// "nullable" in order to interoperate seamlessly with clients not able to /// "nullable" in order to interoperate seamlessly with clients not able to
/// implement the full compression tests by introspecting the call to verify /// implement the full compression tests by introspecting the call to verify
/// the response's compression status. /// the response's compression status.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.BoolValue Compressed { public global::Grpc.Testing.BoolValue Compressed {
@ -1566,7 +1566,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Server-streaming request. /// Server-streaming request.
/// </summary> /// </summary>
public sealed partial class StreamingOutputCallRequest : pb::IMessage<StreamingOutputCallRequest> { public sealed partial class StreamingOutputCallRequest : pb::IMessage<StreamingOutputCallRequest> {
private static readonly pb::MessageParser<StreamingOutputCallRequest> _parser = new pb::MessageParser<StreamingOutputCallRequest>(() => new StreamingOutputCallRequest()); private static readonly pb::MessageParser<StreamingOutputCallRequest> _parser = new pb::MessageParser<StreamingOutputCallRequest>(() => new StreamingOutputCallRequest());
@ -1607,11 +1607,11 @@ namespace Grpc.Testing {
public const int ResponseTypeFieldNumber = 1; public const int ResponseTypeFieldNumber = 1;
private global::Grpc.Testing.PayloadType responseType_ = 0; private global::Grpc.Testing.PayloadType responseType_ = 0;
/// <summary> /// <summary>
/// DEPRECATED, don't use. To be removed shortly. /// DEPRECATED, don't use. To be removed shortly.
/// Desired payload type in the response from the server. /// Desired payload type in the response from the server.
/// If response_type is RANDOM, the payload from each response in the stream /// If response_type is RANDOM, the payload from each response in the stream
/// might be of different types. This is to simulate a mixed type of payload /// might be of different types. This is to simulate a mixed type of payload
/// stream. /// stream.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.PayloadType ResponseType { public global::Grpc.Testing.PayloadType ResponseType {
@ -1627,7 +1627,7 @@ namespace Grpc.Testing {
= pb::FieldCodec.ForMessage(18, global::Grpc.Testing.ResponseParameters.Parser); = pb::FieldCodec.ForMessage(18, global::Grpc.Testing.ResponseParameters.Parser);
private readonly pbc::RepeatedField<global::Grpc.Testing.ResponseParameters> responseParameters_ = new pbc::RepeatedField<global::Grpc.Testing.ResponseParameters>(); private readonly pbc::RepeatedField<global::Grpc.Testing.ResponseParameters> responseParameters_ = new pbc::RepeatedField<global::Grpc.Testing.ResponseParameters>();
/// <summary> /// <summary>
/// Configuration for each expected response message. /// Configuration for each expected response message.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<global::Grpc.Testing.ResponseParameters> ResponseParameters { public pbc::RepeatedField<global::Grpc.Testing.ResponseParameters> ResponseParameters {
@ -1638,7 +1638,7 @@ namespace Grpc.Testing {
public const int PayloadFieldNumber = 3; public const int PayloadFieldNumber = 3;
private global::Grpc.Testing.Payload payload_; private global::Grpc.Testing.Payload payload_;
/// <summary> /// <summary>
/// Optional input payload sent along with the request. /// Optional input payload sent along with the request.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.Payload Payload { public global::Grpc.Testing.Payload Payload {
@ -1652,7 +1652,7 @@ namespace Grpc.Testing {
public const int ResponseStatusFieldNumber = 7; public const int ResponseStatusFieldNumber = 7;
private global::Grpc.Testing.EchoStatus responseStatus_; private global::Grpc.Testing.EchoStatus responseStatus_;
/// <summary> /// <summary>
/// Whether server should return a given status /// Whether server should return a given status
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.EchoStatus ResponseStatus { public global::Grpc.Testing.EchoStatus ResponseStatus {
@ -1790,7 +1790,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Server-streaming response, as configured by the request and parameters. /// Server-streaming response, as configured by the request and parameters.
/// </summary> /// </summary>
public sealed partial class StreamingOutputCallResponse : pb::IMessage<StreamingOutputCallResponse> { public sealed partial class StreamingOutputCallResponse : pb::IMessage<StreamingOutputCallResponse> {
private static readonly pb::MessageParser<StreamingOutputCallResponse> _parser = new pb::MessageParser<StreamingOutputCallResponse>(() => new StreamingOutputCallResponse()); private static readonly pb::MessageParser<StreamingOutputCallResponse> _parser = new pb::MessageParser<StreamingOutputCallResponse>(() => new StreamingOutputCallResponse());
@ -1828,7 +1828,7 @@ namespace Grpc.Testing {
public const int PayloadFieldNumber = 1; public const int PayloadFieldNumber = 1;
private global::Grpc.Testing.Payload payload_; private global::Grpc.Testing.Payload payload_;
/// <summary> /// <summary>
/// Payload to increase response size. /// Payload to increase response size.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.Payload Payload { public global::Grpc.Testing.Payload Payload {
@ -1919,8 +1919,8 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// For reconnect interop test only. /// For reconnect interop test only.
/// Client tells server what reconnection parameters it used. /// Client tells server what reconnection parameters it used.
/// </summary> /// </summary>
public sealed partial class ReconnectParams : pb::IMessage<ReconnectParams> { public sealed partial class ReconnectParams : pb::IMessage<ReconnectParams> {
private static readonly pb::MessageParser<ReconnectParams> _parser = new pb::MessageParser<ReconnectParams>(() => new ReconnectParams()); private static readonly pb::MessageParser<ReconnectParams> _parser = new pb::MessageParser<ReconnectParams>(() => new ReconnectParams());
@ -2040,9 +2040,9 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// For reconnect interop test only. /// For reconnect interop test only.
/// Server tells client whether its reconnects are following the spec and the /// Server tells client whether its reconnects are following the spec and the
/// reconnect backoffs it saw. /// reconnect backoffs it saw.
/// </summary> /// </summary>
public sealed partial class ReconnectInfo : pb::IMessage<ReconnectInfo> { public sealed partial class ReconnectInfo : pb::IMessage<ReconnectInfo> {
private static readonly pb::MessageParser<ReconnectInfo> _parser = new pb::MessageParser<ReconnectInfo>(() => new ReconnectInfo()); private static readonly pb::MessageParser<ReconnectInfo> _parser = new pb::MessageParser<ReconnectInfo>(() => new ReconnectInfo());

@ -44,7 +44,7 @@ namespace Grpc.Testing {
} }
#region Messages #region Messages
/// <summary> /// <summary>
/// Reponse message containing the gauge name and value /// Reponse message containing the gauge name and value
/// </summary> /// </summary>
public sealed partial class GaugeResponse : pb::IMessage<GaugeResponse> { public sealed partial class GaugeResponse : pb::IMessage<GaugeResponse> {
private static readonly pb::MessageParser<GaugeResponse> _parser = new pb::MessageParser<GaugeResponse>(() => new GaugeResponse()); private static readonly pb::MessageParser<GaugeResponse> _parser = new pb::MessageParser<GaugeResponse>(() => new GaugeResponse());
@ -282,7 +282,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Request message containing the gauge name /// Request message containing the gauge name
/// </summary> /// </summary>
public sealed partial class GaugeRequest : pb::IMessage<GaugeRequest> { public sealed partial class GaugeRequest : pb::IMessage<GaugeRequest> {
private static readonly pb::MessageParser<GaugeRequest> _parser = new pb::MessageParser<GaugeRequest>(() => new GaugeRequest()); private static readonly pb::MessageParser<GaugeRequest> _parser = new pb::MessageParser<GaugeRequest>(() => new GaugeRequest());

@ -335,8 +335,8 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// TODO (vpai): Fill this in once the details of complex, representative /// TODO (vpai): Fill this in once the details of complex, representative
/// protos are decided /// protos are decided
/// </summary> /// </summary>
public sealed partial class ComplexProtoParams : pb::IMessage<ComplexProtoParams> { public sealed partial class ComplexProtoParams : pb::IMessage<ComplexProtoParams> {
private static readonly pb::MessageParser<ComplexProtoParams> _parser = new pb::MessageParser<ComplexProtoParams>(() => new ComplexProtoParams()); private static readonly pb::MessageParser<ComplexProtoParams> _parser = new pb::MessageParser<ComplexProtoParams>(() => new ComplexProtoParams());

@ -37,6 +37,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Google.Protobuf;
using Grpc.Core; using Grpc.Core;
using Grpc.Core.Utils; using Grpc.Core.Utils;
using Grpc.Testing; using Grpc.Testing;
@ -68,7 +69,7 @@ namespace Grpc.IntegrationTesting
server = new Server server = new Server
{ {
Services = { TestService.BindService(new TestServiceImpl()) }, Services = { TestService.BindService(new SslCredentialsTestServiceImpl()) },
Ports = { { Host, ServerPort.PickUnused, serverCredentials } } Ports = { { Host, ServerPort.PickUnused, serverCredentials } }
}; };
server.Start(); server.Start();
@ -95,5 +96,40 @@ namespace Grpc.IntegrationTesting
var response = client.UnaryCall(new SimpleRequest { ResponseSize = 10 }); var response = client.UnaryCall(new SimpleRequest { ResponseSize = 10 });
Assert.AreEqual(10, response.Payload.Body.Length); Assert.AreEqual(10, response.Payload.Body.Length);
} }
[Test]
public async Task AuthContextIsPopulated()
{
var call = client.StreamingInputCall();
await call.RequestStream.CompleteAsync();
var response = await call.ResponseAsync;
Assert.AreEqual(12345, response.AggregatedPayloadSize);
}
private class SslCredentialsTestServiceImpl : TestService.TestServiceBase
{
public override async Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context)
{
return new SimpleResponse { Payload = CreateZerosPayload(request.ResponseSize) };
}
public override async Task<StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<StreamingInputCallRequest> requestStream, ServerCallContext context)
{
var authContext = context.AuthContext;
await requestStream.ForEachAsync(async request => {});
Assert.IsTrue(authContext.IsPeerAuthenticated);
Assert.AreEqual("x509_subject_alternative_name", authContext.PeerIdentityPropertyName);
Assert.IsTrue(authContext.PeerIdentity.Count() > 0);
Assert.AreEqual("ssl", authContext.FindPropertiesByName("transport_security_type").First().Value);
return new StreamingInputCallResponse { AggregatedPayloadSize = 12345 };
}
private static Payload CreateZerosPayload(int size)
{
return new Payload { Body = ByteString.CopyFrom(new byte[size]) };
}
}
} }
} }

@ -90,7 +90,7 @@ namespace Grpc.Testing {
public const int TimeElapsedFieldNumber = 1; public const int TimeElapsedFieldNumber = 1;
private double timeElapsed_; private double timeElapsed_;
/// <summary> /// <summary>
/// wall clock time change in seconds since last reset /// wall clock time change in seconds since last reset
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double TimeElapsed { public double TimeElapsed {
@ -104,7 +104,7 @@ namespace Grpc.Testing {
public const int TimeUserFieldNumber = 2; public const int TimeUserFieldNumber = 2;
private double timeUser_; private double timeUser_;
/// <summary> /// <summary>
/// change in user time (in seconds) used by the server since last reset /// change in user time (in seconds) used by the server since last reset
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double TimeUser { public double TimeUser {
@ -118,8 +118,8 @@ namespace Grpc.Testing {
public const int TimeSystemFieldNumber = 3; public const int TimeSystemFieldNumber = 3;
private double timeSystem_; private double timeSystem_;
/// <summary> /// <summary>
/// change in server time (in seconds) used by the server process and all /// change in server time (in seconds) used by the server process and all
/// threads since last reset /// threads since last reset
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double TimeSystem { public double TimeSystem {
@ -133,7 +133,7 @@ namespace Grpc.Testing {
public const int TotalCpuTimeFieldNumber = 4; public const int TotalCpuTimeFieldNumber = 4;
private ulong totalCpuTime_; private ulong totalCpuTime_;
/// <summary> /// <summary>
/// change in total cpu time of the server (data from proc/stat) /// change in total cpu time of the server (data from proc/stat)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ulong TotalCpuTime { public ulong TotalCpuTime {
@ -147,7 +147,7 @@ namespace Grpc.Testing {
public const int IdleCpuTimeFieldNumber = 5; public const int IdleCpuTimeFieldNumber = 5;
private ulong idleCpuTime_; private ulong idleCpuTime_;
/// <summary> /// <summary>
/// change in idle time of the server (data from proc/stat) /// change in idle time of the server (data from proc/stat)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ulong IdleCpuTime { public ulong IdleCpuTime {
@ -296,7 +296,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Histogram params based on grpc/support/histogram.c /// Histogram params based on grpc/support/histogram.c
/// </summary> /// </summary>
public sealed partial class HistogramParams : pb::IMessage<HistogramParams> { public sealed partial class HistogramParams : pb::IMessage<HistogramParams> {
private static readonly pb::MessageParser<HistogramParams> _parser = new pb::MessageParser<HistogramParams>(() => new HistogramParams()); private static readonly pb::MessageParser<HistogramParams> _parser = new pb::MessageParser<HistogramParams>(() => new HistogramParams());
@ -335,7 +335,7 @@ namespace Grpc.Testing {
public const int ResolutionFieldNumber = 1; public const int ResolutionFieldNumber = 1;
private double resolution_; private double resolution_;
/// <summary> /// <summary>
/// first bucket is [0, 1 + resolution) /// first bucket is [0, 1 + resolution)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double Resolution { public double Resolution {
@ -349,7 +349,7 @@ namespace Grpc.Testing {
public const int MaxPossibleFieldNumber = 2; public const int MaxPossibleFieldNumber = 2;
private double maxPossible_; private double maxPossible_;
/// <summary> /// <summary>
/// use enough buckets to allow this value /// use enough buckets to allow this value
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double MaxPossible { public double MaxPossible {
@ -450,7 +450,7 @@ namespace Grpc.Testing {
} }
/// <summary> /// <summary>
/// Histogram data based on grpc/support/histogram.c /// Histogram data based on grpc/support/histogram.c
/// </summary> /// </summary>
public sealed partial class HistogramData : pb::IMessage<HistogramData> { public sealed partial class HistogramData : pb::IMessage<HistogramData> {
private static readonly pb::MessageParser<HistogramData> _parser = new pb::MessageParser<HistogramData>(() => new HistogramData()); private static readonly pb::MessageParser<HistogramData> _parser = new pb::MessageParser<HistogramData>(() => new HistogramData());
@ -887,7 +887,7 @@ namespace Grpc.Testing {
public const int LatenciesFieldNumber = 1; public const int LatenciesFieldNumber = 1;
private global::Grpc.Testing.HistogramData latencies_; private global::Grpc.Testing.HistogramData latencies_;
/// <summary> /// <summary>
/// Latency histogram. Data points are in nanoseconds. /// Latency histogram. Data points are in nanoseconds.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Testing.HistogramData Latencies { public global::Grpc.Testing.HistogramData Latencies {
@ -901,7 +901,7 @@ namespace Grpc.Testing {
public const int TimeElapsedFieldNumber = 2; public const int TimeElapsedFieldNumber = 2;
private double timeElapsed_; private double timeElapsed_;
/// <summary> /// <summary>
/// See ServerStats for details. /// See ServerStats for details.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public double TimeElapsed { public double TimeElapsed {
@ -939,7 +939,7 @@ namespace Grpc.Testing {
= pb::FieldCodec.ForMessage(42, global::Grpc.Testing.RequestResultCount.Parser); = pb::FieldCodec.ForMessage(42, global::Grpc.Testing.RequestResultCount.Parser);
private readonly pbc::RepeatedField<global::Grpc.Testing.RequestResultCount> requestResults_ = new pbc::RepeatedField<global::Grpc.Testing.RequestResultCount>(); private readonly pbc::RepeatedField<global::Grpc.Testing.RequestResultCount> requestResults_ = new pbc::RepeatedField<global::Grpc.Testing.RequestResultCount>();
/// <summary> /// <summary>
/// Number of failed requests (one row per status code seen) /// Number of failed requests (one row per status code seen)
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<global::Grpc.Testing.RequestResultCount> RequestResults { public pbc::RepeatedField<global::Grpc.Testing.RequestResultCount> RequestResults {

@ -1,17 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="BouncyCastle" version="1.7.0" targetFramework="net45" /> <package id="Castle.Core" version="4.0.0" targetFramework="net45" />
<package id="Castle.Core" version="3.3.3" targetFramework="net45" /> <package id="CommandLineParser" version="2.1.1-beta" targetFramework="net45" />
<package id="CommandLineParser.Unofficial" version="2.0.275" targetFramework="net45" /> <package id="Google.Apis" version="1.21.0" targetFramework="net45" />
<package id="Google.Apis" version="1.16.0" targetFramework="net45" /> <package id="Google.Apis.Auth" version="1.21.0" targetFramework="net45" />
<package id="Google.Apis.Auth" version="1.16.0" targetFramework="net45" /> <package id="Google.Apis.Core" version="1.21.0" targetFramework="net45" />
<package id="Google.Apis.Core" version="1.16.0" targetFramework="net45" /> <package id="Google.Protobuf" version="3.2.0" targetFramework="net45" />
<package id="Google.Protobuf" version="3.0.0" targetFramework="net45" /> <package id="Moq" version="4.7.0" targetFramework="net45" />
<package id="log4net" version="2.0.3" targetFramework="net45" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
<package id="Moq" version="4.6.38-alpha" targetFramework="net45" /> <package id="NUnit" version="3.6.0" targetFramework="net45" />
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" /> <package id="NUnitLite" version="3.6.0" targetFramework="net45" />
<package id="NUnit" version="3.2.0" targetFramework="net45" />
<package id="NUnitLite" version="3.2.0" targetFramework="net45" />
<package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" /> <package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" />
<package id="Zlib.Portable.Signed" version="1.11.0" targetFramework="net45" /> <package id="Zlib.Portable.Signed" version="1.11.0" targetFramework="net45" />
</packages> </packages>

@ -54,18 +54,15 @@
"Grpc.Core": { "Grpc.Core": {
"target": "project" "target": "project"
}, },
"Google.Protobuf": "3.0.0", "Google.Protobuf": "3.2.0",
"CommandLineParser.Unofficial": "2.0.275", "CommandLineParser": "2.1.1-beta",
"Moq": "4.6.38-alpha", "Moq": "4.7.0",
"NUnit": "3.2.0", "NUnit": "3.6.0",
"NUnitLite": "3.2.0-*" "NUnitLite": "3.6.0"
}, },
"frameworks": { "frameworks": {
"net45": { "net45": {
"frameworkAssemblies": { "frameworkAssemblies": {}
"System.Runtime": "",
"System.IO": ""
}
}, },
"netcoreapp1.0": { "netcoreapp1.0": {
"imports": [ "imports": [

@ -35,17 +35,17 @@
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="nunit.framework"> <Reference Include="System.Interactive.Async">
<HintPath>..\packages\NUnit.3.2.0\lib\net45\nunit.framework.dll</HintPath> <HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath>
</Reference>
<Reference Include="nunitlite">
<HintPath>..\packages\NUnitLite.3.2.0\lib\net45\nunitlite.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Protobuf"> <Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll</HintPath> <HintPath>..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Interactive.Async"> <Reference Include="nunit.framework">
<HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath> <HintPath>..\packages\NUnit.3.6.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="nunitlite">
<HintPath>..\packages\NUnitLite.3.6.0\lib\net45\nunitlite.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Google.Protobuf" version="3.0.0" targetFramework="net45" /> <package id="Google.Protobuf" version="3.2.0" targetFramework="net45" />
<package id="NUnit" version="3.2.0" targetFramework="net45" /> <package id="NUnit" version="3.6.0" targetFramework="net45" />
<package id="NUnitLite" version="3.2.0" targetFramework="net45" /> <package id="NUnitLite" version="3.6.0" targetFramework="net45" />
<package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" /> <package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" />
</packages> </packages>

@ -45,8 +45,8 @@
"Grpc.Reflection": { "Grpc.Reflection": {
"target": "project" "target": "project"
}, },
"NUnit": "3.2.0", "NUnit": "3.6.0",
"NUnitLite": "3.2.0-*" "NUnitLite": "3.6.0"
}, },
"frameworks": { "frameworks": {
"net45": { }, "net45": { },

@ -36,12 +36,12 @@
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.0.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="System.Interactive.Async"> <Reference Include="System.Interactive.Async">
<HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath> <HintPath>..\packages\System.Interactive.Async.3.1.1\lib\net45\System.Interactive.Async.dll</HintPath>
</Reference> </Reference>
<Reference Include="Google.Protobuf">
<HintPath>..\packages\Google.Protobuf.3.2.0\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\Grpc.Core\Version.cs"> <Compile Include="..\Grpc.Core\Version.cs">

@ -70,7 +70,7 @@ namespace Grpc.Reflection.V1Alpha {
} }
#region Messages #region Messages
/// <summary> /// <summary>
/// The message sent by the client when calling ServerReflectionInfo method. /// The message sent by the client when calling ServerReflectionInfo method.
/// </summary> /// </summary>
public sealed partial class ServerReflectionRequest : pb::IMessage<ServerReflectionRequest> { public sealed partial class ServerReflectionRequest : pb::IMessage<ServerReflectionRequest> {
private static readonly pb::MessageParser<ServerReflectionRequest> _parser = new pb::MessageParser<ServerReflectionRequest>(() => new ServerReflectionRequest()); private static readonly pb::MessageParser<ServerReflectionRequest> _parser = new pb::MessageParser<ServerReflectionRequest>(() => new ServerReflectionRequest());
@ -136,7 +136,7 @@ namespace Grpc.Reflection.V1Alpha {
/// <summary>Field number for the "file_by_filename" field.</summary> /// <summary>Field number for the "file_by_filename" field.</summary>
public const int FileByFilenameFieldNumber = 3; public const int FileByFilenameFieldNumber = 3;
/// <summary> /// <summary>
/// Find a proto file by the file name. /// Find a proto file by the file name.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string FileByFilename { public string FileByFilename {
@ -150,9 +150,9 @@ namespace Grpc.Reflection.V1Alpha {
/// <summary>Field number for the "file_containing_symbol" field.</summary> /// <summary>Field number for the "file_containing_symbol" field.</summary>
public const int FileContainingSymbolFieldNumber = 4; public const int FileContainingSymbolFieldNumber = 4;
/// <summary> /// <summary>
/// Find the proto file that declares the given fully-qualified symbol name. /// Find the proto file that declares the given fully-qualified symbol name.
/// This field should be a fully-qualified symbol name /// This field should be a fully-qualified symbol name
/// (e.g. &lt;package>.&lt;service>[.&lt;method>] or &lt;package>.&lt;type>). /// (e.g. &lt;package>.&lt;service>[.&lt;method>] or &lt;package>.&lt;type>).
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string FileContainingSymbol { public string FileContainingSymbol {
@ -166,8 +166,8 @@ namespace Grpc.Reflection.V1Alpha {
/// <summary>Field number for the "file_containing_extension" field.</summary> /// <summary>Field number for the "file_containing_extension" field.</summary>
public const int FileContainingExtensionFieldNumber = 5; public const int FileContainingExtensionFieldNumber = 5;
/// <summary> /// <summary>
/// Find the proto file which defines an extension extending the given /// Find the proto file which defines an extension extending the given
/// message type with the given field number. /// message type with the given field number.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Reflection.V1Alpha.ExtensionRequest FileContainingExtension { public global::Grpc.Reflection.V1Alpha.ExtensionRequest FileContainingExtension {
@ -181,14 +181,14 @@ namespace Grpc.Reflection.V1Alpha {
/// <summary>Field number for the "all_extension_numbers_of_type" field.</summary> /// <summary>Field number for the "all_extension_numbers_of_type" field.</summary>
public const int AllExtensionNumbersOfTypeFieldNumber = 6; public const int AllExtensionNumbersOfTypeFieldNumber = 6;
/// <summary> /// <summary>
/// Finds the tag numbers used by all known extensions of the given message /// Finds the tag numbers used by all known extensions of the given message
/// type, and appends them to ExtensionNumberResponse in an undefined order. /// type, and appends them to ExtensionNumberResponse in an undefined order.
/// Its corresponding method is best-effort: it's not guaranteed that the /// Its corresponding method is best-effort: it's not guaranteed that the
/// reflection service will implement this method, and it's not guaranteed /// reflection service will implement this method, and it's not guaranteed
/// that this method will provide all extensions. Returns /// that this method will provide all extensions. Returns
/// StatusCode::UNIMPLEMENTED if it's not implemented. /// StatusCode::UNIMPLEMENTED if it's not implemented.
/// This field should be a fully-qualified type name. The format is /// This field should be a fully-qualified type name. The format is
/// &lt;package>.&lt;type> /// &lt;package>.&lt;type>
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string AllExtensionNumbersOfType { public string AllExtensionNumbersOfType {
@ -202,8 +202,8 @@ namespace Grpc.Reflection.V1Alpha {
/// <summary>Field number for the "list_services" field.</summary> /// <summary>Field number for the "list_services" field.</summary>
public const int ListServicesFieldNumber = 7; public const int ListServicesFieldNumber = 7;
/// <summary> /// <summary>
/// List the full names of registered services. The content will not be /// List the full names of registered services. The content will not be
/// checked. /// checked.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string ListServices { public string ListServices {
@ -401,8 +401,8 @@ namespace Grpc.Reflection.V1Alpha {
} }
/// <summary> /// <summary>
/// The type name and extension number sent by the client when requesting /// The type name and extension number sent by the client when requesting
/// file_containing_extension. /// file_containing_extension.
/// </summary> /// </summary>
public sealed partial class ExtensionRequest : pb::IMessage<ExtensionRequest> { public sealed partial class ExtensionRequest : pb::IMessage<ExtensionRequest> {
private static readonly pb::MessageParser<ExtensionRequest> _parser = new pb::MessageParser<ExtensionRequest>(() => new ExtensionRequest()); private static readonly pb::MessageParser<ExtensionRequest> _parser = new pb::MessageParser<ExtensionRequest>(() => new ExtensionRequest());
@ -441,7 +441,7 @@ namespace Grpc.Reflection.V1Alpha {
public const int ContainingTypeFieldNumber = 1; public const int ContainingTypeFieldNumber = 1;
private string containingType_ = ""; private string containingType_ = "";
/// <summary> /// <summary>
/// Fully-qualified type name. The format should be &lt;package>.&lt;type> /// Fully-qualified type name. The format should be &lt;package>.&lt;type>
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string ContainingType { public string ContainingType {
@ -553,7 +553,7 @@ namespace Grpc.Reflection.V1Alpha {
} }
/// <summary> /// <summary>
/// The message sent by the server to answer ServerReflectionInfo method. /// The message sent by the server to answer ServerReflectionInfo method.
/// </summary> /// </summary>
public sealed partial class ServerReflectionResponse : pb::IMessage<ServerReflectionResponse> { public sealed partial class ServerReflectionResponse : pb::IMessage<ServerReflectionResponse> {
private static readonly pb::MessageParser<ServerReflectionResponse> _parser = new pb::MessageParser<ServerReflectionResponse>(() => new ServerReflectionResponse()); private static readonly pb::MessageParser<ServerReflectionResponse> _parser = new pb::MessageParser<ServerReflectionResponse>(() => new ServerReflectionResponse());
@ -628,12 +628,12 @@ namespace Grpc.Reflection.V1Alpha {
/// <summary>Field number for the "file_descriptor_response" field.</summary> /// <summary>Field number for the "file_descriptor_response" field.</summary>
public const int FileDescriptorResponseFieldNumber = 4; public const int FileDescriptorResponseFieldNumber = 4;
/// <summary> /// <summary>
/// This message is used to answer file_by_filename, file_containing_symbol, /// This message is used to answer file_by_filename, file_containing_symbol,
/// file_containing_extension requests with transitive dependencies. As /// file_containing_extension requests with transitive dependencies. As
/// the repeated label is not allowed in oneof fields, we use a /// the repeated label is not allowed in oneof fields, we use a
/// FileDescriptorResponse message to encapsulate the repeated fields. /// FileDescriptorResponse message to encapsulate the repeated fields.
/// The reflection service is allowed to avoid sending FileDescriptorProtos /// The reflection service is allowed to avoid sending FileDescriptorProtos
/// that were previously sent in response to earlier requests in the stream. /// that were previously sent in response to earlier requests in the stream.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Reflection.V1Alpha.FileDescriptorResponse FileDescriptorResponse { public global::Grpc.Reflection.V1Alpha.FileDescriptorResponse FileDescriptorResponse {
@ -647,7 +647,7 @@ namespace Grpc.Reflection.V1Alpha {
/// <summary>Field number for the "all_extension_numbers_response" field.</summary> /// <summary>Field number for the "all_extension_numbers_response" field.</summary>
public const int AllExtensionNumbersResponseFieldNumber = 5; public const int AllExtensionNumbersResponseFieldNumber = 5;
/// <summary> /// <summary>
/// This message is used to answer all_extension_numbers_of_type requst. /// This message is used to answer all_extension_numbers_of_type requst.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Reflection.V1Alpha.ExtensionNumberResponse AllExtensionNumbersResponse { public global::Grpc.Reflection.V1Alpha.ExtensionNumberResponse AllExtensionNumbersResponse {
@ -661,7 +661,7 @@ namespace Grpc.Reflection.V1Alpha {
/// <summary>Field number for the "list_services_response" field.</summary> /// <summary>Field number for the "list_services_response" field.</summary>
public const int ListServicesResponseFieldNumber = 6; public const int ListServicesResponseFieldNumber = 6;
/// <summary> /// <summary>
/// This message is used to answer list_services request. /// This message is used to answer list_services request.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Reflection.V1Alpha.ListServiceResponse ListServicesResponse { public global::Grpc.Reflection.V1Alpha.ListServiceResponse ListServicesResponse {
@ -675,7 +675,7 @@ namespace Grpc.Reflection.V1Alpha {
/// <summary>Field number for the "error_response" field.</summary> /// <summary>Field number for the "error_response" field.</summary>
public const int ErrorResponseFieldNumber = 7; public const int ErrorResponseFieldNumber = 7;
/// <summary> /// <summary>
/// This message is used when an error occurs. /// This message is used when an error occurs.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Grpc.Reflection.V1Alpha.ErrorResponse ErrorResponse { public global::Grpc.Reflection.V1Alpha.ErrorResponse ErrorResponse {
@ -893,9 +893,9 @@ namespace Grpc.Reflection.V1Alpha {
} }
/// <summary> /// <summary>
/// Serialized FileDescriptorProto messages sent by the server answering /// Serialized FileDescriptorProto messages sent by the server answering
/// a file_by_filename, file_containing_symbol, or file_containing_extension /// a file_by_filename, file_containing_symbol, or file_containing_extension
/// request. /// request.
/// </summary> /// </summary>
public sealed partial class FileDescriptorResponse : pb::IMessage<FileDescriptorResponse> { public sealed partial class FileDescriptorResponse : pb::IMessage<FileDescriptorResponse> {
private static readonly pb::MessageParser<FileDescriptorResponse> _parser = new pb::MessageParser<FileDescriptorResponse>(() => new FileDescriptorResponse()); private static readonly pb::MessageParser<FileDescriptorResponse> _parser = new pb::MessageParser<FileDescriptorResponse>(() => new FileDescriptorResponse());
@ -935,9 +935,9 @@ namespace Grpc.Reflection.V1Alpha {
= pb::FieldCodec.ForBytes(10); = pb::FieldCodec.ForBytes(10);
private readonly pbc::RepeatedField<pb::ByteString> fileDescriptorProto_ = new pbc::RepeatedField<pb::ByteString>(); private readonly pbc::RepeatedField<pb::ByteString> fileDescriptorProto_ = new pbc::RepeatedField<pb::ByteString>();
/// <summary> /// <summary>
/// Serialized FileDescriptorProto messages. We avoid taking a dependency on /// Serialized FileDescriptorProto messages. We avoid taking a dependency on
/// descriptor.proto, which uses proto2 only features, by making them opaque /// descriptor.proto, which uses proto2 only features, by making them opaque
/// bytes instead. /// bytes instead.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<pb::ByteString> FileDescriptorProto { public pbc::RepeatedField<pb::ByteString> FileDescriptorProto {
@ -1012,8 +1012,8 @@ namespace Grpc.Reflection.V1Alpha {
} }
/// <summary> /// <summary>
/// A list of extension numbers sent by the server answering /// A list of extension numbers sent by the server answering
/// all_extension_numbers_of_type request. /// all_extension_numbers_of_type request.
/// </summary> /// </summary>
public sealed partial class ExtensionNumberResponse : pb::IMessage<ExtensionNumberResponse> { public sealed partial class ExtensionNumberResponse : pb::IMessage<ExtensionNumberResponse> {
private static readonly pb::MessageParser<ExtensionNumberResponse> _parser = new pb::MessageParser<ExtensionNumberResponse>(() => new ExtensionNumberResponse()); private static readonly pb::MessageParser<ExtensionNumberResponse> _parser = new pb::MessageParser<ExtensionNumberResponse>(() => new ExtensionNumberResponse());
@ -1052,8 +1052,8 @@ namespace Grpc.Reflection.V1Alpha {
public const int BaseTypeNameFieldNumber = 1; public const int BaseTypeNameFieldNumber = 1;
private string baseTypeName_ = ""; private string baseTypeName_ = "";
/// <summary> /// <summary>
/// Full name of the base type, including the package name. The format /// Full name of the base type, including the package name. The format
/// is &lt;package>.&lt;type> /// is &lt;package>.&lt;type>
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string BaseTypeName { public string BaseTypeName {
@ -1158,7 +1158,7 @@ namespace Grpc.Reflection.V1Alpha {
} }
/// <summary> /// <summary>
/// A list of ServiceResponse sent by the server answering list_services request. /// A list of ServiceResponse sent by the server answering list_services request.
/// </summary> /// </summary>
public sealed partial class ListServiceResponse : pb::IMessage<ListServiceResponse> { public sealed partial class ListServiceResponse : pb::IMessage<ListServiceResponse> {
private static readonly pb::MessageParser<ListServiceResponse> _parser = new pb::MessageParser<ListServiceResponse>(() => new ListServiceResponse()); private static readonly pb::MessageParser<ListServiceResponse> _parser = new pb::MessageParser<ListServiceResponse>(() => new ListServiceResponse());
@ -1198,8 +1198,8 @@ namespace Grpc.Reflection.V1Alpha {
= pb::FieldCodec.ForMessage(10, global::Grpc.Reflection.V1Alpha.ServiceResponse.Parser); = pb::FieldCodec.ForMessage(10, global::Grpc.Reflection.V1Alpha.ServiceResponse.Parser);
private readonly pbc::RepeatedField<global::Grpc.Reflection.V1Alpha.ServiceResponse> service_ = new pbc::RepeatedField<global::Grpc.Reflection.V1Alpha.ServiceResponse>(); private readonly pbc::RepeatedField<global::Grpc.Reflection.V1Alpha.ServiceResponse> service_ = new pbc::RepeatedField<global::Grpc.Reflection.V1Alpha.ServiceResponse>();
/// <summary> /// <summary>
/// The information of each service may be expanded in the future, so we use /// The information of each service may be expanded in the future, so we use
/// ServiceResponse message to encapsulate it. /// ServiceResponse message to encapsulate it.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<global::Grpc.Reflection.V1Alpha.ServiceResponse> Service { public pbc::RepeatedField<global::Grpc.Reflection.V1Alpha.ServiceResponse> Service {
@ -1274,8 +1274,8 @@ namespace Grpc.Reflection.V1Alpha {
} }
/// <summary> /// <summary>
/// The information of a single service used by ListServiceResponse to answer /// The information of a single service used by ListServiceResponse to answer
/// list_services request. /// list_services request.
/// </summary> /// </summary>
public sealed partial class ServiceResponse : pb::IMessage<ServiceResponse> { public sealed partial class ServiceResponse : pb::IMessage<ServiceResponse> {
private static readonly pb::MessageParser<ServiceResponse> _parser = new pb::MessageParser<ServiceResponse>(() => new ServiceResponse()); private static readonly pb::MessageParser<ServiceResponse> _parser = new pb::MessageParser<ServiceResponse>(() => new ServiceResponse());
@ -1313,8 +1313,8 @@ namespace Grpc.Reflection.V1Alpha {
public const int NameFieldNumber = 1; public const int NameFieldNumber = 1;
private string name_ = ""; private string name_ = "";
/// <summary> /// <summary>
/// Full name of a registered service, including its package name. The format /// Full name of a registered service, including its package name. The format
/// is &lt;package>.&lt;service> /// is &lt;package>.&lt;service>
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string Name { public string Name {
@ -1399,7 +1399,7 @@ namespace Grpc.Reflection.V1Alpha {
} }
/// <summary> /// <summary>
/// The error code and error message sent by the server when an error occurs. /// The error code and error message sent by the server when an error occurs.
/// </summary> /// </summary>
public sealed partial class ErrorResponse : pb::IMessage<ErrorResponse> { public sealed partial class ErrorResponse : pb::IMessage<ErrorResponse> {
private static readonly pb::MessageParser<ErrorResponse> _parser = new pb::MessageParser<ErrorResponse>(() => new ErrorResponse()); private static readonly pb::MessageParser<ErrorResponse> _parser = new pb::MessageParser<ErrorResponse>(() => new ErrorResponse());
@ -1438,7 +1438,7 @@ namespace Grpc.Reflection.V1Alpha {
public const int ErrorCodeFieldNumber = 1; public const int ErrorCodeFieldNumber = 1;
private int errorCode_; private int errorCode_;
/// <summary> /// <summary>
/// This field uses the error codes defined in grpc::StatusCode. /// This field uses the error codes defined in grpc::StatusCode.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int ErrorCode { public int ErrorCode {

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Google.Protobuf" version="3.0.0" targetFramework="net45" /> <package id="Google.Protobuf" version="3.2.0" targetFramework="net45" />
<package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" /> <package id="System.Interactive.Async" version="3.1.1" targetFramework="net45" />
</packages> </packages>

@ -22,15 +22,10 @@
}, },
"dependencies": { "dependencies": {
"Grpc.Core": "1.2.0-dev", "Grpc.Core": "1.2.0-dev",
"Google.Protobuf": "3.0.0" "Google.Protobuf": "3.2.0"
}, },
"frameworks": { "frameworks": {
"net45": { "net45": {},
"frameworkAssemblies": {
"System.Runtime": "",
"System.IO": ""
}
},
"netstandard1.5": { "netstandard1.5": {
"dependencies": { "dependencies": {
"NETStandard.Library": "1.6.0" "NETStandard.Library": "1.6.0"

@ -1023,6 +1023,31 @@ GPR_EXPORT grpc_call_credentials *GPR_CALLTYPE grpcsharp_metadata_credentials_cr
return grpc_metadata_credentials_create_from_plugin(plugin, NULL); return grpc_metadata_credentials_create_from_plugin(plugin, NULL);
} }
/* Auth context */
GPR_EXPORT grpc_auth_context *GPR_CALLTYPE grpcsharp_call_auth_context(grpc_call *call) {
return grpc_call_auth_context(call);
}
GPR_EXPORT const char *GPR_CALLTYPE grpcsharp_auth_context_peer_identity_property_name(
const grpc_auth_context *ctx) {
return grpc_auth_context_peer_identity_property_name(ctx);
}
GPR_EXPORT grpc_auth_property_iterator GPR_CALLTYPE
grpcsharp_auth_context_property_iterator(const grpc_auth_context *ctx) {
return grpc_auth_context_property_iterator(ctx);
}
GPR_EXPORT const grpc_auth_property *GPR_CALLTYPE grpcsharp_auth_property_iterator_next(
grpc_auth_property_iterator *it) {
return grpc_auth_property_iterator_next(it);
}
GPR_EXPORT void GPR_CALLTYPE grpcsharp_auth_context_release(grpc_auth_context *ctx) {
grpc_auth_context_release(ctx);
}
/* Logging */ /* Logging */
typedef void(GPR_CALLTYPE *grpcsharp_log_func)(const char *file, int32_t line, typedef void(GPR_CALLTYPE *grpcsharp_log_func)(const char *file, int32_t line,

@ -8,6 +8,8 @@
"Grpc.Core.Internal.Tests.MetadataArraySafeHandleTest", "Grpc.Core.Internal.Tests.MetadataArraySafeHandleTest",
"Grpc.Core.Internal.Tests.TimespecTest", "Grpc.Core.Internal.Tests.TimespecTest",
"Grpc.Core.Tests.AppDomainUnloadTest", "Grpc.Core.Tests.AppDomainUnloadTest",
"Grpc.Core.Tests.AuthContextTest",
"Grpc.Core.Tests.AuthPropertyTest",
"Grpc.Core.Tests.CallCredentialsTest", "Grpc.Core.Tests.CallCredentialsTest",
"Grpc.Core.Tests.CallOptionsTest", "Grpc.Core.Tests.CallOptionsTest",
"Grpc.Core.Tests.ChannelCredentialsTest", "Grpc.Core.Tests.ChannelCredentialsTest",
@ -20,7 +22,6 @@
"Grpc.Core.Tests.HalfcloseTest", "Grpc.Core.Tests.HalfcloseTest",
"Grpc.Core.Tests.MarshallingErrorsTest", "Grpc.Core.Tests.MarshallingErrorsTest",
"Grpc.Core.Tests.MetadataTest", "Grpc.Core.Tests.MetadataTest",
"Grpc.Core.Tests.NUnitVersionTest",
"Grpc.Core.Tests.PerformanceTest", "Grpc.Core.Tests.PerformanceTest",
"Grpc.Core.Tests.PInvokeTest", "Grpc.Core.Tests.PInvokeTest",
"Grpc.Core.Tests.ResponseHeadersTest", "Grpc.Core.Tests.ResponseHeadersTest",

@ -237,7 +237,7 @@ def _consume_request_iterator(request_iterator, state, call,
cygrpc.Operations(operations), event_handler) cygrpc.Operations(operations), event_handler)
state.due.add(cygrpc.OperationType.send_close_from_client) state.due.add(cygrpc.OperationType.send_close_from_client)
def stop_consumption_thread(timeout): def stop_consumption_thread(timeout): # pylint: disable=unused-argument
with state.condition: with state.condition:
if state.code is None: if state.code is None:
call.cancel() call.cancel()
@ -736,7 +736,7 @@ def _run_channel_spin_thread(state):
state.managed_calls = None state.managed_calls = None
return return
def stop_channel_spin(timeout): def stop_channel_spin(timeout): # pylint: disable=unused-argument
with state.lock: with state.lock:
if state.managed_calls is not None: if state.managed_calls is not None:
for call in state.managed_calls: for call in state.managed_calls:
@ -877,12 +877,8 @@ def _moot(state):
def _subscribe(state, callback, try_to_connect): def _subscribe(state, callback, try_to_connect):
with state.lock: with state.lock:
if not state.callbacks_and_connectivities and not state.polling: if not state.callbacks_and_connectivities and not state.polling:
def cancel_all_subscriptions(timeout):
_moot(state)
polling_thread = _common.CleanupThread( polling_thread = _common.CleanupThread(
cancel_all_subscriptions, lambda timeout: _moot(state),
target=_poll_connectivity, target=_poll_connectivity,
args=(state, state.channel, bool(try_to_connect))) args=(state, state.channel, bool(try_to_connect)))
polling_thread.start() polling_thread.start()

@ -35,6 +35,8 @@ from grpc.framework.common import cardinality
from grpc.framework.foundation import future from grpc.framework.foundation import future
from grpc.framework.interfaces.face import face from grpc.framework.interfaces.face import face
# pylint: disable=too-many-arguments,too-many-locals,unused-argument
_STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS = { _STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS = {
grpc.StatusCode.CANCELLED: (face.Abortion.Kind.CANCELLED, grpc.StatusCode.CANCELLED: (face.Abortion.Kind.CANCELLED,
face.CancellationError), face.CancellationError),

@ -41,6 +41,8 @@ from grpc.framework.foundation import logging_pool
from grpc.framework.foundation import stream from grpc.framework.foundation import stream
from grpc.framework.interfaces.face import face from grpc.framework.interfaces.face import face
# pylint: disable=too-many-return-statements
_DEFAULT_POOL_SIZE = 8 _DEFAULT_POOL_SIZE = 8
@ -179,7 +181,7 @@ def _run_request_pipe_thread(request_iterator, request_consumer,
return return
request_consumer.terminate() request_consumer.terminate()
def stop_request_pipe(timeout): def stop_request_pipe(timeout): # pylint: disable=unused-argument
thread_joined.set() thread_joined.set()
request_pipe_thread = _common.CleanupThread( request_pipe_thread = _common.CleanupThread(

@ -41,6 +41,8 @@ from grpc.beta import interfaces # pylint: disable=unused-import
from grpc.framework.common import cardinality # pylint: disable=unused-import from grpc.framework.common import cardinality # pylint: disable=unused-import
from grpc.framework.interfaces.face import face # pylint: disable=unused-import from grpc.framework.interfaces.face import face # pylint: disable=unused-import
# pylint: disable=too-many-arguments
ChannelCredentials = grpc.ChannelCredentials ChannelCredentials = grpc.ChannelCredentials
ssl_channel_credentials = grpc.ssl_channel_credentials ssl_channel_credentials = grpc.ssl_channel_credentials
CallCredentials = grpc.CallCredentials CallCredentials = grpc.CallCredentials

@ -46,26 +46,29 @@ import six
# abandonment is referenced from specification in this module. # abandonment is referenced from specification in this module.
from grpc.framework.foundation import abandonment # pylint: disable=unused-import from grpc.framework.foundation import abandonment # pylint: disable=unused-import
# pylint: disable=too-many-arguments
class NoSuchMethodError(Exception): class NoSuchMethodError(Exception):
"""Indicates that an unrecognized operation has been called. """Indicates that an unrecognized operation has been called.
Attributes: Attributes:
code: A code value to communicate to the other side of the operation along
with indication of operation termination. May be None.
details: A details value to communicate to the other side of the operation
along with indication of operation termination. May be None.
"""
def __init__(self, code, details):
"""Constructor.
Args:
code: A code value to communicate to the other side of the operation code: A code value to communicate to the other side of the operation
along with indication of operation termination. May be None. along with indication of operation termination. May be None.
details: A details value to communicate to the other side of the details: A details value to communicate to the other side of the
operation along with indication of operation termination. May be None. operation along with indication of operation termination. May be None.
""" """
def __init__(self, code, details):
"""Constructor.
Args:
code: A code value to communicate to the other side of the operation
along with indication of operation termination. May be None.
details: A details value to communicate to the other side of the
operation along with indication of operation termination. May be None.
"""
super(NoSuchMethodError, self).__init__()
self.code = code self.code = code
self.details = details self.details = details

@ -42,6 +42,8 @@ from grpc.framework.foundation import abandonment # pylint: disable=unused-impo
from grpc.framework.foundation import future # pylint: disable=unused-import from grpc.framework.foundation import future # pylint: disable=unused-import
from grpc.framework.foundation import stream # pylint: disable=unused-import from grpc.framework.foundation import stream # pylint: disable=unused-import
# pylint: disable=too-many-arguments
class NoSuchMethodError(Exception): class NoSuchMethodError(Exception):
"""Raised by customer code to indicate an unrecognized method. """Raised by customer code to indicate an unrecognized method.

@ -47,7 +47,7 @@ PACKAGE_DIRECTORIES = {
SETUP_REQUIRES = ( SETUP_REQUIRES = (
'grpcio-tools>={version}'.format(version=grpc_version.VERSION),) 'grpcio-tools>={version}'.format(version=grpc_version.VERSION),)
INSTALL_REQUIRES = ('protobuf>=3.0.0', INSTALL_REQUIRES = ('protobuf>=3.2.0',
'grpcio>={version}'.format(version=grpc_version.VERSION),) 'grpcio>={version}'.format(version=grpc_version.VERSION),)
COMMAND_CLASS = { COMMAND_CLASS = {

@ -47,7 +47,7 @@ PACKAGE_DIRECTORIES = {
SETUP_REQUIRES = ( SETUP_REQUIRES = (
'grpcio-tools>={version}'.format(version=grpc_version.VERSION),) 'grpcio-tools>={version}'.format(version=grpc_version.VERSION),)
INSTALL_REQUIRES = ('protobuf>=3.0.0', INSTALL_REQUIRES = ('protobuf>=3.2.0',
'grpcio>={version}'.format(version=grpc_version.VERSION),) 'grpcio>={version}'.format(version=grpc_version.VERSION),)
COMMAND_CLASS = { COMMAND_CLASS = {

@ -56,7 +56,7 @@ INSTALL_REQUIRES = (
'grpcio>={version}'.format(version=grpc_version.VERSION), 'grpcio>={version}'.format(version=grpc_version.VERSION),
'grpcio-tools>={version}'.format(version=grpc_version.VERSION), 'grpcio-tools>={version}'.format(version=grpc_version.VERSION),
'grpcio-health-checking>={version}'.format(version=grpc_version.VERSION), 'grpcio-health-checking>={version}'.format(version=grpc_version.VERSION),
'oauth2client>=1.4.7', 'protobuf>=3.0.0', 'six>=1.10',) 'oauth2client>=1.4.7', 'protobuf>=3.2.0', 'six>=1.10',)
COMMAND_CLASS = { COMMAND_CLASS = {
# Run `preprocess` *before* doing any packaging! # Run `preprocess` *before* doing any packaging!

@ -27,6 +27,7 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
require 'etc'
require 'mkmf' require 'mkmf'
LIBDIR = RbConfig::CONFIG['libdir'] LIBDIR = RbConfig::CONFIG['libdir']
@ -80,7 +81,9 @@ ENV['BUILDDIR'] = output_dir
unless windows unless windows
puts 'Building internal gRPC into ' + grpc_lib_dir puts 'Building internal gRPC into ' + grpc_lib_dir
system("make -j -C #{grpc_root} #{grpc_lib_dir}/libgrpc.a CONFIG=#{grpc_config}") nproc = 4
nproc = Etc.nprocessors * 2 if Etc.respond_to? :nprocessors
system("make -j#{nproc} -C #{grpc_root} #{grpc_lib_dir}/libgrpc.a CONFIG=#{grpc_config}")
exit 1 unless $? == 0 exit 1 unless $? == 0
end end

@ -45,7 +45,11 @@
# out. It can be re-enabled for one build by setting the npm config # out. It can be re-enabled for one build by setting the npm config
# variable grpc_uv to true, and it can be re-enabled permanently by # variable grpc_uv to true, and it can be re-enabled permanently by
# setting it to true here. # setting it to true here.
'grpc_uv%': 'false' 'grpc_uv%': 'false',
# Some Node installations use the system installation of OpenSSL, and on
# some systems, the system OpenSSL still does not have ALPN support. This
# will let users recompile gRPC to work without ALPN.
'grpc_alpn%': 'true'
}, },
'target_defaults': { 'target_defaults': {
'include_dirs': [ 'include_dirs': [
@ -75,10 +79,16 @@
'OPENSSL_NO_ASM' 'OPENSSL_NO_ASM'
] ]
}, { }, {
# As of the beginning of 2017, we only support versions of Node with 'conditions': [
# embedded versions of OpenSSL that support ALPN ['grpc_alpn=="true"', {
'defines': [ 'defines': [
'TSI_OPENSSL_ALPN_SUPPORT=1' 'TSI_OPENSSL_ALPN_SUPPORT=1'
],
}, {
'defines': [
'TSI_OPENSSL_ALPN_SUPPORT=0'
],
}]
], ],
'include_dirs': [ 'include_dirs': [
'<(node_root_dir)/deps/openssl/openssl/include', '<(node_root_dir)/deps/openssl/openssl/include',

@ -24,7 +24,7 @@
}, },
"dependencies": { "dependencies": {
"Grpc.Core": "${settings.csharp_version}", "Grpc.Core": "${settings.csharp_version}",
"Google.Apis.Auth": "1.16.0" "Google.Apis.Auth": "1.21.0"
}, },
"frameworks": { "frameworks": {
"net45": { }, "net45": { },

@ -6,10 +6,10 @@
"Grpc.Core": { "Grpc.Core": {
"target": "project" "target": "project"
}, },
"Newtonsoft.Json": "8.0.3", "Newtonsoft.Json": "9.0.1",
"NUnit": "3.2.0", "NUnit": "3.6.0",
"NUnitLite": "3.2.0-*", "NUnitLite": "3.6.0",
"NUnit.ConsoleRunner": "3.2.0", "NUnit.ConsoleRunner": "3.6.0",
"OpenCover": "4.6.519", "OpenCover": "4.6.519",
"ReportGenerator": "2.4.4.0" "ReportGenerator": "2.4.4.0"
}, },

@ -6,8 +6,8 @@
"Grpc.Examples": { "Grpc.Examples": {
"target": "project" "target": "project"
}, },
"NUnit": "3.2.0", "NUnit": "3.6.0",
"NUnitLite": "3.2.0-*" "NUnitLite": "3.6.0"
}, },
"frameworks": { "frameworks": {
"net45": { }, "net45": { },

@ -6,15 +6,10 @@
"Grpc.Core": { "Grpc.Core": {
"target": "project" "target": "project"
}, },
"Google.Protobuf": "3.0.0" "Google.Protobuf": "3.2.0"
}, },
"frameworks": { "frameworks": {
"net45": { "net45": {},
"frameworkAssemblies": {
"System.Runtime": "",
"System.IO": ""
}
},
"netcoreapp1.0": { "netcoreapp1.0": {
"dependencies": { "dependencies": {
"Microsoft.NETCore.App": { "Microsoft.NETCore.App": {

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

Loading…
Cancel
Save