Showing preview only (2,785K chars total). Download the full file or copy to clipboard to get everything.
Repository: hyperium/tonic
Branch: master
Commit: d9a52ef67970
Files: 479
Total size: 49.9 MB
Directory structure:
gitextract_d8h12mxx/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ └── CI.yml
├── .gitignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE
├── README.md
├── SECURITY.md
├── codegen/
│ ├── Cargo.toml
│ └── src/
│ └── main.rs
├── examples/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ ├── data/
│ │ ├── gcp/
│ │ │ └── roots.pem
│ │ ├── route_guide_db.json
│ │ └── tls/
│ │ ├── ca.key
│ │ ├── ca.pem
│ │ ├── client1.key
│ │ ├── client1.pem
│ │ ├── client2.key
│ │ ├── client2.pem
│ │ ├── client_ca.key
│ │ ├── client_ca.pem
│ │ ├── create.sh
│ │ ├── openssl.cnf
│ │ ├── server.key
│ │ ├── server.pem
│ │ ├── server2.key
│ │ └── server2.pem
│ ├── helloworld-tutorial.md
│ ├── proto/
│ │ ├── attrs/
│ │ │ └── attrs.proto
│ │ ├── echo/
│ │ │ └── echo.proto
│ │ ├── googleapis/
│ │ │ └── google/
│ │ │ ├── api/
│ │ │ │ ├── annotations.proto
│ │ │ │ ├── client.proto
│ │ │ │ ├── field_behavior.proto
│ │ │ │ ├── http.proto
│ │ │ │ └── resource.proto
│ │ │ └── pubsub/
│ │ │ └── v1/
│ │ │ ├── pubsub.proto
│ │ │ └── schema.proto
│ │ ├── helloworld/
│ │ │ └── helloworld.proto
│ │ ├── routeguide/
│ │ │ └── route_guide.proto
│ │ └── unaryecho/
│ │ └── echo.proto
│ ├── routeguide-tutorial.md
│ └── src/
│ ├── authentication/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── autoreload/
│ │ └── server.rs
│ ├── blocking/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── cancellation/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── codec_buffers/
│ │ ├── client.rs
│ │ ├── common.rs
│ │ └── server.rs
│ ├── compression/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── dynamic/
│ │ └── server.rs
│ ├── dynamic_load_balance/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── gcp/
│ │ ├── README.md
│ │ └── client.rs
│ ├── grpc-web/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── h2c/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── health/
│ │ ├── README.md
│ │ └── server.rs
│ ├── helloworld/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── interceptor/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── json-codec/
│ │ ├── client.rs
│ │ ├── common.rs
│ │ └── server.rs
│ ├── load_balance/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── mock/
│ │ └── mock.rs
│ ├── multiplex/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── reflection/
│ │ └── server.rs
│ ├── richer-error/
│ │ ├── client.rs
│ │ ├── client_vec.rs
│ │ ├── server.rs
│ │ └── server_vec.rs
│ ├── routeguide/
│ │ ├── client.rs
│ │ ├── data.rs
│ │ └── server.rs
│ ├── streaming/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── tls/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── tls_client_auth/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── tls_rustls/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── tower/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── tracing/
│ │ ├── client.rs
│ │ └── server.rs
│ └── uds/
│ ├── client_standard.rs
│ ├── client_with_connector.rs
│ └── server.rs
├── flake.nix
├── grpc/
│ ├── Cargo.toml
│ ├── examples/
│ │ └── inmemory.rs
│ ├── proto/
│ │ └── echo/
│ │ └── echo.proto
│ └── src/
│ ├── attributes/
│ │ ├── linked_list.rs
│ │ └── mod.rs
│ ├── byte_str.rs
│ ├── client/
│ │ ├── channel.rs
│ │ ├── interceptor.rs
│ │ ├── load_balancing/
│ │ │ ├── child_manager.rs
│ │ │ ├── graceful_switch.rs
│ │ │ ├── mod.rs
│ │ │ ├── pick_first.rs
│ │ │ ├── registry.rs
│ │ │ ├── round_robin.rs
│ │ │ └── test_utils.rs
│ │ ├── mod.rs
│ │ ├── name_resolution/
│ │ │ ├── backoff.rs
│ │ │ ├── dns/
│ │ │ │ ├── mod.rs
│ │ │ │ └── test.rs
│ │ │ ├── mod.rs
│ │ │ └── registry.rs
│ │ ├── service_config.rs
│ │ ├── stream_util.rs
│ │ ├── subchannel.rs
│ │ └── transport/
│ │ ├── mod.rs
│ │ ├── registry.rs
│ │ └── tonic/
│ │ ├── mod.rs
│ │ └── test.rs
│ ├── core/
│ │ └── mod.rs
│ ├── credentials/
│ │ ├── call.rs
│ │ ├── client.rs
│ │ ├── dyn_wrapper.rs
│ │ ├── insecure.rs
│ │ ├── local.rs
│ │ ├── mod.rs
│ │ ├── rustls/
│ │ │ ├── client/
│ │ │ │ ├── mod.rs
│ │ │ │ └── test.rs
│ │ │ ├── key_log.rs
│ │ │ ├── mod.rs
│ │ │ ├── server/
│ │ │ │ ├── mod.rs
│ │ │ │ └── test.rs
│ │ │ └── tls_stream.rs
│ │ └── server.rs
│ ├── generated/
│ │ ├── echo_fds.rs
│ │ └── grpc_examples_echo.rs
│ ├── inmemory/
│ │ └── mod.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── rt/
│ │ ├── hyper_wrapper.rs
│ │ ├── mod.rs
│ │ └── tokio/
│ │ ├── hickory_resolver.rs
│ │ └── mod.rs
│ ├── send_future.rs
│ ├── server/
│ │ └── mod.rs
│ ├── status/
│ │ ├── server_status.rs
│ │ └── status_code.rs
│ └── status.rs
├── interop/
│ ├── Cargo.toml
│ ├── bin/
│ │ ├── client_darwin_amd64
│ │ ├── client_linux_amd64
│ │ ├── server_darwin_amd64
│ │ └── server_linux_amd64
│ ├── build.rs
│ ├── data/
│ │ ├── README.md
│ │ ├── ca.pem
│ │ ├── cert-generator/
│ │ │ ├── .gitignore
│ │ │ ├── ca.tf
│ │ │ └── server_certs.tf
│ │ ├── server1.key
│ │ └── server1.pem
│ ├── proto/
│ │ └── grpc/
│ │ └── testing/
│ │ ├── empty.proto
│ │ ├── messages.proto
│ │ └── test.proto
│ ├── src/
│ │ ├── bin/
│ │ │ ├── client.rs
│ │ │ └── server.rs
│ │ ├── client.rs
│ │ ├── client_prost.rs
│ │ ├── client_protobuf.rs
│ │ ├── lib.rs
│ │ ├── server_prost.rs
│ │ └── server_protobuf.rs
│ ├── test.sh
│ └── update_binaries.sh
├── prepare-release.sh
├── protoc-gen-rust-grpc/
│ ├── .bazelrc
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── README.md
│ ├── cmake/
│ │ └── FetchProtobuf.cmake
│ └── src/
│ ├── BUILD
│ ├── grpc_rust_generator.cc
│ ├── grpc_rust_generator.h
│ └── grpc_rust_plugin.cc
├── publish-release.sh
├── tests/
│ ├── compile/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ ├── ambiguous_methods.proto
│ │ │ ├── includee.proto
│ │ │ ├── includer.proto
│ │ │ ├── result.proto
│ │ │ ├── root_crate_path.proto
│ │ │ ├── same_name.proto
│ │ │ ├── service.proto
│ │ │ ├── skip_debug.proto
│ │ │ ├── stream.proto
│ │ │ └── use_arc_self.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ ├── ui/
│ │ │ ├── ambiguous_methods.rs
│ │ │ ├── includer.rs
│ │ │ ├── result.rs
│ │ │ ├── root_file_path.rs
│ │ │ ├── same_name.rs
│ │ │ ├── service.rs
│ │ │ ├── skip_debug.rs
│ │ │ ├── stream.rs
│ │ │ └── use_arc_self.rs
│ │ └── ui.rs
│ ├── compression/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ └── test.proto
│ │ └── src/
│ │ ├── bidirectional_stream.rs
│ │ ├── client_stream.rs
│ │ ├── compressing_request.rs
│ │ ├── compressing_response.rs
│ │ ├── lib.rs
│ │ ├── server_stream.rs
│ │ └── util.rs
│ ├── default_stubs/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ ├── test.proto
│ │ │ └── test_default.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ └── default.rs
│ ├── deprecated_methods/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ └── test.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ └── deprecated_methods.rs
│ ├── disable_comments/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ └── test.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ └── disable_comments.rs
│ ├── extern_path/
│ │ ├── my_application/
│ │ │ ├── Cargo.toml
│ │ │ ├── build.rs
│ │ │ └── src/
│ │ │ └── main.rs
│ │ ├── proto/
│ │ │ ├── my_application/
│ │ │ │ └── service.proto
│ │ │ └── uuid/
│ │ │ └── uuid.proto
│ │ └── uuid/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── integration_tests/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ ├── stream.proto
│ │ │ └── test.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ ├── client_layer.rs
│ │ ├── complex_tower_middleware.rs
│ │ ├── connect_info.rs
│ │ ├── connection.rs
│ │ ├── extensions.rs
│ │ ├── http2_keep_alive.rs
│ │ ├── http2_max_header_list_size.rs
│ │ ├── interceptor.rs
│ │ ├── load_shed.rs
│ │ ├── max_message_size.rs
│ │ ├── origin.rs
│ │ ├── routes_builder.rs
│ │ ├── status.rs
│ │ ├── streams.rs
│ │ ├── timeout.rs
│ │ └── user_agent.rs
│ ├── web/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ └── test.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ ├── grpc.rs
│ │ └── grpc_web.rs
│ ├── wellknown/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ └── wellknown.proto
│ │ └── src/
│ │ └── lib.rs
│ └── wellknown-compiled/
│ ├── Cargo.toml
│ ├── build.rs
│ ├── proto/
│ │ ├── google.proto
│ │ └── test.proto
│ └── src/
│ └── lib.rs
├── tonic/
│ ├── Cargo.toml
│ ├── benches/
│ │ └── decode.rs
│ ├── benches-disabled/
│ │ ├── README.md
│ │ ├── bench_main.rs
│ │ ├── benchmarks/
│ │ │ ├── compiled_protos/
│ │ │ │ ├── diverse_types.rs
│ │ │ │ ├── helloworld.rs
│ │ │ │ └── mod.rs
│ │ │ ├── mod.rs
│ │ │ ├── request_response.rs
│ │ │ ├── request_response_diverse_types.rs
│ │ │ └── utils.rs
│ │ └── proto/
│ │ ├── diverse_types/
│ │ │ └── diverse_types.proto
│ │ └── helloworld/
│ │ └── helloworld.proto
│ └── src/
│ ├── body.rs
│ ├── client/
│ │ ├── grpc.rs
│ │ ├── mod.rs
│ │ └── service.rs
│ ├── codec/
│ │ ├── buffer.rs
│ │ ├── compression.rs
│ │ ├── decode.rs
│ │ ├── encode.rs
│ │ └── mod.rs
│ ├── codegen.rs
│ ├── extensions.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── metadata/
│ │ ├── encoding.rs
│ │ ├── key.rs
│ │ ├── map.rs
│ │ ├── mod.rs
│ │ └── value.rs
│ ├── request.rs
│ ├── response.rs
│ ├── server/
│ │ ├── grpc.rs
│ │ ├── mod.rs
│ │ └── service.rs
│ ├── service/
│ │ ├── interceptor.rs
│ │ ├── layered.rs
│ │ ├── mod.rs
│ │ ├── recover_error.rs
│ │ └── router.rs
│ ├── status.rs
│ ├── transport/
│ │ ├── channel/
│ │ │ ├── endpoint.rs
│ │ │ ├── mod.rs
│ │ │ ├── service/
│ │ │ │ ├── add_origin.rs
│ │ │ │ ├── connection.rs
│ │ │ │ ├── connector.rs
│ │ │ │ ├── discover.rs
│ │ │ │ ├── executor.rs
│ │ │ │ ├── io.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── reconnect.rs
│ │ │ │ ├── tls.rs
│ │ │ │ └── user_agent.rs
│ │ │ ├── tls.rs
│ │ │ └── uds_connector.rs
│ │ ├── error.rs
│ │ ├── mod.rs
│ │ ├── server/
│ │ │ ├── conn.rs
│ │ │ ├── display_error_stack.rs
│ │ │ ├── incoming.rs
│ │ │ ├── io_stream.rs
│ │ │ ├── mod.rs
│ │ │ ├── service/
│ │ │ │ ├── io.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── tls.rs
│ │ │ ├── tls.rs
│ │ │ └── unix.rs
│ │ ├── service/
│ │ │ ├── grpc_timeout.rs
│ │ │ ├── mod.rs
│ │ │ └── tls.rs
│ │ └── tls.rs
│ └── util.rs
├── tonic-build/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── client.rs
│ ├── code_gen.rs
│ ├── lib.rs
│ ├── manual.rs
│ └── server.rs
├── tonic-health/
│ ├── Cargo.toml
│ ├── README.md
│ ├── proto/
│ │ └── health.proto
│ └── src/
│ ├── generated/
│ │ ├── grpc_health_v1.rs
│ │ └── grpc_health_v1_fds.rs
│ ├── lib.rs
│ └── server.rs
├── tonic-prost/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── codec.rs
│ └── lib.rs
├── tonic-prost-build/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── lib.rs
│ └── tests.rs
├── tonic-protobuf/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── tonic-protobuf-build/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ └── lib.rs
├── tonic-reflection/
│ ├── Cargo.toml
│ ├── README.md
│ ├── proto/
│ │ ├── reflection_v1.proto
│ │ └── reflection_v1alpha.proto
│ ├── src/
│ │ ├── generated/
│ │ │ ├── grpc_reflection_v1.rs
│ │ │ ├── grpc_reflection_v1alpha.rs
│ │ │ ├── reflection_v1_fds.rs
│ │ │ └── reflection_v1alpha1_fds.rs
│ │ ├── lib.rs
│ │ └── server/
│ │ ├── mod.rs
│ │ ├── v1.rs
│ │ └── v1alpha.rs
│ └── tests/
│ ├── server.rs
│ └── versions.rs
├── tonic-types/
│ ├── Cargo.toml
│ ├── README.md
│ ├── proto/
│ │ ├── error_details.proto
│ │ └── status.proto
│ └── src/
│ ├── generated/
│ │ ├── google_rpc.rs
│ │ └── types_fds.rs
│ ├── lib.rs
│ └── richer_error/
│ ├── error_details/
│ │ ├── mod.rs
│ │ └── vec.rs
│ ├── mod.rs
│ └── std_messages/
│ ├── bad_request.rs
│ ├── debug_info.rs
│ ├── error_info.rs
│ ├── help.rs
│ ├── loc_message.rs
│ ├── mod.rs
│ ├── prec_failure.rs
│ ├── quota_failure.rs
│ ├── request_info.rs
│ ├── resource_info.rs
│ └── retry_info.rs
├── tonic-web/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── call.rs
│ ├── client.rs
│ ├── layer.rs
│ ├── lib.rs
│ └── service.rs
├── tonic-xds/
│ ├── Cargo.toml
│ ├── examples/
│ │ └── gen_test_proto.rs
│ ├── proto/
│ │ └── test/
│ │ └── helloworld.proto
│ └── src/
│ ├── client/
│ │ ├── channel.rs
│ │ ├── cluster.rs
│ │ ├── endpoint.rs
│ │ ├── lb.rs
│ │ ├── mod.rs
│ │ └── route.rs
│ ├── common/
│ │ ├── async_util.rs
│ │ └── mod.rs
│ ├── lib.rs
│ ├── testutil/
│ │ ├── grpc.rs
│ │ ├── mod.rs
│ │ └── proto/
│ │ ├── helloworld.rs
│ │ └── mod.rs
│ └── xds/
│ ├── bootstrap.rs
│ ├── mod.rs
│ ├── resource/
│ │ ├── cluster.rs
│ │ ├── endpoints.rs
│ │ ├── listener.rs
│ │ ├── mod.rs
│ │ └── route_config.rs
│ ├── routing.rs
│ ├── uri.rs
│ └── xds_manager.rs
└── xds-client/
├── Cargo.toml
├── examples/
│ └── basic.rs
└── src/
├── client/
│ ├── config.rs
│ ├── mod.rs
│ ├── retry.rs
│ ├── watch.rs
│ └── worker.rs
├── codec/
│ ├── mod.rs
│ └── prost.rs
├── error.rs
├── lib.rs
├── message.rs
├── resource/
│ ├── mod.rs
│ └── prost.rs
├── runtime/
│ ├── mod.rs
│ └── tokio.rs
└── transport/
├── mod.rs
└── tonic.rs
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: 🐛 Bug Report
about: If something isn't working as expected 🤔.
---
## Bug Report
<!--
Thank you for reporting an issue.
Please fill in as much of the template below as you're able.
-->
### Version
<!--
List the versions of all `tonic` crates you are using. The easiest way to get
this information is using `cargo-tree`.
`cargo install cargo-tree`
(see install here: https://github.com/sfackler/cargo-tree)
Then:
`cargo tree | grep tonic`
-->
### Platform
<!---
Output of `uname -a` (UNIX), or version and 32 or 64-bit (Windows)
-->
### Crates
<!--
If known, please specify the affected tonic crates. Otherwise, delete this
section.
-->
### Description
<!--
Enter your issue details below this comment.
One way to structure the description:
<short summary of the bug>
I tried this code:
<code sample that causes the bug>
I expected to see this happen: <explanation>
Instead, this happened: <explanation>
-->
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: 💡 Feature Request
about: I have a suggestion (and may want to implement it 🙂)!
---
## Feature Request
### Crates
<!--
If known, please specify the tonic crate or crates the new feature should
be added to. Otherwise, delete this section.
-->
### Motivation
<!--
Please describe the use case(s) or other motivation for the new feature.
-->
### Proposal
<!--
How should the new feature be implemented, and why? Add any considered
drawbacks.
-->
### Alternatives
<!--
Are there other ways to solve this problem that you've considered? What are
their potential drawbacks? Why was the proposed solution chosen over these
alternatives?
-->
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
Thank you for your Pull Request. Please provide a description above and review
the requirements below.
If this change is intended for tonic `v0.14.x` please make this PR against that branch
otherwise, it may not get included in a relase for a long time.
Bug fixes and new features should include tests.
Contributors guide: https://github.com/hyperium/tonic/blob/master/CONTRIBUTING.md
-->
## Motivation
<!--
Explain the context and why you're making that change. What is the problem
you're trying to solve? If a new feature is being added, describe the intended
use case that feature fulfills.
-->
## Solution
<!--
Summarize the solution and provide any necessary context needed to understand
the code change.
-->
================================================
FILE: .github/workflows/CI.yml
================================================
name: CI
on:
push:
pull_request: {}
merge_group:
branches: [ "master" ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
rustfmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: hecrj/setup-rust-action@v2
with:
components: rustfmt
- run: cargo fmt --all --check
build-protoc-plugin:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macOS-latest, windows-latest]
outputs:
cache-hit: ${{ steps.cache-plugin.outputs.cache-hit }}
steps:
- uses: actions/checkout@v6
- name: Cache protoc and plugin
id: cache-plugin
uses: actions/cache@v4
with:
path: ${{ runner.temp }}/protoc-plugin
# The key changes only when plugin source files or CMake files change
key: ${{ runner.os }}-protoc-plugin-cmake-v4-${{ hashFiles('protoc-gen-rust-grpc/src/**', 'protoc-gen-rust-grpc/CMakeLists.txt', 'protoc-gen-rust-grpc/cmake/**') }}
- name: Install CMake
if: steps.cache-plugin.outputs.cache-hit != 'true'
uses: lukka/get-cmake@latest
with:
cmakeVersion: "~3.28.0"
# Building the protoc plugin from scratch takes 6–14 minutes, depending on
# the OS. This delays the execution of workflows that use the plugin in
# build.rs files. We try to avoid rebuilding the plugin if it hasn't
# changed.
- name: Build protoc plugin
if: steps.cache-plugin.outputs.cache-hit != 'true'
working-directory: ./protoc-gen-rust-grpc
shell: bash
run: |
set -e
# Create build directory
mkdir -p build
cd build
# Configure with CMake
cmake .. -DCMAKE_BUILD_TYPE=Release -DPROTOBUF_VERSION=33.0
# Build with limited parallelism to avoid OOM
cmake --build . --parallel 2
# The target path needs to match the cache config.
TARGET_PATH="${{ runner.temp }}/protoc-plugin"
mkdir -p "${TARGET_PATH}"
# Copy both protoc and the plugin
# First, find and copy protoc
PROTOC_FOUND=false
for protoc_path in "bin/protoc" "bin/protoc.exe" "bin/Release/protoc.exe" "bin/Debug/protoc.exe" "_deps/protobuf-build/protoc" "_deps/protobuf-build/protoc.exe" "_deps/protobuf-build/Release/protoc.exe" "_deps/protobuf-build/Debug/protoc.exe"; do
if [ -f "$protoc_path" ]; then
echo "Found protoc at: $protoc_path"
# Copy with explicit name to ensure it's called 'protoc' or 'protoc.exe'
if [[ "$protoc_path" == *.exe ]]; then
cp "$protoc_path" "${TARGET_PATH}/protoc.exe"
echo "Copied to: ${TARGET_PATH}/protoc.exe"
else
cp "$protoc_path" "${TARGET_PATH}/protoc"
chmod +x "${TARGET_PATH}/protoc"
echo "Copied to: ${TARGET_PATH}/protoc"
fi
PROTOC_FOUND=true
break
fi
done
if [ "$PROTOC_FOUND" = "false" ]; then
echo "Error: protoc not found in expected locations"
echo "Searching for protoc in build directory:"
find . -name "protoc" -o -name "protoc.exe" | head -20
exit 1
fi
# Copy protoc with its standard installation structure
echo "Setting up protoc installation..."
# protoc expects to find includes relative to its binary location
# Standard structure: bin/protoc and include/google/protobuf/*.proto
# First check if CMake created an install directory
if [ -d "install" ] && [ -f "install/bin/protoc" -o -f "install/bin/protoc.exe" ]; then
echo "Found CMake install directory"
cp -r install/* "${TARGET_PATH}/"
else
# Manual setup if no install directory
echo "Creating manual protoc installation structure..."
# The protoc binary should already be copied to TARGET_PATH
# Now find and copy the include files to the correct relative location
mkdir -p "${TARGET_PATH}/include"
# Find the protobuf include files
INCLUDE_FOUND=false
for include_path in "_deps/protobuf-src/src" "_deps/protobuf-build/include" "include"; do
if [ -d "$include_path/google/protobuf" ] && [ -f "$include_path/google/protobuf/descriptor.proto" ]; then
echo "Found protobuf includes at: $include_path"
cp -r "$include_path/google" "${TARGET_PATH}/include/"
INCLUDE_FOUND=true
break
fi
done
if [ "$INCLUDE_FOUND" = "false" ]; then
echo "Warning: Could not find protobuf include files"
echo "Searching for descriptor.proto:"
find . -name "descriptor.proto" -type f | grep -v "test" | head -10
fi
fi
# Then copy the plugin (handle different output locations)
if [ -f "bin/protoc-gen-rust-grpc" ]; then
cp bin/protoc-gen-rust-grpc "${TARGET_PATH}/"
elif [ -f "bin/protoc-gen-rust-grpc.exe" ]; then
cp bin/protoc-gen-rust-grpc.exe "${TARGET_PATH}/"
elif [ -f "bin/Release/protoc-gen-rust-grpc.exe" ]; then
# Windows Release build
cp bin/Release/protoc-gen-rust-grpc.exe "${TARGET_PATH}/"
elif [ -f "bin/Debug/protoc-gen-rust-grpc.exe" ]; then
# Windows Debug build (shouldn't happen with Release config, but just in case)
cp bin/Debug/protoc-gen-rust-grpc.exe "${TARGET_PATH}/"
else
echo "Error: protoc-gen-rust-grpc not found"
echo "Looking for binary in common locations..."
find . -name "protoc-gen-rust-grpc*" -type f 2>/dev/null | head -10
exit 1
fi
clippy:
runs-on: ubuntu-latest
needs: build-protoc-plugin
steps:
- uses: actions/checkout@v6
- uses: hecrj/setup-rust-action@v2
with:
components: clippy
- name: Restore protoc and plugin from cache
id: cache-plugin
uses: actions/cache@v4
with:
path: ${{ runner.temp }}/protoc-plugin
key: ${{ runner.os }}-protoc-plugin-cmake-v4-${{ hashFiles('protoc-gen-rust-grpc/src/**', 'protoc-gen-rust-grpc/CMakeLists.txt', 'protoc-gen-rust-grpc/cmake/**') }}
- name: Add protoc and plugin to PATH
shell: bash
run: |
# Use forward slashes for all paths in bash, even on Windows
PROTOC_DIR="${{ runner.temp }}/protoc-plugin"
PROTOC_DIR="${PROTOC_DIR//\\/\/}" # Convert backslashes to forward slashes
echo "${PROTOC_DIR}" >> $GITHUB_PATH
# Also set PROTOC for build scripts
if [ "${{ runner.os }}" = "Windows" ]; then
echo "PROTOC=${PROTOC_DIR}/protoc.exe" >> $GITHUB_ENV
else
echo "PROTOC=${PROTOC_DIR}/protoc" >> $GITHUB_ENV
fi
# Set the protoc include path only if it exists
if [ -d "${PROTOC_DIR}/include" ]; then
echo "PROTOC_INCLUDE=${PROTOC_DIR}/include" >> $GITHUB_ENV
fi
- uses: Swatinem/rust-cache@v2
- run: cargo clippy --workspace --all-features --all-targets
codegen:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: hecrj/setup-rust-action@v2
- uses: Swatinem/rust-cache@v2
- run: cargo run --package codegen
- run: git diff --exit-code
udeps:
runs-on: ubuntu-latest
needs: build-protoc-plugin
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly-2026-02-22
- uses: taiki-e/install-action@cargo-hack
- uses: taiki-e/install-action@cargo-udeps
- name: Restore protoc and plugin from cache
id: cache-plugin
uses: actions/cache@v4
with:
path: ${{ runner.temp }}/protoc-plugin
key: ${{ runner.os }}-protoc-plugin-cmake-v4-${{ hashFiles('protoc-gen-rust-grpc/src/**', 'protoc-gen-rust-grpc/CMakeLists.txt', 'protoc-gen-rust-grpc/cmake/**') }}
- name: Add protoc and plugin to PATH
shell: bash
run: |
# Use forward slashes for all paths in bash, even on Windows
PROTOC_DIR="${{ runner.temp }}/protoc-plugin"
PROTOC_DIR="${PROTOC_DIR//\\/\/}" # Convert backslashes to forward slashes
echo "${PROTOC_DIR}" >> $GITHUB_PATH
# Also set PROTOC for build scripts
if [ "${{ runner.os }}" = "Windows" ]; then
echo "PROTOC=${PROTOC_DIR}/protoc.exe" >> $GITHUB_ENV
else
echo "PROTOC=${PROTOC_DIR}/protoc" >> $GITHUB_ENV
fi
# Set the protoc include path only if it exists
if [ -d "${PROTOC_DIR}/include" ]; then
echo "PROTOC_INCLUDE=${PROTOC_DIR}/include" >> $GITHUB_ENV
fi
- uses: Swatinem/rust-cache@v2
- run: cargo hack udeps --workspace --exclude-features=_tls-any,tls,tls-aws-lc,tls-ring,tls-connect-info --each-feature
- run: cargo udeps --package tonic --features tls-ring,transport
- run: cargo udeps --package tonic --features tls-ring,server
- run: cargo udeps --package tonic --features tls-ring,channel
- run: cargo udeps --package tonic --features tls-aws-lc,transport
- run: cargo udeps --package tonic --features tls-aws-lc,server
- run: cargo udeps --package tonic --features tls-aws-lc,channel
- run: cargo udeps --package tonic --features tls-connect-info
check:
runs-on: ${{ matrix.os }}
needs: build-protoc-plugin
strategy:
matrix:
os: [ubuntu-latest, macOS-latest, windows-latest]
env:
RUSTFLAGS: "-D warnings"
steps:
- uses: actions/checkout@v6
- uses: hecrj/setup-rust-action@v2
- uses: taiki-e/install-action@cargo-hack
- name: Restore protoc and plugin from cache
id: cache-plugin
uses: actions/cache@v4
with:
path: ${{ runner.temp }}/protoc-plugin
key: ${{ runner.os }}-protoc-plugin-cmake-v4-${{ hashFiles('protoc-gen-rust-grpc/src/**', 'protoc-gen-rust-grpc/CMakeLists.txt', 'protoc-gen-rust-grpc/cmake/**') }}
- name: Add protoc and plugin to PATH
shell: bash
run: |
# Use forward slashes for all paths in bash, even on Windows
PROTOC_DIR="${{ runner.temp }}/protoc-plugin"
PROTOC_DIR="${PROTOC_DIR//\\/\/}" # Convert backslashes to forward slashes
echo "${PROTOC_DIR}" >> $GITHUB_PATH
# Also set PROTOC for build scripts
if [ "${{ runner.os }}" = "Windows" ]; then
echo "PROTOC=${PROTOC_DIR}/protoc.exe" >> $GITHUB_ENV
else
echo "PROTOC=${PROTOC_DIR}/protoc" >> $GITHUB_ENV
fi
# Set the protoc include path only if it exists
if [ -d "${PROTOC_DIR}/include" ]; then
echo "PROTOC_INCLUDE=${PROTOC_DIR}/include" >> $GITHUB_ENV
fi
- uses: Swatinem/rust-cache@v2
- name: Check features
run: cargo hack check --workspace --no-private --each-feature --no-dev-deps
- name: Check tonic feature powerset
run: cargo hack check --package tonic --feature-powerset --depth 2
- name: Check all targets
run: cargo check --workspace --all-targets --all-features
msrv:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: hecrj/setup-rust-action@v2
- name: Resolve MSRV aware dependencies
run: cargo update
env:
CARGO_RESOLVER_INCOMPATIBLE_RUST_VERSIONS: fallback
- name: Get MSRV from manifest file
id: msrv
run: echo "version=$(yq '.workspace.package.rust-version' Cargo.toml)" >> "$GITHUB_OUTPUT"
- uses: hecrj/setup-rust-action@v2
with:
rust-version: ${{ steps.msrv.outputs.version }}
- uses: taiki-e/install-action@cargo-no-dev-deps
- uses: Swatinem/rust-cache@v2
# we exlude crates that do not use rust-version = { workspace = true }
- run: cargo no-dev-deps --no-private check --all-features --workspace --exclude grpc --exclude tonic-protobuf\*
doc:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@nightly
- uses: dtolnay/install@cargo-docs-rs
- uses: taiki-e/install-action@cargo-hack
- uses: Swatinem/rust-cache@v2
- run: cargo +nightly hack --no-private docs-rs
env:
RUSTDOCFLAGS: "-D warnings"
test:
runs-on: ${{ matrix.os }}
needs: build-protoc-plugin
strategy:
matrix:
os: [ubuntu-latest, macOS-latest, windows-latest]
steps:
- uses: actions/checkout@v6
- uses: hecrj/setup-rust-action@v2
- name: Restore protoc and plugin from cache
id: cache-plugin
uses: actions/cache@v4
with:
path: ${{ runner.temp }}/protoc-plugin
key: ${{ runner.os }}-protoc-plugin-cmake-v4-${{ hashFiles('protoc-gen-rust-grpc/src/**', 'protoc-gen-rust-grpc/CMakeLists.txt', 'protoc-gen-rust-grpc/cmake/**') }}
- name: Check cache status
if: steps.cache-plugin.outputs.cache-hit != 'true'
run: |
echo "ERROR: Cache miss! The protoc plugin was not found in cache."
echo "This means the build-protoc-plugin job either failed or didn't run."
exit 1
- name: Add protoc and plugin to PATH
shell: bash
run: |
# Use forward slashes for all paths in bash, even on Windows
PROTOC_DIR="${{ runner.temp }}/protoc-plugin"
PROTOC_DIR="${PROTOC_DIR//\\/\/}" # Convert backslashes to forward slashes
echo "${PROTOC_DIR}" >> $GITHUB_PATH
# Also set PROTOC for build scripts
if [ "${{ runner.os }}" = "Windows" ]; then
echo "PROTOC=${PROTOC_DIR}/protoc.exe" >> $GITHUB_ENV
else
echo "PROTOC=${PROTOC_DIR}/protoc" >> $GITHUB_ENV
fi
# Set the protoc include path only if it exists
if [ -d "${PROTOC_DIR}/include" ]; then
echo "PROTOC_INCLUDE=${PROTOC_DIR}/include" >> $GITHUB_ENV
fi
- uses: taiki-e/install-action@cargo-hack
- uses: taiki-e/install-action@cargo-nextest
- uses: Swatinem/rust-cache@v2
- run: cargo nextest run --workspace --all-features
env:
QUICKCHECK_TESTS: 1000 # run a lot of quickcheck iterations
doc-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: hecrj/setup-rust-action@v2
- uses: taiki-e/install-action@cargo-hack
- uses: Swatinem/rust-cache@v2
- run: cargo hack --no-private test --doc --all-features
interop:
name: Interop Tests
runs-on: ${{ matrix.os }}
needs: build-protoc-plugin
strategy:
matrix:
os: [ubuntu-latest, macOS-latest, windows-latest]
steps:
- uses: actions/checkout@v6
- uses: hecrj/setup-rust-action@v2
- name: Restore protoc and plugin from cache
id: cache-plugin
uses: actions/cache@v4
with:
path: ${{ runner.temp }}/protoc-plugin
key: ${{ runner.os }}-protoc-plugin-cmake-v4-${{ hashFiles('protoc-gen-rust-grpc/src/**', 'protoc-gen-rust-grpc/CMakeLists.txt', 'protoc-gen-rust-grpc/cmake/**') }}
- name: Add protoc and plugin to PATH
shell: bash
run: |
# Use forward slashes for all paths in bash, even on Windows
PROTOC_DIR="${{ runner.temp }}/protoc-plugin"
PROTOC_DIR="${PROTOC_DIR//\\/\/}" # Convert backslashes to forward slashes
echo "${PROTOC_DIR}" >> $GITHUB_PATH
# Also set PROTOC for build scripts
if [ "${{ runner.os }}" = "Windows" ]; then
echo "PROTOC=${PROTOC_DIR}/protoc.exe" >> $GITHUB_ENV
else
echo "PROTOC=${PROTOC_DIR}/protoc" >> $GITHUB_ENV
fi
# Set the protoc include path only if it exists
if [ -d "${PROTOC_DIR}/include" ]; then
echo "PROTOC_INCLUDE=${PROTOC_DIR}/include" >> $GITHUB_ENV
fi
- uses: Swatinem/rust-cache@v2
- name: Run interop tests
run: ./interop/test.sh
shell: bash
- name: Run interop tests with Rustls
run: ./interop/test.sh --use_tls tls_rustls
shell: bash
semver:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: obi1kenobi/cargo-semver-checks-action@v2
with:
feature-group: all-features
external-types:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly-2025-10-18
- name: Install cargo-check-external-types
uses: taiki-e/cache-cargo-install-action@v2
with:
tool: cargo-check-external-types@0.4.0
- uses: taiki-e/install-action@cargo-hack
- uses: Swatinem/rust-cache@v2
- run: cargo hack --no-private check-external-types --all-features
env:
RUSTFLAGS: "-D warnings"
================================================
FILE: .gitignore
================================================
target/
**/*.rs.bk
Cargo.lock
tags
================================================
FILE: CHANGELOG.md
================================================
# NOTE: ths changelog is no longer used and from version `v0.13.0` onward we will be using github releases and the changes can be found [here](https://github.com/hyperium/tonic/releases).
# [0.12.3](https://github.com/hyperium/tonic/compare/v0.12.2...v0.12.3) (2024-08-29)
### Features
* **server:** Added support for grpc max_connection_age (#1865)
* **build:** Add `#[deprecated]` to deprecated client methods (#1879)
* **build:** plumb skip_debug through prost Builder and add test (#1900)
### Bug Fixes
* **build:** Revert "fix tonic-build cargo build script outputs (#1821)" which accidentally increases MSRV (#1898)
* **server:** ignore more error kinds in incoming socket stream (#1885)
* **transport**: do not shutdown server on broken connections (#1948)
# [0.12.2](https://github.com/hyperium/tonic/compare/v0.12.1...v0.12.2) (2024-08-23)
### Features
* Move TimeoutExpired out of transport (#1826)
* Move ConnectError type from transport (#1828)
* **channel:** allow setting max_header_list_size (#1835)
* **router:** Add RoutesBuilder constructor (#1855)
* **tls:** Rename tls-roots feature with tls-native-roots (#1860)
* **router:** Rename Routes::into_router with into_axum_router (#1862)
* **router:** Implement from axum::Router for Routes (#1863)
* **channel:** Re-enable TLS based on Cargo features in generated clients (#1866)
* **server:** allow setting max_header_list_size (#1870)
* **build:** Expose formatted service name (#1684)
* **reflection:** add back support for v1alpha reflection protocol (#1888)
### Bug Fixes
* **router:** Add missing unimplemented fallback to RoutesBuilder (#1864)
* **server:** Prevent server from exiting on ECONNABORTED (#1874)
* **web:** fix panic in trailer parsing on multiple trailers (#1880)
* **web:** fix empty trailer parsing causing infinite parser loop (#1883)
# [0.12.1](https://github.com/hyperium/tonic/compare/v0.12.0...v0.12.1) (2024-07-17)
### Bug Fixes
* Reduce tokio-stream feature (#1795)
# [0.12.0](https://github.com/hyperium/tonic/compare/v0.11.0...v0.12.0) (2024-07-08)
This breaking release updates tonic to the hyper `1.0` ecosystem and also updates
to prost `v0.13.0`.
### Features
* **build:** Custom codecs for generated code ([#1599](https://github.com/hyperium/tonic/issues/1599)) ([18a2b30](https://github.com/hyperium/tonic/commit/18a2b30922460be02829706cf9dd0cd1ec6a19c1))
* **channel:** Make channel feature additive ([#1574](https://github.com/hyperium/tonic/issues/1574)) ([b947e1a](https://github.com/hyperium/tonic/commit/b947e1ac0727ceb0a0267a30854ada4ba18931db))
* **codec:** Make error when not utf8 value in compression encoding ([#1768](https://github.com/hyperium/tonic/issues/1768)) ([f8e1f87](https://github.com/hyperium/tonic/commit/f8e1f87eb862676147fd6215b58c9090d259104d))
* Implement http_body::Body::size_hint for custom body ([#1713](https://github.com/hyperium/tonic/issues/1713)) ([9728c01](https://github.com/hyperium/tonic/commit/9728c01132bd64dca046675198edc751c4547966))
* Make boxed function public ([#1754](https://github.com/hyperium/tonic/issues/1754)) ([2cc868f](https://github.com/hyperium/tonic/commit/2cc868f80b20379d6635ac182f523b4971d016b7))
* Relax GrpcMethod lifetime ([#1598](https://github.com/hyperium/tonic/issues/1598)) ([68bf17d](https://github.com/hyperium/tonic/commit/68bf17d67ad71af44c34d565566c3dd58ea3ab87))
* **tls:** Add ability to add multiple ca certificates ([#1724](https://github.com/hyperium/tonic/issues/1724)) ([3457f92](https://github.com/hyperium/tonic/commit/3457f9203226f88524b31bf5d64ce6e5ec7c993c))
* **tls:** Use rustls_pki_types::CertificateDer to describe DER encoded certificate ([#1707](https://github.com/hyperium/tonic/issues/1707)) ([96a8cbc](https://github.com/hyperium/tonic/commit/96a8cbc04d0cad6d30d2944dba6b32aac8975f91))
* **tls:** Remove tls roots implicit configuration ([#1731](https://github.com/hyperium/tonic/issues/1731)) ([de73617](https://github.com/hyperium/tonic/commit/de736171f20ec5d485c26ee5eda4a9ccf5fc75e5))
* **transport:** Make service router independent from transport ([#1572](https://github.com/hyperium/tonic/issues/1572)) ([da48235](https://github.com/hyperium/tonic/commit/da482359933f52e84c0263b28a5a83ab1efe6c33))
* **transport:** Make transport server and channel independent ([#1630](https://github.com/hyperium/tonic/issues/1630)) ([654289f](https://github.com/hyperium/tonic/commit/654289fdc24f56d6845ec0ceb233deb46b640fac))
* **transport:** Rename reexported axum body ([#1752](https://github.com/hyperium/tonic/issues/1752)) ([5d7bfc2](https://github.com/hyperium/tonic/commit/5d7bfc22c590982463f2d93464b0a7fb90e17083))
* Use http::Extensions directly ([#1710](https://github.com/hyperium/tonic/issues/1710)) ([ed95d27](https://github.com/hyperium/tonic/commit/ed95d2762146f001970b74941f3bad77b7560426))
### Bug Fixes
* **tonic:** flush accumulated ready messages when status received ([#1756](https://github.com/hyperium/tonic/issues/1756)) ([d312dcc](https://github.com/hyperium/tonic/commit/d312dcc0ec362cb12f6e54072622761d7466a650)), closes [#1423](https://github.com/hyperium/tonic/issues/1423)
### BREAKING CHANGES
* `tonic` and crates updated to hyper 1.0 (#1670)
* `tonic` and crates updated to prost 0.13 (#1779)
* `tonic_reflection::server` is updated to use the generated
`tonic_reflection::pb::v1` code.
* Make compression encoding configuration more malleable (#1757)
* Removed implicit configuration of client TLS roots setup (#1731)
[v1.8.8]: https://github.com/fullstorydev/grpcurl/releases/tag/v1.8.8
[proto]: https://github.com/grpc/grpc/blob/master/src/proto/grpc/reflection/v1/reflection.proto
[grpcurl]: https://github.com/fullstorydev/grpcurl
# [0.11.0](https://github.com/hyperium/tonic/compare/v0.10.2...v0.11.0) (2024-02-08)
BREAKING CHANGES:
- Removed `NamedService` from the `transport` module, please import it via
`tonic::server::NamedService`.
- MSRV bumped to `1.70`.
### Features
- Added `zstd` compression support.
- Added connection timeout for `connecto_with_connector_lazy`.
- Upgrade rustls to `v0.22`
- Feature gate server implementation for `tonic-reflection`.
# [0.10.2](https://github.com/hyperium/tonic/compare/v0.10.1...v0.10.2) (2023-09-28)
### Bug Fixes
* **web:** Client decoding incomplete buffer bug ([#1540](https://github.com/hyperium/tonic/issues/1540)) ([83e363a](https://github.com/hyperium/tonic/commit/83e363ace6cbe20ccc2efbe1eb10a4236e4b8065))
# [0.10.1](https://github.com/hyperium/tonic/compare/v0.10.0...v0.10.1) (2023-09-21)
### Bug Fixes
* **web:** Buffer incomplete messages ([#1528](https://github.com/hyperium/tonic/issues/1528)) ([fe6f8d9](https://github.com/hyperium/tonic/commit/fe6f8d9b4953a266eb32945a67edce9558bd05b3))
# [0.10.0](https://github.com/hyperium/tonic/compare/v0.9.2...v0.10.0) (2023-09-08)
### Bug Fixes
* **codegen:** Use stream type from codegen mod ([#1446](https://github.com/hyperium/tonic/issues/1446)) ([60d776b](https://github.com/hyperium/tonic/commit/60d776b019854b6a6881d69823a36dcc18b1b4ce))
* **examples:** Use https scheme when using tls ([#1466](https://github.com/hyperium/tonic/issues/1466)) ([388b177](https://github.com/hyperium/tonic/commit/388b177d99e7b0a2c8d5eab1dee65c4dbb671db4))
* **tls:** Don't use tls w/ `http` scheme ([#1454](https://github.com/hyperium/tonic/issues/1454)) ([95e81f5](https://github.com/hyperium/tonic/commit/95e81f51fbbc32a5cf2b94ac0d7005d56b44a8d3))
### Features
* **build:** Add optional default unimplemented stubs ([#1344](https://github.com/hyperium/tonic/issues/1344)) ([aff1daf](https://github.com/hyperium/tonic/commit/aff1daf65d9a0d55b92719318eba2b5a4769c4e1))
* **core:** amortize many ready messages into fewer, larger buffers ([#1423](https://github.com/hyperium/tonic/issues/1423)) ([76eedc1](https://github.com/hyperium/tonic/commit/76eedc13d0dd891892301afa38c3dd8ae6646edf))
* **tonic-types:** add ability to extract rich error details from `google.rpc.Status` ([#1430](https://github.com/hyperium/tonic/issues/1430)) ([5fd635a](https://github.com/hyperium/tonic/commit/5fd635a30568ff629c4197c603c45b6b94750e88))
* **transport:** Add `Router::into_router` ([#1442](https://github.com/hyperium/tonic/issues/1442)) ([ea06a1b](https://github.com/hyperium/tonic/commit/ea06a1bb30bc325c7f6d7763fe48bf8b88c1c3ed))
* **transport:** Expose TcpConnectInfo fields ([#1449](https://github.com/hyperium/tonic/issues/1449)) ([74b079c](https://github.com/hyperium/tonic/commit/74b079ce752311fbe760d748804d801c385a5e7a))
* **web:** Add `GrpcWebClientService` ([#1472](https://github.com/hyperium/tonic/issues/1472)) ([dc29c17](https://github.com/hyperium/tonic/commit/dc29c17ae3ef729024e1f80c66566b09d7a01051))
## [0.9.2](https://github.com/hyperium/tonic/compare/v0.9.1...v0.9.2) (2023-04-17)
## [0.9.1](https://github.com/hyperium/tonic/compare/v0.9.0...v0.9.1) (2023-04-03)
# [0.9.0](https://github.com/hyperium/tonic/compare/v0.8.4...v0.9.0) (2023-03-31)
### Bug Fixes
* **build:** Allow Services to be named Result ([#1203](https://github.com/hyperium/tonic/issues/1203)) ([a562a3c](https://github.com/hyperium/tonic/commit/a562a3ce329a38696dfcb0d82b7102d93fb30a5c)), closes [#1156](https://github.com/hyperium/tonic/issues/1156)
* **codec:** Cancelled client streaming handling ([#1315](https://github.com/hyperium/tonic/issues/1315)) ([c8027a1](https://github.com/hyperium/tonic/commit/c8027a1385dd5d3fb6abdce7be49c46a43d4f3c2)), closes [#848](https://github.com/hyperium/tonic/issues/848)
* MetadataKey::from_bytes returns an error ([#1246](https://github.com/hyperium/tonic/issues/1246)) ([930c805](https://github.com/hyperium/tonic/commit/930c805127cada70e4e4ab03c7680214b5c2a4f5))
* **web:** Fix `enable` and update docs ([#1326](https://github.com/hyperium/tonic/issues/1326)) ([a9db219](https://github.com/hyperium/tonic/commit/a9db219e50b7d27e48cd44e76941113a36b72e26))
### Features
* add GrpcMethod extension into request for client ([#1275](https://github.com/hyperium/tonic/issues/1275)) ([7a6b20d](https://github.com/hyperium/tonic/commit/7a6b20d8ef5d31c9cc01f0cf697df1f3e28cb421))
* **build:** Builder: add {enum,message}_attributes ([#1234](https://github.com/hyperium/tonic/issues/1234)) ([ff642f9](https://github.com/hyperium/tonic/commit/ff642f9233beab322333745f9edfa9c62ae18ca4))
* **codec:** Configure max request message size ([#1274](https://github.com/hyperium/tonic/issues/1274)) ([9f716d8](https://github.com/hyperium/tonic/commit/9f716d841184b8521720c6ed941af137ca2ee6a0)), closes [#1097](https://github.com/hyperium/tonic/issues/1097)
* **core:** Default encoding/decoding limits ([#1335](https://github.com/hyperium/tonic/issues/1335)) ([ff33119](https://github.com/hyperium/tonic/commit/ff331199e45c8b53e93f1bd51ccd74dafc2146ac))
* **reflection:** Add dummy implementation for extension ([#1209](https://github.com/hyperium/tonic/issues/1209)) ([fdff111](https://github.com/hyperium/tonic/commit/fdff11115b44c4cc7e3de59ea045a193fa6881bc))
* Rename api related to protobuf ([#1224](https://github.com/hyperium/tonic/issues/1224)) ([d2542dc](https://github.com/hyperium/tonic/commit/d2542dc034e89383bd182a25a0d3235859fb10f9))
* **tls:** add an option for optional TLS client authentication ([#1163](https://github.com/hyperium/tonic/issues/1163)) ([773e4e1](https://github.com/hyperium/tonic/commit/773e4e1749daf023222f2294816b1f09d9e916a0)), closes [#687](https://github.com/hyperium/tonic/issues/687)
* **tonic:** Use NamedService without transport feature ([#1273](https://github.com/hyperium/tonic/issues/1273)) ([5acde56](https://github.com/hyperium/tonic/commit/5acde56176d928ffddbf1076e922764fb151f959))
* **transport:** Add`local_addr` to `Request o` ([#1327](https://github.com/hyperium/tonic/issues/1327)) ([b54ce23](https://github.com/hyperium/tonic/commit/b54ce2321a5cba1c32261f4eda2b27d1110b893d))
* **transport:** added support for EC keys ([#1145](https://github.com/hyperium/tonic/issues/1145)) ([17d6a4b](https://github.com/hyperium/tonic/commit/17d6a4b576c1571bb149d3e935e9a835265a80dd)), closes [#1143](https://github.com/hyperium/tonic/issues/1143)
* **types:** Add gRPC Richer Error Model support (Docs) ([#1317](https://github.com/hyperium/tonic/issues/1317)) ([69ce71e](https://github.com/hyperium/tonic/commit/69ce71efa6f4601c9e8060e87d0641a51251e9ab))
* **types:** Add gRPC Richer Error Model support (Examples) ([#1300](https://github.com/hyperium/tonic/issues/1300)) ([d471212](https://github.com/hyperium/tonic/commit/d471212ee8264ca6c5169a9893f361187e9378c9))
* **types:** Add gRPC Richer Error Model support (Help) ([#1293](https://github.com/hyperium/tonic/issues/1293)) ([d6041a9](https://github.com/hyperium/tonic/commit/d6041a99c2a216a2ebc83b7bc5a0947ba7ca869c))
* **types:** Add gRPC Richer Error Model support (LocalizedMessage) ([#1295](https://github.com/hyperium/tonic/issues/1295)) ([d54d02d](https://github.com/hyperium/tonic/commit/d54d02d3ed8bf221c0c54494b7ce692d412391a4))
* **types:** Add gRPC Richer Error Model support (PreconditionFailure) ([#1276](https://github.com/hyperium/tonic/issues/1276)) ([2378581](https://github.com/hyperium/tonic/commit/2378581850483f26fd7c1dee0a797d936b73e881))
* **types:** Add gRPC Richer Error Model support (QuotaFailure) ([#1204](https://github.com/hyperium/tonic/issues/1204)) ([03b4735](https://github.com/hyperium/tonic/commit/03b4735bb4ba7c6e84842d0515d1fd3be9d1cc13))
* **types:** Add gRPC Richer Error Model support (ResourceInfo) ([#1282](https://github.com/hyperium/tonic/issues/1282)) ([7eeda24](https://github.com/hyperium/tonic/commit/7eeda24350c5a61cae7c8e56cc0439d9c40cc77d))
* **types:** Add gRPC Richer Error Model support (RetryInfo) ([#1095](https://github.com/hyperium/tonic/issues/1095)) ([6cdb3d4](https://github.com/hyperium/tonic/commit/6cdb3d4685966b71f051e4cd67c50e1d2db402f5))
* **types:** add support for `DebugInfo` error message type ([#1179](https://github.com/hyperium/tonic/issues/1179)) ([3076e82](https://github.com/hyperium/tonic/commit/3076e8251e602ed6e98a8b3029070b33e3459109))
* **types:** Expose FILE_DESCRIPTOR_SET ([#1210](https://github.com/hyperium/tonic/issues/1210)) ([cc42d1f](https://github.com/hyperium/tonic/commit/cc42d1f88c39d87b244f863daf4ff625f6ff36df))
## [0.8.4](https://github.com/hyperium/tonic/compare/v0.8.3...v0.8.4) (2022-11-29)
### Bug Fixes
* **build:** Fix CodeGen8uilder typo ([#1165](https://github.com/hyperium/tonic/issues/1165)) ([#1166](https://github.com/hyperium/tonic/issues/1166)) ([c7476ff](https://github.com/hyperium/tonic/commit/c7476fff425b972c7966228fd38a9191e8d2ddc9))
## [0.8.3](https://github.com/hyperium/tonic/compare/v0.8.2...v0.8.3) (2022-11-28)
### Bug Fixes
* do not panic while encoding oversized bodies ([#1142](https://github.com/hyperium/tonic/issues/1142)) ([33e22bb](https://github.com/hyperium/tonic/commit/33e22bbc5ef1b74de82394c3ebfea27382419620)), closes [#1141](https://github.com/hyperium/tonic/issues/1141)
* **reflection, health:** Remove transport feature ([#1112](https://github.com/hyperium/tonic/issues/1112)) ([7153289](https://github.com/hyperium/tonic/commit/7153289b51f7770cdd00cefeceddacc4cf36df97))
### Features
* **build:** Add `build_transport` builder option ([#1130](https://github.com/hyperium/tonic/issues/1130)) ([1f5bc9b](https://github.com/hyperium/tonic/commit/1f5bc9b9d55f814d1cb83de6f43239e275122265))
* **build:** Add `CodeGenBuilder` ([#1154](https://github.com/hyperium/tonic/issues/1154)) ([c4525ba](https://github.com/hyperium/tonic/commit/c4525ba6ad21cf9db8d1857931f430cbe924aeb5))
* **build:** Add disable_comments option ([#1127](https://github.com/hyperium/tonic/issues/1127)) ([e188521](https://github.com/hyperium/tonic/commit/e1885211495e63d962bc1d00f9be6eeaab2bb901))
* Expose `Request#into_parts` and `Request#from_parts` ([#1118](https://github.com/hyperium/tonic/issues/1118)) ([b409ddd](https://github.com/hyperium/tonic/commit/b409ddd478959e239aeef3cb8715cd3ace470a8f))
* **transport:** add `from_listener` for `TcpIncoming` ([#1093](https://github.com/hyperium/tonic/issues/1093)) ([0b03b30](https://github.com/hyperium/tonic/commit/0b03b30cccc67d517b05587614405d63d942b1bb))
* **web:** Implement tower::Layer for tonic_web::Config ([#1119](https://github.com/hyperium/tonic/issues/1119)) ([40536dc](https://github.com/hyperium/tonic/commit/40536dc13428f6338610d74f7b45a5f9c87d9335))
* **web:** Removed Cors impl and replaced with tower-http's CorsLayer ([#1123](https://github.com/hyperium/tonic/issues/1123)) ([a98d719](https://github.com/hyperium/tonic/commit/a98d719fb4b0a88127504a1ab3eb472e842c6b71)), closes [#1122](https://github.com/hyperium/tonic/issues/1122)
## [0.8.2](https://github.com/hyperium/tonic/compare/v0.8.0...v0.8.2) (2022-09-28)
### Bug Fixes
* **transport:** Bump axum for CVE-2022-3212 ([#1088](https://github.com/hyperium/tonic/issues/1088)) ([cddd992](https://github.com/hyperium/tonic/commit/cddd99266682127a3fa0e5d601f56a6346369814))
### Features
* add `Result<T>` type alias for `std::result::Result<T, tonic::Status>` ([#1085](https://github.com/hyperium/tonic/issues/1085)) ([56ff45d](https://github.com/hyperium/tonic/commit/56ff45d9a36040c429753d0d118ad980fbfe3eb8))
* **build:** add `cleanup-markdown` feature flag ([#1086](https://github.com/hyperium/tonic/issues/1086)) ([c1b08df](https://github.com/hyperium/tonic/commit/c1b08dffacb67e13ce7e94a002eee8999ca7c0e5))
* **tonic:** impl `Clone` for `Status` using `Arc` ([#1076](https://github.com/hyperium/tonic/issues/1076)) ([ee3d0df](https://github.com/hyperium/tonic/commit/ee3d0dfe7556fc7e996764f650ee3351097e7309))
* **transport:** Expose hyper's H2 adaptive window on server ([#1071](https://github.com/hyperium/tonic/issues/1071)) ([919d28b](https://github.com/hyperium/tonic/commit/919d28b2b96c7c803cec131a9e36e80d2b071701))
* **types:** Add gRPC Richer Error Model support (BadRequest) ([#1068](https://github.com/hyperium/tonic/issues/1068)) ([3e40d81](https://github.com/hyperium/tonic/commit/3e40d819cfbd3d5e4e078b79e3c95a43d14d489e)), closes [/github.com/hyperium/tonic/pull/1068#discussion_r956117520](https://github.com//github.com/hyperium/tonic/pull/1068/issues/discussion_r956117520)
# [0.8.0](https://github.com/hyperium/tonic/compare/v0.7.2...v0.8.0) (2022-07-29)
### Features
* Add `Grpc::with_origin` for clients ([#1017](https://github.com/hyperium/tonic/issues/1017)) ([10f6d2f](https://github.com/hyperium/tonic/commit/10f6d2f1a9fa3969599ebd674f7be27f4f458754))
* **build:** Add option to emit rerun-if-changed instructions ([#1021](https://github.com/hyperium/tonic/issues/1021)) ([1d2083a](https://github.com/hyperium/tonic/commit/1d2083a1a690edcb3f95343edfe229339c4257b7))
* **build:** Better support for custom codecs ([#999](https://github.com/hyperium/tonic/issues/999)) ([de2e4ac](https://github.com/hyperium/tonic/commit/de2e4ac077c076736dc451f3415ea7da1a61a560))
* Decouple `NamedService` from the `transport` feature ([#969](https://github.com/hyperium/tonic/issues/969)) ([feae96c](https://github.com/hyperium/tonic/commit/feae96c5be1247af368e6ce665c8df757d298e35))
### BREAKING CHANGES
* **build:** `CODEC_PATH` moved from const to fn
## [0.7.2](https://github.com/hyperium/tonic/compare/v0.7.1...v0.7.2) (2022-05-05)
### Bug Fixes
* **build:** Reduce `Default` bound requirement ([#974](https://github.com/hyperium/tonic/issues/974)) ([4533a6e](https://github.com/hyperium/tonic/commit/4533a6e20eb889f8f13446c0edf39613fa4fe9f6))
* don't enable default features in tower ([#972](https://github.com/hyperium/tonic/issues/972)) ([b4f9634](https://github.com/hyperium/tonic/commit/b4f96343afe6106db80f41f49e576a687bfcd633))
* **transport:** Emit `HttpsUriWithoutTlsSupport` only w/ tls feat ([#996](https://github.com/hyperium/tonic/issues/996)) ([1dd5ad2](https://github.com/hyperium/tonic/commit/1dd5ad2b07810fc6eb5015c152ec737b5f0ca39c))
### Features
* Add TryFrom implementations for MetadataValue ([#990](https://github.com/hyperium/tonic/issues/990)) ([edc5a0d](https://github.com/hyperium/tonic/commit/edc5a0d88d4a392effe065dfcc1c005b6bb55b5d))
## [0.7.1](https://github.com/hyperium/tonic/compare/v0.7.0...v0.7.1) (2022-04-04)
### Features
* **transport:** Add `channel` feature flag ([#960](https://github.com/hyperium/tonic/issues/960)) ([f1ca90f](https://github.com/hyperium/tonic/commit/f1ca90f2882925c30f96ef60ccfd4fe39bc2c93b))
# [0.7.0](https://github.com/hyperium/tonic/compare/v0.6.2...v0.7.0) (2022-04-01)
### Bug Fixes
* **build:** clippy warning for must_use ([#892](https://github.com/hyperium/tonic/issues/892)) ([a337f13](https://github.com/hyperium/tonic/commit/a337f132a57dfcc262b70537cf31686519e0f73c))
* **codec:** Remove `Default` bound on `Codec` ([#894](https://github.com/hyperium/tonic/issues/894)) ([d574cfd](https://github.com/hyperium/tonic/commit/d574cfda3a692d300db02f486a1792a99b3f9f6d))
* **codec:** Return None after poll_data error ([#921](https://github.com/hyperium/tonic/issues/921)) ([d7cae70](https://github.com/hyperium/tonic/commit/d7cae702fc2284473846db7c946baf87977b7b48))
* Handle interceptor errors as responses ([#840](https://github.com/hyperium/tonic/issues/840)) ([#842](https://github.com/hyperium/tonic/issues/842)) ([bf44940](https://github.com/hyperium/tonic/commit/bf44940f9b73709a83b31e4595a3d8ad262797a3))
* **health:** Correctly implement spec for overall health ([#897](https://github.com/hyperium/tonic/issues/897)) ([2b0ffee](https://github.com/hyperium/tonic/commit/2b0ffee62034f5983f8d6dcdafccd66f780559f2))
* Return error on non https uri instead of panic ([#838](https://github.com/hyperium/tonic/issues/838)) ([ef6e245](https://github.com/hyperium/tonic/commit/ef6e245180936097e56f5f95ed8b182674f3131b))
* **tonic:** Expose h2 error instead of reason ([#883](https://github.com/hyperium/tonic/issues/883)) ([a33e15a](https://github.com/hyperium/tonic/commit/a33e15a387a6ca1844748346904d28cb4caae84b))
* **tonic:** Preserve HTTP method in interceptor ([#912](https://github.com/hyperium/tonic/issues/912)) ([e623562](https://github.com/hyperium/tonic/commit/e6235623c4707f97e9b9f7c3ba88745050a884e5))
* **transport:** connect w/ connector infailable ([#922](https://github.com/hyperium/tonic/issues/922)) ([a197c20](https://github.com/hyperium/tonic/commit/a197c20469a666164c5cba280679e55b9e9e2b6c))
* **transport:** Endpoint returns transport error ([#920](https://github.com/hyperium/tonic/issues/920)) ([ee6e726](https://github.com/hyperium/tonic/commit/ee6e726707a6839c6cabe672eb296c6118a2a1cd))
* **transport:** Make `Server::layer()` support more than one layer ([#932](https://github.com/hyperium/tonic/issues/932)) ([e30bb7e](https://github.com/hyperium/tonic/commit/e30bb7ede7e107a3181cd786533c250ba09a2fcf))
* **transport:** Make server builder more consitient ([#901](https://github.com/hyperium/tonic/issues/901)) ([6763d19](https://github.com/hyperium/tonic/commit/6763d191d267c1b9f861b96ad0f4b850e0264f4d))
* **web:** Fix error tonic-web doc url ([#928](https://github.com/hyperium/tonic/issues/928)) ([37cd483](https://github.com/hyperium/tonic/commit/37cd48304f07adf09ab61b74b6ba3c91a24d2729))
### Features
* **build:** add constructor `from_arc` for gRPC servers ([#875](https://github.com/hyperium/tonic/issues/875)) ([7179f7a](https://github.com/hyperium/tonic/commit/7179f7ae6a5186bb64e4c120302084f56c053206))
* **build:** Expose Prost generation plugin ([#947](https://github.com/hyperium/tonic/issues/947)) ([d4bd475](https://github.com/hyperium/tonic/commit/d4bd4758dd80135f89d3e559c5d7f42ccbbab504))
* **build:** use prettyplease to format output ([#890](https://github.com/hyperium/tonic/issues/890)) ([#904](https://github.com/hyperium/tonic/issues/904)) ([d6c0fc1](https://github.com/hyperium/tonic/commit/d6c0fc112b2288a080fd0a727453b24d666e3d79))
* **health:** Expose `HealthService` publically ([#930](https://github.com/hyperium/tonic/issues/930)) ([097e7e8](https://github.com/hyperium/tonic/commit/097e7e85a9079bb76bef54921f03c6f7e0ee0744))
* Implement hash for `Code` ([#917](https://github.com/hyperium/tonic/issues/917)) ([6bc7dab](https://github.com/hyperium/tonic/commit/6bc7dab8e099c8ce226a6261e545d8d131c604f0))
* **tls:** upgrade to tokio-rustls 0.23 (rustls 0.20) ([#859](https://github.com/hyperium/tonic/issues/859)) ([4548997](https://github.com/hyperium/tonic/commit/4548997080c9c34f12dc0ff83ab0e2bb35ceca9c))
* **transport:** add unix socket support in server ([#861](https://github.com/hyperium/tonic/issues/861)) ([dee2ab5](https://github.com/hyperium/tonic/commit/dee2ab52ff4a2995156a3baf5ea916b479fd1d14))
* **transport:** port router to axum ([#830](https://github.com/hyperium/tonic/issues/830)) ([6dfc20e](https://github.com/hyperium/tonic/commit/6dfc20e1db455be12b0a647533c65bbfd6ae78f2))
* **transport:** support customizing `Channel`'s async executor ([#935](https://github.com/hyperium/tonic/issues/935)) ([0859d82](https://github.com/hyperium/tonic/commit/0859d82e577fb024e39ce9b5b7356b95dcb66562))
* Update prost to 0.10 ([#948](https://github.com/hyperium/tonic/issues/948)) ([c78274e](https://github.com/hyperium/tonic/commit/c78274e3fe5763cba291a605979cd7175ad6c38f))
## [0.6.2](https://github.com/hyperium/tonic/compare/v0.6.1...v0.6.2) (2021-12-08)
### Bug Fixes
* **examples:** Fix autoreload example ([#798](https://github.com/hyperium/tonic/issues/798)) ([#818](https://github.com/hyperium/tonic/issues/818)) ([8508f36](https://github.com/hyperium/tonic/commit/8508f369c2c12b09bcd6c099a7915566603911fd))
## [0.6.1](https://github.com/hyperium/tonic/compare/v0.6.0...v0.6.1) (2021-10-27)
### Bug Fixes
* **transport:** Bump hyper to 0.14.14 ([#813](https://github.com/hyperium/tonic/issues/813)) ([2a3e9b2](https://github.com/hyperium/tonic/commit/2a3e9b2f6fa459b065c5a4ebeab5f447a3515707))
# [0.6.0](https://github.com/hyperium/tonic/compare/v0.5.2...v0.6.0) (2021-10-25)
### Bug Fixes
* **build:** Correctly convert `Empty` to `()` ([#734](https://github.com/hyperium/tonic/issues/734)) ([ff6a690](https://github.com/hyperium/tonic/commit/ff6a690cec9daca33984cabea66f9d370ac63462))
* **build:** split path types in compile ([#721](https://github.com/hyperium/tonic/issues/721)) ([53ecc1f](https://github.com/hyperium/tonic/commit/53ecc1f85e7f7eeb0dce4ab23432d6c36d8a46b0))
* **tonic:** change `connect_lazy` to be infallible ([#712](https://github.com/hyperium/tonic/issues/712)) ([2e47154](https://github.com/hyperium/tonic/commit/2e471548d89be98d26b2332d059a24a3fc15ec23))
* **tonic:** fix extensions disappearing during streaming requests ([5c1bb90](https://github.com/hyperium/tonic/commit/5c1bb90ce82ecf90843a7c959edd7ef8fc280f62)), closes [#770](https://github.com/hyperium/tonic/issues/770)
* **tonic:** Remove `Sync` requirement for streams ([#804](https://github.com/hyperium/tonic/issues/804)) ([23c1392](https://github.com/hyperium/tonic/commit/23c1392fb7e0ac50bcdedc35509917061bc858e1))
* **tonic:** Status code to set correct source on unkown error ([#799](https://github.com/hyperium/tonic/issues/799)) ([4054d61](https://github.com/hyperium/tonic/commit/4054d61e14b9794a72b48de1a051c26129ec36b1))
* **transport:** AddOrigin panic on invalid uri ([#801](https://github.com/hyperium/tonic/issues/801)) ([3ab00f3](https://github.com/hyperium/tonic/commit/3ab00f304dd204fccf00d1995e635fa6b2f8503b))
* **transport:** Correctly map hyper errors ([#629](https://github.com/hyperium/tonic/issues/629)) ([4947b07](https://github.com/hyperium/tonic/commit/4947b076f5b0b5149ee7f6144515535b85f65db5))
### Features
* **build:** Support prost's include_file option ([#774](https://github.com/hyperium/tonic/issues/774)) ([3f9ab80](https://github.com/hyperium/tonic/commit/3f9ab801f7ee50ec04ab0f73cd457898dc687e61))
* Update `prost` and friends to 0.9 ([#791](https://github.com/hyperium/tonic/issues/791)) ([09805ec](https://github.com/hyperium/tonic/commit/09805ece453047bf609b1a69c72931eae6e1144a))
## [0.5.2](https://github.com/hyperium/tonic/compare/v0.5.1...v0.5.2) (2021-08-10)
## [0.5.1](https://github.com/hyperium/tonic/compare/v0.5.0...v0.5.1) (2021-08-09)
### Bug Fixes
* **build:** allow services to be named `Service` ([#709](https://github.com/hyperium/tonic/issues/709)) ([380d81d](https://github.com/hyperium/tonic/commit/380d81dd86a4d4ab2a23a7d9c072eab67631c331))
* **build:** remove unnecessary `Debug` constraint for client streams ([#719](https://github.com/hyperium/tonic/issues/719)) ([167e8cb](https://github.com/hyperium/tonic/commit/167e8cb5b212338b0d668f5304ab19823ab94529))
### Features
* **examples:** add grpc-web example ([#710](https://github.com/hyperium/tonic/issues/710)) ([5aa8ae1](https://github.com/hyperium/tonic/commit/5aa8ae1fec27377cd4c2a41d309945d7e38087d0))
* **health:** Expose grpc_health_v1 file descriptor set ([#620](https://github.com/hyperium/tonic/issues/620)) ([6ee638d](https://github.com/hyperium/tonic/commit/6ee638d9409144dc1c587283f47994ba9f4b8efd))
* **tonic:** add `Interceptor` trait ([#713](https://github.com/hyperium/tonic/issues/713)) ([8c8f4d1](https://github.com/hyperium/tonic/commit/8c8f4d12515643050f47227894c98e226b01f924))
* **transport:** Add `Connected` impl for `DuplexStream` ([#722](https://github.com/hyperium/tonic/issues/722)) ([0e33a02](https://github.com/hyperium/tonic/commit/0e33a0241e642b402a2215d30a8bfc0de2b168d2))
# [0.5.0](https://github.com/hyperium/tonic/compare/v0.4.3...v0.5.0) (2021-07-08)
### Bug Fixes
* **build:** fix `with_interceptor` not building on Rust 1.51 ([#669](https://github.com/hyperium/tonic/issues/669)) ([9478fac](https://github.com/hyperium/tonic/commit/9478fac97984cf8291bf89c55eb9a02a06889e03))
* **codec:** Fix streaming reponses w/ many status ([#689](https://github.com/hyperium/tonic/issues/689)) ([737ace3](https://github.com/hyperium/tonic/commit/737ace393d3d11fb179af939e5f1a5d16ebc2b82)), closes [#681](https://github.com/hyperium/tonic/issues/681)
* **codec:** improve error message for invalid compression flag ([#663](https://github.com/hyperium/tonic/issues/663)) ([9cc14b7](https://github.com/hyperium/tonic/commit/9cc14b79fba9e789e215f7ea3fa40ccfaecc8e59))
* **examples:** Fix tower examples ([#624](https://github.com/hyperium/tonic/issues/624)) ([4a917a3](https://github.com/hyperium/tonic/commit/4a917a32f05c70c99d608be5ae3fc58f130ee4df))
* **tonic:** don't include error's cause in Display impl ([#633](https://github.com/hyperium/tonic/issues/633)) ([31a3468](https://github.com/hyperium/tonic/commit/31a34681c7ba606e27615859d4b65dfcdcaa6f38))
* **tonic:** don't remove reserved headers in interceptor ([#701](https://github.com/hyperium/tonic/issues/701)) ([6711b80](https://github.com/hyperium/tonic/commit/6711b8067457ed31f1844e3ec6571ef0c4589325))
* **tonic:** make `Interceptor` `UnwindSafe` ([#641](https://github.com/hyperium/tonic/issues/641)) ([57509d3](https://github.com/hyperium/tonic/commit/57509d321ba49e6e9189efef345d59089875dff8))
* **transport:** remove needless `BoxFuture` ([#644](https://github.com/hyperium/tonic/issues/644)) ([74ad0a9](https://github.com/hyperium/tonic/commit/74ad0a998fedb2507f6b2f035b961eb9bac5b494))
* **web:** fix compilation ([#670](https://github.com/hyperium/tonic/issues/670)) ([e199387](https://github.com/hyperium/tonic/commit/e1993877c430906500aeda9ab1e3413e68ed483d))
### Features
* **build:** support adding attributes to clients and servers ([#684](https://github.com/hyperium/tonic/issues/684)) ([a948a8f](https://github.com/hyperium/tonic/commit/a948a8f884705b9f2a6df5c86d07cc6eb0bb1b7c))
* **codec:** compression support ([#692](https://github.com/hyperium/tonic/issues/692)) ([0583cff](https://github.com/hyperium/tonic/commit/0583cff80f57ba071295416ee8828c3430851d0d))
* **metadata:** expose `IterMut` and `ValuesMut` ([#639](https://github.com/hyperium/tonic/issues/639)) ([b0ec3ea](https://github.com/hyperium/tonic/commit/b0ec3ead344df44fc17e5ad22398ed2464768e63))
* **metadata:** remove manual `Send + Sync` impls for metadata types ([#640](https://github.com/hyperium/tonic/issues/640)) ([e97f518](https://github.com/hyperium/tonic/commit/e97f5180250a567aead16fe9a8644216edc4bbb3))
* **tonic-web:** implement grpc <-> grpc-web protocol translation ([#455](https://github.com/hyperium/tonic/issues/455)) ([c309063](https://github.com/hyperium/tonic/commit/c309063254dff42fd05afc5e56b0b0371b905758))
* **tonic:** add `h2::Error` as a `source` for `Status` ([#612](https://github.com/hyperium/tonic/issues/612)) ([b90bb7b](https://github.com/hyperium/tonic/commit/b90bb7bbc012207451fe2788a8efd69023312425))
* **tonic:** add `Request` and `Response` extensions ([#642](https://github.com/hyperium/tonic/issues/642)) ([352b0f5](https://github.com/hyperium/tonic/commit/352b0f584be33bc49ca266698c9224d16a6825ff))
* **tonic:** expose setting for `http2_adaptive_window` ([#657](https://github.com/hyperium/tonic/issues/657)) ([12815d0](https://github.com/hyperium/tonic/commit/12815d0a1d558eb9f661a85354336b04df1f5bab))
* **tonic:** implement `From<Code>` for `i32` ([f33316d](https://github.com/hyperium/tonic/commit/f33316d5b32f6a44fa23ea12851f502c48bac5ea))
* **tonic:** make it easier to add tower middleware to servers ([#651](https://github.com/hyperium/tonic/issues/651)) ([4d2667d](https://github.com/hyperium/tonic/commit/4d2667d1cb1b938756d20dafa3cccae1db23a831))
* **tonic:** pass `trace_fn` the request rather than just the headers ([#634](https://github.com/hyperium/tonic/issues/634)) ([7862a22](https://github.com/hyperium/tonic/commit/7862a2259db8dc1af440604c6c582487a59a2709))
* **tonic:** Use `BoxBody` from `http-body` crate ([#622](https://github.com/hyperium/tonic/issues/622)) ([4dda4cb](https://github.com/hyperium/tonic/commit/4dda4cbcca88fa46a7d8a6e4eabfb6d7c333617a))
* **transport:** Add `connect_with_connector_lazy` ([#696](https://github.com/hyperium/tonic/issues/696)) ([2a46ff5](https://github.com/hyperium/tonic/commit/2a46ff5c96415b217700353dadba74a80e5ad88c)), closes [#695](https://github.com/hyperium/tonic/issues/695)
* **transport:** Add a tls-webpki-roots feature to add trust roots from webpki-roots ([#660](https://github.com/hyperium/tonic/issues/660)) ([32173dc](https://github.com/hyperium/tonic/commit/32173dc7f6521bad8f26b055b6a86d807348f151))
* **transport:** add connect timeout to `Endpoint` ([#662](https://github.com/hyperium/tonic/issues/662)) ([2b60a00](https://github.com/hyperium/tonic/commit/2b60a00614c5c4260ce0acaaa599da89bebfd267))
* **transport:** provide generic access to connect info ([#647](https://github.com/hyperium/tonic/issues/647)) ([e5e3118](https://github.com/hyperium/tonic/commit/e5e311853bff347355722bc829d40f54e8954aee))
## [0.4.3](https://github.com/hyperium/tonic/compare/v0.4.2...v0.4.3) (2021-04-29)
### Features
* **tonic:** Add `Request::set_timeout` ([#615](https://github.com/hyperium/tonic/issues/615)) ([dae31d0](https://github.com/hyperium/tonic/commit/dae31d0e1cfafaaad9d634d7c0022c65ab76d7e1))
* **transport:** Support timeouts with "grpc-timeout" header ([#606](https://github.com/hyperium/tonic/issues/606)) ([9ff4f7b](https://github.com/hyperium/tonic/commit/9ff4f7b8e418278a923a86bb925e3f3e189ca7e0))
## [0.4.2](https://github.com/hyperium/tonic/compare/v0.4.1...v0.4.2) (2021-04-13)
### Bug Fixes
* **codec:** Allocate inbound buffer once ([#578](https://github.com/hyperium/tonic/issues/578)) ([1d2754f](https://github.com/hyperium/tonic/commit/1d2754feba6b49bfc813f41e8e8e42ffaf8ab0dd))
* **reflection:** Depend on correct version of build ([#582](https://github.com/hyperium/tonic/issues/582)) ([db09093](https://github.com/hyperium/tonic/commit/db0909382b8ab1a385c1352feeea663844b7d799))
### Features
* **build:** Add `prostoc_args` ([#577](https://github.com/hyperium/tonic/issues/577)) ([480a794](https://github.com/hyperium/tonic/commit/480a79409c4cb9a1c680e57d0f74ad1d4f18beaa))
* Expose status constructors ([#579](https://github.com/hyperium/tonic/issues/579)) ([0d05aa0](https://github.com/hyperium/tonic/commit/0d05aa0d02bd3037e81c72dcf7fa5168d5a62097))
* **health:** Expose proto and client ([#471](https://github.com/hyperium/tonic/issues/471)) ([#602](https://github.com/hyperium/tonic/issues/602)) ([49f6137](https://github.com/hyperium/tonic/commit/49f613767341656cad1cc4883ff0e89b03d378ae))
### Reverts
* Revert "Remove grpc-timeout header from reserved headers (#603)" ([7aaa2f8](https://github.com/hyperium/tonic/commit/7aaa2f85d991d875673825fd76931d0a4f3c86b0)), closes [#603](https://github.com/hyperium/tonic/issues/603)
## [0.4.1](https://github.com/hyperium/tonic/compare/v0.4.0...v0.4.1) (2021-03-16)
### Bug Fixes
* Depend on at least tower 0.4.4 ([#554](https://github.com/hyperium/tonic/issues/554)) ([ca3b9a1](https://github.com/hyperium/tonic/commit/ca3b9a1df12f32a425926a6cd7d04e1692f8f503)), closes [#553](https://github.com/hyperium/tonic/issues/553) [#552](https://github.com/hyperium/tonic/issues/552) [#553](https://github.com/hyperium/tonic/issues/553) [#552](https://github.com/hyperium/tonic/issues/552)
### Features
* **build:** Add disable_package_emission option to tonic-build ([#556](https://github.com/hyperium/tonic/issues/556)) ([4f5e160](https://github.com/hyperium/tonic/commit/4f5e160679bf1ac37c7d3094a65690ce59986fc3))
* **build:** Support compiling well-known protobuf types ([#522](https://github.com/hyperium/tonic/issues/522)) ([61555ff](https://github.com/hyperium/tonic/commit/61555ff2b5b76e4e3172717354aed1e6f31d6611))
* **build:** Use `RUSTFMT` to find `rustfmt` binary ([#566](https://github.com/hyperium/tonic/issues/566)) ([ea56e2e](https://github.com/hyperium/tonic/commit/ea56e2e2b89d45c95c60152cbe5e4338e1c997fd))
* Implement gRPC Reflection Service ([#340](https://github.com/hyperium/tonic/issues/340)) ([c54f247](https://github.com/hyperium/tonic/commit/c54f24721c669f0784694568f387bba6bec98e12))
# [0.4.0](https://github.com/hyperium/tonic/compare/v0.3.1...v0.4.0) (2021-01-15)
### Bug Fixes
* **build:** Add content-type for generated unimplemented service ([#441](https://github.com/hyperium/tonic/issues/441)) ([62c1230](https://github.com/hyperium/tonic/commit/62c1230117bcaa6f45cb0fa0697b89b9255a94a5))
* **build:** Match namespace code with other generated packages ([#472](https://github.com/hyperium/tonic/issues/472)) ([1b03ece](https://github.com/hyperium/tonic/commit/1b03ece2a81cb7e8b1922b3c3c1f496bd402d76c))
* gracefully handle bad native certs ([#520](https://github.com/hyperium/tonic/issues/520)) ([fe4d5b9](https://github.com/hyperium/tonic/commit/fe4d5b9d9a0fdcf414bbe31c2fcad59e8cc03da8)), closes [#519](https://github.com/hyperium/tonic/issues/519)
* **transport:** Add content-type for Unimplemented ([#434](https://github.com/hyperium/tonic/issues/434)) ([594a542](https://github.com/hyperium/tonic/commit/594a542b8a9e8f9f4c3bd1d0a08e87ce74a850e5))
* **transport:** reconnect lazy connections after first failure ([#458](https://github.com/hyperium/tonic/issues/458)) ([e9910d1](https://github.com/hyperium/tonic/commit/e9910d10a7c1287a2247a236b45dbf31eceb08bd)), closes [#452](https://github.com/hyperium/tonic/issues/452)
* **transport:** return Poll::ready until error is consumed ([#536](https://github.com/hyperium/tonic/issues/536)) ([dafea9a](https://github.com/hyperium/tonic/commit/dafea9adeec5626ee780bc3ad7dc69691db51a82))
* fix(transport) Do not panic when building and Endpoint with an invali… (#438) ([26ce9d1](https://github.com/hyperium/tonic/commit/26ce9d12bf1765e5a7acb07cab05b6bd75bd4e4d)), closes [#438](https://github.com/hyperium/tonic/issues/438)
### Features
* **tonic:** implement From<io::Error> for Status ([#500](https://github.com/hyperium/tonic/issues/500)) ([fc86563](https://github.com/hyperium/tonic/commit/fc86563b369d0b73a79d3e8dc9a84d5ce1513303))
* **transport:** Add `Router::into_service` ([#419](https://github.com/hyperium/tonic/issues/419)) ([37f6733](https://github.com/hyperium/tonic/commit/37f6733f85a42e828c124026c3a0f21919549b12))
* **transport:** add max http2 frame size to server. ([#529](https://github.com/hyperium/tonic/issues/529)) ([31936e0](https://github.com/hyperium/tonic/commit/31936e0513a41e83c8137786bd417fe57ecd05eb)), closes [#264](https://github.com/hyperium/tonic/issues/264)
* **transport:** add user-agent header to client requests. ([#457](https://github.com/hyperium/tonic/issues/457)) ([d4899df](https://github.com/hyperium/tonic/commit/d4899df83287a4eb1a91754c2e2955000d13c5f4)), closes [#453](https://github.com/hyperium/tonic/issues/453)
* **transport:** Connect lazily in the load balanced channel ([#493](https://github.com/hyperium/tonic/issues/493)) ([2e964c7](https://github.com/hyperium/tonic/commit/2e964c78c666ecd6e6cfc37689d30300cad81f4c))
* **transport:** expose HTTP2 server keepalive interval and timeout ([#486](https://github.com/hyperium/tonic/issues/486)) ([2b9cdb9](https://github.com/hyperium/tonic/commit/2b9cdb9779eb5cb7d3862e1ce95ab63f847ec223)), closes [#474](https://github.com/hyperium/tonic/issues/474)
* **transport:** Fix TLS accept w/ peer certs ([#535](https://github.com/hyperium/tonic/issues/535)) ([41c51f1](https://github.com/hyperium/tonic/commit/41c51f1c61ac957e439ced4302f09160c850787e))
* **transport:** Move error! to debug! ([#537](https://github.com/hyperium/tonic/issues/537)) ([a7778ad](https://github.com/hyperium/tonic/commit/a7778ad16611b7ade64c33256eecf9825408f06a))
### BREAKING CHANGES
* `TryFrom` API has been changed.
## [0.3.1](https://github.com/hyperium/tonic/compare/v0.3.0...v0.3.1) (2020-08-20)
### Bug Fixes
* **transport:** Return connection error on `Channel::connect` ([#413](https://github.com/hyperium/tonic/issues/413)) ([2ea17b2](https://github.com/hyperium/tonic/commit/2ea17b2ecfc40a20f4d9608f807b3d099a8f415d)), closes [#403](https://github.com/hyperium/tonic/issues/403)
# [0.3.0](https://github.com/hyperium/tonic/compare/v0.2.1...v0.3.0) (2020-07-13)
### Bug Fixes
* `Status::details` leaking base64 encoding ([#395](https://github.com/hyperium/tonic/issues/395)) ([2c4c544](https://github.com/hyperium/tonic/commit/2c4c544d902c588fc0654910fba1f0d21d78eab3)), closes [#379](https://github.com/hyperium/tonic/issues/379)
* **build:** Allow empty packages ([#382](https://github.com/hyperium/tonic/issues/382)) ([f085aba](https://github.com/hyperium/tonic/commit/f085aba302001986fd04219d2843f659f73c4031)), closes [#381](https://github.com/hyperium/tonic/issues/381)
* **build:** Make generated server service public ([#347](https://github.com/hyperium/tonic/issues/347)) ([8cd6f05](https://github.com/hyperium/tonic/commit/8cd6f0506429cfbe59e63b0216f208482d12358a))
* Remove uses of pin_project::project attribute ([#367](https://github.com/hyperium/tonic/issues/367)) ([5bda615](https://github.com/hyperium/tonic/commit/5bda6156328bd2c94bc274588871b666f1b72d6e))
* **transport:** Propagate errors in tls_config instead of unwrap/panic ([#385](https://github.com/hyperium/tonic/issues/385)) ([3b9d6a6](https://github.com/hyperium/tonic/commit/3b9d6a6262b62f30b8c9953f0da8e403be53216e))
### Features
* Add `Display` implementation for `Code` ([#386](https://github.com/hyperium/tonic/issues/386)) ([ab1de44](https://github.com/hyperium/tonic/commit/ab1de44771f3fa6ac283485bdbf1035d6407ac1a))
* Add `Status::to_http` ([#376](https://github.com/hyperium/tonic/issues/376)) ([327b4ff](https://github.com/hyperium/tonic/commit/327b4fffa3381345ee4620df7e9998efe2aa9454))
* Add metadata to error responses ([#348](https://github.com/hyperium/tonic/issues/348)) ([372da52](https://github.com/hyperium/tonic/commit/372da52e96114ca76cc221f3c598be82bfae970c))
* add new method get_uri for Endpoint ([#371](https://github.com/hyperium/tonic/issues/371)) ([54d7a7a](https://github.com/hyperium/tonic/commit/54d7a7af6b6530b80353c5741586c38cca8382c9))
* **codec:** Improve compression flag log ([#374](https://github.com/hyperium/tonic/issues/374)) ([d68dd36](https://github.com/hyperium/tonic/commit/d68dd365321764aceaf4e37a106a519797926495))
* **transport:** Add Endpoint::connect_lazy method ([#392](https://github.com/hyperium/tonic/issues/392)) ([ec9046d](https://github.com/hyperium/tonic/commit/ec9046dfc23d63828363d9555cd7b96811ad442d)), closes [#167](https://github.com/hyperium/tonic/issues/167)
* **transport:** Add optional service methods ([#275](https://github.com/hyperium/tonic/issues/275)) ([2b997b0](https://github.com/hyperium/tonic/commit/2b997b0c5f37d69f3cd8b5b566b64df110d9f4eb))
* **transport:** Dynamic load balancing ([#341](https://github.com/hyperium/tonic/issues/341)) ([85ae0a4](https://github.com/hyperium/tonic/commit/85ae0a4733b9e99edaa05e65160d98f21f288fc1))
* **types:** Add `tonic-types` crate ([#391](https://github.com/hyperium/tonic/issues/391)) ([ea7fe66](https://github.com/hyperium/tonic/commit/ea7fe66b145e01891f1c1f16d247e02524d98fae))
## [0.2.1](https://github.com/hyperium/tonic/compare/v0.2.0...v0.2.1) (2020-05-07)
### Bug Fixes
* base64 encode details header ([#345](https://github.com/hyperium/tonic/issues/345)) ([e683ffe](https://github.com/hyperium/tonic/commit/e683ffef1fcbe0ace9cc696232489f5f6600e83f))
* **build:** Remove ambiguity in service method call ([#327](https://github.com/hyperium/tonic/issues/327)) ([5d56daa](https://github.com/hyperium/tonic/commit/5d56daa721cfb18edc74cf50db4270e2c8461fc9))
* **transport:** Apply tls-connector for discovery when applicable ([#334](https://github.com/hyperium/tonic/issues/334)) ([#338](https://github.com/hyperium/tonic/issues/338)) ([99fbe22](https://github.com/hyperium/tonic/commit/99fbe22e7c1340d6be9ee5d3ae9738850881af61))
### Features
* **transport:** Add AsRef impl for Certificate ([#326](https://github.com/hyperium/tonic/issues/326)) ([d2ad8df](https://github.com/hyperium/tonic/commit/d2ad8df629a349cc151a0a4ede96f04356f73839))
# [0.2.0](https://github.com/hyperium/tonic/compare/v0.1.1...v0.2.0) (2020-04-01)
### Bug Fixes
* **build:** Allow non_camel_case_types on codegen structs ([224280d](https://github.com/hyperium/tonic/commit/224280dfff8944e9e553337416d23d6e5a050945)), closes [#295](https://github.com/hyperium/tonic/issues/295)
* **build:** Don't replace extern_paths ([#261](https://github.com/hyperium/tonic/issues/261)) ([1b3d107](https://github.com/hyperium/tonic/commit/1b3d107206136312a2536d3b72748c52191d99b1))
* **build:** Ignore non `.rs` files with rustfmt ([#284](https://github.com/hyperium/tonic/issues/284)) ([7dfa2a2](https://github.com/hyperium/tonic/commit/7dfa2a277b593e008cea53eef7163ca59a06c56a)), closes [#283](https://github.com/hyperium/tonic/issues/283)
* **build:** Implement Debug for client struct ([6dbe88d](https://github.com/hyperium/tonic/commit/6dbe88d445e378fff48d05083c23baeb2020cb2d)), closes [#298](https://github.com/hyperium/tonic/issues/298)
* **build:** Remove debug println! ([#287](https://github.com/hyperium/tonic/issues/287)) ([e2c2be2](https://github.com/hyperium/tonic/commit/e2c2be2f084b7c1ef4e93f6994cb9c728de0c1ed))
* **build:** Server service uses generic body bound ([#306](https://github.com/hyperium/tonic/issues/306)) ([5758b75](https://github.com/hyperium/tonic/commit/5758b758b2d44059b0149a31542d11589999a789))
* **health:** Set referenced version of tonic ([59c7788](https://github.com/hyperium/tonic/commit/59c77888464a0302993dbe07fed7c1848b415f8f))
* **metadata:** Remove deprecated error description ([61e0429](https://github.com/hyperium/tonic/commit/61e0429ae810354363835c36a046b5113b3c74b4))
* **transport:** Handle tls accepting on task ([#320](https://github.com/hyperium/tonic/issues/320)) ([04a8c0c](https://github.com/hyperium/tonic/commit/04a8c0c82a4007f48c3bf3539a3f2312746fedd1))
### Features
* Add Status with Details Constructor ([#308](https://github.com/hyperium/tonic/issues/308)) ([cfd59db](https://github.com/hyperium/tonic/commit/cfd59dbb342a8b7d216f4856e13d24b564c606f3))
* **build:** Add support for custom prost config ([#318](https://github.com/hyperium/tonic/issues/318)) ([202093c](https://github.com/hyperium/tonic/commit/202093c31715b52997c6c206c758924ff5f69bc8))
* **build:** Decouple codgen from `prost` ([#170](https://github.com/hyperium/tonic/issues/170)) ([f65cda1](https://github.com/hyperium/tonic/commit/f65cda1ea0a190fe07c4f8d91473baad9a6f1f77))
* **health:** Add tonic-health server impl ([da92dbf](https://github.com/hyperium/tonic/commit/da92dbf8aa885ea0ea05755e9432532fc980e353)), closes [#135](https://github.com/hyperium/tonic/issues/135) [#135](https://github.com/hyperium/tonic/issues/135)
* **transport:** Expose http2 keep-alive support ([#307](https://github.com/hyperium/tonic/issues/307)) ([012fa3c](https://github.com/hyperium/tonic/commit/012fa3cb4a0e010dafa28305416fab6c4278fc7b))
## [0.1.1](https://github.com/hyperium/tonic/compare/v0.1.0...v0.1.1) (2020-01-20)
### Bug Fixes
* **build:** Typo with client mod docstring ([#237](https://github.com/hyperium/tonic/issues/237)) ([5fc6762](https://github.com/hyperium/tonic/commit/5fc6762435494d8df023bea8e35a5d20d81f2f3b))
* **transport:** Add Connected impl for TcpStream ([#245](https://github.com/hyperium/tonic/issues/245)) ([cfdf0af](https://github.com/hyperium/tonic/commit/cfdf0aff549196af0c3b7f6e531dbeacfb6990dc))
* **transport:** Use Uri host if no domain for tls ([#244](https://github.com/hyperium/tonic/issues/244)) ([6de0b4d](https://github.com/hyperium/tonic/commit/6de0b4d26fd82b4d1303080b0ba8c4db2d4f0fd1))
# [0.1.0](https://github.com/hyperium/tonic/compare/v0.1.0-beta.1...v0.1.0) (2020-01-14)
### Bug Fixes
* **build:** Remove default impl for Server traits ([#229](https://github.com/hyperium/tonic/issues/229)) ([a41f55a](https://github.com/hyperium/tonic/commit/a41f55ab9dfe77fca920b3c2e89343c7ce963225))
* **transport:** Improve `Error` type ([#217](https://github.com/hyperium/tonic/issues/217)) ([ec1f37e](https://github.com/hyperium/tonic/commit/ec1f37e4b46279d20f4fadafa5bf30cfb729fa42))
### chore
* rename ServiceName -> NamedService ([#233](https://github.com/hyperium/tonic/issues/233)) ([6ee2ed9](https://github.com/hyperium/tonic/commit/6ee2ed9b4ff30c0517d70908c6348a633dab5b91))
### Features
* Add gRPC interceptors ([#232](https://github.com/hyperium/tonic/issues/232)) ([eba7ec7](https://github.com/hyperium/tonic/commit/eba7ec7b32fb96938cbdc3d2dfd91c238afda0dc))
* **build:** Add extern_path config support ([#223](https://github.com/hyperium/tonic/issues/223)) ([e034288](https://github.com/hyperium/tonic/commit/e034288c3739467238aee54fdbe0a2a3a87bf824))
* **codec:** Introduce `Decoder/Encoder` traits ([#208](https://github.com/hyperium/tonic/issues/208)) ([0fa2bf1](https://github.com/hyperium/tonic/commit/0fa2bf1cea9d1166d49e40f2211268611b6993de))
* **transport:** Add `serve_with_incoming_shutdown` ([#220](https://github.com/hyperium/tonic/issues/220)) ([a66595b](https://github.com/hyperium/tonic/commit/a66595bfe3c146daaa437bddd5ce3db4542b1bf6))
* **transport:** Add server side peer cert support ([#228](https://github.com/hyperium/tonic/issues/228)) ([af807c3](https://github.com/hyperium/tonic/commit/af807c3ccd283cee0e424e75298cd176424767ca))
### BREAKING CHANGES
* Rename `ServiceName` to `NamedService`.
* removed `interceptor_fn` and `intercep_headers_fn` from `transport` in favor of using `tonic::Interceptor`.
* **codec:** Add new `Decoder/Encoder` traits and use `EncodeBuf/DecodeBuf` over `BytesMut` directly.
* **build:** remove default implementations for server traits.
# [0.1.0-beta.1](https://github.com/hyperium/tonic/compare/v0.1.0-alpha.5...v0.1.0-beta.1) (2019-12-19)
### Bug Fixes
* **build:** Allow creating multiple services in the same package ([#173](https://github.com/hyperium/tonic/issues/173)) ([0847b67](https://github.com/hyperium/tonic/commit/0847b67c4eb66a814c8c447a57fade2552e64a85))
* **build:** Prevent duplicated client/server generated code ([#121](https://github.com/hyperium/tonic/issues/121)) ([b02b4b2](https://github.com/hyperium/tonic/commit/b02b4b238bfee96b886609396b957e2592477ecb))
* **build:** Remove async ready ([#185](https://github.com/hyperium/tonic/issues/185)) ([97d5363](https://github.com/hyperium/tonic/commit/97d5363e2b2aee456edc5db4b5b53316c8b40745))
* **build:** snake_case service names ([#190](https://github.com/hyperium/tonic/issues/190)) ([3a5c66d](https://github.com/hyperium/tonic/commit/3a5c66d5f236eaece05dbd9fd1e1a00a3ab98259))
* **docs:** typo in lib.rs ([#142](https://github.com/hyperium/tonic/issues/142)) ([c63c107](https://github.com/hyperium/tonic/commit/c63c107560db165303c369487006b3507a0e7e07))
* **examples:** Remove use of VecDeque as a placeholder type ([#143](https://github.com/hyperium/tonic/issues/143)) ([354d4fd](https://github.com/hyperium/tonic/commit/354d4fdc35dc51575f4c685fc04354f2058061ff))
* Sanitize custom metadata ([#138](https://github.com/hyperium/tonic/issues/138)) ([f9502df](https://github.com/hyperium/tonic/commit/f9502dfd7ef306fff86c83b711bc96623555ef5c))
* **transport:** Fix infinite recursion in `poll_ready` ([#192](https://github.com/hyperium/tonic/issues/192)) ([c99d13c](https://github.com/hyperium/tonic/commit/c99d13c6e669be3a6ecf428ae32d4b937393738a)), closes [#184](https://github.com/hyperium/tonic/issues/184) [#191](https://github.com/hyperium/tonic/issues/191)
* **transport:** Fix lazily reconnecting ([#187](https://github.com/hyperium/tonic/issues/187)) ([0505dff](https://github.com/hyperium/tonic/commit/0505dff65a18c162c3ae398d42ed20ac54351439)), closes [#167](https://github.com/hyperium/tonic/issues/167)
* **transport:** Load balance connecting panic ([#128](https://github.com/hyperium/tonic/issues/128)) ([23e7695](https://github.com/hyperium/tonic/commit/23e7695800d8f22ee8e0ba7456f5ffc4b19430c3)), closes [#127](https://github.com/hyperium/tonic/issues/127)
* **transport:** Remove support for OpenSSL ([#141](https://github.com/hyperium/tonic/issues/141)) ([8506050](https://github.com/hyperium/tonic/commit/85060500f3a8f91ed47c632e07896c9e5567629a))
* **transport:** Remove with_rustls for tls config ([#188](https://github.com/hyperium/tonic/issues/188)) ([502491a](https://github.com/hyperium/tonic/commit/502491a59031dc0aa6e51a764f8edab04ab85581))
* **transport:** Update builders to move self ([#132](https://github.com/hyperium/tonic/issues/132)) ([85ef18f](https://github.com/hyperium/tonic/commit/85ef18f8b7f91047ca5bcfe5fc90e3c510c7936a))
### Features
* Add `Status` constructors ([#137](https://github.com/hyperium/tonic/issues/137)) ([997241c](https://github.com/hyperium/tonic/commit/997241c43fdb390caad19a41dc6bf67724de521a))
* expose tcp_nodelay for clients and servers ([#145](https://github.com/hyperium/tonic/issues/145)) ([0eb9991](https://github.com/hyperium/tonic/commit/0eb9991b9fcd4a688904788966d1e5ab74918571))
* **transport:** Add `remote_addr` to `Request` on the server si… ([#186](https://github.com/hyperium/tonic/issues/186)) ([3eb76ab](https://github.com/hyperium/tonic/commit/3eb76abf9fdce5f903de1a7f05b8afc8694fa0ce))
* **transport:** Add server graceful shutdown ([#169](https://github.com/hyperium/tonic/issues/169)) ([393a57e](https://github.com/hyperium/tonic/commit/393a57eadebb8e2e6d3633f70141edba647b5f65))
* **transport:** Add system root anchors for TLS ([#114](https://github.com/hyperium/tonic/issues/114)) ([ac0e333](https://github.com/hyperium/tonic/commit/ac0e333b39f60f9c304d7798a49e07e9f08a16d4)), closes [#101](https://github.com/hyperium/tonic/issues/101)
* **transport:** Add tracing support to server ([#175](https://github.com/hyperium/tonic/issues/175)) ([f46a454](https://github.com/hyperium/tonic/commit/f46a45401d42f6c8b6ab449f7462735a9aea0bfc))
* **transport:** Allow custom IO and UDS example ([#184](https://github.com/hyperium/tonic/issues/184)) ([b90c340](https://github.com/hyperium/tonic/commit/b90c3408001f762a32409f7e2cf688ebae39d89e)), closes [#136](https://github.com/hyperium/tonic/issues/136)
* **transport:** Enable TCP_NODELAY. ([#120](https://github.com/hyperium/tonic/issues/120)) ([0299509](https://github.com/hyperium/tonic/commit/029950904a5e1398bb508446b660c1863e9f631c))
* **transport:** Expose tcp keepalive to clients & servers ([#151](https://github.com/hyperium/tonic/issues/151)) ([caccfad](https://github.com/hyperium/tonic/commit/caccfad7e7b03d42aa1679c00a270c92a621bb0f))
### BREAKING CHANGES
* **build:** Build will now generate each service client and server into their own modules.
* **transport:** Remove support for OpenSSL within the transport.
# [0.1.0-alpha.5](https://github.com/hyperium/tonic/compare/v0.1.0-alpha.4...v0.1.0-alpha.5) (2019-10-31)
### Bug Fixes
* **build:** Fix missing argument in generate_connect ([#95](https://github.com/hyperium/tonic/issues/95)) ([eea3c0f](https://github.com/hyperium/tonic/commit/eea3c0f99ac292efb7b8d4956fa014108af871ac))
* **codec:** Enforce encoders/decoders are `Sync` ([#84](https://github.com/hyperium/tonic/issues/84)) ([3ce61d9](https://github.com/hyperium/tonic/commit/3ce61d9860528dd4a13f719774d5c649198fb55c)), closes [#81](https://github.com/hyperium/tonic/issues/81)
* **codec:** Remove custom content-type ([#104](https://github.com/hyperium/tonic/issues/104)) ([a17049f](https://github.com/hyperium/tonic/commit/a17049f1f72c9655a72fef8021072d56b3f4e543))
### Features
* Add `IntoRequest` and `IntoStreamingRequest` traits ([#66](https://github.com/hyperium/tonic/issues/66)) ([4bb087b](https://github.com/hyperium/tonic/commit/4bb087b5ff19636a20e10a669ba3b46f99c84358))
* **transport:** Add service multiplexing/routing ([#99](https://github.com/hyperium/tonic/issues/99)) ([5b4f468](https://github.com/hyperium/tonic/commit/5b4f4689a253ccca34f34bb5329b420efb9159c1)), closes [#29](https://github.com/hyperium/tonic/issues/29)
* **transport:** Change channel connect to be async ([#107](https://github.com/hyperium/tonic/issues/107)) ([5c2f4db](https://github.com/hyperium/tonic/commit/5c2f4dba322b28e8132b21acfa184309de791d12))
### BREAKING CHANGES
* **transport:** `Endpoint::channel` was removed in favor of
an async `Endpoint::connect`.
# [0.1.0-alpha.4](https://github.com/hyperium/tonic/compare/v0.1.0-alpha.3...v0.1.0-alpha.4) (2019-10-23)
### Bug Fixes
* **build:** Fix service and rpc name conflict ([#92](https://github.com/hyperium/tonic/issues/92)) ([1dbde95](https://github.com/hyperium/tonic/commit/1dbde95d844378121af54f16d9f8aa9f0f7fc2f2)), closes [#89](https://github.com/hyperium/tonic/issues/89)
* **client:** Use `Stream` instead of `TrySteam` for client calls ([#61](https://github.com/hyperium/tonic/issues/61)) ([7eda823](https://github.com/hyperium/tonic/commit/7eda823c9cbe6054c39b42f8f3e7efce4698aebe))
* **codec:** Properly decode partial DATA frames ([#83](https://github.com/hyperium/tonic/issues/83)) ([9079e0f](https://github.com/hyperium/tonic/commit/9079e0f66bc75d2ce49a5537bf66c9ff5effbdab))
* **transport:** Rename server tls config method ([#73](https://github.com/hyperium/tonic/issues/73)) ([2a4bdb2](https://github.com/hyperium/tonic/commit/2a4bdb24f62bb3bbceb73e9551ba70512f94c187))
### Features
* **docs:** Add routeguide tutorial ([#21](https://github.com/hyperium/tonic/issues/21)) ([5d0a795](https://github.com/hyperium/tonic/commit/5d0a7955541509d2dbfdb9b689fb57cd2b842172))
* **transport:** Add support client mTLS ([#77](https://github.com/hyperium/tonic/issues/77)) ([335a373](https://github.com/hyperium/tonic/commit/335a373a403615a9737b2e19d0089c89bcaa3c4e))
### BREAKING CHANGES
* **transport:** `rustls_client_config` for the server has been renamed to `rustls_server_config`.
# [0.1.0-alpha.3](https://github.com/hyperium/tonic/compare/v0.1.0-alpha.2...v0.1.0-alpha.3) (2019-10-09)
### Features
* **build:** Expose prost-build type_attributes and field_attribu… ([#60](https://github.com/hyperium/tonic/issues/60)) ([06ff619](https://github.com/hyperium/tonic/commit/06ff619944a2f44d3aea60e653b39157c392f541))
* **transport:** Expose more granular control of TLS configuration ([#48](https://github.com/hyperium/tonic/issues/48)) ([8db3961](https://github.com/hyperium/tonic/commit/8db3961491c35955c76bf2da6a17bf8a60e3b146))
# [0.1.0-alpha.2](https://github.com/hyperium/tonic/compare/2670b349f96666c8d30d9d5d6ac2e611bb4584e2...v0.1.0-alpha.2) (2019-10-08)
### Bug Fixes
* **codec:** Fix buffer decode panic on full ([#43](https://github.com/hyperium/tonic/issues/43)) ([ed3e7e9](https://github.com/hyperium/tonic/commit/ed3e7e95a5401b9b224640e17908c2182286197d))
* **codegen:** Fix Empty protobuf type and add unimplemented ([#26](https://github.com/hyperium/tonic/issues/26)) ([2670b34](https://github.com/hyperium/tonic/commit/2670b349f96666c8d30d9d5d6ac2e611bb4584e2))
* **codegen:** Use wellknown types from `prost-types` ([#49](https://github.com/hyperium/tonic/issues/49)) ([4e1fcec](https://github.com/hyperium/tonic/commit/4e1fcece150fb1f373b0ccbb69d302463ed6bcfd))
* **transport:** Attempt to load RSA private keys in rustls ([#39](https://github.com/hyperium/tonic/issues/39)) ([2c5c3a2](https://github.com/hyperium/tonic/commit/2c5c3a282a1ccc9288bc0f6fb138fc123f45dd09))
* **transport:** Avoid exit after bad TLS handshake ([#51](https://github.com/hyperium/tonic/issues/51)) ([412a0bd](https://github.com/hyperium/tonic/commit/412a0bd697b4822b94c55cb18d2373a6ed75b690))
### Features
* **codgen:** Add default implementations for the generated serve… ([#27](https://github.com/hyperium/tonic/issues/27)) ([4559613](https://github.com/hyperium/tonic/commit/4559613c37f75dde67981ee38a7f5af5947ef0be))
* **transport:** Expose http/2 settings ([#28](https://github.com/hyperium/tonic/issues/28)) ([0218d58](https://github.com/hyperium/tonic/commit/0218d58c282d6de6f300229677c99369d3ea20ed))
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Tonic
:balloon: Thanks for your help improving the project! We are so happy to have
you!
There are opportunities to contribute to `tonic` at any level. It doesn't
matter if you are just getting started with Rust or are the most weathered
expert, we can use your help.
**No contribution is too small and all contributions are valued.**
This guide will help you get started. **Do not let this guide intimidate you**.
It should be considered a map to help you navigate the process.
You may also get help with contributing in the `dev` channel, please join
us!
Tonic is a part of the [Tokio][tokio] and [Hyperium][hyperium] project, and follows the project's
guidelines for contributing. This document is based on the
[`CONTRIBUTING.md` file][tokio-contrib] in the `tokio-rs/tokio` repository.
[dev]: https://gitter.im/tokio-rs/dev
[tokio]: https://tokio.rs
[hyperium]: https://github.com/hyperium
[tokio-contrib]: https://github.com/tokio-rs/tokio/blob/master/CONTRIBUTING.md
## Conduct
The `tonic` project adheres to the [Rust Code of Conduct][coc]. This describes
the _minimum_ behavior expected from all contributors.
[coc]: https://github.com/rust-lang/rust/blob/master/CODE_OF_CONDUCT.md
## Contributing in Issues
For any issue, there are fundamentally three ways an individual can contribute:
1. By opening the issue for discussion: For instance, if you believe that you
have uncovered a bug in a `tonic` crate, creating a new issue in the
hyperium/tonic [issue tracker][issues] is the way to report it.
2. By helping to triage the issue: This can be done by providing
supporting details (a test case that demonstrates a bug), providing
suggestions on how to address the issue, or ensuring that the issue is tagged
correctly.
3. By helping to resolve the issue: Typically this is done either in the form of
demonstrating that the issue reported is not a problem after all, or more
often, by opening a Pull Request that changes some bit of something in
Tokio in a concrete and reviewable manner.
**Anybody can participate in any stage of contribution**. We urge you to
participate in the discussion around bugs and participate in reviewing PRs.
[issues]: https://github.com/hyperium/tonic/issues
### Asking for General Help
If you have reviewed existing documentation and still have questions or are
having problems, you can open an issue asking for help.
In exchange for receiving help, we ask that you contribute back a documentation
PR that helps others avoid the problems that you encountered.
### Submitting a Bug Report
When opening a new issue in the `tonic` issue tracker, users will
be presented with a [basic template][template] that should be filled in. If you
believe that you have uncovered a bug, please fill out this form, following the
template to the best of your ability. Do not worry if you cannot answer every
detail, just fill in what you can.
The two most important pieces of information we need in order to properly
evaluate the report is a description of the behavior you are seeing and a simple
test case we can use to recreate the problem on our own. If we cannot recreate
the issue, it becomes impossible for us to fix.
In order to rule out the possibility of bugs introduced by userland code, test
cases should be limited, as much as possible, to using only Tokio APIs.
See [How to create a Minimal, Complete, and Verifiable example][mcve].
[mcve]: https://stackoverflow.com/help/mcve
[template]: .github/ISSUE_TEMPLATE/bug_report.md
### Triaging a Bug Report
Once an issue has been opened, it is not uncommon for there to be discussion
around it. Some contributors may have differing opinions about the issue,
including whether the behavior being seen is a bug or a feature. This discussion
is part of the process and should be kept focused, helpful, and professional.
Short, clipped responses—that provide neither additional context nor supporting
detail—are not helpful or professional. To many, such responses are simply
annoying and unfriendly.
Contributors are encouraged to help one another make forward progress as much as
possible, empowering one another to solve issues collaboratively. If you choose
to comment on an issue that you feel either is not a problem that needs to be
fixed, or if you encounter information in an issue that you feel is incorrect,
explain why you feel that way with additional supporting context, and be willing
to be convinced that you may be wrong. By doing so, we can often reach the
correct outcome much faster.
### Resolving a Bug Report
In the majority of cases, issues are resolved by opening a Pull Request. The
process for opening and reviewing a Pull Request is similar to that of opening
and triaging issues, but carries with it a necessary review and approval
workflow that ensures that the proposed changes meet the minimal quality and
functional guidelines of the Tokio project.
## Pull Requests
Pull Requests are the way concrete changes are made to the code, documentation,
and dependencies in the `tonic` repository.
Even tiny pull requests (e.g., one character pull request fixing a typo in API
documentation) are greatly appreciated. Before making a large change, it is
usually a good idea to first open an issue describing the change to solicit
feedback and guidance. This will increase the likelihood of the PR getting
merged.
### Tests
If the change being proposed alters code (as opposed to only documentation for
example), it is either adding new functionality to a crate or it is fixing
existing, broken functionality. In both of these cases, the pull request should
include one or more tests to ensure that the crate does not regress in the future.
There are two ways to write tests: integration tests and documentation tests
(Tokio avoids unit tests as much as possible).
#### Integration tests
Integration tests go in the same crate as the code they are testing. Each sub
crate should have a `dev-dependency` on `tonic` itself. This makes all
`tonic` utilities available to use in tests, no matter the crate being
tested.
The best strategy for writing a new integration test is to look at existing
integration tests in the crate and follow the style.
#### Documentation tests
Ideally, every API has at least one [documentation test] that demonstrates how to
use the API. Documentation tests are run with `cargo test --doc`. This ensures
that the example is correct and provides additional test coverage.
The trick to documentation tests is striking a balance between being succinct
for a reader to understand and actually testing the API.
The type level example for `tokio_timer::Timeout` provides a good example of a
documentation test:
```rust
/// // import the `timeout` function, usually this is done
/// // with `use tokio::prelude::*`
/// use tokio::prelude::FutureExt;
/// use futures::Stream;
/// use futures::sync::mpsc;
/// use std::time::Duration;
///
/// # fn main() {
/// let (tx, rx) = mpsc::unbounded();
/// # tx.unbounded_send(()).unwrap();
/// # drop(tx);
///
/// let process = rx.for_each(|item| {
/// // do something with `item`
/// # drop(item);
/// # Ok(())
/// });
///
/// # tokio::runtime::current_thread::block_on_all(
/// // Wrap the future with a `Timeout` set to expire in 10 milliseconds.
/// process.timeout(Duration::from_millis(10))
/// # ).unwrap();
/// # }
```
Given that this is a *type* level documentation test and the primary way users
of `tokio` will create an instance of `Timeout` is by using
`FutureExt::timeout`, this is how the documentation test is structured.
Lines that start with `/// #` are removed when the documentation is generated.
They are only there to get the test to run. The `block_on_all` function is the
easiest way to execute a future from a test.
If this were a documentation test for the `Timeout::new` function, then the
example would explicitly use `Timeout::new`. For example:
```rust
/// use tokio::timer::Timeout;
/// use futures::Future;
/// use futures::sync::oneshot;
/// use std::time::Duration;
///
/// # fn main() {
/// let (tx, rx) = oneshot::channel();
/// # tx.send(()).unwrap();
///
/// # tokio::runtime::current_thread::block_on_all(
/// // Wrap the future with a `Timeout` set to expire in 10 milliseconds.
/// Timeout::new(rx, Duration::from_millis(10))
/// # ).unwrap();
/// # }
```
#### Generated code
When making changes to `tonic-build` that affects the generated code you will
need to ensure that each of the sub crates gets updated as well. Each of the sub
crates like, for example `tonic-health`, generate their gRPC code via `codegen`
crate.
```
cargo run --package codegen
```
### Commits
It is a recommended best practice to keep your changes as logically grouped as
possible within individual commits. There is no limit to the number of commits
any single Pull Request may have, and many contributors find it easier to review
changes that are split across multiple commits.
That said, if you have a number of commits that are "checkpoints" and don't
represent a single logical change, please squash those together.
Note that multiple commits often get squashed when they are landed (see the
notes about [commit squashing]).
#### Commit message guidelines
A good commit message should describe what changed and why.
1. The first line should:
* contain a short description of the change (preferably 50 characters or less,
and no more than 72 characters)
* be entirely in lowercase with the exception of proper nouns, acronyms, and
the words that refer to code, like function/variable names
* be prefixed with the name of the crate being changed (without the
`tonic` prefix) and start with an imperative verb.
Examples:
* build: add regex for parsing field filters
* tonic: add `Clone` impl for `Service` and `MakeService`
2. Keep the second line blank.
3. Wrap all other lines at 72 columns (except for long URLs).
4. If your patch fixes an open issue, you can add a reference to it at the end
of the log. Use the `Fixes: #` prefix and the issue number. For other
references use `Refs: #`. `Refs` may include multiple issues, separated by a
comma.
Examples:
- `Fixes: #1337`
- `Refs: #1234`
Sample complete commit message:
```txt
subcrate: explain the commit in one line
Body of commit message is a few lines of text, explaining things
in more detail, possibly giving some background about the issue
being fixed, etc.
The body of the commit message can be several paragraphs, and
please do proper word-wrap and keep columns shorter than about
72 characters or so. That way, `git log` will show things
nicely even when it is indented.
Fixes: #1337
Refs: #453, #154
```
### Opening the Pull Request
From within GitHub, opening a new Pull Request will present you with a
[template] that should be filled out. Please try to do your best at filling out
the details, but feel free to skip parts if you're not sure what to put.
[template]: .github/PULL_REQUEST_TEMPLATE.md
### Discuss and update
You will probably get feedback or requests for changes to your Pull Request.
This is a big part of the submission process so don't be discouraged! Some
contributors may sign off on the Pull Request right away, others may have
more detailed comments or feedback. This is a necessary part of the process
in order to evaluate whether the changes are correct and necessary.
**Any community member can review a PR and you might get conflicting feedback**.
Keep an eye out for comments from code owners to provide guidance on conflicting
feedback.
**Once the PR is open, do not rebase the commits**. See [Commit Squashing] for
more details.
### Commit Squashing
In most cases, **do not squash commits that you add to your Pull Request during
the review process**. When the commits in your Pull Request land, they may be
squashed into one commit per logical change. Metadata will be added to the
commit message (including links to the Pull Request, links to relevant issues,
and the names of the reviewers). The commit history of your Pull Request,
however, will stay intact on the Pull Request page.
## Reviewing Pull Requests
**Any Tokio and Hyperium community member is welcome to review any pull request**.
All Tokio contributors who choose to review and provide feedback on Pull
Requests have a responsibility to both the project and the individual making the
contribution. Reviews and feedback must be helpful, insightful, and geared
towards improving the contribution as opposed to simply blocking it. If there
are reasons why you feel the PR should not land, explain what those are. Do not
expect to be able to block a Pull Request from advancing simply because you say
"No" without giving an explanation. Be open to having your mind changed. Be open
to working with the contributor to make the Pull Request better.
Reviews that are dismissive or disrespectful of the contributor or any other
reviewers are strictly counter to the Code of Conduct.
When reviewing a Pull Request, the primary goals are for the codebase to improve
and for the person submitting the request to succeed. **Even if a Pull Request
does not land, the submitters should come away from the experience feeling like
their effort was not wasted or unappreciated**. Every Pull Request from a new
contributor is an opportunity to grow the community.
### Review a bit at a time.
Do not overwhelm new contributors.
It is tempting to micro-optimize and make everything about relative performance,
perfect grammar, or exact style matches. Do not succumb to that temptation.
Focus first on the most significant aspects of the change:
1. Does this change make sense for Tokio?
2. Does this change make Tokio better, even if only incrementally?
3. Are there clear bugs or larger scale issues that need attending to?
4. Is the commit message readable and correct? If it contains a breaking change
is it clear enough?
Note that only **incremental** improvement is needed to land a PR. This means
that the PR does not need to be perfect, only better than the status quo. Follow
up PRs may be opened to continue iterating.
When changes are necessary, *request* them, do not *demand* them, and **do not
assume that the submitter already knows how to add a test or run a benchmark**.
Specific performance optimization techniques, coding styles and conventions
change over time. The first impression you give to a new contributor never does.
Nits (requests for small changes that are not essential) are fine, but try to
avoid stalling the Pull Request. Most nits can typically be fixed by the Tokio
Collaborator landing the Pull Request but they can also be an opportunity for
the contributor to learn a bit more about the project.
It is always good to clearly indicate nits when you comment: e.g.
`Nit: change foo() to bar(). But this is not blocking.`
If your comments were addressed but were not folded automatically after new
commits or if they proved to be mistaken, please, [hide them][hiding-a-comment]
with the appropriate reason to keep the conversation flow concise and relevant.
### Be aware of the person behind the code
Be aware that *how* you communicate requests and reviews in your feedback can
have a significant impact on the success of the Pull Request. Yes, we may land
a particular change that makes `tonic` better, but the individual might
just not want to have anything to do with `tonic` ever again. The goal is
not just having good code.
### Abandoned or Stalled Pull Requests
If a Pull Request appears to be abandoned or stalled, it is polite to first
check with the contributor to see if they intend to continue the work before
checking if they would mind if you took it over (especially if it just has nits
left). When doing so, it is courteous to give the original contributor credit
for the work they started (either by preserving their name and email address in
the commit log, or by using an `Author: ` meta-data tag in the commit.
_Adapted from the [Node.js contributing guide][node]_.
[node]: https://github.com/nodejs/node/blob/master/CONTRIBUTING.md
[hiding-a-comment]: https://help.github.com/articles/managing-disruptive-comments/#hiding-a-comment
[documentation test]: https://doc.rust-lang.org/rustdoc/documentation-tests.html
## Releasing
Since the Tonic project consists of a number of crates, many of which depend on
each other, releasing new versions to crates.io can involve some complexities.
When releasing a new version of a crate, follow these steps:
1. First you must pick the correct version to release, if there are breaking
changes make sure to select a semver compatible version bump.
2. In general, tonic tries to keep all crates at the same version to make it
easy to release and figure out what sub crates you need that will work with
the core version of tonic. To prepare a release branch you can follow the
commands below:
```
git checkout -b <release-branch-name>
./prepare-release.sh <version> # where version is X.Y.Z
```
3. Once all the crate versions have been updated its time to update the
changelog. Tonic uses `conventional-changelog` and it's cli to generate the
changelog.
```
conventional-changelog -p angular -i CHANGELOG.md -s
```
Once the entries have been generated, you must edit the `CHANGELOG.md` file
to add the version and tag to the title and edit any changelog entries. You
must also add any breaking changes here as sometimes they get lost.
4. Once the changelog has been updated you can now create a `chore: release
vX.Y.Z` commit and push the release branch and open a release PR.
5. Once the release PR has been approved and merged into `master` the following
command will release those changes.
```
./publish-release.sh
```
6. Once all the crates have been released you now must create a release on
github using the text from the changelog.
================================================
FILE: Cargo.toml
================================================
[workspace]
members = [
"tonic",
"tonic-build",
"tonic-health",
"tonic-protobuf",
"tonic-protobuf-build",
"tonic-types",
"tonic-reflection",
"tonic-prost",
"tonic-prost-build",
"tonic-web",
"examples",
"codegen",
"grpc",
"xds-client",
"tonic-xds",
"interop",
"tests/disable_comments",
"tests/wellknown",
"tests/wellknown-compiled",
"tests/extern_path/uuid",
"tests/extern_path/my_application",
"tests/integration_tests",
"tests/compression",
"tests/compile",
"tests/web",
"tests/default_stubs",
"tests/deprecated_methods",
]
resolver = "2"
[workspace.package]
rust-version = "1.88"
[workspace.lints.rust]
missing_debug_implementations = "warn"
missing_docs = "warn"
rust_2018_idioms = "warn"
unreachable_pub = "warn"
[workspace.lints.clippy]
uninlined_format_args = "deny"
[workspace.lints.rustdoc]
broken_intra_doc_links = "deny"
================================================
FILE: LICENSE
================================================
Copyright (c) 2025 Lucio Franco
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: README.md
================================================

A rust implementation of [gRPC], a high performance, open source, general
RPC framework that puts mobile and HTTP/2 first.
> **Note**: tonic's [master](https://github.com/hyperium/tonic) branch is
> currently preparing breaking changes. For the most recently *released* code,
> look to the [0.14.x branch](https://github.com/hyperium/tonic/tree/v0.14.x).
[`tonic`] is a gRPC over HTTP/2 implementation focused on high performance, interoperability, and flexibility. This library was created to have first class support of async/await and to act as a core building block for production systems written in Rust.
[](https://crates.io/crates/tonic)
[](https://docs.rs/tonic)
[](LICENSE)
[Examples] | [Website] | [Docs] | [Chat][discord]
## Overview
[`tonic`] is composed of three main components: the generic gRPC implementation, the high performance HTTP/2
implementation and the codegen powered by [`prost`]. The generic implementation can support any HTTP/2
implementation and any encoding via a set of generic traits. The HTTP/2 implementation is based on [`hyper`],
a fast HTTP/1.1 and HTTP/2 client and server built on top of the robust [`tokio`] stack. The codegen
contains the tools to build clients and servers from [`protobuf`] definitions.
## Features
- Bi-directional streaming
- High performance async io
- Interoperability
- TLS backed by [`rustls`]
- Load balancing
- Custom metadata
- Authentication
- Health Checking
## Getting Started
- The [`helloworld`][helloworld-tutorial] tutorial provides a basic example of using `tonic`, perfect for first time users!
- The [`routeguide`][routeguide-tutorial] tutorial provides a complete example of using `tonic` and all its features.
Examples can be found in [`examples`] and for more complex scenarios [`interop`]
may be a good resource as it shows examples of many of the gRPC features.
### Rust Version
`tonic`'s MSRV is `1.88`.
### Dependencies
[`tonic-build`] uses `protoc` [Protocol Buffers compiler] in some APIs which compile Protocol Buffers resource files such as [`tonic_build::compile_protos()`].
[Protocol Buffers compiler]: https://protobuf.dev/downloads/
[`tonic_build::compile_protos()`]: https://docs.rs/tonic-build/latest/tonic_build/fn.compile_protos.html
## Getting Help
First, see if the answer to your question can be found in the API documentation.
If the answer is not there, there is an active community in
the [Tonic Discord channel][discord]. We would be happy to try to answer your
question. If that doesn't work, try opening an [issue] with the question.
[issue]: https://github.com/hyperium/tonic/issues/new/choose
## Project Layout
- [`tonic`]: Generic gRPC and HTTP/2 client/server implementation.
- [`tonic-build`]: [`prost`] based service codegen.
- [`tonic-types`]: [`prost`] based grpc utility types including support for gRPC Well Known Types.
- [`tonic-health`]: Implementation of the standard [gRPC health checking service][healthcheck].
Also serves as an example of both unary and response streaming.
- [`tonic-reflection`]: A tonic based gRPC reflection implementation.
- [`examples`]: Example gRPC implementations showing off tls, load balancing and bi-directional streaming.
- [`interop`]: Interop tests implementation.
## Contributing
:balloon: Thanks for your help improving the project! We are so happy to have
you! We have a [contributing guide][guide] to help you get involved in the Tonic
project.
[guide]: CONTRIBUTING.md
## License
This project is licensed under the [MIT license](LICENSE).
### Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in Tonic by you, shall be licensed as MIT, without any additional
terms or conditions.
[gRPC]: https://grpc.io
[`tonic`]: ./tonic
[`tonic-build`]: ./tonic-build
[`tonic-types`]: ./tonic-types
[`tonic-health`]: ./tonic-health
[`tonic-reflection`]: ./tonic-reflection
[`examples`]: ./examples
[`interop`]: ./interop
[`tokio`]: https://github.com/tokio-rs/tokio
[`hyper`]: https://github.com/hyperium/hyper
[`prost`]: https://github.com/tokio-rs/prost
[`protobuf`]: https://protobuf.dev/
[`rustls`]: https://github.com/rustls/rustls
[`interop`]: https://github.com/hyperium/tonic/tree/master/interop
[Examples]: https://github.com/hyperium/tonic/tree/master/examples
[Website]: https://github.com/hyperium/tonic
[Docs]: https://docs.rs/tonic
[discord]: https://discord.gg/6yGkFeN
[routeguide-tutorial]: https://github.com/hyperium/tonic/blob/master/examples/routeguide-tutorial.md
[helloworld-tutorial]: https://github.com/hyperium/tonic/blob/master/examples/helloworld-tutorial.md
[healthcheck]: https://grpc.io/docs/guides/health-checking/
================================================
FILE: SECURITY.md
================================================
# Security Policy
tonic (and related projects in hyperium) uses the same security policy as the [Tokio project][tokio-security].
## Report a security issue
The process for reporting an issue is the same as the [Tokio project][tokio-security]. This includes private reporting via security@tokio.rs.
[tokio-security]: https://github.com/tokio-rs/tokio/security/policy
================================================
FILE: codegen/Cargo.toml
================================================
[package]
name = "codegen"
authors = ["Lucio Franco <luciofranco14@gmail.com>"]
license = "MIT"
edition = "2024"
rust-version = { workspace = true }
[dependencies]
protox = "0.9"
prettyplease = "0.2"
quote = "1"
syn = "2"
tempfile = "3.8.0"
tonic-prost-build = {path = "../tonic-prost-build", default-features = false, features = ["cleanup-markdown"]}
================================================
FILE: codegen/src/main.rs
================================================
use std::{
fs::File,
io::{BufWriter, Write as _},
path::{Path, PathBuf},
time::Instant,
};
use protox::prost::Message as _;
use quote::quote;
use tonic_prost_build::FileDescriptorSet;
fn main() {
println!("Running codegen...");
let start = Instant::now();
// tonic-health
codegen(
&PathBuf::from(std::env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.join("tonic-health"),
&["proto/health.proto"],
&["proto"],
&PathBuf::from("src/generated"),
&PathBuf::from("src/generated/grpc_health_v1_fds.rs"),
true,
true,
);
// tonic-reflection
codegen(
&PathBuf::from(std::env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.join("tonic-reflection"),
&["proto/reflection_v1.proto"],
&["proto"],
&PathBuf::from("src/generated"),
&PathBuf::from("src/generated/reflection_v1_fds.rs"),
true,
true,
);
codegen(
&PathBuf::from(std::env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.join("tonic-reflection"),
&["proto/reflection_v1alpha.proto"],
&["proto"],
&PathBuf::from("src/generated"),
&PathBuf::from("src/generated/reflection_v1alpha1_fds.rs"),
true,
true,
);
// tonic-types
codegen(
&PathBuf::from(std::env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.join("tonic-types"),
&["proto/status.proto", "proto/error_details.proto"],
&["proto"],
&PathBuf::from("src/generated"),
&PathBuf::from("src/generated/types_fds.rs"),
false,
false,
);
// grpc
codegen(
&PathBuf::from(std::env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.join("grpc"),
&["proto/echo/echo.proto"],
&["proto"],
&PathBuf::from("src/generated"),
&PathBuf::from("src/generated/echo_fds.rs"),
true,
true,
);
println!("Codgen completed: {}ms", start.elapsed().as_millis());
}
fn codegen(
root_dir: &Path,
iface_files: &[&str],
include_dirs: &[&str],
out_dir: &Path,
file_descriptor_set_path: &Path,
build_client: bool,
build_server: bool,
) {
let tempdir = tempfile::Builder::new()
.prefix("tonic-codegen-")
.tempdir()
.unwrap();
let iface_files = iface_files.iter().map(|&path| root_dir.join(path));
let include_dirs = include_dirs.iter().map(|&path| root_dir.join(path));
let out_dir = root_dir.join(out_dir);
let file_descriptor_set_path = root_dir.join(file_descriptor_set_path);
let fds = protox::compile(iface_files, include_dirs).unwrap();
write_fds(&fds, &file_descriptor_set_path);
tonic_prost_build::configure()
.build_client(build_client)
.build_server(build_server)
.build_transport(false)
.out_dir(&tempdir)
.compile_fds(fds)
.unwrap();
for path in std::fs::read_dir(tempdir.path()).unwrap() {
let path = path.unwrap().path();
let to = out_dir.join(
path.file_name()
.unwrap()
.to_str()
.unwrap()
.strip_suffix(".rs")
.unwrap()
.replace('.', "_")
+ ".rs",
);
std::fs::copy(&path, &to).unwrap();
}
}
fn write_fds(fds: &FileDescriptorSet, path: &Path) {
const GENERATED_COMMENT: &str = "// This file is @generated by codegen.";
let mut file_header = String::new();
let mut fds = fds.clone();
for fd in fds.file.iter() {
let Some(source_code_info) = &fd.source_code_info else {
continue;
};
for location in &source_code_info.location {
for comment in &location.leading_detached_comments {
file_header += comment;
}
}
}
for fd in fds.file.iter_mut() {
fd.source_code_info = None;
}
let fds_raw = fds.encode_to_vec();
let tokens = quote! {
/// Byte encoded FILE_DESCRIPTOR_SET.
pub const FILE_DESCRIPTOR_SET: &[u8] = &[#(#fds_raw),*];
};
let ast = syn::parse2(tokens).unwrap();
let formatted = prettyplease::unparse(&ast);
let mut writer = BufWriter::new(File::create(path).unwrap());
writer.write_all(GENERATED_COMMENT.as_bytes()).unwrap();
writer.write_all(b"\n").unwrap();
if !file_header.is_empty() {
let file_header = comment_out(&file_header);
writer.write_all(file_header.as_bytes()).unwrap();
writer.write_all(b"\n").unwrap();
}
writer.write_all(formatted.as_bytes()).unwrap()
}
fn comment_out(s: &str) -> String {
s.split('\n')
.map(|line| format!("// {line}"))
.collect::<Vec<String>>()
.join("\n")
}
================================================
FILE: examples/Cargo.toml
================================================
[package]
authors = ["Lucio Franco <luciofranco14@gmail.com>"]
edition = "2024"
license = "MIT"
name = "examples"
[[bin]]
name = "helloworld-server"
path = "src/helloworld/server.rs"
[[bin]]
name = "helloworld-client"
path = "src/helloworld/client.rs"
[[bin]]
name = "blocking-server"
path = "src/blocking/server.rs"
[[bin]]
name = "blocking-client"
path = "src/blocking/client.rs"
[[bin]]
name = "routeguide-server"
path = "src/routeguide/server.rs"
required-features = ["routeguide"]
[[bin]]
name = "routeguide-client"
path = "src/routeguide/client.rs"
required-features = ["routeguide"]
[[bin]]
name = "authentication-client"
path = "src/authentication/client.rs"
[[bin]]
name = "authentication-server"
path = "src/authentication/server.rs"
[[bin]]
name = "load-balance-client"
path = "src/load_balance/client.rs"
[[bin]]
name = "load-balance-server"
path = "src/load_balance/server.rs"
[[bin]]
name = "dynamic-load-balance-client"
path = "src/dynamic_load_balance/client.rs"
[[bin]]
name = "dynamic-load-balance-server"
path = "src/dynamic_load_balance/server.rs"
[[bin]]
name = "tls-client"
path = "src/tls/client.rs"
required-features = ["tls"]
[[bin]]
name = "tls-server"
path = "src/tls/server.rs"
required-features = ["tls"]
[[bin]]
name = "tls-rustls-client"
path = "src/tls_rustls/client.rs"
required-features = ["tls-rustls"]
[[bin]]
name = "tls-rustls-server"
path = "src/tls_rustls/server.rs"
required-features = ["tls-rustls"]
[[bin]]
name = "tls-client-auth-server"
path = "src/tls_client_auth/server.rs"
required-features = ["tls-client-auth"]
[[bin]]
name = "tls-client-auth-client"
path = "src/tls_client_auth/client.rs"
required-features = ["tls-client-auth"]
[[bin]]
name = "tower-server"
path = "src/tower/server.rs"
required-features = ["tower"]
[[bin]]
name = "tower-client"
path = "src/tower/client.rs"
required-features = ["tower"]
[[bin]]
name = "multiplex-server"
path = "src/multiplex/server.rs"
[[bin]]
name = "multiplex-client"
path = "src/multiplex/client.rs"
[[bin]]
name = "gcp-client"
path = "src/gcp/client.rs"
required-features = ["gcp"]
[[bin]]
name = "tracing-client"
path = "src/tracing/client.rs"
required-features = ["tracing"]
[[bin]]
name = "tracing-server"
path = "src/tracing/server.rs"
required-features = ["tracing"]
[[bin]]
name = "uds-client-standard"
path = "src/uds/client_standard.rs"
required-features = ["uds"]
[[bin]]
name = "uds-client-with-connector"
path = "src/uds/client_with_connector.rs"
required-features = ["uds"]
[[bin]]
name = "uds-server"
path = "src/uds/server.rs"
required-features = ["uds"]
[[bin]]
name = "interceptor-client"
path = "src/interceptor/client.rs"
[[bin]]
name = "interceptor-server"
path = "src/interceptor/server.rs"
[[bin]]
name = "health-server"
path = "src/health/server.rs"
required-features = ["health"]
[[bin]]
name = "reflection-server"
path = "src/reflection/server.rs"
required-features = ["reflection"]
[[bin]]
name = "autoreload-server"
path = "src/autoreload/server.rs"
required-features = ["autoreload"]
[[bin]]
name = "compression-server"
path = "src/compression/server.rs"
required-features = ["compression"]
[[bin]]
name = "compression-client"
path = "src/compression/client.rs"
required-features = ["compression"]
[[bin]]
name = "mock"
path = "src/mock/mock.rs"
required-features = ["mock"]
[[bin]]
name = "grpc-web-server"
path = "src/grpc-web/server.rs"
required-features = ["grpc-web"]
[[bin]]
name = "grpc-web-client"
path = "src/grpc-web/client.rs"
required-features = ["grpc-web"]
[[bin]]
name = "streaming-client"
path = "src/streaming/client.rs"
required-features = ["streaming"]
[[bin]]
name = "streaming-server"
path = "src/streaming/server.rs"
required-features = ["streaming"]
[[bin]]
name = "json-codec-client"
path = "src/json-codec/client.rs"
required-features = ["json-codec"]
[[bin]]
name = "json-codec-server"
path = "src/json-codec/server.rs"
required-features = ["json-codec"]
[[bin]]
name = "richer-error-client"
path = "src/richer-error/client.rs"
required-features = ["types"]
[[bin]]
name = "richer-error-server"
path = "src/richer-error/server.rs"
required-features = ["types"]
[[bin]]
name = "richer-error-client-vec"
path = "src/richer-error/client_vec.rs"
required-features = ["types"]
[[bin]]
name = "richer-error-server-vec"
path = "src/richer-error/server_vec.rs"
required-features = ["types"]
[[bin]]
name = "dynamic-server"
path = "src/dynamic/server.rs"
[[bin]]
name = "h2c-server"
path = "src/h2c/server.rs"
required-features = ["h2c"]
[[bin]]
name = "h2c-client"
path = "src/h2c/client.rs"
required-features = ["h2c"]
[[bin]]
name = "cancellation-server"
path = "src/cancellation/server.rs"
required-features = ["cancellation"]
[[bin]]
name = "cancellation-client"
path = "src/cancellation/client.rs"
[[bin]]
name = "codec-buffers-server"
path = "src/codec_buffers/server.rs"
[[bin]]
name = "codec-buffers-client"
path = "src/codec_buffers/client.rs"
[features]
gcp = ["dep:prost-types", "tonic/tls-ring"]
routeguide = ["dep:async-stream", "dep:tokio-stream", "dep:rand", "dep:serde", "dep:serde_json"]
reflection = ["dep:tonic-reflection"]
autoreload = ["dep:tokio-stream", "tokio-stream?/net", "dep:listenfd"]
health = ["dep:tonic-health"]
grpc-web = ["dep:tonic-web", "dep:bytes", "dep:http", "dep:hyper", "dep:hyper-util", "dep:tracing-subscriber", "dep:tower", "dep:tower-http", "tower-http?/cors"]
tracing = ["dep:tracing", "dep:tracing-subscriber"]
uds = ["dep:tokio-stream", "tokio-stream?/net", "dep:tower", "dep:hyper", "dep:hyper-util"]
streaming = ["dep:tokio-stream", "dep:h2"]
mock = ["dep:tokio-stream", "dep:tower", "dep:hyper-util"]
json-codec = ["dep:serde", "dep:serde_json", "dep:bytes"]
compression = ["tonic/gzip"]
tls = ["tonic/tls-ring"]
tls-rustls = ["dep:http", "dep:hyper", "dep:hyper-util", "dep:hyper-rustls", "dep:tower", "tower-http/util", "tower-http/add-extension", "dep:tokio-rustls"]
tls-client-auth = ["tonic/tls-ring"]
types = ["dep:tonic-types"]
h2c = ["dep:hyper", "dep:tower", "dep:http", "dep:hyper-util"]
cancellation = ["dep:tokio-util"]
full = ["gcp", "routeguide", "reflection", "autoreload", "health", "grpc-web", "tracing", "uds", "streaming", "mock", "json-codec", "compression", "tls", "tls-rustls", "tls-client-auth", "types", "cancellation", "h2c"]
tower = ["dep:tower", "dep:http"]
default = ["full"]
[dependencies]
# Common dependencies
tokio = { version = "1.0", features = ["rt-multi-thread", "macros"] }
prost = "0.14"
tonic = { path = "../tonic" }
tonic-prost = { path = "../tonic-prost" }
# Optional dependencies
tonic-web = { path = "../tonic-web", optional = true }
tonic-health = { path = "../tonic-health", optional = true }
tonic-reflection = { path = "../tonic-reflection", optional = true }
tonic-types = { path = "../tonic-types", optional = true }
async-stream = { version = "0.3", optional = true }
tokio-stream = { version = "0.1", optional = true }
tokio-util = { version = "0.7.8", optional = true }
tower = { version = "0.5", optional = true }
rand = { version = "0.9", optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
tracing = { version = "0.1.16", optional = true }
tracing-subscriber = { version = "0.3", features = ["tracing-log", "fmt"], optional = true }
prost-types = { version = "0.14", optional = true }
http = { version = "1", optional = true }
hyper = { version = "1", optional = true }
hyper-util = { version = "0.1.4", optional = true }
listenfd = { version = "1.0", optional = true }
bytes = { version = "1", optional = true }
h2 = { version = "0.4", optional = true }
tokio-rustls = { version = "0.26.1", optional = true, features = ["ring", "tls12"], default-features = false }
hyper-rustls = { version = "0.27.0", features = ["http2", "ring", "tls12"], optional = true, default-features = false }
tower-http = { version = "0.6", optional = true }
[build-dependencies]
tonic-prost-build = { path = "../tonic-prost-build" }
================================================
FILE: examples/README.md
================================================
# Examples
Set of examples that show off the features provided by `tonic`.
In order to build these examples, you must have the `protoc` Protocol Buffers compiler
installed, along with the Protocol Buffers resource files.
Ubuntu:
```bash
sudo apt update && sudo apt upgrade -y
sudo apt install -y protobuf-compiler libprotobuf-dev
```
Alpine Linux:
```sh
sudo apk add protoc protobuf-dev
```
macOS:
Assuming [Homebrew](https://brew.sh/) is already installed. (If not, see instructions for installing Homebrew on [the Homebrew website](https://brew.sh/).)
```zsh
brew install protobuf
```
## Helloworld
### Client
```bash
$ cargo run --bin helloworld-client
```
### Server
```bash
$ cargo run --bin helloworld-server
```
## RouteGuide
### Client
```bash
$ cargo run --bin routeguide-client
```
### Server
```bash
$ cargo run --bin routeguide-server
```
## Authentication
### Client
```bash
$ cargo run --bin authentication-client
```
### Server
```bash
$ cargo run --bin authentication-server
```
## Load Balance
### Client
```bash
$ cargo run --bin load-balance-client
```
### Server
```bash
$ cargo run --bin load-balance-server
```
## Dynamic Load Balance
### Client
```bash
$ cargo run --bin dynamic-load-balance-client
```
### Server
```bash
$ cargo run --bin dynamic-load-balance-server
```
## TLS (rustls)
### Client
```bash
$ cargo run --bin tls-client
```
### Server
```bash
$ cargo run --bin tls-server
```
## Health Checking
### Server
```bash
$ cargo run --bin health-server
```
## Server Reflection
### Server
```bash
$ cargo run --bin reflection-server
```
## Tower Middleware
### Server
```bash
$ cargo run --bin tower-server
```
## Autoreloading Server
### Server
```bash
systemfd --no-pid -s http::[::1]:50051 -- cargo watch -x 'run --bin autoreload-server'
```
### Notes:
If you are using the `codegen` feature, then the following dependencies are
**required**:
* [bytes](https://crates.io/crates/bytes)
* [prost](https://crates.io/crates/prost)
* [prost-derive](https://crates.io/crates/prost-derive)
The autoload example requires the following crates installed globally:
* [systemfd](https://crates.io/crates/systemfd)
* [cargo-watch](https://crates.io/crates/cargo-watch)
## Richer Error
Both clients and both servers do the same thing, but using the two different
approaches. Run one of the servers in one terminal, and then run the clients
in another.
### Client using the `ErrorDetails` struct
```bash
$ cargo run --bin richer-error-client
```
### Client using a vector of error message types
```bash
$ cargo run --bin richer-error-client-vec
```
### Server using the `ErrorDetails` struct
```bash
$ cargo run --bin richer-error-server
```
### Server using a vector of error message types
```bash
$ cargo run --bin richer-error-server-vec
```
================================================
FILE: examples/build.rs
================================================
use std::{env, path::PathBuf};
fn main() {
tonic_prost_build::configure()
.compile_protos(&["proto/routeguide/route_guide.proto"], &["proto"])
.unwrap();
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
tonic_prost_build::configure()
.file_descriptor_set_path(out_dir.join("helloworld_descriptor.bin"))
.compile_protos(&["proto/helloworld/helloworld.proto"], &["proto"])
.unwrap();
tonic_prost_build::compile_protos("proto/echo/echo.proto").unwrap();
tonic_prost_build::compile_protos("proto/unaryecho/echo.proto").unwrap();
tonic_prost_build::configure()
.server_mod_attribute("attrs", "#[cfg(feature = \"server\")]")
.server_attribute("Echo", "#[derive(PartialEq)]")
.client_mod_attribute("attrs", "#[cfg(feature = \"client\")]")
.client_attribute("Echo", "#[derive(PartialEq)]")
.compile_protos(&["proto/attrs/attrs.proto"], &["proto"])
.unwrap();
tonic_prost_build::configure()
.build_server(false)
.compile_protos(
&["proto/googleapis/google/pubsub/v1/pubsub.proto"],
&["proto/googleapis"],
)
.unwrap();
build_json_codec_service();
let smallbuff_copy = out_dir.join("smallbuf");
let _ = std::fs::create_dir(smallbuff_copy.clone()); // This will panic below if the directory failed to create
tonic_prost_build::configure()
.out_dir(smallbuff_copy)
.codec_path("crate::common::SmallBufferCodec")
.compile_protos(&["proto/helloworld/helloworld.proto"], &["proto"])
.unwrap();
}
// Manually define the json.helloworld.Greeter service which used a custom JsonCodec to use json
// serialization instead of protobuf for sending messages on the wire.
// This will result in generated client and server code which relies on its request, response and
// codec types being defined in a module `crate::common`.
//
// See the client/server examples defined in `src/json-codec` for more information.
fn build_json_codec_service() {
let greeter_service = tonic_prost_build::manual::Service::builder()
.name("Greeter")
.package("json.helloworld")
.method(
tonic_prost_build::manual::Method::builder()
.name("say_hello")
.route_name("SayHello")
.input_type("crate::common::HelloRequest")
.output_type("crate::common::HelloResponse")
.codec_path("crate::common::JsonCodec")
.build(),
)
.build();
tonic_prost_build::manual::Builder::new().compile(&[greeter_service]);
}
================================================
FILE: examples/data/gcp/roots.pem
================================================
# Operating CA: Comodo Group
# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
# Subject: CN=AAA Certificate Services O=Comodo CA Limited
# Label: "Comodo AAA Services root"
# Serial: 1
# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
-----BEGIN CERTIFICATE-----
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
-----END CERTIFICATE-----
# Operating CA: Comodo Group
# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
# Label: "AddTrust External Root"
# Serial: 1
# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
-----BEGIN CERTIFICATE-----
MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
-----END CERTIFICATE-----
# Operating CA: Comodo Group
# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
# Label: "COMODO Certification Authority"
# Serial: 104350513648249232941998508985834464573
# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
-----BEGIN CERTIFICATE-----
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
ZQ==
-----END CERTIFICATE-----
# Operating CA: Comodo Group
# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
# Label: "COMODO ECC Certification Authority"
# Serial: 41578283867086692638256921589707938090
# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
-----BEGIN CERTIFICATE-----
MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
-----END CERTIFICATE-----
# Operating CA: Comodo Group
# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited
# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited
# Label: "COMODO RSA Certification Authority"
# Serial: 101909084537582093308941363524873193117
# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18
# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4
# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34
-----BEGIN CERTIFICATE-----
MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
NVOFBkpdn627G190
-----END CERTIFICATE-----
# Operating CA: Comodo Group
# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
# Label: "USERTrust ECC Certification Authority"
# Serial: 123013823720199481456569720443997572134
# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1
# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0
# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a
-----BEGIN CERTIFICATE-----
MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
-----END CERTIFICATE-----
# Operating CA: Comodo Group
# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
# Label: "USERTrust RSA Certification Authority"
# Serial: 2645093764781058787591871645665788717
# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5
# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e
# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2
-----BEGIN CERTIFICATE-----
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
jjxDah2nGN59PRbxYvnKkKj9
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
# Label: "Baltimore CyberTrust Root"
# Serial: 33554617
# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
# Label: "Cybertrust Global Root"
# Serial: 4835703278459682877484360
# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
-----BEGIN CERTIFICATE-----
MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
WL1WMRJOEcgh4LMRkWXbtKaIOM5V
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert Assured ID Root CA"
# Serial: 17154717934120587862167794914071425081
# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
-----BEGIN CERTIFICATE-----
MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert Assured ID Root G2"
# Serial: 15385348160840213938643033620894905419
# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d
# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f
# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
IhNzbM8m9Yop5w==
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert Assured ID Root G3"
# Serial: 15459312981008553731928384953135426796
# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb
# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89
# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2
-----BEGIN CERTIFICATE-----
MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
6pZjamVFkpUBtA==
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert Global Root CA"
# Serial: 10944719598952040374951832963794454346
# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert Global Root G2"
# Serial: 4293743540046975378534879503202253541
# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44
# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4
# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f
-----BEGIN CERTIFICATE-----
MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
MrY=
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert Global Root G3"
# Serial: 7089244469030293291760083333884364146
# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca
# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e
# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0
-----BEGIN CERTIFICATE-----
MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
sycX
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert High Assurance EV Root CA"
# Serial: 3553400076410547919724730734378100087
# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
+OkuE6N36B9K
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert Trusted Root G4"
# Serial: 7451500558977370777930084869016614236
# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49
# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4
# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88
-----BEGIN CERTIFICATE-----
MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
-----END CERTIFICATE-----
# Operating CA: DigiCert
# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
# Label: "GeoTrust Global CA"
# Serial: 144470
# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----
# Operating CA: Entrust Datacard
# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
# Label: "Entrust Root Certification Authority"
# Serial: 1164660820
# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
-----BEGIN CERTIFICATE-----
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
0vdXcDazv/wor3ElhVsT/h5/WrQ8
-----END CERTIFICATE-----
# Operating CA: Entrust Datacard
# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
# Label: "Entrust Root Certification Authority - EC1"
# Serial: 51543124481930649114116133369
# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
-----BEGIN CERTIFICATE-----
MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
-----END CERTIFICATE-----
# Operating CA: Entrust Datacard
# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
# Label: "Entrust Root Certification Authority - G2"
# Serial: 1246989352
# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
-----BEGIN CERTIFICATE-----
MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
-----END CERTIFICATE-----
# Operating CA: Entrust Datacard
# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
# Label: "Entrust.net Premium 2048 Secure Server CA"
# Serial: 946069240
# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
-----BEGIN CERTIFICATE-----
MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
fF6adulZkMV8gzURZVE=
-----END CERTIFICATE-----
# Operating CA: Entrust Datacard
# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
# Subject: CN=AffirmTrust Commercial O=AffirmTrust
# Label: "AffirmTrust Commercial"
# Serial: 8608355977964138876
# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
-----END CERTIFICATE-----
# Operating CA: Entrust Datacard
# Issuer: CN=AffirmTrust Networking O=AffirmTrust
# Subject: CN=AffirmTrust Networking O=AffirmTrust
# Label: "AffirmTrust Networking"
# Serial: 8957382827206547757
# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
-----END CERTIFICATE-----
# Operating CA: Entrust Datacard
# Issuer: CN=AffirmTrust Premium O=AffirmTrust
# Subject: CN=AffirmTrust Premium O=AffirmTrust
# Label: "AffirmTrust Premium"
# Serial: 7893706540734352110
# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
-----BEGIN CERTIFICATE-----
MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
KeC2uAloGRwYQw==
-----END CERTIFICATE-----
# Operating CA: Entrust Datacard
# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
# Label: "AffirmTrust Premium ECC"
# Serial: 8401224907861490260
# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
-----BEGIN CERTIFICATE-----
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
-----END CERTIFICATE-----
# Operating CA: GlobalSign
# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
# Label: "GlobalSign Root CA"
# Serial: 4835703278459707669005204
# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE-----
# Operating CA: GlobalSign
# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
# Label: "GlobalSign Root CA - R3"
# Serial: 4835703278459759426209954
# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
-----BEGIN CERTIFICATE-----
MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
WD9f
-----END CERTIFICATE-----
# Operating CA: GlobalSign
# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
# Label: "GlobalSign ECC Root CA - R5"
# Serial: 32785792099990507226680698011560947931244
# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08
# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa
# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24
-----BEGIN CERTIFICATE-----
MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
xwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE-----
# Operating CA: GlobalSign
# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6
# Label: "GlobalSign Root CA - R6"
# Serial: 1417766617973444989252670301619537
# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae
# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1
# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69
-----BEGIN CERTIFICATE-----
MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg
MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh
bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx
MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET
MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI
xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k
ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD
aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw
LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw
1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX
k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2
SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h
bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n
WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY
rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce
MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD
AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu
bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt
Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61
55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj
vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf
cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz
oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp
nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs
pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v
JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R
8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4
5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
-----END CERTIFICATE-----
# Note: "GlobalSign Root CA - R7" not added on purpose. It is P-521.
# Note: "GlobalSign Root CA - R8" is not yet included in Mozilla.
# Operating CA: GoDaddy
# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
# Label: "Go Daddy Root Certificate Authority - G2"
# Serial: 0
# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
4uJEvlz36hz1
-----END CERTIFICATE-----
# Operating CA: GoDaddy
# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
# Label: "Starfield Root Certificate Authority - G2"
# Serial: 0
# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
-----BEGIN CERTIFICATE-----
MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
-----END CERTIFICATE-----
# Operating CA: GoDaddy
# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
# Label: "Starfield Class 2 CA"
# Serial: 0
# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
-----BEGIN CERTIFICATE-----
MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
-----END CERTIFICATE-----
# Operating CA: GoDaddy
# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
# Label: "Go Daddy Class 2 CA"
# Serial: 0
# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
-----BEGIN CERTIFICATE-----
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
ReYNnyicsbkqWletNw+vHX/bvZ8=
-----END CERTIFICATE-----
# Operating CA: Google Trust Services LLC
# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
# Label: "GlobalSign Root CA - R2"
# Serial: 4835703278459682885658125
# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
-----END CERTIFICATE-----
# Operating CA: Google Trust Services LLC
# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
# Label: "GlobalSign ECC Root CA - R4"
# Serial: 14367148294922964480859022125800977897474
# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e
# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb
# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c
-----BEGIN CERTIFICATE-----
MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
ewv4n4Q=
-----END CERTIFICATE-----
# Operating CA: Google Trust Services LLC
# Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1
# Subject: C=US, O=Google Trust Services LLC, CN=GTS Root R1
# Label: "GTS Root R1"
# Serial: 6e:47:a9:c5:4b:47:0c:0d:ec:33:d0:89:b9:1c:f4:e1
# MD5 Fingerprint: 82:1A:EF:D4:D2:4A:F2:9F:E2:3D:97:06:14:70:72:85
# SHA1 Fingerprint: E1:C9:50:E6:EF:22:F8:4C:56:45:72:8B:92:20:60:D7:D5:A7:A3:E8
# SHA256 Fingerprint: 2A:57:54:71:E3:13:40:BC:21:58:1C:BD:2C:F1:3E:15:84:63:20:3E:CE:94:BC:F9:D3:CC:19:6B:F0:9A:54:72
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH
MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy
MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl
cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM
f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX
mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7
zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P
fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc
vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4
Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp
zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO
Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW
k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+
DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF
lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW
Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1
d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z
XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR
gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3
d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv
J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg
DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM
+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy
F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9
SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws
E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl
-----END CERTIFICATE-----
# Operating CA: Google Trust Services LLC
# Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R2
# Subject: C=US, O=Google Trust Services LLC, CN=GTS Root R2
# Label: "GTS Root R2"
# Serial: 6e:47:a9:c6:5a:b3:e7:20:c5:30:9a:3f:68:52:f2:6f
# MD5 Fingerprint: 44:ED:9A:0E:A4:09:3B:00:F2:AE:4C:A3:C6:61:B0:8B
# SHA1 Fingerprint: D2:73:96:2A:2A:5E:39:9F:73:3F:E1:C7:1E:64:3F:03:38:34:FC:4D
# SHA256 Fingerprint: C4:5D:7B:B0:8E:6D:67:E6:2E:42:35:11:0B:56:4E:5F:78:FD:92:EF:05:8C:84:0A:EA:4E:64:55:D7:58:5C:60
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH
MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy
MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl
cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv
CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg
GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu
XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd
re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu
PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1
mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K
8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj
x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR
nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0
kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok
twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp
8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT
vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT
z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA
pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb
pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB
R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R
RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk
0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC
5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF
izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn
yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC
-----END CERTIFICATE-----
# Operating CA: Google Trust Services LLC
# Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R3
# Subject: C=US, O=Google Trust Services LLC, CN=GTS Root R3
# Label: "GTS Root R3"
# Serial: 6e:47:a9:c7:6c:a9:73:24:40:89:0f:03:55:dd:8d:1d
# MD5 Fingerprint: 1A:79:5B:6B:04:52:9C:5D:C7:74:33:1B:25:9A:F9:25
# SHA1 Fingerprint: 30:D4:24:6F:07:FF:DB:91:89:8A:0B:E9:49:66:11:EB:8C:5E:46:E5
# SHA256 Fingerprint: 15:D5:B8:77:46:19:EA:7D:54:CE:1C:A6:D0:B0:C4:03:E0:37:A9:17:F1:31:E8:A0:4E:1E:6B:7A:71:BA:BC:E5
-----BEGIN CERTIFICATE-----
MIICDDCCAZGgAwIBAgIQbkepx2ypcyR
gitextract_d8h12mxx/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ └── CI.yml
├── .gitignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE
├── README.md
├── SECURITY.md
├── codegen/
│ ├── Cargo.toml
│ └── src/
│ └── main.rs
├── examples/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ ├── data/
│ │ ├── gcp/
│ │ │ └── roots.pem
│ │ ├── route_guide_db.json
│ │ └── tls/
│ │ ├── ca.key
│ │ ├── ca.pem
│ │ ├── client1.key
│ │ ├── client1.pem
│ │ ├── client2.key
│ │ ├── client2.pem
│ │ ├── client_ca.key
│ │ ├── client_ca.pem
│ │ ├── create.sh
│ │ ├── openssl.cnf
│ │ ├── server.key
│ │ ├── server.pem
│ │ ├── server2.key
│ │ └── server2.pem
│ ├── helloworld-tutorial.md
│ ├── proto/
│ │ ├── attrs/
│ │ │ └── attrs.proto
│ │ ├── echo/
│ │ │ └── echo.proto
│ │ ├── googleapis/
│ │ │ └── google/
│ │ │ ├── api/
│ │ │ │ ├── annotations.proto
│ │ │ │ ├── client.proto
│ │ │ │ ├── field_behavior.proto
│ │ │ │ ├── http.proto
│ │ │ │ └── resource.proto
│ │ │ └── pubsub/
│ │ │ └── v1/
│ │ │ ├── pubsub.proto
│ │ │ └── schema.proto
│ │ ├── helloworld/
│ │ │ └── helloworld.proto
│ │ ├── routeguide/
│ │ │ └── route_guide.proto
│ │ └── unaryecho/
│ │ └── echo.proto
│ ├── routeguide-tutorial.md
│ └── src/
│ ├── authentication/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── autoreload/
│ │ └── server.rs
│ ├── blocking/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── cancellation/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── codec_buffers/
│ │ ├── client.rs
│ │ ├── common.rs
│ │ └── server.rs
│ ├── compression/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── dynamic/
│ │ └── server.rs
│ ├── dynamic_load_balance/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── gcp/
│ │ ├── README.md
│ │ └── client.rs
│ ├── grpc-web/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── h2c/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── health/
│ │ ├── README.md
│ │ └── server.rs
│ ├── helloworld/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── interceptor/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── json-codec/
│ │ ├── client.rs
│ │ ├── common.rs
│ │ └── server.rs
│ ├── load_balance/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── mock/
│ │ └── mock.rs
│ ├── multiplex/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── reflection/
│ │ └── server.rs
│ ├── richer-error/
│ │ ├── client.rs
│ │ ├── client_vec.rs
│ │ ├── server.rs
│ │ └── server_vec.rs
│ ├── routeguide/
│ │ ├── client.rs
│ │ ├── data.rs
│ │ └── server.rs
│ ├── streaming/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── tls/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── tls_client_auth/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── tls_rustls/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── tower/
│ │ ├── client.rs
│ │ └── server.rs
│ ├── tracing/
│ │ ├── client.rs
│ │ └── server.rs
│ └── uds/
│ ├── client_standard.rs
│ ├── client_with_connector.rs
│ └── server.rs
├── flake.nix
├── grpc/
│ ├── Cargo.toml
│ ├── examples/
│ │ └── inmemory.rs
│ ├── proto/
│ │ └── echo/
│ │ └── echo.proto
│ └── src/
│ ├── attributes/
│ │ ├── linked_list.rs
│ │ └── mod.rs
│ ├── byte_str.rs
│ ├── client/
│ │ ├── channel.rs
│ │ ├── interceptor.rs
│ │ ├── load_balancing/
│ │ │ ├── child_manager.rs
│ │ │ ├── graceful_switch.rs
│ │ │ ├── mod.rs
│ │ │ ├── pick_first.rs
│ │ │ ├── registry.rs
│ │ │ ├── round_robin.rs
│ │ │ └── test_utils.rs
│ │ ├── mod.rs
│ │ ├── name_resolution/
│ │ │ ├── backoff.rs
│ │ │ ├── dns/
│ │ │ │ ├── mod.rs
│ │ │ │ └── test.rs
│ │ │ ├── mod.rs
│ │ │ └── registry.rs
│ │ ├── service_config.rs
│ │ ├── stream_util.rs
│ │ ├── subchannel.rs
│ │ └── transport/
│ │ ├── mod.rs
│ │ ├── registry.rs
│ │ └── tonic/
│ │ ├── mod.rs
│ │ └── test.rs
│ ├── core/
│ │ └── mod.rs
│ ├── credentials/
│ │ ├── call.rs
│ │ ├── client.rs
│ │ ├── dyn_wrapper.rs
│ │ ├── insecure.rs
│ │ ├── local.rs
│ │ ├── mod.rs
│ │ ├── rustls/
│ │ │ ├── client/
│ │ │ │ ├── mod.rs
│ │ │ │ └── test.rs
│ │ │ ├── key_log.rs
│ │ │ ├── mod.rs
│ │ │ ├── server/
│ │ │ │ ├── mod.rs
│ │ │ │ └── test.rs
│ │ │ └── tls_stream.rs
│ │ └── server.rs
│ ├── generated/
│ │ ├── echo_fds.rs
│ │ └── grpc_examples_echo.rs
│ ├── inmemory/
│ │ └── mod.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── rt/
│ │ ├── hyper_wrapper.rs
│ │ ├── mod.rs
│ │ └── tokio/
│ │ ├── hickory_resolver.rs
│ │ └── mod.rs
│ ├── send_future.rs
│ ├── server/
│ │ └── mod.rs
│ ├── status/
│ │ ├── server_status.rs
│ │ └── status_code.rs
│ └── status.rs
├── interop/
│ ├── Cargo.toml
│ ├── bin/
│ │ ├── client_darwin_amd64
│ │ ├── client_linux_amd64
│ │ ├── server_darwin_amd64
│ │ └── server_linux_amd64
│ ├── build.rs
│ ├── data/
│ │ ├── README.md
│ │ ├── ca.pem
│ │ ├── cert-generator/
│ │ │ ├── .gitignore
│ │ │ ├── ca.tf
│ │ │ └── server_certs.tf
│ │ ├── server1.key
│ │ └── server1.pem
│ ├── proto/
│ │ └── grpc/
│ │ └── testing/
│ │ ├── empty.proto
│ │ ├── messages.proto
│ │ └── test.proto
│ ├── src/
│ │ ├── bin/
│ │ │ ├── client.rs
│ │ │ └── server.rs
│ │ ├── client.rs
│ │ ├── client_prost.rs
│ │ ├── client_protobuf.rs
│ │ ├── lib.rs
│ │ ├── server_prost.rs
│ │ └── server_protobuf.rs
│ ├── test.sh
│ └── update_binaries.sh
├── prepare-release.sh
├── protoc-gen-rust-grpc/
│ ├── .bazelrc
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── README.md
│ ├── cmake/
│ │ └── FetchProtobuf.cmake
│ └── src/
│ ├── BUILD
│ ├── grpc_rust_generator.cc
│ ├── grpc_rust_generator.h
│ └── grpc_rust_plugin.cc
├── publish-release.sh
├── tests/
│ ├── compile/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ ├── ambiguous_methods.proto
│ │ │ ├── includee.proto
│ │ │ ├── includer.proto
│ │ │ ├── result.proto
│ │ │ ├── root_crate_path.proto
│ │ │ ├── same_name.proto
│ │ │ ├── service.proto
│ │ │ ├── skip_debug.proto
│ │ │ ├── stream.proto
│ │ │ └── use_arc_self.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ ├── ui/
│ │ │ ├── ambiguous_methods.rs
│ │ │ ├── includer.rs
│ │ │ ├── result.rs
│ │ │ ├── root_file_path.rs
│ │ │ ├── same_name.rs
│ │ │ ├── service.rs
│ │ │ ├── skip_debug.rs
│ │ │ ├── stream.rs
│ │ │ └── use_arc_self.rs
│ │ └── ui.rs
│ ├── compression/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ └── test.proto
│ │ └── src/
│ │ ├── bidirectional_stream.rs
│ │ ├── client_stream.rs
│ │ ├── compressing_request.rs
│ │ ├── compressing_response.rs
│ │ ├── lib.rs
│ │ ├── server_stream.rs
│ │ └── util.rs
│ ├── default_stubs/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ ├── test.proto
│ │ │ └── test_default.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ └── default.rs
│ ├── deprecated_methods/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ └── test.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ └── deprecated_methods.rs
│ ├── disable_comments/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ └── test.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ └── disable_comments.rs
│ ├── extern_path/
│ │ ├── my_application/
│ │ │ ├── Cargo.toml
│ │ │ ├── build.rs
│ │ │ └── src/
│ │ │ └── main.rs
│ │ ├── proto/
│ │ │ ├── my_application/
│ │ │ │ └── service.proto
│ │ │ └── uuid/
│ │ │ └── uuid.proto
│ │ └── uuid/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── integration_tests/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ ├── stream.proto
│ │ │ └── test.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ ├── client_layer.rs
│ │ ├── complex_tower_middleware.rs
│ │ ├── connect_info.rs
│ │ ├── connection.rs
│ │ ├── extensions.rs
│ │ ├── http2_keep_alive.rs
│ │ ├── http2_max_header_list_size.rs
│ │ ├── interceptor.rs
│ │ ├── load_shed.rs
│ │ ├── max_message_size.rs
│ │ ├── origin.rs
│ │ ├── routes_builder.rs
│ │ ├── status.rs
│ │ ├── streams.rs
│ │ ├── timeout.rs
│ │ └── user_agent.rs
│ ├── web/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ └── test.proto
│ │ ├── src/
│ │ │ └── lib.rs
│ │ └── tests/
│ │ ├── grpc.rs
│ │ └── grpc_web.rs
│ ├── wellknown/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── proto/
│ │ │ └── wellknown.proto
│ │ └── src/
│ │ └── lib.rs
│ └── wellknown-compiled/
│ ├── Cargo.toml
│ ├── build.rs
│ ├── proto/
│ │ ├── google.proto
│ │ └── test.proto
│ └── src/
│ └── lib.rs
├── tonic/
│ ├── Cargo.toml
│ ├── benches/
│ │ └── decode.rs
│ ├── benches-disabled/
│ │ ├── README.md
│ │ ├── bench_main.rs
│ │ ├── benchmarks/
│ │ │ ├── compiled_protos/
│ │ │ │ ├── diverse_types.rs
│ │ │ │ ├── helloworld.rs
│ │ │ │ └── mod.rs
│ │ │ ├── mod.rs
│ │ │ ├── request_response.rs
│ │ │ ├── request_response_diverse_types.rs
│ │ │ └── utils.rs
│ │ └── proto/
│ │ ├── diverse_types/
│ │ │ └── diverse_types.proto
│ │ └── helloworld/
│ │ └── helloworld.proto
│ └── src/
│ ├── body.rs
│ ├── client/
│ │ ├── grpc.rs
│ │ ├── mod.rs
│ │ └── service.rs
│ ├── codec/
│ │ ├── buffer.rs
│ │ ├── compression.rs
│ │ ├── decode.rs
│ │ ├── encode.rs
│ │ └── mod.rs
│ ├── codegen.rs
│ ├── extensions.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── metadata/
│ │ ├── encoding.rs
│ │ ├── key.rs
│ │ ├── map.rs
│ │ ├── mod.rs
│ │ └── value.rs
│ ├── request.rs
│ ├── response.rs
│ ├── server/
│ │ ├── grpc.rs
│ │ ├── mod.rs
│ │ └── service.rs
│ ├── service/
│ │ ├── interceptor.rs
│ │ ├── layered.rs
│ │ ├── mod.rs
│ │ ├── recover_error.rs
│ │ └── router.rs
│ ├── status.rs
│ ├── transport/
│ │ ├── channel/
│ │ │ ├── endpoint.rs
│ │ │ ├── mod.rs
│ │ │ ├── service/
│ │ │ │ ├── add_origin.rs
│ │ │ │ ├── connection.rs
│ │ │ │ ├── connector.rs
│ │ │ │ ├── discover.rs
│ │ │ │ ├── executor.rs
│ │ │ │ ├── io.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── reconnect.rs
│ │ │ │ ├── tls.rs
│ │ │ │ └── user_agent.rs
│ │ │ ├── tls.rs
│ │ │ └── uds_connector.rs
│ │ ├── error.rs
│ │ ├── mod.rs
│ │ ├── server/
│ │ │ ├── conn.rs
│ │ │ ├── display_error_stack.rs
│ │ │ ├── incoming.rs
│ │ │ ├── io_stream.rs
│ │ │ ├── mod.rs
│ │ │ ├── service/
│ │ │ │ ├── io.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── tls.rs
│ │ │ ├── tls.rs
│ │ │ └── unix.rs
│ │ ├── service/
│ │ │ ├── grpc_timeout.rs
│ │ │ ├── mod.rs
│ │ │ └── tls.rs
│ │ └── tls.rs
│ └── util.rs
├── tonic-build/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── client.rs
│ ├── code_gen.rs
│ ├── lib.rs
│ ├── manual.rs
│ └── server.rs
├── tonic-health/
│ ├── Cargo.toml
│ ├── README.md
│ ├── proto/
│ │ └── health.proto
│ └── src/
│ ├── generated/
│ │ ├── grpc_health_v1.rs
│ │ └── grpc_health_v1_fds.rs
│ ├── lib.rs
│ └── server.rs
├── tonic-prost/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── codec.rs
│ └── lib.rs
├── tonic-prost-build/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── lib.rs
│ └── tests.rs
├── tonic-protobuf/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── tonic-protobuf-build/
│ ├── Cargo.toml
│ ├── README.md
│ ├── build.rs
│ └── src/
│ └── lib.rs
├── tonic-reflection/
│ ├── Cargo.toml
│ ├── README.md
│ ├── proto/
│ │ ├── reflection_v1.proto
│ │ └── reflection_v1alpha.proto
│ ├── src/
│ │ ├── generated/
│ │ │ ├── grpc_reflection_v1.rs
│ │ │ ├── grpc_reflection_v1alpha.rs
│ │ │ ├── reflection_v1_fds.rs
│ │ │ └── reflection_v1alpha1_fds.rs
│ │ ├── lib.rs
│ │ └── server/
│ │ ├── mod.rs
│ │ ├── v1.rs
│ │ └── v1alpha.rs
│ └── tests/
│ ├── server.rs
│ └── versions.rs
├── tonic-types/
│ ├── Cargo.toml
│ ├── README.md
│ ├── proto/
│ │ ├── error_details.proto
│ │ └── status.proto
│ └── src/
│ ├── generated/
│ │ ├── google_rpc.rs
│ │ └── types_fds.rs
│ ├── lib.rs
│ └── richer_error/
│ ├── error_details/
│ │ ├── mod.rs
│ │ └── vec.rs
│ ├── mod.rs
│ └── std_messages/
│ ├── bad_request.rs
│ ├── debug_info.rs
│ ├── error_info.rs
│ ├── help.rs
│ ├── loc_message.rs
│ ├── mod.rs
│ ├── prec_failure.rs
│ ├── quota_failure.rs
│ ├── request_info.rs
│ ├── resource_info.rs
│ └── retry_info.rs
├── tonic-web/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── call.rs
│ ├── client.rs
│ ├── layer.rs
│ ├── lib.rs
│ └── service.rs
├── tonic-xds/
│ ├── Cargo.toml
│ ├── examples/
│ │ └── gen_test_proto.rs
│ ├── proto/
│ │ └── test/
│ │ └── helloworld.proto
│ └── src/
│ ├── client/
│ │ ├── channel.rs
│ │ ├── cluster.rs
│ │ ├── endpoint.rs
│ │ ├── lb.rs
│ │ ├── mod.rs
│ │ └── route.rs
│ ├── common/
│ │ ├── async_util.rs
│ │ └── mod.rs
│ ├── lib.rs
│ ├── testutil/
│ │ ├── grpc.rs
│ │ ├── mod.rs
│ │ └── proto/
│ │ ├── helloworld.rs
│ │ └── mod.rs
│ └── xds/
│ ├── bootstrap.rs
│ ├── mod.rs
│ ├── resource/
│ │ ├── cluster.rs
│ │ ├── endpoints.rs
│ │ ├── listener.rs
│ │ ├── mod.rs
│ │ └── route_config.rs
│ ├── routing.rs
│ ├── uri.rs
│ └── xds_manager.rs
└── xds-client/
├── Cargo.toml
├── examples/
│ └── basic.rs
└── src/
├── client/
│ ├── config.rs
│ ├── mod.rs
│ ├── retry.rs
│ ├── watch.rs
│ └── worker.rs
├── codec/
│ ├── mod.rs
│ └── prost.rs
├── error.rs
├── lib.rs
├── message.rs
├── resource/
│ ├── mod.rs
│ └── prost.rs
├── runtime/
│ ├── mod.rs
│ └── tokio.rs
└── transport/
├── mod.rs
└── tonic.rs
Showing preview only (369K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4388 symbols across 315 files)
FILE: codegen/src/main.rs
function main (line 12) | fn main() {
function codegen (line 87) | fn codegen(
function write_fds (line 134) | fn write_fds(fds: &FileDescriptorSet, path: &Path) {
function comment_out (line 179) | fn comment_out(s: &str) -> String {
FILE: examples/build.rs
function main (line 3) | fn main() {
function build_json_codec_service (line 51) | fn build_json_codec_service() {
FILE: examples/src/authentication/client.rs
function main (line 9) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/authentication/server.rs
type EchoResult (line 8) | type EchoResult<T> = Result<Response<T>, Status>;
type EchoServer (line 11) | pub struct EchoServer {}
method unary_echo (line 15) | async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResul...
function main (line 22) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function check_auth (line 33) | fn check_auth(req: Request<()>) -> Result<Request<()>, Status> {
FILE: examples/src/autoreload/server.rs
type MyGreeter (line 11) | pub struct MyGreeter {}
method say_hello (line 15) | async fn say_hello(
function main (line 29) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/blocking/client.rs
type StdError (line 9) | type StdError = Box<dyn std::error::Error + Send + Sync + 'static>;
type Result (line 10) | type Result<T, E = StdError> = ::std::result::Result<T, E>;
type BlockingClient (line 16) | struct BlockingClient {
method connect (line 22) | pub fn connect<D>(dst: D) -> Result<Self, tonic::transport::Error>
method say_hello (line 33) | pub fn say_hello(
function main (line 41) | fn main() -> Result<()> {
FILE: examples/src/blocking/server.rs
type MyGreeter (line 13) | pub struct MyGreeter {}
method say_hello (line 17) | async fn say_hello(
function main (line 31) | fn main() {
FILE: examples/src/cancellation/client.rs
function main (line 11) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/cancellation/server.rs
type MyGreeter (line 18) | pub struct MyGreeter {}
method say_hello (line 22) | async fn say_hello(
function with_cancellation_handler (line 49) | async fn with_cancellation_handler<FRequest, FCancellation>(
function main (line 73) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/codec_buffers/client.rs
function main (line 18) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/codec_buffers/common.rs
type SmallBufferCodec (line 19) | pub struct SmallBufferCodec<T, U>(PhantomData<(T, U)>);
type Encode (line 26) | type Encode = T;
type Decode (line 27) | type Decode = U;
type Encoder (line 29) | type Encoder = <ProstCodec<T, U> as Codec>::Encoder;
type Decoder (line 30) | type Decoder = <ProstCodec<T, U> as Codec>::Decoder;
method encoder (line 32) | fn encoder(&mut self) -> Self::Encoder {
method decoder (line 39) | fn decoder(&mut self) -> Self::Decoder {
FILE: examples/src/codec_buffers/server.rs
type MyGreeter (line 21) | pub struct MyGreeter {}
method say_hello (line 25) | async fn say_hello(
function main (line 39) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/compression/client.rs
function main (line 11) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/compression/server.rs
type MyGreeter (line 12) | pub struct MyGreeter {}
method say_hello (line 16) | async fn say_hello(
function main (line 30) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/dynamic/server.rs
type EchoResult (line 18) | type EchoResult<T> = Result<Response<T>, Status>;
type MyEcho (line 21) | pub struct MyEcho {}
method unary_echo (line 25) | async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResult<...
function init_echo (line 34) | fn init_echo(args: &[String], builder: &mut RoutesBuilder) {
type MyGreeter (line 44) | pub struct MyGreeter {}
method say_hello (line 48) | async fn say_hello(
function init_greeter (line 61) | fn init_greeter(args: &[String], builder: &mut RoutesBuilder) {
function main (line 72) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/dynamic_load_balance/client.rs
function main (line 16) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/dynamic_load_balance/server.rs
type EchoResult (line 11) | type EchoResult<T> = Result<Response<T>, Status>;
type EchoServer (line 14) | pub struct EchoServer {
method unary_echo (line 20) | async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResul...
function main (line 28) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/gcp/client.rs
constant ENDPOINT (line 12) | const ENDPOINT: &str = "https://pubsub.googleapis.com";
function main (line 15) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/grpc-web/client.rs
function main (line 10) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/grpc-web/server.rs
type MyGreeter (line 11) | pub struct MyGreeter {}
method say_hello (line 15) | async fn say_hello(
function main (line 29) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/h2c/client.rs
function main (line 12) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
type H2cChannel (line 45) | pub struct H2cChannel {
type Response (line 50) | type Response = http::Response<Incoming>;
type Error (line 51) | type Error = hyper::Error;
type Future (line 52) | type Future =
method poll_ready (line 55) | fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll<Result<(), Self:...
method call (line 59) | fn call(&mut self, request: http::Request<Body>) -> Self::Future {
FILE: examples/src/h2c/server.rs
type MyGreeter (line 17) | pub struct MyGreeter {}
method say_hello (line 21) | async fn say_hello(
function main (line 35) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
type H2c (line 76) | pub struct H2c<S> {
type BoxError (line 80) | type BoxError = Box<dyn std::error::Error + Send + Sync>;
type Response (line 88) | type Response = hyper::Response<Body>;
type Error (line 89) | type Error = hyper::Error;
type Future (line 90) | type Future =
function poll_ready (line 93) | fn poll_ready(
function call (line 100) | fn call(&mut self, req: hyper::Request<Incoming>) -> Self::Future {
FILE: examples/src/health/server.rs
type MyGreeter (line 13) | pub struct MyGreeter {}
method say_hello (line 17) | async fn say_hello(
function twiddle_service_status (line 32) | async fn twiddle_service_status(reporter: HealthReporter) {
function main (line 47) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/helloworld/client.rs
function main (line 9) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/helloworld/server.rs
type MyGreeter (line 11) | pub struct MyGreeter {}
method say_hello (line 15) | async fn say_hello(
function main (line 29) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/interceptor/client.rs
function main (line 15) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function intercept (line 36) | fn intercept(req: Request<()>) -> Result<Request<()>, Status> {
type MyInterceptor (line 43) | struct MyInterceptor;
method call (line 46) | fn call(&mut self, request: tonic::Request<()>) -> Result<tonic::Request...
function using_named_interceptor (line 52) | async fn using_named_interceptor() -> Result<(), Box<dyn std::error::Err...
function using_function_pointer_interceptro (line 66) | async fn using_function_pointer_interceptro() -> Result<(), Box<dyn std:...
FILE: examples/src/interceptor/server.rs
type MyGreeter (line 11) | pub struct MyGreeter {}
method say_hello (line 15) | async fn say_hello(
function main (line 30) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function intercept (line 49) | fn intercept(mut req: Request<()>) -> Result<Request<()>, Status> {
type MyExtension (line 61) | struct MyExtension {
FILE: examples/src/json-codec/client.rs
function main (line 16) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/json-codec/common.rs
type HelloRequest (line 14) | pub struct HelloRequest {
type HelloResponse (line 19) | pub struct HelloResponse {
type JsonEncoder (line 24) | pub struct JsonEncoder<T>(PhantomData<T>);
type Item (line 27) | type Item = T;
type Error (line 28) | type Error = Status;
method encode (line 30) | fn encode(&mut self, item: Self::Item, buf: &mut EncodeBuf<'_>) -> Resul...
type JsonDecoder (line 36) | pub struct JsonDecoder<U>(PhantomData<U>);
type Item (line 39) | type Item = U;
type Error (line 40) | type Error = Status;
method decode (line 42) | fn decode(&mut self, buf: &mut DecodeBuf<'_>) -> Result<Option<Self::Ite...
type JsonCodec (line 55) | pub struct JsonCodec<T, U>(PhantomData<(T, U)>);
method default (line 58) | fn default() -> Self {
type Encode (line 68) | type Encode = T;
type Decode (line 69) | type Decode = U;
type Encoder (line 70) | type Encoder = JsonEncoder<T>;
type Decoder (line 71) | type Decoder = JsonDecoder<U>;
method encoder (line 73) | fn encoder(&mut self) -> Self::Encoder {
method decoder (line 77) | fn decoder(&mut self) -> Self::Decoder {
FILE: examples/src/json-codec/server.rs
type MyGreeter (line 18) | pub struct MyGreeter {}
method say_hello (line 22) | async fn say_hello(
function main (line 36) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/load_balance/client.rs
function main (line 9) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/load_balance/server.rs
type EchoResult (line 11) | type EchoResult<T> = Result<Response<T>, Status>;
type EchoServer (line 14) | pub struct EchoServer {
method unary_echo (line 20) | async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResul...
function main (line 28) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/mock/mock.rs
function main (line 19) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
type MyGreeter (line 62) | pub struct MyGreeter {}
method say_hello (line 66) | async fn say_hello(
FILE: examples/src/multiplex/client.rs
function main (line 14) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/multiplex/server.rs
function main (line 22) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
type MyGreeter (line 38) | pub struct MyGreeter {}
method say_hello (line 42) | async fn say_hello(
type MyEcho (line 54) | pub struct MyEcho {}
method unary_echo (line 58) | async fn unary_echo(
FILE: examples/src/reflection/server.rs
constant FILE_DESCRIPTOR_SET (line 7) | pub(crate) const FILE_DESCRIPTOR_SET: &[u8] =
type MyGreeter (line 12) | pub struct MyGreeter {}
method say_hello (line 16) | async fn say_hello(
function main (line 30) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/richer-error/client.rs
function main (line 11) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/richer-error/client_vec.rs
function main (line 11) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/richer-error/server.rs
type MyGreeter (line 12) | pub struct MyGreeter {}
method say_hello (line 16) | async fn say_hello(
function main (line 59) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/richer-error/server_vec.rs
type MyGreeter (line 12) | pub struct MyGreeter {}
method say_hello (line 16) | async fn say_hello(
function main (line 59) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/routeguide/client.rs
function print_features (line 17) | async fn print_features(client: &mut RouteGuideClient<Channel>) -> Resul...
function run_record_route (line 41) | async fn run_record_route(client: &mut RouteGuideClient<Channel>) -> Res...
function run_route_chat (line 61) | async fn run_route_chat(client: &mut RouteGuideClient<Channel>) -> Resul...
function main (line 93) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function random_point (line 117) | fn random_point(rng: &mut ThreadRng) -> Point {
FILE: examples/src/routeguide/data.rs
type Feature (line 5) | struct Feature {
type Location (line 11) | struct Location {
function load (line 17) | pub fn load() -> Vec<crate::routeguide::Feature> {
FILE: examples/src/routeguide/server.rs
type RouteGuideService (line 21) | pub struct RouteGuideService {
method get_feature (line 27) | async fn get_feature(&self, request: Request<Point>) -> Result<Response<...
type ListFeaturesStream (line 39) | type ListFeaturesStream = ReceiverStream<Result<Feature, Status>>;
method list_features (line 41) | async fn list_features(
method record_route (line 64) | async fn record_route(
type RouteChatStream (line 104) | type RouteChatStream = Pin<Box<dyn Stream<Item = Result<RouteNote, Statu...
method route_chat (line 106) | async fn route_chat(
function main (line 135) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function in_range (line 151) | fn in_range(point: &Point, rect: &Rectangle) -> bool {
function calc_distance (line 170) | fn calc_distance(p1: &Point, p2: &Point) -> i32 {
FILE: examples/src/streaming/client.rs
function echo_requests_iter (line 11) | fn echo_requests_iter() -> impl Stream<Item = EchoRequest> {
function streaming_echo (line 17) | async fn streaming_echo(client: &mut EchoClient<Channel>, num: usize) {
function bidirectional_streaming_echo (line 34) | async fn bidirectional_streaming_echo(client: &mut EchoClient<Channel>, ...
function bidirectional_streaming_echo_throttle (line 50) | async fn bidirectional_streaming_echo_throttle(client: &mut EchoClient<C...
function main (line 67) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/streaming/server.rs
type EchoResult (line 12) | type EchoResult<T> = Result<Response<T>, Status>;
type ResponseStream (line 13) | type ResponseStream = Pin<Box<dyn Stream<Item = Result<EchoResponse, Sta...
function match_for_io_error (line 15) | fn match_for_io_error(err_status: &Status) -> Option<&std::io::Error> {
type EchoServer (line 36) | pub struct EchoServer {}
method unary_echo (line 40) | async fn unary_echo(&self, _: Request<EchoRequest>) -> EchoResult<Echo...
type ServerStreamingEchoStream (line 44) | type ServerStreamingEchoStream = ResponseStream;
method server_streaming_echo (line 46) | async fn server_streaming_echo(
method client_streaming_echo (line 83) | async fn client_streaming_echo(
type BidirectionalStreamingEchoStream (line 90) | type BidirectionalStreamingEchoStream = ResponseStream;
method bidirectional_streaming_echo (line 92) | async fn bidirectional_streaming_echo(
function main (line 142) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/tls/client.rs
function main (line 9) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/tls/server.rs
type EchoResult (line 14) | type EchoResult<T> = Result<Response<T>, Status>;
type EchoServer (line 17) | pub struct EchoServer {}
method unary_echo (line 21) | async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResul...
function main (line 38) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/tls_client_auth/client.rs
function main (line 9) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/tls_client_auth/server.rs
type EchoResult (line 9) | type EchoResult<T> = Result<Response<T>, Status>;
type EchoServer (line 12) | pub struct EchoServer {}
method unary_echo (line 16) | async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResul...
function main (line 29) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/tls_rustls/client.rs
function main (line 17) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/tls_rustls/server.rs
function main (line 25) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
type ConnInfo (line 96) | struct ConnInfo {
type EchoResult (line 101) | type EchoResult<T> = Result<Response<T>, Status>;
type EchoServer (line 104) | pub struct EchoServer {}
method unary_echo (line 108) | async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResul...
FILE: examples/src/tower/client.rs
function main (line 13) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function intercept (line 36) | fn intercept(req: Request<()>) -> Result<Request<()>, Status> {
type AuthSvc (line 50) | pub struct AuthSvc {
method new (line 55) | pub fn new(inner: Channel) -> Self {
type Response (line 61) | type Response = Response<Body>;
type Error (line 62) | type Error = Box<dyn std::error::Error + Send + Sync>;
type Future (line 64) | type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self:...
method poll_ready (line 66) | fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self...
method call (line 70) | fn call(&mut self, req: Request<Body>) -> Self::Future {
FILE: examples/src/tower/server.rs
type MyGreeter (line 16) | pub struct MyGreeter {}
method say_hello (line 20) | async fn say_hello(
function main (line 34) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function intercept (line 61) | fn intercept(req: Request<()>) -> Result<Request<()>, Status> {
type MyMiddlewareLayer (line 66) | struct MyMiddlewareLayer {}
type Service (line 69) | type Service = MyMiddleware<S>;
method layer (line 71) | fn layer(&self, service: S) -> Self::Service {
type MyMiddleware (line 77) | struct MyMiddleware<S> {
type BoxFuture (line 81) | type BoxFuture<'a, T> = Pin<Box<dyn std::future::Future<Output = T> + Se...
type Response (line 89) | type Response = S::Response;
type Error (line 90) | type Error = S::Error;
type Future (line 91) | type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>;
function poll_ready (line 93) | fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::...
function call (line 97) | fn call(&mut self, req: http::Request<ReqBody>) -> Self::Future {
FILE: examples/src/tracing/client.rs
function main (line 8) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function say_hi (line 19) | async fn say_hi(name: String) -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/tracing/server.rs
type MyGreeter (line 13) | pub struct MyGreeter {}
method say_hello (line 18) | async fn say_hello(
function main (line 35) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: examples/src/uds/client_standard.rs
function main (line 11) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function main (line 32) | fn main() {
FILE: examples/src/uds/client_with_connector.rs
function main (line 16) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function main (line 44) | fn main() {
FILE: examples/src/uds/server.rs
type MyGreeter (line 22) | pub struct MyGreeter {}
method say_hello (line 26) | async fn say_hello(
function main (line 45) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
function main (line 64) | fn main() {
FILE: grpc/examples/inmemory.rs
type Handler (line 44) | struct Handler {
type MyReqMessage (line 49) | struct MyReqMessage(String);
method encode (line 52) | fn encode(&self) -> Result<Box<dyn Buf + Send + Sync>, String> {
method decode (line 57) | fn decode(&mut self, data: &mut dyn Buf) -> Result<(), String> {
type MyResMessage (line 65) | struct MyResMessage(String);
method encode (line 67) | fn encode(&self) -> Result<Box<dyn Buf + Send + Sync>, String> {
method decode (line 72) | fn decode(&mut self, data: &mut dyn Buf) -> Result<(), String> {
method handle (line 80) | async fn handle(
function main (line 123) | async fn main() {
function run_rpc (line 171) | async fn run_rpc(chan: &Channel) -> String {
FILE: grpc/src/attributes/linked_list.rs
type Node (line 32) | struct Node<K, V> {
type LinkedList (line 52) | pub(crate) struct LinkedList<K, V> {
method clone (line 57) | fn clone(&self) -> Self {
method default (line 65) | fn default() -> Self {
function new (line 72) | pub(crate) fn new() -> Self {
function add (line 80) | pub(crate) fn add(&self, key: K, value: V) -> Self {
function get (line 106) | pub(crate) fn get(&self, key: &K) -> Option<&V> {
function iter (line 124) | pub(crate) fn iter(&self) -> Iter<'_, K, V> {
type Iter (line 133) | pub struct Iter<'a, K, V> {
type Item (line 139) | type Item = (&'a K, &'a V);
method next (line 141) | fn next(&mut self) -> Option<Self::Item> {
function test_add_and_iter (line 157) | fn test_add_and_iter() {
function test_persistence (line 164) | fn test_persistence() {
function test_shadowing (line 178) | fn test_shadowing() {
function test_send_sync (line 186) | fn test_send_sync() {
FILE: grpc/src/attributes/mod.rs
type AttributeTrait (line 37) | trait AttributeTrait: Any + Send + Sync + Debug {
method any_ref (line 38) | fn any_ref(&self) -> &dyn Any;
method dyn_eq (line 39) | fn dyn_eq(&self, other: &dyn AttributeTrait) -> bool;
method dyn_cmp (line 40) | fn dyn_cmp(&self, other: &dyn AttributeTrait) -> Ordering;
method any_ref (line 44) | fn any_ref(&self) -> &dyn Any {
method dyn_eq (line 48) | fn dyn_eq(&self, other: &dyn AttributeTrait) -> bool {
method dyn_cmp (line 56) | fn dyn_cmp(&self, other: &dyn AttributeTrait) -> Ordering {
type AttributeValue (line 68) | struct AttributeValue {
method eq (line 73) | fn eq(&self, other: &Self) -> bool {
method partial_cmp (line 81) | fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
method cmp (line 87) | fn cmp(&self, other: &Self) -> Ordering {
type Attributes (line 107) | pub struct Attributes {
method new (line 112) | pub fn new() -> Self {
method add (line 119) | pub fn add<T: Send + Sync + Eq + Ord + Debug + 'static>(&self, value: ...
method get (line 132) | pub fn get<T: 'static>(&self) -> Option<&T> {
method eq (line 141) | fn eq(&self, other: &Self) -> bool {
method partial_cmp (line 156) | fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
method cmp (line 162) | fn cmp(&self, other: &Self) -> Ordering {
function test_eq (line 176) | fn test_eq() {
function test_attributes (line 189) | fn test_attributes() {
function test_persistence (line 200) | fn test_persistence() {
function test_overwrite (line 212) | fn test_overwrite() {
type Priority (line 221) | struct Priority {
type Config (line 227) | struct Config {
function test_custom_structs (line 233) | fn test_custom_structs() {
FILE: grpc/src/byte_str.rs
type ByteStr (line 32) | pub struct ByteStr {
method from (line 51) | fn from(src: String) -> ByteStr {
type Target (line 38) | type Target = str;
method deref (line 41) | fn deref(&self) -> &str {
FILE: grpc/src/client/channel.rs
type ChannelOptions (line 86) | pub struct ChannelOptions {
method transport_options (line 137) | pub fn transport_options(self, transport_options: TODO) -> Self {
method override_authority (line 140) | pub fn override_authority(self, authority: String) -> Self {
method default (line 120) | fn default() -> Self {
type Channel (line 152) | pub struct Channel {
method new (line 162) | pub fn new<C>(target: &str, credentials: C, options: ChannelOptions) -...
method state (line 183) | pub fn state(&mut self, connect: bool) -> ConnectivityState {
method wait_for_state_change (line 189) | pub async fn wait_for_state_change(
type SendStream (line 199) | type SendStream = Box<dyn DynSendStream>;
type RecvStream (line 200) | type RecvStream = Box<dyn DynRecvStream>;
method invoke (line 202) | async fn invoke(
type PersistentChannel (line 216) | struct PersistentChannel {
method new (line 226) | fn new(
method state (line 242) | fn state(&self, connect: bool) -> ConnectivityState {
method get_active_channel (line 263) | fn get_active_channel(&self) -> Arc<ActiveChannel> {
type ActiveChannel (line 278) | struct ActiveChannel {
method new (line 286) | fn new(target: Url, options: &ChannelOptions, runtime: GrpcRuntime) ->...
type SendStream (line 339) | type SendStream = Box<dyn DynSendStream>;
type RecvStream (line 340) | type RecvStream = Box<dyn DynRecvStream>;
method invoke (line 342) | async fn invoke(
method drop (line 384) | fn drop(&mut self) {
type ResolverWorkScheduler (line 389) | struct ResolverWorkScheduler {
method schedule_work (line 396) | fn schedule_work(&self) {
type WorkQueueTx (line 393) | pub(super) type WorkQueueTx = mpsc::UnboundedSender<WorkQueueItem>;
type InternalChannelController (line 401) | pub(crate) struct InternalChannelController {
method new (line 414) | fn new(
method new_esc_for_isc (line 444) | fn new_esc_for_isc(&self, isc: Arc<InternalSubchannel>) -> Arc<dyn Sub...
method update (line 454) | fn update(&mut self, update: ResolverUpdate) -> Result<(), String> {
method parse_service_config (line 460) | fn parse_service_config(&self, config: &str) -> Result<ServiceConfig, ...
method new_subchannel (line 466) | fn new_subchannel(&mut self, address: &Address) -> Arc<dyn Subchannel> {
method update_picker (line 496) | fn update_picker(&mut self, update: LbState) {
method request_resolution (line 505) | fn request_resolution(&mut self) {
type LbController (line 512) | pub(super) struct LbController {
method new (line 547) | fn new(work_scheduler: Arc<LbWorkScheduler>, runtime: GrpcRuntime) -> ...
method handle_resolver_update (line 556) | fn handle_resolver_update(
method subchannel_update (line 601) | pub(super) fn subchannel_update(
type LbWorkScheduler (line 520) | struct LbWorkScheduler {
method schedule_work (line 526) | fn schedule_work(&self) {
type WorkQueueItem (line 615) | pub(super) enum WorkQueueItem {
type TODO (line 622) | pub struct TODO;
type Watcher (line 627) | pub(crate) struct Watcher<T> {
function new (line 633) | fn new() -> Self {
function iter (line 638) | pub(crate) fn iter(&self) -> WatcherIter<T> {
function cur (line 644) | pub(crate) fn cur(&self) -> Option<T> {
function update (line 651) | fn update(&self, item: T) {
type WatcherIter (line 656) | pub(crate) struct WatcherIter<T> {
function next (line 665) | pub(crate) async fn next(&mut self) -> Option<T> {
FILE: grpc/src/client/interceptor.rs
type Intercept (line 37) | pub trait Intercept<I>: Sync {
method intercept (line 44) | async fn intercept(
type InterceptOnce (line 54) | pub trait InterceptOnce<I>: Sync {
method intercept_once (line 61) | async fn intercept_once(
type IntoOnce (line 73) | pub struct IntoOnce<T>(pub T);
type SendStream (line 82) | type SendStream = SS;
method send (line 579) | async fn send(&mut self, item: &dyn SendMessage, options: SendOptions)...
method send (line 648) | async fn send(&mut self, msg: &dyn SendMessage, options: SendOptions) ...
method send (line 892) | async fn send(&mut self, _item: &dyn SendMessage, _options: SendOption...
type RecvStream (line 83) | type RecvStream = RS;
method next (line 589) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> ClientResponseS...
method next (line 704) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> ClientResponseS...
method next (line 897) | async fn next(
function intercept_once (line 85) | async fn intercept_once(
type Intercepted (line 99) | pub struct Intercepted<Inv, Int> {
function new (line 105) | pub fn new(invoke: Inv, intercept: Int) -> Self {
type SendStream (line 115) | type SendStream = Int::SendStream;
type RecvStream (line 116) | type RecvStream = Int::RecvStream;
method invoke_once (line 118) | async fn invoke_once(
type SendStream (line 136) | type SendStream = SS;
type RecvStream (line 137) | type RecvStream = RS;
method invoke (line 139) | async fn invoke(
type InterceptedOnce (line 151) | pub struct InterceptedOnce<Inv, Int> {
function new (line 157) | pub fn new(invoke: Inv, intercept: Int) -> Self {
type SendStream (line 169) | type SendStream = SS;
type RecvStream (line 170) | type RecvStream = RS;
method invoke_once (line 172) | async fn invoke_once(
type InvokeExt (line 186) | pub trait InvokeExt: Invoke + Sized {
method with_interceptor (line 187) | fn with_interceptor<Int>(self, interceptor: Int) -> Intercepted<Self, ...
method with_once_interceptor (line 194) | fn with_once_interceptor<Int>(self, interceptor: Int) -> InterceptedOn...
type InvokeOnceExt (line 205) | pub trait InvokeOnceExt: InvokeOnce + Sized {
method with_interceptor (line 206) | fn with_interceptor<Int>(self, interceptor: Int) -> Intercepted<Self, ...
method with_once_interceptor (line 213) | fn with_once_interceptor<Int>(self, interceptor: Int) -> Intercepted<S...
type Reusable (line 273) | struct Reusable;
type SendStream (line 275) | type SendStream = NopStream;
type RecvStream (line 276) | type RecvStream = I::RecvStream;
method intercept (line 278) | async fn intercept(
type ReusableFanOut (line 290) | struct ReusableFanOut;
type SendStream (line 292) | type SendStream = RetrySendStream<I::SendStream>;
type RecvStream (line 293) | type RecvStream = RetryRecvStream<I>;
method intercept (line 295) | async fn intercept(
type Oneshot (line 304) | struct Oneshot;
type SendStream (line 306) | type SendStream = I::SendStream;
type RecvStream (line 307) | type RecvStream = NopStream;
method intercept_once (line 309) | async fn intercept_once(
type OneshotFanOut (line 320) | struct OneshotFanOut;
type SendStream (line 322) | type SendStream = I::SendStream;
type RecvStream (line 323) | type RecvStream = I::RecvStream;
method intercept_once (line 325) | async fn intercept_once(
function test_interceptor_creation (line 338) | async fn test_interceptor_creation() {
function test_retry_interceptor_succeeds (line 395) | async fn test_retry_interceptor_succeeds() {
function test_retry_interceptor_fails (line 440) | async fn test_retry_interceptor_fails() {
function test_retry_interceptor_commit_on_headers (line 492) | async fn test_retry_interceptor_commit_on_headers() {
type MockInvoker (line 526) | struct MockInvoker {
method new (line 537) | fn new() -> (Self, MockInvokerController) {
type MockInvokerController (line 532) | struct MockInvokerController {
method recv_req (line 553) | async fn recv_req(&mut self) -> (Bytes, SendOptions) {
method send_resp (line 556) | async fn send_resp(&mut self, item: ClientResponseStreamItem) {
type SendStream (line 562) | type SendStream = MockSendStream;
type RecvStream (line 563) | type RecvStream = MockRecvStream;
method invoke (line 565) | async fn invoke(
type MockSendStream (line 577) | struct MockSendStream(mpsc::Sender<(Bytes, SendOptions)>);
type MockRecvStream (line 587) | struct MockRecvStream(broadcast::Receiver<ClientResponseStreamItem>);
function start_retry_streams (line 594) | async fn start_retry_streams<I: Invoke + Clone>(
type Cache (line 621) | struct Cache<S> {
function new (line 632) | fn new() -> Arc<Mutex<Self>> {
type RetrySendStream (line 642) | struct RetrySendStream<S> {
type RetryRecvStream (line 680) | pub struct RetryRecvStream<I: Invoke> {
function should_retry (line 693) | fn should_retry(i: &ClientResponseStreamItem) -> bool {
constant MAX_ATTEMPTS (line 701) | const MAX_ATTEMPTS: usize = 3;
function replay_sends (line 754) | async fn replay_sends<S, F>(
type RecvStreamState (line 796) | enum RecvStreamState<F> {
function race_with (line 806) | async fn race_with<F2: Future + Unpin>(&mut self, fut: &mut F2) -> Optio...
function resolve (line 822) | async fn resolve(self) -> ClientResponseStreamItem {
type ByteRecvMsg (line 830) | struct ByteRecvMsg {
method new (line 834) | fn new() -> Self {
method decode (line 839) | fn decode(&mut self, data: &mut dyn Buf) -> Result<(), String> {
type ByteSendMsg (line 845) | struct ByteSendMsg<'a> {
function new (line 849) | fn new(data: &'a Bytes) -> Self {
method encode (line 854) | fn encode(&self) -> Result<Box<dyn Buf + Send + Sync>, String> {
type NopInvoker (line 860) | struct NopInvoker;
type SendStream (line 863) | type SendStream = NopStream;
type RecvStream (line 864) | type RecvStream = NopStream;
method invoke (line 866) | async fn invoke(
type NopOnceInvoker (line 875) | struct NopOnceInvoker;
type SendStream (line 878) | type SendStream = NopStream;
type RecvStream (line 879) | type RecvStream = NopStream;
method invoke_once (line 881) | async fn invoke_once(
type NopStream (line 890) | struct NopStream;
FILE: grpc/src/client/load_balancing/child_manager.rs
type ChildManager (line 58) | pub(crate) struct ChildManager<T: Debug> {
type Child (line 69) | pub(crate) struct Child<T> {
type ChildUpdate (line 78) | pub(crate) struct ChildUpdate<T> {
function new (line 99) | pub fn new(runtime: GrpcRuntime, work_scheduler: Arc<dyn WorkScheduler>)...
function children (line 111) | pub fn children(&self) -> impl Iterator<Item = &Child<T>> {
function aggregate_states (line 121) | pub fn aggregate_states(&self) -> ConnectivityState {
function resolve_child_controller (line 157) | fn resolve_child_controller(
function child_updated (line 175) | pub fn child_updated(&mut self) -> bool {
function retain_children (line 183) | pub fn retain_children(
function reset_children (line 194) | fn reset_children(
function update (line 295) | pub fn update(
function resolver_update (line 343) | pub fn resolver_update(
function subchannel_update (line 376) | pub fn subchannel_update(
function work (line 396) | pub fn work(&mut self, channel_controller: &mut dyn ChannelController) {
function exit_idle (line 408) | pub fn exit_idle(&mut self, channel_controller: &mut dyn ChannelControll...
type WrappedController (line 418) | struct WrappedController<'a> {
function new (line 425) | fn new(channel_controller: &'a mut dyn ChannelController) -> Self {
method new_subchannel (line 435) | fn new_subchannel(&mut self, address: &Address) -> Arc<dyn Subchannel> {
method update_picker (line 441) | fn update_picker(&mut self, update: LbState) {
method request_resolution (line 445) | fn request_resolution(&mut self) {
type ChildWorkScheduler (line 451) | struct ChildWorkScheduler {
method invalidate (line 472) | fn invalidate(&self) {
method schedule_work (line 458) | fn schedule_work(&self) {
function setup (line 523) | fn setup(
function create_n_endpoints_with_k_addresses (line 541) | fn create_n_endpoints_with_k_addresses(n: usize, k: usize) -> Vec<Endpoi...
function send_resolver_update_to_policy (line 560) | fn send_resolver_update_to_policy(
function move_subchannel_to_state (line 583) | fn move_subchannel_to_state(
function verify_subchannel_creation_from_policy (line 601) | async fn verify_subchannel_creation_from_policy(
function create_verifying_funcs_for_aggregate_tests (line 619) | fn create_verifying_funcs_for_aggregate_tests() -> StubPolicyFuncs {
function childmanager_aggregate_state_is_ready_if_any_child_is_ready (line 650) | async fn childmanager_aggregate_state_is_ready_if_any_child_is_ready() {
function childmanager_aggregate_state_is_connecting_if_no_child_is_ready (line 705) | async fn childmanager_aggregate_state_is_connecting_if_no_child_is_ready...
function childmanager_aggregate_state_is_idle_if_only_idle_and_failure (line 756) | async fn childmanager_aggregate_state_is_idle_if_only_idle_and_failure() {
function childmanager_aggregate_state_is_transient_failure_if_all_children_are (line 798) | async fn childmanager_aggregate_state_is_transient_failure_if_all_childr...
type ScheduleWorkStubData (line 839) | struct ScheduleWorkStubData {
function create_funcs_for_schedule_work_tests (line 843) | fn create_funcs_for_schedule_work_tests(name: &'static str) -> StubPolic...
function childmanager_schedule_work_works (line 888) | async fn childmanager_schedule_work_works() {
FILE: grpc/src/client/load_balancing/graceful_switch.rs
type GracefulSwitchLbConfig (line 46) | struct GracefulSwitchLbConfig {
type GracefulSwitchPolicy (line 59) | pub(crate) struct GracefulSwitchPolicy {
method new (line 138) | pub fn new(runtime: GrpcRuntime, work_scheduler: Arc<dyn WorkScheduler...
method parse_config (line 151) | pub fn parse_config(
method update_picker (line 185) | fn update_picker(&mut self, channel_controller: &mut dyn ChannelContro...
method maybe_swap (line 199) | fn maybe_swap(&mut self, channel_controller: &mut dyn ChannelControlle...
method resolver_update (line 66) | fn resolver_update(
method subchannel_update (line 108) | fn subchannel_update(
method work (line 119) | fn work(&mut self, channel_controller: &mut dyn ChannelController) {
method exit_idle (line 124) | fn exit_idle(&mut self, channel_controller: &mut dyn ChannelController) {
type ChildKind (line 131) | enum ChildKind {
constant DEFAULT_TEST_SHORT_TIMEOUT (line 287) | const DEFAULT_TEST_SHORT_TIMEOUT: Duration = Duration::from_millis(10);
type TestSubchannelList (line 289) | struct TestSubchannelList {
method new (line 294) | fn new(addresses: &Vec<Address>, channel_controller: &mut dyn ChannelC...
method contains (line 305) | fn contains(&self, sc: &Arc<dyn Subchannel>) -> bool {
type TestPicker (line 311) | struct TestPicker {
method new (line 316) | fn new(name: &'static str) -> Self {
method pick (line 321) | fn pick(&self, _req: &RequestHeaders) -> PickResult {
type TestState (line 336) | struct TestState {
function create_funcs_for_gracefulswitch_tests (line 341) | fn create_funcs_for_gracefulswitch_tests(name: &'static str) -> StubPoli...
function setup (line 404) | fn setup() -> (
function create_endpoint_with_one_address (line 423) | fn create_endpoint_with_one_address(addr: String) -> Endpoint {
function verify_subchannel_creation_from_policy (line 435) | async fn verify_subchannel_creation_from_policy(
function verify_correct_picker_from_policy (line 448) | async fn verify_correct_picker_from_policy(
function move_subchannel_to_state (line 472) | fn move_subchannel_to_state(
function gracefulswitch_successful_first_update (line 491) | async fn gracefulswitch_successful_first_update() {
function gracefulswitch_switching_to_resolver_update (line 543) | async fn gracefulswitch_switching_to_resolver_update() {
function assert_channel_empty (line 623) | async fn assert_channel_empty(rx_events: &mut UnboundedReceiver<TestEven...
function gracefulswitch_two_policies_same_type (line 635) | async fn gracefulswitch_two_policies_same_type() {
function gracefulswitch_current_not_ready_pending_update (line 691) | async fn gracefulswitch_current_not_ready_pending_update() {
function gracefulswitch_current_leaving_ready (line 767) | async fn gracefulswitch_current_leaving_ready() {
function gracefulswitch_pending_leaving_connecting (line 854) | async fn gracefulswitch_pending_leaving_connecting() {
function gracefulswitch_subchannels_removed_after_current_child_swapped (line 944) | async fn gracefulswitch_subchannels_removed_after_current_child_swapped() {
FILE: grpc/src/client/load_balancing/mod.rs
type LbPolicyOptions (line 66) | pub(crate) struct LbPolicyOptions {
type WorkScheduler (line 76) | pub(crate) trait WorkScheduler: Send + Sync + Debug {
method schedule_work (line 80) | fn schedule_work(&self);
type ParsedJsonLbConfig (line 87) | pub(crate) struct ParsedJsonLbConfig {
method new (line 93) | pub fn new(json: &str) -> Result<Self, String> {
method from_value (line 100) | pub(crate) fn from_value(value: serde_json::Value) -> Self {
method convert_to (line 109) | pub fn convert_to<T: serde::de::DeserializeOwned>(
type LbPolicyBuilder (line 124) | pub(crate) trait LbPolicyBuilder: Send + Sync + Debug {
method build (line 132) | fn build(&self, options: LbPolicyOptions) -> Box<dyn LbPolicy>;
method name (line 135) | fn name(&self) -> &'static str;
method parse_config (line 141) | fn parse_config(
type LbPolicy (line 154) | pub(crate) trait LbPolicy: Send + Debug {
method resolver_update (line 157) | fn resolver_update(
method subchannel_update (line 166) | fn subchannel_update(
method work (line 175) | fn work(&mut self, channel_controller: &mut dyn ChannelController);
method exit_idle (line 179) | fn exit_idle(&mut self, channel_controller: &mut dyn ChannelController);
type ChannelController (line 183) | pub(crate) trait ChannelController: Send + Sync {
method new_subchannel (line 185) | fn new_subchannel(&mut self, address: &Address) -> Arc<dyn Subchannel>;
method update_picker (line 188) | fn update_picker(&mut self, update: LbState);
method request_resolution (line 193) | fn request_resolution(&mut self);
type SubchannelState (line 198) | pub(crate) struct SubchannelState {
method default (line 208) | fn default() -> Self {
method fmt (line 217) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type Picker (line 247) | pub(crate) trait Picker: Send + Sync + Debug {
method pick (line 254) | fn pick(&self, request: &RequestHeaders) -> PickResult;
method pick (line 606) | fn pick(&self, _request: &RequestHeaders) -> PickResult {
method pick (line 617) | fn pick(&self, _: &RequestHeaders) -> PickResult {
type PickResult (line 258) | pub(crate) enum PickResult {
method unwrap_pick (line 280) | pub fn unwrap_pick(self) -> Pick {
method eq (line 289) | fn eq(&self, other: &Self) -> bool {
method fmt (line 309) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type LbState (line 320) | pub(crate) struct LbState {
method initial (line 343) | pub fn initial() -> Self {
method eq (line 332) | fn eq(&self, other: &Self) -> bool {
type CompletionCallback (line 352) | pub(crate) type CompletionCallback = Box<dyn Fn() + Send + Sync>;
type Pick (line 355) | pub(crate) struct Pick {
method fmt (line 365) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type DynHash (line 374) | pub(crate) trait DynHash {
method dyn_hash (line 376) | fn dyn_hash(&self, state: &mut Box<&mut dyn Hasher>);
method dyn_hash (line 380) | fn dyn_hash(&self, state: &mut Box<&mut dyn Hasher>) {
type DynPartialEq (line 385) | pub(crate) trait DynPartialEq {
method dyn_eq (line 386) | fn dyn_eq(&self, other: &&dyn Any) -> bool;
method dyn_eq (line 390) | fn dyn_eq(&self, other: &&dyn Any) -> bool {
type Sealed (line 399) | pub trait Sealed {}
type SealedSubchannel (line 402) | pub(crate) trait SealedSubchannel: private::Sealed {}
type Subchannel (line 421) | pub(crate) trait Subchannel:
method address (line 426) | fn address(&self) -> Address;
method connect (line 429) | fn connect(&self);
method address (line 535) | fn address(&self) -> Address {
method connect (line 539) | fn connect(&self) {
method address (line 590) | fn address(&self) -> Address {
method connect (line 593) | fn connect(&self) {
function downcast_ref (line 433) | pub fn downcast_ref<T>(&self) -> Option<&T>
method hash (line 442) | fn hash<H: Hasher>(&self, state: &mut H) {
method eq (line 448) | fn eq(&self, other: &Self) -> bool {
method fmt (line 456) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method fmt (line 462) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type WeakSubchannel (line 468) | struct WeakSubchannel(Weak<dyn Subchannel>);
method from (line 471) | fn from(subchannel: Arc<dyn Subchannel>) -> Self {
method new (line 477) | pub fn new(subchannel: &Arc<dyn Subchannel>) -> Self {
method upgrade (line 481) | pub fn upgrade(&self) -> Option<Arc<dyn Subchannel>> {
method hash (line 487) | fn hash<H: Hasher>(&self, state: &mut H) {
method eq (line 493) | fn eq(&self, other: &Self) -> bool {
type ExternalSubchannel (line 500) | pub(crate) struct ExternalSubchannel {
method new (line 507) | pub(super) fn new(isc: Arc<InternalSubchannel>, work_scheduler: WorkQu...
method set_watcher (line 515) | pub(super) fn set_watcher(&self, watcher: Arc<SubchannelStateWatcher>) {
method hash (line 521) | fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
method eq (line 527) | fn eq(&self, other: &Self) -> bool {
method drop (line 549) | fn drop(&mut self) {
method fmt (line 567) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method fmt (line 573) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type ForwardingSubchannel (line 578) | pub(crate) trait ForwardingSubchannel: DynHash + DynPartialEq + Any + Se...
method delegate (line 579) | fn delegate(&self) -> Arc<dyn Subchannel>;
method address (line 581) | fn address(&self) -> Address {
method connect (line 584) | fn connect(&self) {
type QueuingPicker (line 603) | pub(crate) struct QueuingPicker {}
type FailingPicker (line 612) | pub(crate) struct FailingPicker {
FILE: grpc/src/client/load_balancing/pick_first.rs
type Builder (line 52) | struct Builder {}
method build (line 55) | fn build(&self, options: LbPolicyOptions) -> Box<dyn LbPolicy> {
method name (line 64) | fn name(&self) -> &'static str {
function reg (line 69) | pub(crate) fn reg() {
type PickFirstPolicy (line 74) | struct PickFirstPolicy {
method resolver_update (line 82) | fn resolver_update(
method subchannel_update (line 114) | fn subchannel_update(
method work (line 131) | fn work(&mut self, channel_controller: &mut dyn ChannelController) {}
method exit_idle (line 133) | fn exit_idle(&mut self, _channel_controller: &mut dyn ChannelController) {
type OneSubchannelPicker (line 139) | struct OneSubchannelPicker {
method pick (line 144) | fn pick(&self, _: &RequestHeaders) -> PickResult {
FILE: grpc/src/client/load_balancing/registry.rs
type LbPolicyRegistry (line 34) | pub(crate) struct LbPolicyRegistry {
method new (line 40) | pub fn new() -> Self {
method add_builder (line 44) | pub(crate) fn add_builder(&self, builder: impl LbPolicyBuilder + 'stat...
method get_policy (line 51) | pub(crate) fn get_policy(&self, name: &str) -> Option<Arc<dyn LbPolicy...
method default (line 57) | fn default() -> Self {
FILE: grpc/src/client/load_balancing/round_robin.rs
type RoundRobinBuilder (line 55) | struct RoundRobinBuilder {}
method build (line 58) | fn build(&self, options: LbPolicyOptions) -> Box<dyn LbPolicy> {
method name (line 68) | fn name(&self) -> &'static str {
type RoundRobinPolicy (line 74) | struct RoundRobinPolicy {
method new (line 80) | fn new(
method move_to_transient_failure (line 92) | fn move_to_transient_failure(
method update_picker (line 108) | fn update_picker(&mut self, channel_controller: &mut dyn ChannelContro...
method handle_resolver_error (line 129) | fn handle_resolver_error(
method resolver_update (line 153) | fn resolver_update(
method subchannel_update (line 193) | fn subchannel_update(
method work (line 204) | fn work(&mut self, channel_controller: &mut dyn ChannelController) {
method exit_idle (line 209) | fn exit_idle(&mut self, channel_controller: &mut dyn ChannelController) {
function reg (line 216) | pub(crate) fn reg() {
type RoundRobinPicker (line 223) | struct RoundRobinPicker {
method new (line 229) | fn new(pickers: Vec<Arc<dyn Picker>>) -> Self {
method pick (line 239) | fn pick(&self, request_headers: &RequestHeaders) -> PickResult {
constant DEFAULT_TEST_SHORT_TIMEOUT (line 281) | const DEFAULT_TEST_SHORT_TIMEOUT: std::time::Duration = std::time::Durat...
function setup (line 297) | fn setup(
type TestSubchannelList (line 319) | struct TestSubchannelList {
method new (line 324) | fn new(addresses: &[Address], channel_controller: &mut dyn ChannelCont...
method contains (line 333) | fn contains(&self, sc: &Arc<dyn Subchannel>) -> bool {
function create_endpoints (line 338) | fn create_endpoints(num_endpoints: usize, num_addresses: usize) -> Vec<E...
function send_resolver_update_to_policy (line 357) | fn send_resolver_update_to_policy(
function send_resolver_error_to_policy (line 369) | fn send_resolver_error_to_policy(
function move_subchannel_to_state (line 381) | fn move_subchannel_to_state(
function move_subchannel_to_transient_failure (line 397) | fn move_subchannel_to_transient_failure(
type OneSubchannelPicker (line 414) | struct OneSubchannelPicker {
method pick (line 419) | fn pick(&self, _: &RequestHeaders) -> PickResult {
function addresses_from_endpoints (line 428) | fn addresses_from_endpoints(endpoints: &[Endpoint]) -> Vec<Address> {
type PickFirstState (line 438) | struct PickFirstState {
function create_funcs_for_roundrobin_tests (line 449) | fn create_funcs_for_roundrobin_tests() -> StubPolicyFuncs {
function create_endpoint (line 556) | fn create_endpoint(num_addresses: usize) -> Endpoint {
function verify_subchannel_creation (line 572) | async fn verify_subchannel_creation(
function verify_connecting_picker (line 591) | async fn verify_connecting_picker(
function verify_ready_picker (line 611) | async fn verify_ready_picker(
function verify_roundrobin_ready_picker (line 640) | async fn verify_roundrobin_ready_picker(
function verify_transient_failure_picker (line 666) | async fn verify_transient_failure_picker(
function verify_resolution_request (line 690) | async fn verify_resolution_request(rx_events: &mut mpsc::UnboundedReceiv...
function verify_no_activity (line 698) | async fn verify_no_activity(rx_events: &mut mpsc::UnboundedReceiver<Test...
function roundrobin_resolver_error_before_a_valid_update (line 711) | async fn roundrobin_resolver_error_before_a_valid_update() {
function roundrobin_resolver_error_after_a_valid_update_in_ready (line 724) | async fn roundrobin_resolver_error_after_a_valid_update_in_ready() {
function roundrobin_resolver_error_after_a_valid_update_in_connecting (line 764) | async fn roundrobin_resolver_error_after_a_valid_update_in_connecting() {
function roundrobin_resolver_error_after_a_valid_update_in_tf (line 799) | async fn roundrobin_resolver_error_after_a_valid_update_in_tf() {
function roundrobin_picks_are_round_robin (line 829) | async fn roundrobin_picks_are_round_robin() {
function roundrobin_endpoints_removed (line 881) | async fn roundrobin_endpoints_removed() {
function roundrobin_one_endpoint_down (line 916) | async fn roundrobin_one_endpoint_down() {
function roundrobin_pick_after_resolved_updated_hosts (line 992) | async fn roundrobin_pick_after_resolved_updated_hosts() {
function roundrobin_stay_transient_failure_until_ready (line 1133) | async fn roundrobin_stay_transient_failure_until_ready() {
function roundrobin_zero_endpoints_from_resolver_before_valid_update (line 1182) | async fn roundrobin_zero_endpoints_from_resolver_before_valid_update() {
function roundrobin_zero_endpoints_from_resolver_after_valid_update (line 1198) | async fn roundrobin_zero_endpoints_from_resolver_after_valid_update() {
function roundrobin_with_multiple_backends_first_backend_is_ready (line 1238) | async fn roundrobin_with_multiple_backends_first_backend_is_ready() {
function roundrobin_resolver_update_contains_currently_ready_subchannel (line 1291) | async fn roundrobin_resolver_update_contains_currently_ready_subchannel() {
FILE: grpc/src/client/load_balancing/test_utils.rs
function new_request_headers (line 51) | pub(crate) fn new_request_headers() -> RequestHeaders {
type TestSubchannel (line 57) | pub(crate) struct TestSubchannel {
method new (line 63) | pub fn new(address: Address, tx_connect: mpsc::UnboundedSender<TestEve...
method delegate (line 72) | fn delegate(&self) -> Arc<dyn Subchannel> {
method address (line 76) | fn address(&self) -> Address {
method connect (line 80) | fn connect(&self) {
method hash (line 89) | fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
method eq (line 95) | fn eq(&self, other: &Self) -> bool {
type TestEvent (line 101) | pub(crate) enum TestEvent {
method fmt (line 111) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type TestChannelController (line 125) | pub(crate) struct TestChannelController {
method new_subchannel (line 130) | fn new_subchannel(&mut self, address: &Address) -> Arc<dyn Subchannel> {
method update_picker (line 140) | fn update_picker(&mut self, update: LbState) {
method request_resolution (line 146) | fn request_resolution(&mut self) {
type TestWorkScheduler (line 152) | pub(crate) struct TestWorkScheduler {
method schedule_work (line 157) | fn schedule_work(&self) {
type ResolverUpdateFn (line 163) | type ResolverUpdateFn = Arc<
type SubchannelUpdateFn (line 175) | type SubchannelUpdateFn = Arc<
type WorkFn (line 181) | type WorkFn = Arc<dyn Fn(&mut StubPolicyData, &mut dyn ChannelController...
type StubPolicyFuncs (line 186) | pub(crate) struct StubPolicyFuncs {
method fmt (line 193) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type StubPolicyData (line 200) | pub(crate) struct StubPolicyData {
method new (line 207) | pub fn new(lb_policy_options: LbPolicyOptions) -> Self {
type StubPolicy (line 217) | pub(crate) struct StubPolicy {
method resolver_update (line 223) | fn resolver_update(
method subchannel_update (line 235) | fn subchannel_update(
method exit_idle (line 246) | fn exit_idle(&mut self, channel_controller: &mut dyn ChannelController) {
method work (line 250) | fn work(&mut self, channel_controller: &mut dyn ChannelController) {
type StubPolicyBuilder (line 259) | pub(crate) struct StubPolicyBuilder {
type MockConfig (line 266) | pub(super) struct MockConfig {
method build (line 271) | fn build(&self, options: LbPolicyOptions) -> Box<dyn LbPolicy> {
method name (line 279) | fn name(&self) -> &'static str {
method parse_config (line 283) | fn parse_config(
function reg_stub_policy (line 297) | pub(crate) fn reg_stub_policy(name: &'static str, funcs: StubPolicyFuncs) {
FILE: grpc/src/client/mod.rs
type ConnectivityState (line 60) | pub enum ConnectivityState {
method fmt (line 69) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type CallOptions (line 85) | pub struct CallOptions {
type Invoke (line 96) | pub trait Invoke: Sync {
method invoke (line 109) | async fn invoke(
type DynInvoke (line 117) | pub trait DynInvoke: Send + Sync {
method dyn_invoke (line 118) | async fn dyn_invoke(
method dyn_invoke (line 127) | async fn dyn_invoke(
type InvokeOnce (line 140) | pub trait InvokeOnce: Sync {
method invoke_once (line 144) | async fn invoke_once(
type SendStream (line 152) | type SendStream = T::SendStream;
type RecvStream (line 153) | type RecvStream = T::RecvStream;
method invoke_once (line 155) | async fn invoke_once(
type SendStream (line 171) | pub trait SendStream {
method send (line 181) | async fn send(&mut self, msg: &dyn SendMessage, options: SendOptions) ...
method send (line 197) | async fn send(&mut self, msg: &dyn SendMessage, options: SendOptions) ...
type DynSendStream (line 185) | pub trait DynSendStream: Send {
method dyn_send (line 186) | async fn dyn_send(&mut self, msg: &dyn SendMessage, options: SendOptio...
method dyn_send (line 191) | async fn dyn_send(&mut self, msg: &dyn SendMessage, options: SendOptio...
type SendOptions (line 208) | pub struct SendOptions {
type RecvStream (line 222) | pub trait RecvStream {
method next (line 231) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> ClientResponseS...
method next (line 247) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> ClientResponseS...
type DynRecvStream (line 235) | pub trait DynRecvStream: Send {
method dyn_next (line 236) | async fn dyn_next(&mut self, msg: &mut dyn RecvMessage) -> ClientRespo...
method dyn_next (line 241) | async fn dyn_next(&mut self, msg: &mut dyn RecvMessage) -> ClientRespo...
FILE: grpc/src/client/name_resolution/backoff.rs
type BackoffConfig (line 30) | pub(crate) struct BackoffConfig {
method validate (line 66) | fn validate(&self) -> Result<(), &'static str> {
type ExponentialBackoff (line 45) | pub(crate) struct ExponentialBackoff {
method new (line 88) | pub fn new(config: BackoffConfig) -> Result<Self, &'static str> {
method reset (line 97) | pub fn reset(&mut self) {
method backoff_duration (line 101) | pub fn backoff_duration(&mut self) -> Duration {
constant DEFAULT_EXPONENTIAL_CONFIG (line 58) | pub(crate) const DEFAULT_EXPONENTIAL_CONFIG: BackoffConfig = BackoffConf...
constant EPSILON (line 124) | const EPSILON: f64 = 1e-9;
function default_config_is_valid (line 127) | fn default_config_is_valid() {
function base_less_than_max (line 133) | fn base_less_than_max() {
function base_more_than_max (line 145) | fn base_more_than_max() {
function negative_multiplier (line 157) | fn negative_multiplier() {
function negative_jitter (line 169) | fn negative_jitter() {
function jitter_greater_than_one (line 181) | fn jitter_greater_than_one() {
function backoff_reset_no_jitter (line 193) | fn backoff_reset_no_jitter() {
function backoff_with_jitter (line 221) | fn backoff_with_jitter() {
FILE: grpc/src/client/name_resolution/dns/mod.rs
constant DEFAULT_PORT (line 61) | const DEFAULT_PORT: u16 = 443;
constant DEFAULT_DNS_PORT (line 62) | const DEFAULT_DNS_PORT: u16 = 53;
function get_resolving_timeout (line 76) | fn get_resolving_timeout() -> Duration {
function set_resolving_timeout (line 92) | pub(crate) fn set_resolving_timeout(duration: Duration) {
function get_min_resolution_interval (line 96) | fn get_min_resolution_interval() -> Duration {
function set_min_resolution_interval (line 105) | pub(crate) fn set_min_resolution_interval(duration: Duration) {
function reg (line 109) | pub(crate) fn reg() {
type Builder (line 113) | struct Builder {}
type DnsOptions (line 115) | struct DnsOptions {
method build (line 204) | fn build(&self, target: &Target, options: ResolverOptions) -> Box<dyn Re...
method scheme (line 236) | fn scheme(&self) -> &'static str {
method is_valid_uri (line 240) | fn is_valid_uri(&self, target: &Target) -> bool {
type DnsResolver (line 250) | struct DnsResolver {
method new (line 124) | fn new(
type InternalState (line 257) | struct InternalState {
method resolve_now (line 264) | fn resolve_now(&mut self) {
method work (line 268) | fn work(&mut self, channel_controller: &mut dyn ChannelController) {
method drop (line 298) | fn drop(&mut self) {
type HostPort (line 304) | struct HostPort {
type ParseResult (line 310) | struct ParseResult {
function parse_endpoint_and_authority (line 315) | fn parse_endpoint_and_authority(target: &Target) -> Result<ParseResult, ...
function parse_host_port (line 356) | fn parse_host_port(host_and_port: &str, default_port: u16) -> Result<Opt...
function nop_resolver_for_ip (line 376) | fn nop_resolver_for_ip(ip: IpAddr, port: u16, options: ResolverOptions) ...
function nop_resolver_for_err (line 393) | fn nop_resolver_for_err(err: String, options: ResolverOptions) -> Box<dy...
FILE: grpc/src/client/name_resolution/dns/test.rs
constant DEFAULT_TEST_SHORT_TIMEOUT (line 58) | const DEFAULT_TEST_SHORT_TIMEOUT: Duration = Duration::from_millis(10);
function target_parsing (line 61) | pub(crate) fn target_parsing() {
type FakeWorkScheduler (line 176) | struct FakeWorkScheduler {
method schedule_work (line 181) | fn schedule_work(&self) {
type FakeChannelController (line 186) | struct FakeChannelController {
method update (line 192) | fn update(&mut self, update: ResolverUpdate) -> Result<(), String> {
method parse_service_config (line 198) | fn parse_service_config(&self, _: &str) -> Result<ServiceConfig, String> {
function dns_basic (line 204) | pub(crate) async fn dns_basic() {
function invalid_target (line 233) | pub(crate) async fn invalid_target() {
type FakeDns (line 268) | struct FakeDns {
method lookup_host_name (line 275) | async fn lookup_host_name(&self, _: &str) -> Result<Vec<std::net::IpAd...
method lookup_txt (line 280) | async fn lookup_txt(&self, _: &str) -> Result<Vec<String>, String> {
type FakeRuntime (line 286) | struct FakeRuntime {
method spawn (line 292) | fn spawn(
method get_dns_resolver (line 299) | fn get_dns_resolver(&self, _: rt::ResolverOptions) -> Result<Box<dyn r...
method sleep (line 303) | fn sleep(&self, duration: std::time::Duration) -> Pin<Box<dyn rt::Slee...
method tcp_stream (line 307) | fn tcp_stream(
method listen_tcp (line 315) | fn listen_tcp(
function dns_lookup_error (line 325) | pub(crate) async fn dns_lookup_error() {
function dns_lookup_timeout (line 361) | pub(crate) async fn dns_lookup_timeout() {
function rate_limit (line 403) | pub(crate) async fn rate_limit() {
function re_resolution_after_success (line 453) | pub(crate) async fn re_resolution_after_success() {
function backoff_on_error (line 497) | pub(crate) async fn backoff_on_error() {
FILE: grpc/src/client/name_resolution/mod.rs
type Target (line 60) | pub(crate) struct Target {
method from (line 76) | fn from(url: url::Url) -> Self {
method scheme (line 92) | pub fn scheme(&self) -> &str {
method authority_host (line 97) | pub fn authority_host(&self) -> &str {
method authority_port (line 102) | pub fn authority_port(&self) -> Option<u16> {
method authority_host_port (line 108) | pub fn authority_host_port(&self) -> String {
method path (line 119) | pub fn path(&self) -> &str {
type Err (line 65) | type Err = String;
method from_str (line 67) | fn from_str(s: &str) -> Result<Self, Self::Err> {
method fmt (line 125) | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
type ResolverBuilder (line 138) | pub(crate) trait ResolverBuilder: Send + Sync {
method build (line 143) | fn build(&self, target: &Target, options: ResolverOptions) -> Box<dyn ...
method scheme (line 146) | fn scheme(&self) -> &str;
method default_authority (line 156) | fn default_authority(&self, target: &Target) -> String {
method is_valid_uri (line 163) | fn is_valid_uri(&self, uri: &Target) -> bool;
type ResolverOptions (line 169) | pub(crate) struct ResolverOptions {
type WorkScheduler (line 189) | pub(crate) trait WorkScheduler: Send + Sync {
method schedule_work (line 193) | fn schedule_work(&self);
type Resolver (line 201) | pub(crate) trait Resolver: Send + Sync {
method resolve_now (line 211) | fn resolve_now(&mut self);
method work (line 215) | fn work(&mut self, channel_controller: &mut dyn ChannelController);
method resolve_now (line 342) | fn resolve_now(&mut self) {}
method work (line 344) | fn work(&mut self, channel_controller: &mut dyn ChannelController) {
type ChannelController (line 220) | pub(crate) trait ChannelController: Send + Sync {
method update (line 226) | fn update(&mut self, update: ResolverUpdate) -> Result<(), String>;
method parse_service_config (line 230) | fn parse_service_config(&self, config: &str) -> Result<ServiceConfig, ...
type ResolverUpdate (line 237) | pub(crate) struct ResolverUpdate {
method default (line 261) | fn default() -> Self {
type Endpoint (line 276) | pub(crate) struct Endpoint {
method hash (line 286) | fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
type Address (line 294) | pub(crate) struct Address {
method eq (line 311) | fn eq(&self, other: &Self) -> bool {
method hash (line 317) | fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
method fmt (line 325) | fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
type NopResolver (line 337) | struct NopResolver {
function parse_target (line 354) | pub fn parse_target() {
FILE: grpc/src/client/name_resolution/registry.rs
type ResolverRegistry (line 37) | pub(crate) struct ResolverRegistry {
method new (line 43) | fn new() -> Self {
method add_builder (line 57) | pub fn add_builder(&self, builder: Box<dyn ResolverBuilder>) {
method try_add_builder (line 65) | pub fn try_add_builder(&self, builder: Box<dyn ResolverBuilder>) -> Re...
method get (line 83) | pub fn get(&self, scheme: &str) -> Option<Arc<dyn ResolverBuilder>> {
function global_registry (line 93) | pub(crate) fn global_registry() -> &'static ResolverRegistry {
FILE: grpc/src/client/service_config.rs
type ServiceConfig (line 32) | pub(crate) struct ServiceConfig {
type LbPolicyType (line 37) | pub enum LbPolicyType {
type LbConfig (line 45) | pub(crate) struct LbConfig {
method new (line 51) | pub fn new(config: impl Any + Send + Sync) -> Self {
method convert_to (line 58) | pub fn convert_to<T: 'static + Send + Sync>(&self) -> Option<Arc<T>> {
FILE: grpc/src/client/stream_util.rs
type ResponseValidator (line 39) | pub struct ResponseValidator {
method new (line 50) | pub fn new(unary: bool) -> Self {
type SendStream (line 56) | type SendStream = I::SendStream;
type RecvStream (line 57) | type RecvStream = RecvStreamValidator<I::RecvStream>;
method intercept (line 59) | async fn intercept(
type RecvStreamValidator (line 73) | pub struct RecvStreamValidator<R> {
type RecvStreamState (line 79) | enum RecvStreamState {
function new (line 95) | pub fn new(recv_stream: R, unary_response: bool) -> Self {
function error (line 105) | fn error(&mut self, s: impl Into<String>) -> ClientResponseStreamItem {
method next (line 115) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> ClientResponseStr...
function test_validator_messages_before_headers (line 182) | async fn test_validator_messages_before_headers() {
function test_validator_stream_closed_before_trailers (line 200) | async fn test_validator_stream_closed_before_trailers() {
function test_validator_headers_repeated (line 229) | async fn test_validator_headers_repeated() {
function test_validator_unary_ok_without_message (line 256) | async fn test_validator_unary_ok_without_message() {
function test_validator_unary_multiple_messages (line 282) | async fn test_validator_unary_multiple_messages() {
function test_validator_successful_stream (line 303) | async fn test_validator_successful_stream() {
function test_validator_erroring_stream (line 323) | async fn test_validator_erroring_stream() {
function test_validator_successful_unary (line 349) | async fn test_validator_successful_unary() {
function test_validator_erroring_unary (line 367) | async fn test_validator_erroring_unary() {
function validate_scenario (line 403) | async fn validate_scenario(
type NopSendStream (line 444) | struct NopSendStream;
method send (line 447) | async fn send(&mut self, _item: &dyn SendMessage, _options: SendOptions)...
type NopRecvMessage (line 452) | struct NopRecvMessage;
method decode (line 455) | fn decode(&mut self, data: &mut dyn Buf) -> Result<(), String> {
type MockRecvStream (line 462) | struct MockRecvStream {
method new (line 486) | fn new() -> (Self, Sender<ClientResponseStreamItem>) {
type SendStream (line 467) | type SendStream = NopSendStream;
type RecvStream (line 468) | type RecvStream = Self;
method invoke_once (line 470) | async fn invoke_once(
method next (line 480) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> ClientResponseStr...
FILE: grpc/src/client/subchannel.rs
type SharedInvoke (line 57) | type SharedInvoke = Arc<dyn DynInvoke>;
type Backoff (line 59) | pub trait Backoff: Send + Sync {
method backoff_until (line 60) | fn backoff_until(&self) -> Instant;
method reset (line 61) | fn reset(&self);
method min_connect_timeout (line 62) | fn min_connect_timeout(&self) -> Duration;
method backoff_until (line 68) | fn backoff_until(&self) -> Instant {
method reset (line 71) | fn reset(&self) {}
method min_connect_timeout (line 72) | fn min_connect_timeout(&self) -> Duration {
type NopBackoff (line 66) | pub(crate) struct NopBackoff {}
type InternalSubchannelState (line 77) | enum InternalSubchannelState {
method from (line 85) | fn from(iss: &'a InternalSubchannelState) -> SubchannelState {
method fmt (line 111) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method fmt (line 122) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method eq (line 133) | fn eq(&self, other: &Self) -> bool {
method dyn_invoke (line 162) | async fn dyn_invoke(
type InternalSubchannel (line 175) | pub(crate) struct InternalSubchannel {
method new (line 209) | pub(super) fn new(
method address (line 238) | pub(super) fn address(&self) -> Address {
method connect (line 244) | pub(super) fn connect(self: &Arc<Self>) {
method register_connectivity_state_watcher (line 248) | pub(super) fn register_connectivity_state_watcher(&self, watcher: Arc<...
method unregister_connectivity_state_watcher (line 255) | pub(super) fn unregister_connectivity_state_watcher(
type InnerSubchannel (line 183) | struct InnerSubchannel {
method move_to_idle (line 276) | fn move_to_idle(&self) {
method begin_connecting (line 285) | fn begin_connecting(&self) {
method move_to_ready (line 322) | async fn move_to_ready(
method move_to_transient_failure (line 350) | async fn move_to_transient_failure(&self, err: String) {
type SharedInnerSubchannelData (line 187) | struct SharedInnerSubchannelData {
method update_state (line 199) | fn update_state(&mut self, state: InternalSubchannelState) {
method drop (line 371) | fn drop(&mut self) {
type SubchannelKey (line 381) | pub(crate) struct SubchannelKey {
method new (line 386) | pub(crate) fn new(address: Address) -> Self {
method fmt (line 393) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method fmt (line 399) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type InternalSubchannelPool (line 404) | pub(super) struct InternalSubchannelPool {
method new (line 409) | pub(super) fn new() -> Self {
method lookup_subchannel (line 415) | pub(super) fn lookup_subchannel(&self, key: &SubchannelKey) -> Option<...
method register_subchannel (line 425) | pub(super) fn register_subchannel(
method unregister_subchannel (line 438) | pub(super) fn unregister_subchannel(&self, key: &SubchannelKey) {
type SubchannelStateWatcher (line 453) | pub(super) struct SubchannelStateWatcher {
method new (line 459) | pub(super) fn new(sc: Arc<ExternalSubchannel>, work_scheduler: WorkQue...
method on_state_change (line 466) | fn on_state_change(&self, state: SubchannelState) {
FILE: grpc/src/client/transport/mod.rs
type TransportOptions (line 48) | pub(crate) struct TransportOptions {
type Transport (line 64) | pub(crate) trait Transport: Sync {
method connect (line 67) | async fn connect(
type DynTransport (line 76) | pub(crate) trait DynTransport: Send + Sync {
method dyn_connect (line 77) | async fn dyn_connect(
method dyn_connect (line 87) | async fn dyn_connect(
FILE: grpc/src/client/transport/registry.rs
type TransportRegistry (line 37) | pub(crate) struct TransportRegistry {
method new (line 53) | pub(crate) fn new() -> Self {
method add_transport (line 57) | pub(crate) fn add_transport<T>(&self, address_type: &str, transport: T)
method get_transport (line 68) | pub(crate) fn get_transport(
method fmt (line 42) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
FILE: grpc/src/client/transport/tonic/mod.rs
constant DEFAULT_BUFFER_SIZE (line 92) | const DEFAULT_BUFFER_SIZE: usize = 1024;
type BoxError (line 93) | pub(crate) type BoxError = Box<dyn Error + Send + Sync>;
type BoxFuture (line 95) | type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
type BoxStream (line 96) | type BoxStream<T> = Pin<Box<dyn Stream<Item = Result<T, TonicStatus>> + ...
function reg (line 98) | pub(crate) fn reg() {
type TransportBuilder (line 102) | struct TransportBuilder {}
type TonicTransport (line 104) | struct TonicTransport {
method drop (line 111) | fn drop(&mut self) {
type SendStream (line 117) | type SendStream = TonicSendStream;
type RecvStream (line 118) | type RecvStream = TonicRecvStream;
method invoke (line 120) | async fn invoke(
function trailers_from_tonic_status (line 165) | fn trailers_from_tonic_status(status: TonicStatus) -> ClientResponseStre...
function trailers_from_status (line 173) | fn trailers_from_status(code: StatusCode, msg: impl Into<String>) -> Cli...
type TonicSendStream (line 177) | struct TonicSendStream {
method send (line 182) | async fn send(&mut self, msg: &dyn SendMessage, options: SendOptions) ->...
type TonicRecvStream (line 196) | struct TonicRecvStream {
type StreamState (line 200) | enum StreamState {
method next (line 208) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> ClientResponseStr...
function err_streams (line 253) | fn err_streams(status: Status) -> (TonicSendStream, TonicRecvStream) {
type Service (line 263) | type Service = TonicTransport;
method connect (line 265) | async fn connect(
type SendRequestWrapper (line 357) | struct SendRequestWrapper {
method from (line 362) | fn from(inner: SendRequest<Body>) -> Self {
type Response (line 368) | type Response = HttpResponse<Body>;
type Error (line 369) | type Error = BoxError;
type Future (line 370) | type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>;
method poll_ready (line 372) | fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self...
method call (line 376) | fn call(&mut self, req: http::Request<Body>) -> Self::Future {
type TonicService (line 383) | struct TonicService {
type ResponseBody (line 388) | type ResponseBody = Body;
type Error (line 389) | type Error = BoxError;
type Future (line 390) | type Future = ResponseFuture;
method poll_ready (line 392) | fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self...
method call (line 396) | fn call(&mut self, request: http::Request<Body>) -> Self::Future {
type ResponseFuture (line 406) | pub(crate) struct ResponseFuture {
type Output (line 411) | type Output = Result<http::Response<Body>, BoxError>;
method poll (line 413) | fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Ou...
type BufCodec (line 418) | pub(crate) struct BufCodec {}
type Encode (line 421) | type Encode = Box<dyn Buf + Send + Sync>;
type Decode (line 422) | type Decode = Bytes;
type Encoder (line 423) | type Encoder = BufEncoder;
type Decoder (line 424) | type Decoder = BytesDecoder;
method encoder (line 426) | fn encoder(&mut self) -> Self::Encoder {
method decoder (line 430) | fn decoder(&mut self) -> Self::Decoder {
type BytesEncoder (line 435) | pub struct BytesEncoder {}
type Item (line 438) | type Item = Bytes;
type Error (line 439) | type Error = TonicStatus;
method encode (line 441) | fn encode(&mut self, item: Self::Item, dst: &mut EncodeBuf<'_>) -> Resul...
type BufEncoder (line 447) | pub struct BufEncoder {}
type Item (line 450) | type Item = Box<dyn Buf + Send + Sync>;
type Error (line 451) | type Error = TonicStatus;
method encode (line 453) | fn encode(&mut self, mut item: Self::Item, dst: &mut EncodeBuf<'_>) -> R...
type BytesDecoder (line 460) | pub struct BytesDecoder {}
type Item (line 463) | type Item = Bytes;
type Error (line 464) | type Error = TonicStatus;
method decode (line 466) | fn decode(
FILE: grpc/src/client/transport/tonic/test.rs
constant DEFAULT_TEST_DURATION (line 65) | const DEFAULT_TEST_DURATION: Duration = Duration::from_secs(10);
constant DEFAULT_TEST_SHORT_DURATION (line 66) | const DEFAULT_TEST_SHORT_DURATION: Duration = Duration::from_millis(10);
function tonic_transport_rpc (line 70) | pub(crate) async fn tonic_transport_rpc() {
function grpc_invoke_tonic_unary (line 163) | async fn grpc_invoke_tonic_unary() {
type WrappedEchoRequest (line 243) | struct WrappedEchoRequest(EchoRequest);
type WrappedEchoResponse (line 244) | struct WrappedEchoResponse(EchoResponse);
method encode (line 247) | fn encode(&self) -> Result<Box<dyn Buf + Send + Sync>, String> {
method decode (line 253) | fn decode(&mut self, data: &mut dyn Buf) -> Result<(), String> {
type EchoService (line 261) | pub(crate) struct EchoService {}
method unary_echo (line 265) | async fn unary_echo(
type ServerStreamingEchoStream (line 273) | type ServerStreamingEchoStream = ReceiverStream<Result<EchoResponse, Sta...
method server_streaming_echo (line 275) | async fn server_streaming_echo(
method client_streaming_echo (line 282) | async fn client_streaming_echo(
type BidirectionalStreamingEchoStream (line 288) | type BidirectionalStreamingEchoStream =
method bidirectional_streaming_echo (line 291) | async fn bidirectional_streaming_echo(
FILE: grpc/src/core/mod.rs
type SendMessage (line 37) | pub trait SendMessage: Send + Sync {
method encode (line 38) | fn encode(&self) -> Result<Box<dyn Buf + Send + Sync>, String>;
method _ptr_for (line 41) | unsafe fn _ptr_for(&self, id: TypeId) -> Option<*const ()> {
type RecvMessage (line 47) | pub trait RecvMessage: Send + Sync {
method decode (line 48) | fn decode(&mut self, data: &mut dyn Buf) -> Result<(), String>;
method _ptr_for (line 51) | unsafe fn _ptr_for(&mut self, id: TypeId) -> Option<*mut ()> {
type MessageType (line 59) | pub trait MessageType {
function msg_type_id (line 64) | fn msg_type_id<T: MessageType>() -> TypeId
function downcast_ref (line 73) | pub fn downcast_ref<T: MessageType>(&self) -> Option<&T::Target<'_>>
function downcast_mut (line 90) | pub fn downcast_mut<T: MessageType>(&mut self) -> Option<&mut T::Target<...
type ResponseStreamItem (line 116) | pub enum ResponseStreamItem<M> {
type ClientResponseStreamItem (line 130) | pub type ClientResponseStreamItem = ResponseStreamItem<()>;
type ServerResponseStreamItem (line 134) | pub type ServerResponseStreamItem<'a> = ResponseStreamItem<&'a dyn SendM...
type ResponseHeaders (line 138) | pub struct ResponseHeaders {
method new (line 144) | pub fn new() -> Self {
method with_metadata (line 149) | pub fn with_metadata(mut self, metadata: MetadataMap) -> Self {
method metadata (line 155) | pub fn metadata(&self) -> &MetadataMap {
method metadata_mut (line 160) | pub fn metadata_mut(&mut self) -> &mut MetadataMap {
type RequestHeaders (line 167) | pub struct RequestHeaders {
method new (line 176) | pub fn new() -> Self {
method with_method_name (line 181) | pub fn with_method_name(mut self, method_name: impl Into<String>) -> S...
method with_metadata (line 187) | pub fn with_metadata(mut self, metadata: MetadataMap) -> Self {
method method_name (line 193) | pub fn method_name(&self) -> &String {
method metadata (line 198) | pub fn metadata(&self) -> &MetadataMap {
method metadata_mut (line 203) | pub fn metadata_mut(&mut self) -> &mut MetadataMap {
method into_parts (line 209) | pub(crate) fn into_parts(self) -> (String, MetadataMap) {
type Trailers (line 217) | pub struct Trailers {
method new (line 224) | pub fn new(status: Status) -> Self {
method with_status (line 232) | pub fn with_status(mut self, status: Status) -> Self {
method status (line 238) | pub fn status(&self) -> &Status {
method with_metadata (line 243) | pub fn with_metadata(mut self, metadata: MetadataMap) -> Self {
method metadata_mut (line 249) | pub fn metadata_mut(&mut self) -> &mut MetadataMap {
method metadata (line 254) | pub fn metadata(&self) -> &MetadataMap {
FILE: grpc/src/credentials/call.rs
type CallDetails (line 39) | pub struct CallDetails {
method new (line 45) | pub(crate) fn new(service_url: String, method_name: String) -> Self {
method service_url (line 53) | pub fn service_url(&self) -> &str {
method method_name (line 58) | pub fn method_name(&self) -> &str {
type ChannelSecurityInfo (line 63) | pub struct ChannelSecurityInfo {
method new (line 71) | pub(crate) fn new(
method security_protocol (line 83) | pub fn security_protocol(&self) -> &'static str {
method security_level (line 87) | pub fn security_level(&self) -> SecurityLevel {
method attributes (line 91) | pub fn attributes(&self) -> &Attributes {
type CallCredentials (line 99) | pub trait CallCredentials: Send + Sync + Debug {
method get_metadata (line 114) | async fn get_metadata(
method minimum_channel_security_level (line 124) | fn minimum_channel_security_level(&self) -> SecurityLevel {
method get_metadata (line 155) | async fn get_metadata(
method minimum_channel_security_level (line 167) | fn minimum_channel_security_level(&self) -> SecurityLevel {
method get_metadata (line 191) | async fn get_metadata(
method minimum_channel_security_level (line 206) | fn minimum_channel_security_level(&self) -> SecurityLevel {
type CompositeCallCredentials (line 134) | pub struct CompositeCallCredentials {
method new (line 140) | pub fn new(first: Arc<dyn CallCredentials>, second: Arc<dyn CallCreden...
method with_call_credentials (line 147) | pub fn with_call_credentials(mut self, creds: Arc<dyn CallCredentials>...
type MockCallCredentials (line 183) | struct MockCallCredentials {
function test_composite_call_credentials (line 212) | async fn test_composite_call_credentials() {
FILE: grpc/src/credentials/client.rs
type ChannelCredsInternal (line 39) | pub trait ChannelCredsInternal {
method connect (line 56) | async fn connect<Input: GrpcEndpoint>(
method get_call_credentials (line 65) | fn get_call_credentials(&self) -> Option<&Arc<dyn CallCredentials>>;
type ContextType (line 204) | type ContextType = T::ContextType;
type Output (line 205) | type Output<I> = T::Output<I>;
method connect (line 207) | async fn connect<Input: GrpcEndpoint>(
method get_call_credentials (line 219) | fn get_call_credentials(&self) -> Option<&Arc<dyn CallCredentials>> {
type HandshakeOutput (line 68) | pub struct HandshakeOutput<T, C: ClientConnectionSecurityContext> {
type ClientConnectionSecurityContext (line 73) | pub trait ClientConnectionSecurityContext: Send + Sync + 'static {
method validate_authority (line 85) | fn validate_authority(&self, authority: &Authority) -> bool {
method validate_authority (line 91) | fn validate_authority(&self, authority: &Authority) -> bool {
type ClientConnectionSecurityInfo (line 97) | pub struct ClientConnectionSecurityInfo<C> {
function new (line 106) | pub fn new(
function security_protocol (line 120) | pub fn security_protocol(&self) -> &'static str {
function security_level (line 124) | pub fn security_level(&self) -> SecurityLevel {
function security_context (line 128) | pub fn security_context(&self) -> &C {
function attributes (line 132) | pub fn attributes(&self) -> &Attributes {
function into_boxed (line 136) | pub fn into_boxed(
type ClientHandshakeInfo (line 159) | pub struct ClientHandshakeInfo {
method new (line 165) | pub fn new(attributes: Attributes) -> Self {
method attributes (line 169) | pub fn attributes(&self) -> &Attributes {
type CompositeChannelCredentials (line 178) | pub struct CompositeChannelCredentials<T> {
function new (line 184) | pub fn new(channel_creds: T, call_creds: Arc<dyn CallCredentials>) -> Re...
method info (line 225) | fn info(&self) -> &ProtocolInfo {
type MockCallCredentials (line 248) | struct MockCallCredentials {
method get_metadata (line 256) | async fn get_metadata(
method minimum_channel_security_level (line 271) | fn minimum_channel_security_level(&self) -> SecurityLevel {
function test_multiple_composition (line 277) | async fn test_multiple_composition() {
function test_composite_channel_credentials_insecure (line 342) | fn test_composite_channel_credentials_insecure() {
FILE: grpc/src/credentials/dyn_wrapper.rs
type BoxEndpoint (line 39) | type BoxEndpoint = Box<dyn GrpcEndpoint>;
type DynChannelCredentials (line 43) | pub(crate) trait DynChannelCredentials: Send + Sync {
method connect (line 44) | async fn connect(
method info (line 52) | fn info(&self) -> &ProtocolInfo;
method connect (line 61) | async fn connect(
method info (line 83) | fn info(&self) -> &ProtocolInfo {
type DynServerCredentials (line 90) | pub(crate) trait DynServerCredentials: Send + Sync {
method accept (line 91) | async fn accept(
method info (line 97) | fn info(&self) -> &ProtocolInfo;
method accept (line 106) | async fn accept(
method info (line 118) | fn info(&self) -> &ProtocolInfo {
function test_dyn_client_credential_dispatch (line 139) | async fn test_dyn_client_credential_dispatch() {
function test_dyn_server_credential_dispatch (line 188) | async fn test_dyn_server_credential_dispatch() {
FILE: grpc/src/credentials/insecure.rs
type InsecureChannelCredentials (line 49) | pub struct InsecureChannelCredentials {
method new (line 57) | pub fn new() -> Self {
type ContextType (line 73) | type ContextType = InsecureConnectionSecurityContext;
type Output (line 74) | type Output<I> = I;
method connect (line 76) | async fn connect<Input: GrpcEndpoint>(
method get_call_credentials (line 94) | fn get_call_credentials(&self) -> Option<&Arc<dyn CallCredentials>> {
constant PROTOCOL_NAME (line 53) | pub const PROTOCOL_NAME: &str = "insecure";
type InsecureConnectionSecurityContext (line 64) | pub struct InsecureConnectionSecurityContext;
method validate_authority (line 67) | fn validate_authority(&self, _authority: &Authority) -> bool {
method info (line 100) | fn info(&self) -> &ProtocolInfo {
type InsecureServerCredentials (line 108) | pub struct InsecureServerCredentials {
method new (line 113) | pub fn new() -> Self {
type Output (line 119) | type Output<I> = I;
method accept (line 121) | async fn accept<Input: GrpcEndpoint>(
method info (line 138) | fn info(&self) -> &ProtocolInfo {
function test_insecure_client_credentials (line 167) | async fn test_insecure_client_credentials() {
function test_insecure_server_credentials (line 219) | async fn test_insecure_server_credentials() {
FILE: grpc/src/credentials/local.rs
constant PROTOCOL_NAME (line 47) | pub const PROTOCOL_NAME: &str = "local";
type LocalChannelCredentials (line 55) | pub struct LocalChannelCredentials {
method new (line 61) | pub fn new() -> Self {
type ContextType (line 100) | type ContextType = LocalConnectionSecurityContext;
type Output (line 101) | type Output<I> = I;
method connect (line 103) | async fn connect<Input: GrpcEndpoint>(
method get_call_credentials (line 123) | fn get_call_credentials(&self) -> Option<&Arc<dyn CallCredentials>> {
type LocalConnectionSecurityContext (line 69) | pub struct LocalConnectionSecurityContext;
method validate_authority (line 72) | fn validate_authority(&self, _authority: &Authority) -> bool {
function security_level_for_endpoint (line 80) | fn security_level_for_endpoint(
method info (line 129) | fn info(&self) -> &ProtocolInfo {
type LocalServerCredentials (line 137) | pub struct LocalServerCredentials {
method new (line 142) | pub fn new() -> Self {
type Output (line 148) | type Output<I> = I;
method accept (line 150) | async fn accept<Input: GrpcEndpoint>(
method info (line 169) | fn info(&self) -> &ProtocolInfo {
function test_security_level_for_endpoint_success (line 196) | fn test_security_level_for_endpoint_success() {
function test_security_level_for_endpoint_failure (line 208) | fn test_security_level_for_endpoint_failure() {
function test_local_client_credentials (line 215) | async fn test_local_client_credentials() {
function test_local_server_credentials (line 267) | async fn test_local_server_credentials() {
FILE: grpc/src/credentials/mod.rs
type ChannelCredentials (line 42) | pub trait ChannelCredentials: client::ChannelCredsInternal + Sync + 'sta...
method info (line 44) | fn info(&self) -> &ProtocolInfo;
type ServerCredentials (line 47) | pub trait ServerCredentials: server::ServerCredsInternal + Sync + 'static {
method info (line 49) | fn info(&self) -> &ProtocolInfo;
type SecurityLevel (line 55) | pub enum SecurityLevel {
type Authority (line 74) | pub struct Authority {
method new (line 80) | pub fn new(host: String, port: Option<u16>) -> Self {
method host (line 84) | pub fn host(&self) -> &str {
method port (line 88) | pub fn port(&self) -> Option<u16> {
type ProtocolInfo (line 94) | pub struct ProtocolInfo {
method new (line 99) | pub(crate) const fn new(security_protocol: &'static str) -> Self {
method security_protocol (line 103) | pub fn security_protocol(&self) -> &'static str {
FILE: grpc/src/credentials/rustls/client/mod.rs
type ClientTlsConfig (line 64) | pub struct ClientTlsConfig {
method new (line 71) | pub fn new() -> Self {
method with_root_certificates_provider (line 84) | pub fn with_root_certificates_provider<R>(mut self, provider: R) -> Self
method with_identity_provider (line 97) | pub fn with_identity_provider<I>(mut self, provider: I) -> Self
method insecure_with_key_log_path (line 111) | pub fn insecure_with_key_log_path(mut self, path: impl Into<PathBuf>) ...
method default (line 118) | fn default() -> Self {
type RustlsClientTlsCredendials (line 124) | pub struct RustlsClientTlsCredendials {
method new (line 131) | pub fn new(config: ClientTlsConfig) -> Result<RustlsClientTlsCredendia...
method new_impl (line 144) | fn new_impl(
type ContextType (line 218) | type ContextType = ClientTlsSecContext;
type Output (line 219) | type Output<I> = TlsStream<I>;
method connect (line 220) | async fn connect<Input: GrpcEndpoint>(
method get_call_credentials (line 266) | fn get_call_credentials(&self) -> Option<&Arc<dyn CallCredentials>> {
type ClientTlsSecContext (line 192) | pub struct ClientTlsSecContext {
method validate_authority (line 197) | fn validate_authority(&self, authority: &Authority) -> bool {
method info (line 272) | fn info(&self) -> &ProtocolInfo {
FILE: grpc/src/credentials/rustls/client/test.rs
function init_provider (line 57) | fn init_provider() {
function test_tls_handshake (line 64) | async fn test_tls_handshake() {
function test_tls_handshake_no_alpn (line 70) | async fn test_tls_handshake_no_alpn() {
function test_tls_handshake_bad_alpn (line 77) | async fn test_tls_handshake_bad_alpn() {
function test_tls_handshake_alpn_h1_and_h2 (line 84) | async fn test_tls_handshake_alpn_h1_and_h2() {
function test_tls_cipher_suites_secure (line 91) | async fn test_tls_cipher_suites_secure() {
function test_tls_cipher_suites_insecure (line 112) | async fn test_tls_cipher_suites_insecure() {
function test_tls_key_log (line 146) | async fn test_tls_key_log() {
function test_tls_handshake_wrong_server_name (line 199) | async fn test_tls_handshake_wrong_server_name() {
function test_tls_validate_authority (line 242) | async fn test_tls_validate_authority() {
function test_mtls_handshake_no_identity (line 300) | async fn test_mtls_handshake_no_identity() {
function test_mtls_handshake_with_identitiy (line 347) | async fn test_mtls_handshake_with_identitiy() {
function check_client_resumption_disabled (line 390) | async fn check_client_resumption_disabled(
function test_tls_resumption_disabled_tls13 (line 461) | async fn test_tls_resumption_disabled_tls13() {
function test_tls_resumption_disabled_tls12 (line 466) | async fn test_tls_resumption_disabled_tls12() {
function load_identity (line 470) | fn load_identity(cert_file: &str, key_file: &str) -> Identity {
function mtls_server_config (line 476) | fn mtls_server_config() -> ServerConfig {
function test_certs_path (line 500) | fn test_certs_path() -> PathBuf {
function load_certs (line 507) | fn load_certs(filename: &str) -> Vec<CertificateDer<'static>> {
function load_private_key (line 516) | fn load_private_key(filename: &str) -> PrivateKeyDer<'static> {
function load_root_certs (line 531) | fn load_root_certs(filename: &str) -> RootCertificates {
function default_server_config (line 537) | fn default_server_config() -> ServerConfig {
function setup_server (line 548) | async fn setup_server(config: ServerConfig) -> (SocketAddr, JoinHandle<(...
function setup_server_multi_connection (line 552) | async fn setup_server_multi_connection(
function run_handshake_test (line 580) | async fn run_handshake_test(server_alpn: Vec<Vec<u8>>, expect_success: b...
FILE: grpc/src/credentials/rustls/key_log.rs
type KeyLogFileInner (line 29) | struct KeyLogFileInner {
method new (line 35) | fn new(path: &PathBuf) -> Self {
method try_write (line 50) | fn try_write(&mut self, label: &str, client_random: &[u8], secret: &[u...
method fmt (line 70) | fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
type KeyLogFile (line 83) | pub struct KeyLogFile(Mutex<KeyLogFileInner>);
method new (line 88) | pub fn new(path: &PathBuf) -> Self {
method log (line 94) | fn log(&self, label: &str, client_random: &[u8], secret: &[u8]) {
method fmt (line 110) | fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
FILE: grpc/src/credentials/rustls/mod.rs
constant ALPN_PROTO_STR_H2 (line 39) | const ALPN_PROTO_STR_H2: &[u8; 2] = b"h2";
type RootCertificates (line 43) | pub struct RootCertificates {
method from_pem (line 51) | pub fn from_pem(pem: impl AsRef<[u8]>) -> Self {
method get_ref (line 57) | fn get_ref(&self) -> &[u8] {
type Identity (line 64) | pub struct Identity {
method from_pem (line 75) | pub fn from_pem(cert: impl AsRef<[u8]>, key: impl AsRef<[u8]>) -> Self {
type IdentityList (line 69) | pub type IdentityList = Vec<Identity>;
type ProviderInternal (line 90) | pub trait ProviderInternal<T> {
method get_receiver (line 95) | fn get_receiver(self) -> Receiver<T>;
type Provider (line 111) | pub trait Provider<T>: provider::ProviderInternal<T> {}
type StaticProvider (line 114) | pub struct StaticProvider<T> {
function new (line 120) | pub fn new(value: T) -> Self {
function get_receiver (line 126) | fn get_receiver(self) -> watch::Receiver<T> {
type StaticRootCertificatesProvider (line 137) | pub type StaticRootCertificatesProvider = StaticProvider<RootCertificates>;
type StaticIdentityProvider (line 138) | pub type StaticIdentityProvider = StaticProvider<Identity>;
function sanitize_crypto_provider (line 144) | fn sanitize_crypto_provider(mut crypto_provider: CryptoProvider) -> Resu...
function parse_certs (line 167) | fn parse_certs(pem: &[u8]) -> Result<Vec<CertificateDer<'static>>, Strin...
function parse_key (line 174) | fn parse_key(pem: &[u8]) -> Result<PrivateKeyDer<'static>, String> {
FILE: grpc/src/credentials/rustls/server/mod.rs
type SniResolver (line 64) | struct SniResolver {
method resolve (line 69) | fn resolve(&self, client_hello: ClientHello) -> Option<Arc<CertifiedKey>> {
type TlsClientCertificateRequestType (line 99) | pub enum TlsClientCertificateRequestType<R = StaticRootCertificatesProvi...
type InnerClientCertificateRequestType (line 133) | enum InnerClientCertificateRequestType {
method from (line 144) | fn from(value: TlsClientCertificateRequestType) -> Self {
type RustlsServerTlsCredendials (line 164) | pub struct RustlsServerTlsCredendials {
method new (line 209) | pub fn new(config: ServerTlsConfig) -> Result<RustlsServerTlsCredendia...
method new_impl (line 222) | fn new_impl(
type ServerTlsConfig (line 169) | pub struct ServerTlsConfig {
method new (line 176) | pub fn new<I>(identities_provider: I) -> Self
method with_request_type (line 191) | pub fn with_request_type(mut self, request_type: TlsClientCertificateR...
method insecure_with_key_log_path (line 202) | pub fn insecure_with_key_log_path(mut self, path: impl Into<PathBuf>) ...
type NoTicketer (line 306) | struct NoTicketer;
method enabled (line 309) | fn enabled(&self) -> bool {
method lifetime (line 312) | fn lifetime(&self) -> u32 {
method encrypt (line 315) | fn encrypt(&self, _plain: &[u8]) -> Option<Vec<u8>> {
method decrypt (line 318) | fn decrypt(&self, _cipher: &[u8]) -> Option<Vec<u8>> {
type Output (line 324) | type Output<Input> = TlsStream<Input>;
method accept (line 326) | async fn accept<Input: GrpcEndpoint>(
method info (line 356) | fn info(&self) -> &ProtocolInfo {
FILE: grpc/src/credentials/rustls/server/test.rs
function init_provider (line 51) | fn init_provider() {
function test_tls_server_handshake (line 58) | async fn test_tls_server_handshake() {
function test_tls_server_handshake_no_alpn (line 117) | async fn test_tls_server_handshake_no_alpn() {
function test_tls_server_handshake_bad_alpn (line 161) | async fn test_tls_server_handshake_bad_alpn() {
function test_tls_handshake_alpn_h1_and_h2 (line 200) | async fn test_tls_handshake_alpn_h1_and_h2() {
function test_tls_server_mtls_require_fail (line 238) | async fn test_tls_server_mtls_require_fail() {
function test_tls_server_mtls_success (line 291) | async fn test_tls_server_mtls_success() {
function test_tls_server_mtls_optional (line 353) | async fn test_tls_server_mtls_optional() {
function test_tls_server_key_log (line 411) | async fn test_tls_server_key_log() {
function check_resumption_disabled (line 469) | async fn check_resumption_disabled(versions: Vec<&'static rustls::Suppor...
function test_tls_server_resumption_disabled_tls13 (line 532) | async fn test_tls_server_resumption_disabled_tls13() {
function test_tls_server_resumption_disabled_tls12 (line 537) | async fn test_tls_server_resumption_disabled_tls12() {
function test_tls_server_sni (line 542) | async fn test_tls_server_sni() {
function test_tls_server_cipher_suites_insecure (line 636) | async fn test_tls_server_cipher_suites_insecure() {
function create_root_store (line 669) | fn create_root_store() -> rustls::RootCertStore {
function test_certs_path (line 678) | fn test_certs_path() -> PathBuf {
function load_certs (line 685) | fn load_certs(filename: &str) -> Vec<rustls_pki_types::CertificateDer<'s...
function load_private_key (line 694) | fn load_private_key(filename: &str) -> rustls_pki_types::PrivateKeyDer<'...
function load_root_certs (line 709) | fn load_root_certs(filename: &str) -> RootCertificates {
function load_identity (line 715) | fn load_identity(cert_file: &str, key_file: &str) -> Identity {
FILE: grpc/src/credentials/rustls/tls_stream.rs
type TlsStream (line 38) | pub struct TlsStream<T> {
method poll_read (line 46) | fn poll_read(
method poll_write (line 60) | fn poll_write(
method poll_flush (line 69) | fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result...
method poll_shutdown (line 74) | fn poll_shutdown(
method poll_write_vectored (line 82) | fn poll_write_vectored(
method is_write_vectored (line 91) | fn is_write_vectored(&self) -> bool {
method get_local_address (line 102) | fn get_local_address(&self) -> &str {
method get_peer_address (line 109) | fn get_peer_address(&self) -> &str {
method get_network_type (line 116) | fn get_network_type(&self) -> &'static str {
function new (line 125) | pub fn new(inner: RustlsStream<T>) -> Self {
function inner (line 129) | pub fn inner(&self) -> &RustlsStream<T> {
FILE: grpc/src/credentials/server.rs
type ServerCredsInternal (line 31) | pub trait ServerCredsInternal {
method accept (line 42) | async fn accept<Input: GrpcEndpoint>(
type HandshakeOutput (line 49) | pub struct HandshakeOutput<T> {
type ServerConnectionSecurityInfo (line 55) | pub struct ServerConnectionSecurityInfo {
method new (line 64) | pub fn new(
method security_protocol (line 77) | pub fn security_protocol(&self) -> &'static str {
method security_level (line 82) | pub fn security_level(&self) -> SecurityLevel {
method attributes (line 87) | pub fn attributes(&self) -> &Attributes {
FILE: grpc/src/generated/echo_fds.rs
constant FILE_DESCRIPTOR_SET (line 20) | pub const FILE_DESCRIPTOR_SET: &[u8] = &[
FILE: grpc/src/generated/grpc_examples_echo.rs
type EchoRequest (line 4) | pub struct EchoRequest {
type EchoResponse (line 10) | pub struct EchoResponse {
type EchoClient (line 27) | pub struct EchoClient<T> {
function new (line 37) | pub fn new(inner: T) -> Self {
function with_origin (line 41) | pub fn with_origin(inner: T, origin: Uri) -> Self {
function with_interceptor (line 45) | pub fn with_interceptor<F>(
function send_compressed (line 69) | pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
function accept_compressed (line 75) | pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
function max_decoding_message_size (line 83) | pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
function max_encoding_message_size (line 91) | pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
function unary_echo (line 96) | pub async fn unary_echo(
function server_streaming_echo (line 118) | pub async fn server_streaming_echo(
function client_streaming_echo (line 145) | pub async fn client_streaming_echo(
function bidirectional_streaming_echo (line 169) | pub async fn bidirectional_streaming_echo(
type Echo (line 212) | pub trait Echo: std::marker::Send + std::marker::Sync + 'static {
method unary_echo (line 214) | async fn unary_echo(
method server_streaming_echo (line 225) | async fn server_streaming_echo(
method client_streaming_echo (line 233) | async fn client_streaming_echo(
method bidirectional_streaming_echo (line 244) | async fn bidirectional_streaming_echo(
type EchoServer (line 254) | pub struct EchoServer<T> {
function new (line 262) | pub fn new(inner: T) -> Self {
function from_arc (line 265) | pub fn from_arc(inner: Arc<T>) -> Self {
function with_interceptor (line 274) | pub fn with_interceptor<F>(
function accept_compressed (line 285) | pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
function send_compressed (line 291) | pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
function max_decoding_message_size (line 299) | pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
function max_encoding_message_size (line 307) | pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
type Response (line 318) | type Response = http::Response<tonic::body::Body>;
type Error (line 319) | type Error = std::convert::Infallible;
type Future (line 320) | type Future = BoxFuture<Self::Response, Self::Error>;
function poll_ready (line 321) | fn poll_ready(
function call (line 327) | fn call(&mut self, req: http::Request<B>) -> Self::Future {
method clone (line 531) | fn clone(&self) -> Self {
constant SERVICE_NAME (line 543) | pub const SERVICE_NAME: &str = "grpc.examples.echo.Echo";
constant NAME (line 545) | const NAME: &'static str = SERVICE_NAME;
FILE: grpc/src/inmemory/mod.rs
type InMemoryServerCall (line 77) | struct InMemoryServerCall {
type InMemoryRequestStreamItem (line 83) | enum InMemoryRequestStreamItem {
type InMemoryResponseStreamItem (line 88) | enum InMemoryResponseStreamItem {
type InMemoryListener (line 96) | pub struct InMemoryListener {
method new (line 120) | pub fn new() -> Self {
method id (line 135) | pub fn id(&self) -> String {
method close (line 139) | pub async fn close(self) {
method await_connection (line 159) | pub async fn await_connection(&self) {}
type InMemoryListenerInner (line 100) | struct InMemoryListenerInner {
method drop (line 108) | fn drop(&mut self) {
method default (line 114) | fn default() -> Self {
type SendStream (line 163) | type SendStream = InMemoryServerSendStream;
type RecvStream (line 164) | type RecvStream = InMemoryServerRecvStream;
method accept (line 166) | async fn accept(&self) -> Option<ServerCall<Self::SendStream, Self::Recv...
type InMemoryServerSendStream (line 184) | pub struct InMemoryServerSendStream {
method send (line 189) | async fn send<'a>(
type InMemoryServerRecvStream (line 208) | pub struct InMemoryServerRecvStream {
method next (line 213) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> Result<(), ()> {
type InMemoryConnection (line 223) | pub struct InMemoryConnection {
type SendStream (line 229) | type SendStream = Box<dyn ClientDynSendStream>;
type RecvStream (line 230) | type RecvStream = Box<dyn ClientDynRecvStream>;
method invoke (line 232) | async fn invoke(
method drop (line 255) | fn drop(&mut self) {
type InMemoryClientSendStream (line 260) | pub struct InMemoryClientSendStream {
method send (line 265) | async fn send(&mut self, msg: &dyn SendMessage, _options: ClientSendOpti...
method drop (line 283) | fn drop(&mut self) {
type InMemoryClientRecvStream (line 290) | pub struct InMemoryClientRecvStream {
method next (line 295) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> ClientResponseStr...
type InMemoryTransport (line 308) | pub struct InMemoryTransport {}
type Service (line 311) | type Service = InMemoryConnection;
method connect (line 313) | async fn connect(
type InMemoryResolverBuilder (line 334) | pub struct InMemoryResolverBuilder {}
method build (line 337) | fn build(&self, target: &Target, options: ResolverOptions) -> Box<dyn Re...
method scheme (line 344) | fn scheme(&self) -> &str {
method is_valid_uri (line 348) | fn is_valid_uri(&self, _uri: &Target) -> bool {
type InMemoryResolver (line 353) | struct InMemoryResolver {
method resolve_now (line 358) | fn resolve_now(&mut self) {}
method work (line 360) | fn work(&mut self, channel_controller: &mut dyn ResolverChannelControlle...
function reg (line 386) | pub fn reg() {
FILE: grpc/src/rt/hyper_wrapper.rs
type HyperCompatExec (line 44) | pub(crate) struct HyperCompatExec {
method execute (line 53) | fn execute(&self, fut: F) {
type HyperCompatSleep (line 60) | struct HyperCompatSleep {
type Output (line 65) | type Output = ();
method poll (line 67) | fn poll(
type HyperCompatTimer (line 78) | pub(crate) struct HyperCompatTimer {
method sleep (line 83) | fn sleep(&self, duration: std::time::Duration) -> Pin<Box<dyn hyper::rt:...
method sleep_until (line 88) | fn sleep_until(&self, deadline: Instant) -> Pin<Box<dyn hyper::rt::Sleep...
method new (line 109) | pub fn new(stream: Box<dyn GrpcEndpoint>) -> Self {
method poll_read (line 115) | fn poll_read(
method poll_write (line 126) | fn poll_write(
method poll_flush (line 134) | fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io...
method poll_shutdown (line 138) | fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll...
method poll_read (line 144) | fn poll_read(
method poll_write (line 165) | fn poll_write(
method poll_flush (line 173) | fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result...
method poll_shutdown (line 177) | fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Res...
method is_write_vectored (line 181) | fn is_write_vectored(&self) -> bool {
method poll_write_vectored (line 185) | fn poll_write_vectored(
FILE: grpc/src/rt/mod.rs
type BoxFuture (line 36) | pub type BoxFuture<T> = Pin<Box<dyn Future<Output = T> + Send>>;
type BoxedTaskHandle (line 37) | pub type BoxedTaskHandle = Box<dyn TaskHandle>;
type BoxEndpoint (line 38) | pub type BoxEndpoint = Box<dyn GrpcEndpoint>;
type ScopedBoxFuture (line 39) | pub type ScopedBoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send ...
type Runtime (line 48) | pub trait Runtime: Send + Sync + Debug {
method spawn (line 50) | fn spawn(&self, task: Pin<Box<dyn Future<Output = ()> + Send + 'static...
method get_dns_resolver (line 55) | fn get_dns_resolver(&self, opts: ResolverOptions) -> Result<Box<dyn Dn...
method sleep (line 58) | fn sleep(&self, duration: std::time::Duration) -> Pin<Box<dyn Sleep>>;
method tcp_stream (line 62) | fn tcp_stream(
method listen_tcp (line 69) | fn listen_tcp(
method spawn (line 167) | fn spawn(&self, task: Pin<Box<dyn Future<Output = ()> + Send + 'static...
method get_dns_resolver (line 171) | fn get_dns_resolver(&self, opts: ResolverOptions) -> Result<Box<dyn Dn...
method sleep (line 175) | fn sleep(&self, duration: std::time::Duration) -> Pin<Box<dyn Sleep>> {
method tcp_stream (line 179) | fn tcp_stream(
method listen_tcp (line 187) | fn listen_tcp(
type Sleep (line 77) | pub trait Sleep: Send + Sync + Future<Output = ()> {}
type TaskHandle (line 79) | pub trait TaskHandle: Send + Sync {
method abort (line 81) | fn abort(&self);
type DnsResolver (line 86) | pub trait DnsResolver: Send + Sync {
method lookup_host_name (line 88) | async fn lookup_host_name(&self, name: &str) -> Result<Vec<std::net::I...
method lookup_txt (line 91) | async fn lookup_txt(&self, name: &str) -> Result<Vec<String>, String>;
type ResolverOptions (line 95) | pub struct ResolverOptions {
type TcpOptions (line 102) | pub struct TcpOptions {
type Sealed (line 115) | pub trait Sealed: tokio::io::AsyncRead + tokio::io::AsyncWrite {}
type GrpcEndpoint (line 119) | pub trait GrpcEndpoint: endpoint::Sealed + Send + Unpin + 'static {
method get_local_address (line 121) | fn get_local_address(&self) -> &str;
method get_peer_address (line 124) | fn get_peer_address(&self) -> &str;
method get_network_type (line 126) | fn get_network_type(&self) -> &'static str;
method get_local_address (line 131) | fn get_local_address(&self) -> &str {
method get_peer_address (line 135) | fn get_peer_address(&self) -> &str {
method get_network_type (line 139) | fn get_network_type(&self) -> &'static str {
type TcpListener (line 146) | pub trait TcpListener: Send + Sync {
method accept (line 152) | fn accept(&mut self) -> ScopedBoxFuture<'_, Result<(BoxEndpoint, Socke...
method local_addr (line 155) | fn local_addr(&self) -> &SocketAddr;
type NoOpRuntime (line 164) | pub(crate) struct NoOpRuntime {}
function default_runtime (line 196) | pub(crate) fn default_runtime() -> GrpcRuntime {
type GrpcRuntime (line 206) | pub struct GrpcRuntime {
method new (line 211) | pub fn new<T: Runtime + 'static>(runtime: T) -> Self {
method spawn (line 217) | pub fn spawn(
method get_dns_resolver (line 224) | pub fn get_dns_resolver(&self, opts: ResolverOptions) -> Result<Box<dy...
method sleep (line 228) | pub fn sleep(&self, duration: std::time::Duration) -> Pin<Box<dyn Slee...
method tcp_stream (line 232) | pub fn tcp_stream(
method listen_tcp (line 240) | pub fn listen_tcp(
FILE: grpc/src/rt/tokio/hickory_resolver.rs
type DnsResolver (line 40) | pub(super) struct DnsResolver {
method lookup_host_name (line 46) | async fn lookup_host_name(&self, name: &str) -> Result<Vec<IpAddr>, St...
method lookup_txt (line 55) | async fn lookup_txt(&self, name: &str) -> Result<Vec<String>, String> {
method new (line 75) | pub(super) fn new(opts: ResolverOptions) -> Result<Self, String> {
function compare_hickory_and_default (line 121) | async fn compare_hickory_and_default() {
function resolve_txt (line 143) | async fn resolve_txt() {
function custom_authority (line 180) | async fn custom_authority() {
type FakeDns (line 196) | struct FakeDns {
method shutdown (line 203) | async fn shutdown(mut self) {
function start_in_memory_dns_server (line 215) | async fn start_in_memory_dns_server(host: &str, records: Vec<Record>) ->...
FILE: grpc/src/rt/tokio/mod.rs
type TokioDefaultDnsResolver (line 55) | struct TokioDefaultDnsResolver {
method new (line 162) | pub fn new(opts: ResolverOptions) -> Result<Self, String> {
method lookup_host_name (line 61) | async fn lookup_host_name(&self, name: &str) -> Result<Vec<IpAddr>, Stri...
method lookup_txt (line 74) | async fn lookup_txt(&self, _name: &str) -> Result<Vec<String>, String> {
type TokioRuntime (line 80) | pub(crate) struct TokioRuntime {
method abort (line 85) | fn abort(&self) {
method spawn (line 93) | fn spawn(&self, task: Pin<Box<dyn Future<Output = ()> + Send + 'static>>...
method get_dns_resolver (line 97) | fn get_dns_resolver(&self, opts: ResolverOptions) -> Result<Box<dyn DnsR...
method sleep (line 108) | fn sleep(&self, duration: Duration) -> Pin<Box<dyn Sleep>> {
method tcp_stream (line 112) | fn tcp_stream(
method listen_tcp (line 142) | fn listen_tcp(
type TokioTcpStream (line 170) | struct TokioTcpStream {
method get_local_address (line 225) | fn get_local_address(&self) -> &str {
method get_peer_address (line 229) | fn get_peer_address(&self) -> &str {
method get_network_type (line 233) | fn get_network_type(&self) -> &'static str {
method poll_read (line 177) | fn poll_read(
method poll_write (line 187) | fn poll_write(
method poll_write_vectored (line 195) | fn poll_write_vectored(
method is_write_vectored (line 203) | fn is_write_vectored(&self) -> bool {
method poll_flush (line 207) | fn poll_flush(
method poll_shutdown (line 214) | fn poll_shutdown(
type TokioListener (line 238) | struct TokioListener {
method accept (line 244) | fn accept(&mut self) -> ScopedBoxFuture<'_, Result<(BoxEndpoint, Socke...
method local_addr (line 262) | fn local_addr(&self) -> &SocketAddr {
function lookup_hostname (line 276) | async fn lookup_hostname() {
function default_resolver_txt_fails (line 290) | async fn default_resolver_txt_fails() {
function default_resolver_custom_authority (line 298) | async fn default_resolver_custom_authority() {
FILE: grpc/src/send_future.rs
type SendFuture (line 67) | pub trait SendFuture: Future {
method make_send (line 74) | fn make_send(self) -> impl Future<Output = Self::Output> + Send
FILE: grpc/src/server/mod.rs
type Server (line 33) | pub struct Server {
method new (line 51) | pub fn new() -> Self {
method set_handler (line 55) | pub fn set_handler<H>(&mut self, h: H)
method serve (line 62) | pub async fn serve(&self, l: &impl Listener) {
type Call (line 37) | pub struct Call<SS, RS> {
type Listener (line 44) | pub trait Listener {
method accept (line 47) | async fn accept(&self) -> Option<Call<Self::SendStream, Self::RecvStre...
method default (line 76) | fn default() -> Self {
type Handle (line 84) | pub trait Handle: Send + Sync {
method handle (line 88) | async fn handle(
type DynHandle (line 97) | trait DynHandle: Send + Sync {
method dyn_handle (line 98) | async fn dyn_handle(
method dyn_handle (line 108) | async fn dyn_handle(
type SendStream (line 122) | pub trait SendStream {
method send (line 130) | async fn send<'a>(
method send (line 158) | async fn send<'a>(
method send (line 168) | async fn send<'a>(
type DynSendStream (line 138) | trait DynSendStream: Send {
method dyn_send (line 139) | async fn dyn_send<'a>(
method dyn_send (line 148) | async fn dyn_send<'a>(
type SendOptions (line 180) | pub struct SendOptions {
type RecvStream (line 190) | pub trait RecvStream {
method next (line 199) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> Result<(), ()>;
method next (line 215) | async fn next(&mut self, msg: &mut dyn RecvMessage) -> Result<(), ()> {
type DynRecvStream (line 203) | trait DynRecvStream: Send {
method dyn_next (line 204) | async fn dyn_next(&mut self, msg: &mut dyn RecvMessage) -> Result<(), ...
method dyn_next (line 209) | async fn dyn_next(&mut self, msg: &mut dyn RecvMessage) -> Result<(), ...
FILE: grpc/src/status.rs
type Status (line 33) | pub struct Status {
method new (line 40) | pub fn new(code: StatusCode, message: impl Into<String>) -> Self {
method code (line 48) | pub fn code(&self) -> StatusCode {
method message (line 53) | pub fn message(&self) -> &str {
function test_status_new (line 63) | fn test_status_new() {
function test_status_debug (line 70) | fn test_status_debug() {
FILE: grpc/src/status/server_status.rs
type ServerStatus (line 33) | pub struct ServerStatus(Status);
type Target (line 36) | type Target = Status;
method deref (line 38) | fn deref(&self) -> &Self::Target {
method new (line 45) | pub fn new(code: StatusCode, message: impl Into<String>) -> Self {
method from_status (line 50) | pub fn from_status(status: Status) -> Self {
method into_status (line 55) | pub(crate) fn into_status(self) -> Status {
function test_server_status_new (line 65) | fn test_server_status_new() {
function test_server_status_deref (line 72) | fn test_server_status_deref() {
function test_server_status_from_status (line 78) | fn test_server_status_from_status() {
function test_server_status_into_status (line 85) | fn test_server_status_into_status() {
FILE: grpc/src/status/status_code.rs
type StatusCode (line 28) | pub enum StatusCode {
method from (line 49) | fn from(i: i32) -> Self {
FILE: interop/build.rs
function main (line 1) | fn main() {
FILE: interop/src/bin/client.rs
type Opts (line 8) | struct Opts {
method parse (line 33) | fn parse() -> Result<Self, pico_args::Error> {
type Codec (line 15) | enum Codec {
type Err (line 21) | type Err = String;
method from_str (line 23) | fn from_str(s: &str) -> Result<Self, Self::Err> {
function main (line 46) | async fn main() -> Result<(), Box<dyn std::error::Error>> {
type Testcase (line 134) | enum Testcase {
FILE: interop/src/bin/server.rs
type Opts (line 7) | struct Opts {
method parse (line 31) | fn parse() -> Result<Self, pico_args::Error> {
type Codec (line 13) | enum Codec {
type Err (line 19) | type Err = String;
method from_str (line 21) | fn from_str(s: &str) -> Result<Self, Self::Err> {
function main (line 41) | async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
FILE: interop/src/client.rs
type InteropTest (line 5) | pub trait InteropTest: Send {
method empty_unary (line 6) | async fn empty_unary(&mut self, assertions: &mut Vec<TestAssertion>);
method large_unary (line 8) | async fn large_unary(&mut self, assertions: &mut Vec<TestAssertion>);
method client_streaming (line 10) | async fn client_streaming(&mut self, assertions: &mut Vec<TestAssertio...
method server_streaming (line 12) | async fn server_streaming(&mut self, assertions: &mut Vec<TestAssertio...
method ping_pong (line 14) | async fn ping_pong(&mut self, assertions: &mut Vec<TestAssertion>);
method empty_stream (line 16) | async fn empty_stream(&mut self, assertions: &mut Vec<TestAssertion>);
method status_code_and_message (line 18) | async fn status_code_and_message(&mut self, assertions: &mut Vec<TestA...
method special_status_message (line 20) | async fn special_status_message(&mut self, assertions: &mut Vec<TestAs...
method unimplemented_method (line 22) | async fn unimplemented_method(&mut self, assertions: &mut Vec<TestAsse...
method custom_metadata (line 24) | async fn custom_metadata(&mut self, assertions: &mut Vec<TestAssertion>);
type InteropTestUnimplemented (line 28) | pub trait InteropTestUnimplemented: Send {
method unimplemented_service (line 29) | async fn unimplemented_service(&mut self, assertions: &mut Vec<TestAss...
FILE: interop/src/client_prost.rs
type TestClient (line 12) | pub type TestClient = TestServiceClient<Channel>;
type UnimplementedClient (line 13) | pub type UnimplementedClient = UnimplementedServiceClient<Channel>;
constant LARGE_REQ_SIZE (line 15) | const LARGE_REQ_SIZE: usize = 271_828;
constant LARGE_RSP_SIZE (line 16) | const LARGE_RSP_SIZE: i32 = 314_159;
constant REQUEST_LENGTHS (line 17) | const REQUEST_LENGTHS: &[i32] = &[27182, 8, 1828, 45904];
constant RESPONSE_LENGTHS (line 18) | const RESPONSE_LENGTHS: &[i32] = &[31415, 9, 2653, 58979];
constant TEST_STATUS_MESSAGE (line 19) | const TEST_STATUS_MESSAGE: &str = "test status message";
constant SPECIAL_TEST_STATUS_MESSAGE (line 20) | const SPECIAL_TEST_STATUS_MESSAGE: &str =
method empty_unary (line 25) | async fn empty_unary(&mut self, assertions: &mut Vec<TestAssertion>) {
method large_unary (line 44) | async fn large_unary(&mut self, assertions: &mut Vec<TestAssertion>) {
method client_streaming (line 88) | async fn client_streaming(&mut self, assertions: &mut Vec<TestAssertion>) {
method server_streaming (line 115) | async fn server_streaming(&mut self, assertions: &mut Vec<TestAssertion>) {
method ping_pong (line 157) | async fn ping_pong(&mut self, assertions: &mut Vec<TestAssertion>) {
method empty_stream (line 213) | async fn empty_stream(&mut self, assertions: &mut Vec<TestAssertion>) {
method status_code_and_message (line 234) | async fn status_code_and_message(&mut self, assertions: &mut Vec<TestAss...
method special_status_message (line 290) | async fn special_status_message(&mut self, assertions: &mut Vec<TestAsse...
method unimplemented_method (line 320) | async fn unimplemented_method(&mut self, assertions: &mut Vec<TestAssert...
method custom_metadata (line 332) | async fn custom_metadata(&mut self, assertions: &mut Vec<TestAssertion>) {
method unimplemented_service (line 391) | async fn unimplemented_service(&mut self, assertions: &mut Vec<TestAsser...
function make_ping_pong_request (line 404) | fn make_ping_pong_request(idx: usize) -> StreamingOutputCallRequest {
function make_streaming_input_request (line 414) | fn make_streaming_input_request(len: &i32) -> StreamingInputCallRequest {
FILE: interop/src/client_protobuf.rs
type TestClient (line 38) | pub type TestClient = TestServiceClient<Channel>;
type UnimplementedClient (line 39) | pub type UnimplementedClient = UnimplementedServiceClient<Channel>;
constant LARGE_REQ_SIZE (line 41) | const LARGE_REQ_SIZE: usize = 271_828;
constant LARGE_RSP_SIZE (line 42) | const LARGE_RSP_SIZE: i32 = 314_159;
constant REQUEST_LENGTHS (line 43) | const REQUEST_LENGTHS: &[i32] = &[27182, 8, 1828, 45904];
constant RESPONSE_LENGTHS (line 44) | const RESPONSE_LENGTHS: &[i32] = &[31415, 9, 2653, 58979];
constant TEST_STATUS_MESSAGE (line 45) | const TEST_STATUS_MESSAGE: &str = "test status message";
constant SPECIAL_TEST_STATUS_MESSAGE (line 46) | const SPECIAL_TEST_STATUS_MESSAGE: &str =
method empty_unary (line 51) | async fn empty_unary(&mut self, assertions: &mut Vec<TestAssertion>) {
method large_unary (line 70) | async fn large_unary(&mut self, assertions: &mut Vec<TestAssertion>) {
method client_streaming (line 99) | async fn client_streaming(&mut self, assertions: &mut Vec<TestAssertion>) {
method server_streaming (line 129) | async fn server_streaming(&mut self, assertions: &mut Vec<TestAssertion>) {
method ping_pong (line 169) | async fn ping_pong(&mut self, assertions: &mut Vec<TestAssertion>) {
method empty_stream (line 225) | async fn empty_stream(&mut self, assertions: &mut Vec<TestAssertion>) {
method status_code_and_message (line 246) | async fn status_code_and_message(&mut self, assertions: &mut Vec<TestAss...
method special_status_message (line 300) | async fn special_status_message(&mut self, assertions: &mut Vec<TestAsse...
method unimplemented_method (line 329) | async fn unimplemented_method(&mut self, assertions: &mut Vec<TestAssert...
method custom_metadata (line 343) | async fn custom_metadata(&mut self, assertions: &mut Vec<TestAssertion>) {
method unimplemented_service (line 401) | async fn unimplemented_service(&mut self, assertions: &mut Vec<TestAsser...
function make_ping_pong_request (line 416) | fn make_ping_pong_request(idx: usize) -> StreamingOutputCallRequest {
function make_streaming_input_request (line 425) | fn make_streaming_input_request(len: &i32) -> StreamingInputCallRequest {
FILE: interop/src/lib.rs
function trace_init (line 28) | pub fn trace_init() {
function client_payload (line 32) | pub fn client_payload(size: usize) -> pb::Payload {
function server_payload (line 39) | pub fn server_payload(size: usize) -> pb::Payload {
function with_size (line 47) | fn with_size(size: i32) -> Self {
function response_length (line 55) | fn response_length(response: &pb::StreamingOutputCallResponse) -> i32 {
function response_lengths (line 62) | fn response_lengths(responses: &[pb::StreamingOutputCallResponse]) -> Ve...
function client_payload (line 71) | pub(crate) fn client_payload(size: usize) -> grpc_pb::Payload {
function with_size (line 78) | pub(crate) fn with_size(size: i32) -> Self {
function response_length (line 83) | pub(crate) fn response_length(response: &grpc_pb::StreamingOutputCallRes...
function response_lengths (line 87) | pub(crate) fn response_lengths(responses: &[grpc_pb::StreamingOutputCall...
function server_payload (line 91) | pub(crate) fn server_payload(size: usize) -> grpc_pb::Payload {
type TestAssertion (line 99) | pub enum TestAssertion {
method is_failed (line 111) | pub fn is_failed(&self) -> bool {
method fmt (line 117) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
FILE: interop/src/server_prost.rs
type TestService (line 18) | pub struct TestService {}
method empty_call (line 27) | async fn empty_call(&self, _request: Request<Empty>) -> Result<Empty> {
method unary_call (line 31) | async fn unary_call(&self, request: Request<SimpleRequest>) -> Result<...
method cacheable_unary_call (line 57) | async fn cacheable_unary_call(&self, _: Request<SimpleRequest>) -> Res...
type StreamingOutputCallStream (line 61) | type StreamingOutputCallStream = Stream<StreamingOutputCallResponse>;
method streaming_output_call (line 63) | async fn streaming_output_call(
method streaming_input_call (line 86) | async fn streaming_input_call(
type FullDuplexCallStream (line 104) | type FullDuplexCallStream = Stream<StreamingOutputCallResponse>;
method full_duplex_call (line 106) | async fn full_duplex_call(
type HalfDuplexCallStream (line 144) | type HalfDuplexCallStream = Stream<StreamingOutputCallResponse>;
method half_duplex_call (line 146) | async fn half_duplex_call(
method unimplemented_call (line 153) | async fn unimplemented_call(&self, _: Request<Empty>) -> Result<Empty> {
type Result (line 20) | type Result<T> = StdResult<Response<T>, Status>;
type Streaming (line 21) | type Streaming<T> = Request<tonic::Streaming<T>>;
type Stream (line 22) | type Stream<T> = Pin<Box<dyn tokio_stream::Stream<Item = StdResult<T, St...
type BoxFuture (line 23) | type BoxFuture<T, E> = Pin<Box<dyn Future<Output = StdResult<T, E>> + Se...
type UnimplementedService (line 159) | pub struct UnimplementedService {}
method unimplemented_call (line 163) | async fn unimplemented_call(&self, _req: Request<Empty>) -> Result<Emp...
type EchoHeadersSvc (line 169) | pub struct EchoHeadersSvc<S> {
constant NAME (line 174) | const NAME: &'static str = S::NAME;
function new (line 178) | pub fn new(inner: S) -> Self {
type Response (line 188) | type Response = S::Response;
type Error (line 189) | type Error = S::Error;
type Future (line 190) | type Future = BoxFuture<Self::Response, Self::Error>;
function poll_ready (line 192) | fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<StdResult<(), Se...
function call (line 196) | fn call(&mut self, req: http::Request<Body>) -> Self::Future {
FILE: interop/src/server_protobuf.rs
type TestService (line 20) | pub struct TestService {}
method empty_call (line 28) | async fn empty_call(&self, _request: Request<Empty>) -> Result<Empty> {
method unary_call (line 32) | async fn unary_call(&self, request: Request<SimpleRequest>) -> Result<...
method cacheable_unary_call (line 60) | async fn cacheable_unary_call(&self, _: Request<SimpleRequest>) -> Res...
method streaming_output_call (line 64) | async fn streaming_output_call(
method streaming_input_call (line 81) | async fn streaming_input_call(
method full_duplex_call (line 99) | async fn full_duplex_call(
method half_duplex_call (line 143) | async fn half_duplex_call(
method unimplemented_call (line 151) | async fn unimplemented_call(&self, _: Request<Empty>) -> Result<Empty> {
type Result (line 22) | type Result<T> = StdResult<Response<T>, Status>;
type Streaming (line 23) | type Streaming<T> = Request<tonic::Streaming<T>>;
type BoxFuture (line 24) | type BoxFuture<T, E> = Pin<Box<dyn Future<Output = StdResult<T, E>> + Se...
type UnimplementedService (line 157) | pub struct UnimplementedService {}
method unimplemented_call (line 161) | async fn unimplemented_call(&self, _req: Request<Empty>) -> Result<Emp...
type EchoHeadersSvc (line 167) | pub struct EchoHeadersSvc<S> {
constant NAME (line 172) | const NAME: &'static str = S::NAME;
function new (line 176) | pub fn new(inner: S) -> Self {
type Response (line 186) | type Response = S::Response;
type Error (line 187) | type Error = S::Error;
type Future (line 188) | type Future = BoxFuture<Self::Response, Self::Error>;
function poll_ready (line 190) | fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<StdResult<(), Se...
function call (line 194) | fn call(&mut self, req: http::Request<Body>) -> Self::Future {
FILE: protoc-gen-rust-grpc/src/grpc_rust_generator.cc
type rust_grpc_generator (line 34) | namespace rust_grpc_generator {
function GrpcGetCommentsForDescriptor (line 47) | std::string GrpcGetCommentsForDescriptor(const DescriptorType *descrip...
function RustModuleForContainingType (line 56) | std::string RustModuleForContainingType(const GrpcOpts &opts,
function RsTypePathWithinMessageModule (line 87) | std::string RsTypePathWithinMessageModule(const GrpcOpts &opts,
function RsTypePath (line 94) | std::string RsTypePath(const Descriptor &msg, const GrpcOpts &opts, in...
function ReadFileToString (line 117) | absl::Status ReadFileToString(const absl::string_view name, std::strin...
function GetImportPathToCrateNameMap (line 143) | absl::StatusOr<absl::flat_hash_map<std::string, std::string>>
class Method (line 176) | class Method {
method Method (line 178) | Method() = delete;
method Method (line 180) | explicit Method(const MethodDescriptor *method) : method_(method) {}
method Name (line 183) | std::string Name() const {
method FullName (line 188) | absl::string_view FullName() const { return method_->full_name(); }
method ProtoFieldName (line 191) | absl::string_view ProtoFieldName() const { return method_->name(); }
method IsClientStreaming (line 194) | bool IsClientStreaming() const { return method_->client_streaming(); }
method IsServerStreaming (line 197) | bool IsServerStreaming() const { return method_->server_streaming(); }
method Comment (line 200) | std::string Comment() const { return GrpcGetCommentsForDescriptor(me...
method IsDeprecated (line 203) | bool IsDeprecated() const { return method_->options().deprecated(); }
method RequestName (line 206) | std::string RequestName(const GrpcOpts &opts, int depth) const {
method ResponseName (line 212) | std::string ResponseName(const GrpcOpts &opts, int depth) const {
class Service (line 226) | class Service {
method Service (line 228) | Service() = delete;
method Service (line 230) | explicit Service(const ServiceDescriptor *service) : service_(servic...
method Name (line 233) | std::string Name() const {
method FullName (line 238) | absl::string_view FullName() const { return service_->full_name(); }
method Methods (line 241) | std::vector<Method> Methods() const {
method Comment (line 252) | virtual std::string Comment() const {
function FormatMethodPath (line 262) | static std::string FormatMethodPath(const Service &service,
function SanitizeForRustDoc (line 267) | static std::string SanitizeForRustDoc(absl::string_view raw_comment) {
function ProtoCommentToRustDoc (line 286) | static std::string ProtoCommentToRustDoc(absl::string_view proto_comme...
function GenerateDeprecated (line 304) | static void GenerateDeprecated(Printer &ctx) { ctx.Emit("#[deprecated]...
type client (line 306) | namespace client {
function GenerateMethods (line 308) | static void GenerateMethods(Printer &printer, const Service &service,
function GenerateClient (line 408) | static void GenerateClient(const Service &service, Printer &printer,
type server (line 521) | namespace server {
function GenerateTraitMethods (line 522) | static void GenerateTraitMethods(Printer &printer, const Service &se...
function GenerateTrait (line 581) | static void GenerateTrait(Printer &printer, const Service &service,
function GenerateMethods (line 601) | static void GenerateMethods(Printer &printer, const Service &service,
function GenerateServer (line 791) | static void GenerateServer(const Service &service, Printer &printer,
function GenerateService (line 939) | void GenerateService(protobuf::io::Printer &printer,
function GetRsGrpcFile (line 948) | std::string GetRsGrpcFile(const protobuf::FileDescriptor &file) {
FILE: protoc-gen-rust-grpc/src/grpc_rust_generator.h
function class (line 30) | class GrpcOpts {
function SetImportPathToCrateName (line 40) | void SetImportPathToCrateName(
function SetFilesInCurrentCrate (line 45) | void SetFilesInCurrentCrate(
FILE: protoc-gen-rust-grpc/src/grpc_rust_plugin.cc
class RustGrpcGenerator (line 31) | class RustGrpcGenerator : public protobuf::compiler::CodeGenerator {
method GetSupportedFeatures (line 35) | uint64_t GetSupportedFeatures() const override {
method GetMinimumEdition (line 39) | protobuf::Edition GetMinimumEdition() const override {
method GetMaximumEdition (line 42) | protobuf::Edition GetMaximumEdition() const override {
method GetSupportedFeatures (line 46) | uint64_t GetSupportedFeatures() const override {
method Generate (line 51) | bool Generate(const protobuf::FileDescriptor *file,
function main (line 95) | int main(int argc, char *argv[]) {
FILE: tests/compile/build.rs
function main (line 1) | fn main() {
FILE: tests/compile/tests/ui.rs
function ui (line 2) | fn ui() {
FILE: tests/compile/tests/ui/ambiguous_methods.rs
function main (line 3) | fn main() {}
FILE: tests/compile/tests/ui/includer.rs
type _Test (line 8) | type _Test = dyn pb::top_service_server::TopService;
function main (line 10) | fn main() {}
FILE: tests/compile/tests/ui/result.rs
function main (line 3) | fn main() {}
FILE: tests/compile/tests/ui/root_file_path.rs
type Animal (line 2) | struct Animal {
function main (line 11) | fn main() {}
FILE: tests/compile/tests/ui/same_name.rs
function main (line 3) | fn main() {}
FILE: tests/compile/tests/ui/service.rs
function main (line 3) | fn main() {}
FILE: tests/compile/tests/ui/skip_debug.rs
function main (line 7) | fn main() {}
FILE: tests/compile/tests/ui/stream.rs
function main (line 3) | fn main() {}
FILE: tests/compile/tests/ui/use_arc_self.rs
type Svc (line 6) | struct Svc;
method test_request (line 10) | async fn test_request(
function main (line 18) | fn main() {}
FILE: tests/compression/build.rs
function main (line 1) | fn main() {
FILE: tests/compression/src/bidirectional_stream.rs
function client_enabled_server_enabled (line 13) | async fn client_enabled_server_enabled(encoding: CompressionEncoding) {
FILE: tests/compression/src/client_stream.rs
function client_enabled_server_enabled (line 13) | async fn client_enabled_server_enabled(encoding: CompressionEncoding) {
function client_disabled_server_enabled (line 86) | async fn client_disabled_server_enabled(encoding: CompressionEncoding) {
function client_enabled_server_disabled (line 137) | async fn client_enabled_server_disabled(encoding: CompressionEncoding) {
function compressing_response_from_client_stream (line 180) | async fn compressing_response_from_client_stream(encoding: CompressionEn...
FILE: tests/compression/src/compressing_request.rs
function client_enabled_server_enabled (line 13) | async fn client_enabled_server_enabled(encoding: CompressionEncoding) {
function client_enabled_server_enabled_multi_encoding (line 90) | async fn client_enabled_server_enabled_multi_encoding(encoding: Compress...
function client_enabled_server_disabled (line 152) | async fn client_enabled_server_disabled(encoding: CompressionEncoding) {
function client_mark_compressed_without_header_server_enabled (line 200) | async fn client_mark_compressed_without_header_server_enabled(encoding: ...
function limit_decoded_message_size (line 246) | async fn limit_decoded_message_size(encoding: CompressionEncoding) {
FILE: tests/compression/src/compressing_response.rs
function client_enabled_server_enabled (line 12) | async fn client_enabled_server_enabled(encoding: CompressionEncoding) {
function client_enabled_server_disabled (line 110) | async fn client_enabled_server_disabled(encoding: CompressionEncoding) {
function client_enabled_server_disabled_multi_encoding (line 151) | async fn client_enabled_server_disabled_multi_encoding() {
function client_disabled (line 201) | async fn client_disabled(encoding: CompressionEncoding) {
function server_replying_with_unsupported_encoding (line 272) | async fn server_replying_with_unsupported_encoding(encoding: Compression...
function disabling_compression_on_single_response (line 316) | async fn disabling_compression_on_single_response(encoding: CompressionE...
function disabling_compression_on_response_but_keeping_compression_on_stream (line 372) | async fn disabling_compression_on_response_but_keeping_compression_on_st...
function disabling_compression_on_response_from_client_stream (line 443) | async fn disabling_compression_on_response_from_client_stream(encoding: ...
function limit_decoded_message_size (line 500) | async fn limit_decoded_message_size(encoding: CompressionEncoding) {
FILE: tests/compression/src/lib.rs
type Svc (line 31) | struct Svc {
method prepare_response (line 38) | fn prepare_response<B>(&self, mut res: Response<B>) -> Response<B> {
method compress_output_unary (line 49) | async fn compress_output_unary(&self, _req: Request<()>) -> Result<Res...
method compress_input_unary (line 57) | async fn compress_input_unary(&self, req: Request<SomeData>) -> Result...
type CompressOutputServerStreamStream (line 62) | type CompressOutputServerStreamStream =
method compress_output_server_stream (line 65) | async fn compress_output_server_stream(
method compress_input_client_stream (line 76) | async fn compress_input_client_stream(
method compress_output_client_stream (line 87) | async fn compress_output_client_stream(
type CompressInputOutputBidirectionalStreamStream (line 103) | type CompressInputOutputBidirectionalStreamStream =
method compress_input_output_bidirectional_stream (line 106) | async fn compress_input_output_bidirectional_stream(
constant UNCOMPRESSED_MIN_BODY_SIZE (line 35) | const UNCOMPRESSED_MIN_BODY_SIZE: usize = 1024;
FILE: tests/compression/src/server_stream.rs
function client_enabled_server_enabled (line 13) | async fn client_enabled_server_enabled(encoding: CompressionEncoding) {
function client_disabled_server_enabled (line 78) | async fn client_disabled_server_enabled(encoding: CompressionEncoding) {
function client_enabled_server_disabled (line 130) | async fn client_enabled_server_disabled(encoding: CompressionEncoding) {
FILE: tests/compression/src/util.rs
type CountBytesBody (line 39) | pub struct CountBytesBody<B> {
type Data (line 49) | type Data = B::Data;
type Error (line 50) | type Error = B::Error;
method poll_frame (line 52) | fn poll_frame(
method is_end_stream (line 68) | fn is_end_stream(&self) -> bool {
method size_hint (line 72) | fn size_hint(&self) -> http_body::SizeHint {
function frame_data_length (line 77) | fn frame_data_length(frame: &http_body::Frame<Bytes>) -> usize {
type ChannelBody (line 86) | struct ChannelBody<T> {
function new (line 92) | pub fn new() -> (tokio::sync::mpsc::Sender<Frame<T>>, Self) {
type Data (line 102) | type Data = T;
type Error (line 103) | type Error = tonic::Status;
method poll_frame (line 105) | fn poll_frame(
function measure_request_body_size_layer (line 115) | pub fn measure_request_body_size_layer(
function mock_io_channel (line 136) | pub async fn mock_io_channel(client: tokio::io::DuplexStream) -> Channel {
type AssertRightEncoding (line 150) | pub struct AssertRightEncoding {
method new (line 156) | pub fn new(encoding: CompressionEncoding) -> Self {
method call (line 160) | pub fn call<B: HttpBody>(self, req: http::Request<B>) -> http::Request...
FILE: tests/default_stubs/build.rs
function main (line 1) | fn main() {
FILE: tests/default_stubs/src/lib.rs
type Svc (line 9) | pub struct Svc;
type ServerStreamStream (line 13) | type ServerStreamStream = Pin<Box<dyn Stream<Item = Result<(), Status>...
type BidirectionalStreamStream (line 14) | type BidirectionalStreamStream =
method unary (line 17) | async fn unary(&self, _: Request<()>) -> Result<Response<()>, Status> {
method server_stream (line 21) | async fn server_stream(
method client_stream (line 28) | async fn client_stream(&self, _: Request<Streaming<()>>) -> Result<Res...
method bidirectional_stream (line 32) | async fn bidirectional_stream(
FILE: tests/default_stubs/tests/default.rs
function echo_requests_iter (line 9) | fn echo_requests_iter() -> impl Stream<Item = ()> {
function test_default_stubs (line 13) | async fn test_default_stubs(
function test_default_stubs_tcp (line 77) | async fn test_default_stubs_tcp() {
function test_default_stubs_uds (line 90) | async fn test_default_stubs_uds() {
function run_services_in_background (line 97) | async fn run_services_in_background() -> (SocketAddr, SocketAddr) {
function run_services_in_background_uds (line 129) | async fn run_services_in_background_uds() -> (String, String) {
FILE: tests/deprecated_methods/build.rs
function main (line 1) | fn main() {
FILE: tests/deprecated_methods/tests/deprecated_methods.rs
function test (line 4) | fn test() {
FILE: tests/disable_comments/build.rs
function main (line 1) | fn main() {
FILE: tests/disable_comments/tests/disable_comments.rs
function test (line 4) | fn test() {
FILE: tests/extern_path/my_application/build.rs
function main (line 1) | fn main() -> Result<(), std::io::Error> {
FILE: tests/extern_path/my_application/src/main.rs
function main (line 5) | fn main() {
function service_types_have_extern_types (line 17) | fn service_types_have_extern_types() {
FILE: tests/extern_path/uuid/build.rs
function main (line 1) | fn main() {
FILE: tests/extern_path/uuid/src/lib.rs
type DoSomething (line 3) | pub trait DoSomething {
method do_it (line 4) | fn do_it(&self) -> String;
method do_it (line 8) | fn do_it(&self) -> String {
FILE: tests/integration_tests/build.rs
function main (line 1) | fn main() {
FILE: tests/integration_tests/src/lib.rs
type MockStream (line 17) | pub struct MockStream(pub tokio::io::DuplexStream);
type ConnectInfo (line 20) | type ConnectInfo = ();
method connect_info (line 23) | fn connect_info(&self) -> Self::ConnectInfo {}
method poll_read (line 27) | fn poll_read(
method poll_write (line 37) | fn poll_write(
method poll_flush (line 45) | fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<st...
method poll_shutdown (line 49) | fn poll_shutdown(
method poll_write_vectored (line 56) | fn poll_write_vectored(
method is_write_vectored (line 64) | fn is_write_vectored(&self) -> bool {
function trace_init (line 70) | pub fn trace_init() {
type BoxFuture (line 74) | pub type BoxFuture<'a, T> = std::pin::Pin<Box<dyn std::future::Future<Ou...
FILE: tests/integration_tests/tests/client_layer.rs
function connect_supports_standard_tower_layers (line 13) | async fn connect_supports_standard_tower_layers() {
FILE: tests/integration_tests/tests/complex_tower_middleware.rs
function complex_tower_layers_work (line 14) | async fn complex_tower_layers_work() {
type MyServiceLayer (line 35) | struct MyServiceLayer {}
method new (line 38) | fn new() -> Self {
type Service (line 44) | type Service = MyService<S>;
method layer (line 46) | fn layer(&self, inner: S) -> Self::Service {
type MyService (line 52) | struct MyService<S> {
type Response (line 60) | type Response = http::Response<MyBody<ResBody>>;
type Error (line 61) | type Error = BoxError;
type Future (line 62) | type Future = MyFuture<S::Future, ResBody>;
type Output (line 82) | type Output = Result<http::Response<MyBody<B>>, BoxError>;
method poll (line 84) | fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Outp...
function poll_ready (line 64) | fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::...
function call (line 68) | fn call(&mut self, req: R) -> Self::Future {
type MyFuture (line 73) | struct MyFuture<F, B> {
type MyBody (line 89) | struct MyBody<B> {
type Data (line 97) | type Data = B::Data;
type Error (line 98) | type Error = BoxError;
method poll_frame (line 100) | fn poll_frame(
FILE: tests/integration_tests/tests/connect_info.rs
function getting_connect_info (line 13) | async fn getting_connect_info() {
type Svc (line 78) | struct Svc {}
method unary_call (line 82) | async fn unary_call(&self, req: Request<Input>) -> Result<Response<Out...
function getting_connect_info (line 97) | async fn getting_connect_info() {
FILE: tests/integration_tests/tests/connection.rs
type Svc (line 10) | struct Svc(Arc<Mutex<Option<oneshot::Sender<()>>>>);
method unary_call (line 14) | async fn unary_call(&self, _: Request<Input>) -> Result<Response<Outpu...
function connect_returns_err (line 23) | async fn connect_returns_err() {
function connect_handles_tls (line 30) | async fn connect_handles_tls() {
function connect_returns_err_via_call_after_connected (line 38) | async fn connect_returns_err_via_call_after_connected() {
function connect_lazy_reconnects_after_first_failure (line 73) | async fn connect_lazy_reconnects_after_first_failure() {
FILE: tests/integration_tests/tests/extensions.rs
type ExtensionValue (line 19) | struct ExtensionValue(i32);
function setting_extension_from_interceptor (line 22) | async fn setting_extension_from_interceptor() {
function setting_extension_from_tower (line 72) | async fn setting_extension_from_tower() {
type InterceptedService (line 121) | struct InterceptedService<S> {
type Response (line 134) | type Response = S::Response;
type Error (line 135) | type Error = S::Error;
type Future (line 136) | type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>;
function poll_ready (line 138) | fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::...
function call (line 142) | fn call(&mut self, mut req: http::Request<Body>) -> Self::Future {
constant NAME (line 156) | const NAME: &'static str = S::NAME;
FILE: tests/integration_tests/tests/http2_keep_alive.rs
type Svc (line 9) | struct Svc;
method unary_call (line 13) | async fn unary_call(&self, _: Request<Input>) -> Result<Response<Outpu...
function http2_keepalive_does_not_cause_panics (line 19) | async fn http2_keepalive_does_not_cause_panics() {
function http2_keepalive_does_not_cause_panics_on_client_side (line 49) | async fn http2_keepalive_does_not_cause_panics_on_client_side() {
FILE: tests/integration_tests/tests/http2_max_header_list_size.rs
function test_http_max_header_list_size_and_long_errors (line 13) | async fn test_http_max_header_list_size_and_long_errors() {
FILE: tests/integration_tests/tests/interceptor.rs
function interceptor_retrieves_grpc_method (line 10) | async fn interceptor_retrieves_grpc_method() {
FILE: tests/integration_tests/tests/load_shed.rs
function service_resource_exhausted (line 7) | async fn service_resource_exhausted() {
function service_resource_not_exhausted (line 22) | async fn service_resource_not_exhausted() {
function run_service_in_background (line 35) | async fn run_service_in_background(concurrency_limit: usize) -> SocketAd...
FILE: tests/integration_tests/tests/max_message_size.rs
function max_message_recv_size (line 15) | fn max_message_recv_size() {
function max_message_send_size (line 65) | fn max_message_send_size() {
function response_stream_limit (line 118) | async fn response_stream_limit() {
function assert_server_recv_max_success (line 195) | fn assert_server_recv_max_success(size: usize) {
function assert_server_recv_max_failure (line 206) | fn assert_server_recv_max_failure(size: usize) {
function assert_client_recv_max_success (line 218) | fn assert_client_recv_max_success(size: usize) {
function assert_client_recv_max_failure (line 229) | fn assert_client_recv_max_failure(size: usize) {
function assert_test_case (line 241) | fn assert_test_case(case: TestCase) {
type TestCase (line 259) | struct TestCase {
function max_message_run (line 271) | async fn max_message_run(case: &TestCase) -> Result<(), Status> {
FILE: tests/integration_tests/tests/origin.rs
function writes_origin_header (line 17) | async fn writes_origin_header() {
type OriginLayer (line 69) | struct OriginLayer {}
type Service (line 72) | type Service = OriginService<S>;
method layer (line 74) | fn layer(&self, inner: S) -> Self::Service {
type OriginService (line 80) | struct OriginService<S> {
type Response (line 90) | type Response = T::Response;
type Error (line 91) | type Error = Box<dyn std::error::Error + Send + Sync>;
type Future (line 92) | type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>;
function poll_ready (line 94) | fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::...
function call (line 98) | fn call(&mut self, req: Request<tonic::body::Body>) -> Self::Future {
FILE: tests/integration_tests/tests/routes_builder.rs
function multiple_service_using_routes_builder (line 18) | async fn multiple_service_using_routes_builder() {
FILE: tests/integration_tests/tests/status.rs
function status_with_details (line 22) | async fn status_with_details() {
function status_with_metadata (line 72) | async fn status_with_metadata() {
type Stream (line 141) | type Stream<T> = std::pin::Pin<
function status_from_server_stream (line 146) | async fn status_from_server_stream() {
function status_from_server_stream_with_source (line 198) | async fn status_from_server_stream_with_source() {
function status_from_server_stream_with_inferred_status (line 216) | async fn status_from_server_stream_with_inferred_status() {
function message_and_then_status_from_server_stream (line 303) | async fn message_and_then_status_from_server_stream() {
FILE: tests/integration_tests/tests/streams.rs
type Stream (line 5) | type Stream<T> = std::pin::Pin<
function status_from_server_stream_with_source (line 10) | async fn status_from_server_stream_with_source() {
type Unsync (line 45) | struct Unsync(*mut ());
type Item (line 50) | type Item = Result<OutputStream, Status>;
method poll_next (line 52) | fn poll_next(
FILE: tests/integration_tests/tests/timeout.rs
function cancelation_on_timeout (line 7) | async fn cancelation_on_timeout() {
function picks_server_timeout_if_thats_sorter (line 27) | async fn picks_server_timeout_if_thats_sorter() {
function picks_client_timeout_if_thats_sorter (line 46) | async fn picks_client_timeout_if_thats_sorter() {
function run_service_in_background (line 64) | async fn run_service_in_background(latency: Duration, server_timeout: Du...
FILE: tests/integration_tests/tests/user_agent.rs
function writes_user_agent_header (line 10) | async fn writes_user_agent_header() {
FILE: tests/web/build.rs
function main (line 1) | fn main() {
FILE: tests/web/src/lib.rs
type BoxStream (line 12) | type BoxStream<T> = Pin<Box<dyn Stream<Item = Result<T, Status>> + Send ...
type Svc (line 14) | pub struct Svc;
method unary_call (line 18) | async fn unary_call(&self, req: Request<Input>) -> Result<Response<Outpu...
type ServerStreamStream (line 31) | type ServerStreamStream = BoxStream<Output>;
method server_stream (line 33) | async fn server_stream(
method client_stream (line 49) | async fn client_stream(
constant STANDARD (line 81) | pub const STANDARD: GeneralPurpose = GeneralPurpose::new(
FILE: tests/web/tests/grpc.rs
function smoke_unary (line 17) | async fn smoke_unary() {
function smoke_client_stream (line 33) | async fn smoke_client_stream() {
function smoke_server_stream (line 51) | async fn smoke_server_stream() {
function smoke_error (line 72) | async fn smoke_error() {
function bind (line 95) | async fn bind() -> (TcpListener, String) {
function grpc (line 103) | async fn grpc(accept_h1: bool) -> (impl Future<Output = Result<(), Error...
function grpc_web (line 114) | async fn grpc_web(accept_h1: bool) -> (impl Future<Output = Result<(), E...
type Client (line 126) | type Client = TestClient<Channel>;
function spawn (line 128) | async fn spawn() -> Result<(Client, Client, Client, Client), Error> {
function input (line 144) | fn input() -> Input {
function meta (line 151) | fn meta<T>(r: &Response<T>) -> String {
function data (line 155) | fn data<T>(r: &Response<T>) -> &T {
function stream (line 159) | async fn stream<T>(r: Response<Streaming<T>>) -> Vec<T> {
function status (line 163) | fn status(s: &tonic::Status) -> (String, tonic::Code) {
FILE: tests/web/tests/grpc_web.rs
function binary_request (line 23) | async fn binary_request() {
function text_request (line 46) | async fn text_request() {
function spawn (line 68) | async fn spawn() -> String {
function encode_body (line 87) | fn encode_body() -> Bytes {
function build_request (line 111) | fn build_request(base_uri: String, content_type: &str, accept: &str) -> ...
function decode_body (line 138) | async fn decode_body(body: Incoming, content_type: &str) -> (Output, Byt...
FILE: tests/wellknown-compiled/build.rs
function main (line 1) | fn main() {
FILE: tests/wellknown-compiled/src/lib.rs
function grok (line 14) | pub fn grok() {
FILE: tests/wellknown/build.rs
function main (line 1) | fn main() {
FILE: tonic-build/src/client.rs
function generate_internal (line 11) | pub(crate) fn generate_internal<T: Service>(
function generate_connect (line 140) | fn generate_connect(service_ident: &syn::Ident, enabled: bool) -> TokenS...
function generate_connect (line 163) | fn generate_connect(_service_ident: &syn::Ident, _enabled: bool) -> Toke...
function generate_methods (line 167) | fn generate_methods<T: Service>(
function generate_unary (line 221) | fn generate_unary<T: Service>(
function generate_server_streaming (line 252) | fn generate_server_streaming<T: Service>(
function generate_client_streaming (line 283) | fn generate_client_streaming<T: Service>(
function generate_streaming (line 314) | fn generate_streaming<T: Service>(
FILE: tonic-build/src/code_gen.rs
type CodeGenBuilder (line 14) | pub struct CodeGenBuilder {
method new (line 26) | pub fn new() -> Self {
method emit_package (line 31) | pub fn emit_package(&mut self, enable: bool) -> &mut Self {
method attributes (line 39) | pub fn attributes(&mut self, attributes: Attributes) -> &mut Self {
method build_transport (line 49) | pub fn build_transport(&mut self, build_transport: bool) -> &mut Self {
method compile_well_known_types (line 56) | pub fn compile_well_known_types(&mut self, enable: bool) -> &mut Self {
method disable_comments (line 62) | pub fn disable_comments(&mut self, disable_comments: HashSet<String>) ...
method use_arc_self (line 68) | pub fn use_arc_self(&mut self, enable: bool) -> &mut Self {
method generate_default_stubs (line 74) | pub fn generate_default_stubs(&mut self, generate_default_stubs: bool)...
method generate_client (line 83) | pub fn generate_client(&self, service: &impl Service, proto_path: &str...
method generate_server (line 99) | pub fn generate_server(&self, service: &impl Service, proto_path: &str...
method default (line 114) | fn default() -> Self {
FILE: tonic-build/src/lib.rs
type Service (line 31) | pub trait Service {
method name (line 39) | fn name(&self) -> &str;
method package (line 41) | fn package(&self) -> &str;
method identifier (line 43) | fn identifier(&self) -> &str;
method methods (line 45) | fn methods(&self) -> &[Self::Method];
method comment (line 47) | fn comment(&self) -> &[Self::Comment];
type Method (line 56) | pub trait Method {
method name (line 61) | fn name(&self) -> &str;
method identifier (line 63) | fn identifier(&self) -> &str;
method codec_path (line 65) | fn codec_path(&self) -> &str;
method client_streaming (line 67) | fn client_streaming(&self) -> bool;
method server_streaming (line 69) | fn server_streaming(&self) -> bool;
method comment (line 71) | fn comment(&self) -> &[Self::Comment];
method deprecated (line 73) | fn deprecated(&self) -> bool {
method request_response_name (line 77) | fn request_response_name(
type Attributes (line 86) | pub struct Attributes {
method for_mod (line 96) | fn for_mod(&self, name: &str) -> Vec<syn::Attribute> {
method for_struct (line 100) | fn for_struct(&self, name: &str) -> Vec<syn::Attribute> {
method for_trait (line 104) | fn for_trait(&self, name: &str) -> Vec<syn::Attribute> {
method push_mod (line 117) | pub fn push_mod(&mut self, pattern: impl Into<String>, attr: impl Into...
method push_struct (line 130) | pub fn push_struct(&mut self, pattern: impl Into<String>, attr: impl I...
method push_trait (line 143) | pub fn push_trait(&mut self, pattern: impl Into<String>, attr: impl In...
function format_service_name (line 148) | fn format_service_name<T: Service>(service: &T, emit_package: bool) -> S...
function format_method_path (line 158) | fn format_method_path<T: Service>(service: &T, method: &T::Method, emit_...
function format_method_name (line 166) | fn format_method_name<T: Service>(service: &T, method: &T::Method, emit_...
function generate_attributes (line 175) | fn generate_attributes<'a>(
function generate_deprecated (line 191) | fn generate_deprecated() -> TokenStream {
function generate_doc_comment (line 205) | fn generate_doc_comment<S: AsRef<str>>(comment: S) -> TokenStream {
function generate_doc_comments (line 229) | fn generate_doc_comments<T: AsRef<str>>(comments: &[T]) -> TokenStream {
function match_name (line 240) | pub(crate) fn match_name(pattern: &str, path: &str) -> bool {
function naive_snake_case (line 265) | fn naive_snake_case(name: &str) -> String {
function test_match_name (line 286) | fn test_match_name() {
function test_snake_case (line 307) | fn test_snake_case() {
FILE: tonic-build/src/manual.rs
type ServiceBuilder (line 57) | pub struct ServiceBuilder {
method name (line 74) | pub fn name(mut self, name: impl AsRef<str>) -> Self {
method package (line 83) | pub fn package(mut self, package: impl AsRef<str>) -> Self {
method comment (line 89) | pub fn comment(mut self, comment: impl AsRef<str>) -> Self {
method method (line 95) | pub fn method(mut self, method: Method) -> Self {
method build (line 103) | pub fn build(self) -> Service {
type Service (line 115) | pub struct Service {
method builder (line 128) | pub fn builder() -> ServiceBuilder {
type Comment (line 134) | type Comment = String;
type Method (line 136) | type Method = Method;
method name (line 138) | fn name(&self) -> &str {
method package (line 142) | fn package(&self) -> &str {
method identifier (line 146) | fn identifier(&self) -> &str {
method methods (line 150) | fn methods(&self) -> &[Self::Method] {
method comment (line 154) | fn comment(&self) -> &[Self::Comment] {
type Method (line 161) | pub struct Method {
method builder (line 184) | pub fn builder() -> MethodBuilder {
type Comment (line 190) | type Comment = String;
method name (line 192) | fn name(&self) -> &str {
method identifier (line 196) | fn identifier(&self) -> &str {
method codec_path (line 200) | fn codec_path(&self) -> &str {
method client_streaming (line 204) | fn client_streaming(&self) -> bool {
method server_streaming (line 208) | fn server_streaming(&self) -> bool {
method comment (line 212) | fn comment(&self) -> &[Self::Comment] {
method deprecated (line 216) | fn deprecated(&self) -> bool {
method request_response_name (line 220) | fn request_response_name(
type MethodBuilder (line 256) | pub struct MethodBuilder {
method name (line 283) | pub fn name(mut self, name: impl AsRef<str>) -> Self {
method route_name (line 294) | pub fn route_name(mut self, route_name: impl AsRef<str>) -> Self {
method comment (line 300) | pub fn comment(mut self, comment: impl AsRef<str>) -> Self {
method input_type (line 306) | pub fn input_type(mut self, input_type: impl AsRef<str>) -> Self {
method output_type (line 312) | pub fn output_type(mut self, output_type: impl AsRef<str>) -> Self {
method codec_path (line 320) | pub fn codec_path(mut self, codec_path: impl AsRef<str>) -> Self {
method client_streaming (line 326) | pub fn client_streaming(mut self) -> Self {
method server_streaming (line 332) | pub fn server_streaming(mut self) -> Self {
method build (line 340) | pub fn build(self) -> Method {
type ServiceGenerator (line 355) | struct ServiceGenerator {
method generate (line 362) | fn generate(&mut self, service: &Service) {
method finalize (line 383) | fn finalize(&mut self, buf: &mut String) {
type Builder (line 416) | pub struct Builder {
method new (line 437) | pub fn new() -> Self {
method build_client (line 444) | pub fn build_client(mut self, enable: bool) -> Self {
method build_server (line 452) | pub fn build_server(mut self, enable: bool) -> Self {
method build_transport (line 461) | pub fn build_transport(mut self, enable: bool) -> Self {
method out_dir (line 469) | pub fn out_dir(mut self, out_dir: impl AsRef<Path>) -> Self {
method compile (line 478) | pub fn compile(self, services: &[Service]) {
method default (line 425) | fn default() -> Self {
FILE: tonic-build/src/server.rs
function generate_internal (line 13) | pub(crate) fn generate_internal<T: Service>(
function generate_trait (line 199) | fn generate_trait<T: Service>(
function generate_trait_methods (line 234) | fn generate_trait_methods<T: Service>(
function generate_named (line 359) | fn generate_named(server_service: &syn::Ident, service_name: &str) -> To...
function generate_methods (line 373) | fn generate_methods<T: Service>(
function generate_unary (line 439) | fn generate_unary<T: Method>(
function generate_server_streaming (line 497) | fn generate_server_streaming<T: Method>(
function generate_client_streaming (line 564) | fn generate_client_streaming<T: Method>(
function generate_streaming (line 622) | fn generate_streaming<T: Method>(
FILE: tonic-health/src/generated/grpc_health_v1.rs
type HealthCheckRequest (line 3) | pub struct HealthCheckRequest {
type HealthCheckResponse (line 8) | pub struct HealthCheckResponse {
type ServingStatus (line 26) | pub enum ServingStatus {
method as_str_name (line 38) | pub fn as_str_name(&self) -> &'static str {
method from_str_name (line 47) | pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
type HealthClient (line 70) | pub struct HealthClient<T> {
function new (line 80) | pub fn new(inner: T) -> Self {
function with_origin (line 84) | pub fn with_origin(inner: T, origin: Uri) -> Self {
function with_interceptor (line 88) | pub fn with_interceptor<F>(
function send_compressed (line 112) | pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
function accept_compressed (line 118) | pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
function max_decoding_message_size (line 126) | pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
function max_encoding_message_size (line 134) | pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
function check (line 140) | pub async fn check(
function watch (line 179) | pub async fn watch(
type Health (line 217) | pub trait Health: std::marker::Send + std::marker::Sync + 'static {
method check (line 220) | async fn check(
method watch (line 248) | async fn watch(
type HealthServer (line 254) | pub struct HealthServer<T> {
function new (line 262) | pub fn new(inner: T) -> Self {
function from_arc (line 265) | pub fn from_arc(inner: Arc<T>) -> Self {
function with_interceptor (line 274) | pub fn with_interceptor<F>(
function accept_compressed (line 285) | pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
function send_compressed (line 291) | pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
function max_decoding_message_size (line 299) | pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
function max_encoding_message_size (line 307) | pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
type Response (line 318) | type Response = http::Response<tonic::body::Body>;
type Error (line 319) | type Error = std::convert::Infallible;
type Future (line 320) | type Future = BoxFuture<Self::Response, Self::Error>;
function poll_ready (line 321) | fn poll_ready(
function call (line 327) | fn call(&mut self, req: http::Request<B>) -> Self::Future {
method clone (line 443) | fn clone(&self) -> Self {
constant SERVICE_NAME (line 455) | pub const SERVICE_NAME: &str = "grpc.health.v1.Health";
constant NAME (line 457) | const NAME: &'static str = SERVICE_NAME;
FILE: tonic-health/src/generated/grpc_health_v1_fds.rs
constant FILE_DESCRIPTOR_SET (line 19) | pub const FILE_DESCRIPTOR_SET: &[u8] = &[
FILE: tonic-health/src/lib.rs
function file_descriptor_set_is_valid (line 34) | fn file_descriptor_set_is_valid() {
type ServingStatus (line 49) | pub enum ServingStatus {
method fmt (line 59) | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
function from (line 69) | fn from(s: ServingStatus) -> Self {
FILE: tonic-health/src/server.rs
function health_reporter (line 21) | pub fn health_reporter() -> (HealthReporter, HealthServer<impl Health>) {
type StatusPair (line 29) | type StatusPair = (watch::Sender<ServingStatus>, watch::Receiver<Serving...
type HealthReporter (line 35) | pub struct HealthReporter {
method new (line 41) | pub fn new() -> Self {
method set_serving (line 52) | pub async fn set_serving<S>(&self)
method set_not_serving (line 63) | pub async fn set_not_serving<S>(&self)
method set_service_status (line 74) | pub async fn set_service_status<S>(&self, service_name: S, status: Ser...
method clear_service_status (line 95) | pub async fn clear_service_status(&mut self, service_name: &str) {
method default (line 102) | fn default() -> Self {
type HealthService (line 109) | pub struct HealthService {
method new (line 114) | fn new(services: Arc<RwLock<HashMap<String, StatusPair>>>) -> Self {
method from_health_reporter (line 119) | pub fn from_health_reporter(health_reporter: HealthReporter) -> Self {
method service_health (line 123) | async fn service_health(&self, service_name: &str) -> Option<ServingSt...
method check (line 131) | async fn check(
type WatchStream (line 143) | type WatchStream = WatchStream;
method watch (line 145) | async fn watch(
type WatchStream (line 160) | pub struct WatchStream {
method new (line 165) | fn new(status_rx: watch::Receiver<ServingStatus>) -> Self {
method fmt (line 185) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type Item (line 172) | type Item = Result<HealthCheckResponse, Status>;
method poll_next (line 174) | fn poll_next(
method new (line 191) | fn new(status: ServingStatus) -> Self {
function assert_serving_status (line 207) | fn assert_serving_status(wire: i32, expected: ServingStatus) {
function assert_grpc_status (line 212) | fn assert_grpc_status(wire: Option<Status>, expected: Code) {
function make_test_service (line 217) | async fn make_test_service() -> (HealthReporter, HealthService) {
function test_service_check (line 234) | async fn test_service_check() {
function test_service_watch (line 281) | async fn test_service_watch() {
FILE: tonic-prost-build/src/lib.rs
function configure (line 59) | pub fn configure() -> Builder {
function compile_protos (line 96) | pub fn compile_protos(proto: impl AsRef<Path>) -> io::Result<()> {
function compile_fds (line 108) | pub fn compile_fds(fds: prost_types::FileDescriptorSet) -> io::Result<()> {
constant EXTENDED_NON_PATH_TYPE_ALLOWLIST (line 114) | const EXTENDED_NON_PATH_TYPE_ALLOWLIST: &[&str] =
constant DEFAULT_NON_PATH_TYPE_ALLOWLIST (line 117) | const DEFAULT_NON_PATH_TYPE_ALLOWLIST: &[&str] = &["()"];
type TonicBuildService (line 128) | struct TonicBuildService {
method new (line 134) | fn new(prost_service: Service, codec_path: String) -> Self {
type Method (line 157) | type Method = TonicBuildMethod;
type Comment (line 158) | type Comment = String;
method name (line 160) | fn name(&self) -> &str {
method package (line 164) | fn package(&self) -> &str {
method identifier (line 168) | fn identifier(&self) -> &str {
method methods (line 172) | fn methods(&self) -> &[Self::Method] {
method comment (line 176) | fn comment(&self) -> &[Self::Comment] {
type TonicBuildMethod (line 151) | struct TonicBuildMethod {
type Comment (line 182) | type Comment = String;
method name (line 184) | fn name(&self) -> &str {
method identifier (line 188) | fn identifier(&self) -> &str {
method client_streaming (line 192) | fn client_streaming(&self) -> bool {
method server_streaming (line 196) | fn server_streaming(&self) -> bool {
method comment (line 200) | fn comment(&self) -> &[Self::Comment] {
method request_response_name (line 204) | fn request_response_name(
method codec_path (line 296) | fn codec_path(&self) -> &str {
method deprecated (line 300) | fn deprecated(&self) -> bool {
function is_non_path_type (line 305) | fn is_non_path_type(ty: &str) -> bool {
function is_google_type (line 314) | fn is_google_type(ty: &str) -> bool {
type ServiceGenerator (line 320) | struct ServiceGenerator {
method new (line 337) | fn new(
method generate (line 367) | fn generate(&mut self, service: Service, buf: &mut String) {
type Builder (line 400) | pub struct Builder {
method build_client (line 433) | pub fn build_client(mut self, enable: bool) -> Self {
method build_server (line 439) | pub fn build_server(mut self, enable: bool) -> Self {
method build_transport (line 445) | pub fn build_transport(mut self, enable: bool) -> Self {
method out_dir (line 454) | pub fn out_dir(mut self, out_dir: impl AsRef<Path>) -> Self {
method extern_path (line 464) | pub fn extern_path(mut self, proto_path: impl AsRef<str>, rust_path: i...
method field_attribute (line 475) | pub fn field_attribute<P: AsRef<str>, A: AsRef<str>>(mut self, path: P...
method message_attribute (line 484) | pub fn message_attribute<P: AsRef<str>, A: AsRef<str>>(
method enum_attribute (line 497) | pub fn enum_attribute<P: AsRef<str>, A: AsRef<str>>(mut self, path: P,...
method type_attribute (line 506) | pub fn type_attribute<P: AsRef<str>, A: AsRef<str>>(mut self, path: P,...
method boxed (line 515) | pub fn boxed<P: AsRef<str>>(mut self, path: P) -> Self {
method btree_map (line 523) | pub fn btree_map<P: AsRef<str>>(mut self, path: P) -> Self {
method bytes (line 534) | pub fn bytes<P: AsRef<str>>(mut self, path: P) -> Self {
method server_mod_attribute (line 544) | pub fn server_mod_attribute<P: AsRef<str>, A: AsRef<str>>(
method server_attribute (line 556) | pub fn server_attribute<P: AsRef<str>, A: AsRef<str>>(mut self, path: ...
method trait_attribute (line 564) | pub fn trait_attribute<P: AsRef<str>, A: AsRef<str>>(mut self, path: P...
method client_mod_attribute (line 572) | pub fn client_mod_attribute<P: AsRef<str>, A: AsRef<str>>(
method client_attribute (line 584) | pub fn client_attribute<P: AsRef<str>, A: AsRef<str>>(mut self, path: ...
method proto_path (line 602) | pub fn proto_path(mut self, proto_path: impl AsRef<str>) -> Self {
method compile_well_known_types (line 610) | pub fn compile_well_known_types(mut self, enable: bool) -> Self {
method with_extended_rust_types (line 618) | pub fn with_extended_rust_types(mut self, enable: bool) -> Self {
method emit_package (line 626) | pub fn emit_package(mut self, enable: bool) -> Self {
method file_descriptor_set_path (line 634) | pub fn file_descriptor_set_path(mut self, path: impl AsRef<Path>) -> S...
method skip_protoc_run (line 642) | pub fn skip_protoc_run(mut self) -> Self {
method protoc_arg (line 650) | pub fn protoc_arg<A: AsRef<str>>(mut self, arg: A) -> Self {
method include_file (line 658) | pub fn include_file(mut self, path: impl AsRef<Path>) -> Self {
method emit_rerun_if_changed (line 666) | pub fn emit_rerun_if_changed(mut self, enable: bool) -> Self {
method disable_comments (line 674) | pub fn disable_comments<I, S>(mut self, path: I) -> Self
method use_arc_self (line 685) | pub fn use_arc_self(mut self, enable: bool) -> Self {
method generate_default_stubs (line 692) | pub fn generate_default_stubs(mut self, enable: bool) -> Self {
method codec_path (line 698) | pub fn codec_path(mut self, path: impl AsRef<str>) -> Self {
method skip_debug (line 707) | pub fn skip_debug<I, S>(mut self, paths: I) -> Self
method compile_protos (line 718) | pub fn compile_protos<P>(self, protos: &[P], includes: &[P]) -> io::Re...
method compile_with_config (line 729) | pub fn compile_with_config<P>(
method compile_fds (line 845) | pub fn compile_fds(self, fds: prost_types::FileDescriptorSet) -> io::R...
method compile_fds_with_config (line 850) | pub fn compile_fds_with_config(
method service_generator (line 948) | pub fn service_generator(self) -> Box<dyn prost_build::ServiceGenerato...
FILE: tonic-prost-build/src/tests.rs
function create_test_method (line 5) | fn create_test_method(input_type: String, output_type: String) -> TonicB...
function test_request_response_name_google_types_not_compiled (line 28) | fn test_request_response_name_google_types_not_compiled() {
function test_request_response_name_google_types_compiled (line 63) | fn test_request_response_name_google_types_compiled() {
function test_request_response_name_non_path_types (line 96) | fn test_request_response_name_non_path_types() {
function test_request_response_name_extern_types (line 106) | fn test_request_response_name_extern_types() {
function test_request_response_name_regular_protobuf_types (line 140) | fn test_request_response_name_regular_protobuf_types() {
function test_request_response_name_different_proto_paths (line 170) | fn test_request_response_name_different_proto_paths() {
function test_request_response_name_mixed_types (line 214) | fn test_request_response_name_mixed_types() {
function test_is_google_type (line 237) | fn test_is_google_type() {
function test_extended_non_path_type_allowlist (line 249) | fn test_extended_non_path_type_allowlist() {
function test_default_non_path_type_allowlist (line 292) | fn test_default_non_path_type_allowlist() {
function test_edge_cases (line 303) | fn test_edge_cases() {
FILE: tonic-prost/src/codec.rs
type ProstCodec (line 8) | pub struct ProstCodec<T, U> {
function new (line 15) | pub fn new() -> Self {
method default (line 21) | fn default() -> Self {
function raw_encoder (line 33) | pub fn raw_encoder(buffer_settings: BufferSettings) -> <Self as Codec>::...
function raw_decoder (line 42) | pub fn raw_decoder(buffer_settings: BufferSettings) -> <Self as Codec>::...
type Encode (line 55) | type Encode = T;
type Decode (line 56) | type Decode = U;
type Encoder (line 58) | type Encoder = ProstEncoder<T>;
type Decoder (line 59) | type Decoder = ProstDecoder<U>;
method encoder (line 61) | fn encoder(&mut self) -> Self::Encoder {
method decoder (line 68) | fn decoder(&mut self) -> Self::Decoder {
type ProstEncoder (line 78) | pub struct ProstEncoder<T> {
function new (line 85) | pub fn new(buffer_settings: BufferSettings) -> Self {
type Item (line 94) | type Item = T;
type Error (line 95) | type Error = Status;
method encode (line 97) | fn encode(&mut self, item: Self::Item, buf: &mut EncodeBuf<'_>) -> Resul...
method buffer_settings (line 104) | fn buffer_settings(&self) -> BufferSettings {
type ProstDecoder (line 111) | pub struct ProstDecoder<U> {
function new (line 118) | pub fn new(buffer_settings: BufferSettings) -> Self {
type Item (line 127) | type Item = U;
type Error (line 128) | type Error = Status;
method decode (line 130) | fn decode(&mut self, buf: &mut DecodeBuf<'_>) -> Result<Option<Self::Ite...
method buffer_settings (line 138) | fn buffer_settings(&self) -> BufferSettings {
function from_decode_error (line 143) | fn from_decode_error(error: prost::DecodeError) -> Status {
constant LEN (line 159) | const LEN: usize = 10000;
constant MAX_MESSAGE_SIZE (line 161) | const MAX_MESSAGE_SIZE: usize = 2 * 1024 * 1024;
function decode (line 164) | async fn decode() {
function decode_max_message_size_exceeded (line 190) | async fn decode_max_message_size_exceeded() {
function encode (line 220) | async fn encode() {
function encode_max_message_size_exceeded (line 242) | async fn encode_max_message_size_exceeded() {
function encode_too_big (line 277) | async fn encode_too_big() {
type MockEncoder (line 310) | struct MockEncoder {}
type Item (line 313) | type Item = Vec<u8>;
type Error (line 314) | type Error = Status;
method encode (line 316) | fn encode(&mut self, item: Self::Item, buf: &mut EncodeBuf<'_>) -> Resul...
method buffer_settings (line 321) | fn buffer_settings(&self) -> BufferSettings {
type MockDecoder (line 327) | struct MockDecoder {}
type Item (line 330) | type Item = Vec<u8>;
type Error (line 331) | type Error = Status;
method decode (line 333) | fn decode(&mut self, buf: &mut DecodeBuf<'_>) -> Result<Option<Self::Ite...
method buffer_settings (line 339) | fn buffer_settings(&self) -> BufferSettings {
type MockBody (line 354) | pub(super) struct MockBody {
method new (line 365) | pub(super) fn new(b: &[u8], partial_len: usize, count: usize) -> Self {
type Data (line 375) | type Data = Bytes;
type Error (line 376) | type Error = Status;
method poll_frame (line 378) | fn poll_frame(
FILE: tonic-protobuf-build/build.rs
function main (line 1) | fn main() {
FILE: tonic-protobuf-build/src/lib.rs
function protoc (line 31) | pub fn protoc() -> String {
function protoc_gen_rust_grpc (line 35) | pub fn protoc_gen_rust_grpc() -> String {
function bin (line 39) | pub fn bin() -> String {
type Dependency (line 46) | pub struct Dependency {
method builder (line 53) | pub fn builder() -> DependencyBuilder {
type DependencyBuilder (line 59) | pub struct DependencyBuilder {
method crate_name (line 67) | pub fn crate_name(mut self, name: impl Into<String>) -> Self {
method proto_import_path (line 74) | pub fn proto_import_path(mut self, path: impl Into<PathBuf>) -> Self {
method proto_import_paths (line 80) | pub fn proto_import_paths(mut self, paths: Vec<PathBuf>) -> Self {
method proto_file (line 85) | pub fn proto_file(mut self, file: impl Into<String>) -> Self {
method proto_files (line 90) | pub fn proto_files(mut self, files: Vec<String>) -> Self {
method build (line 95) | pub fn build(self) -> Result<Dependency, &'static str> {
function from (line 106) | fn from(val: &Dependency) -> Self {
type CodeGen (line 117) | pub struct CodeGen {
method new (line 129) | pub fn new() -> Self {
method generate_message_code (line 143) | pub fn generate_message_code(&mut self, enable: bool) -> &mut Self {
method input (line 149) | pub fn input(&mut self, input: impl AsRef<Path>) -> &mut Self {
method inputs (line 155) | pub fn inputs(&mut self, inputs: impl IntoIterator<Item = impl AsRef<P...
method should_format_code (line 162) | pub fn should_format_code(&mut self, enable: bool) -> &mut Self {
method output_dir (line 170) | pub fn output_dir(&mut self, output_dir: impl AsRef<Path>) -> &mut Self {
method include (line 176) | pub fn include(&mut self, include: impl AsRef<Path>) -> &mut Self {
method includes (line 182) | pub fn includes(&mut self, includes: impl Iterator<Item = impl AsRef<P...
method dependencies (line 193) | pub fn dependencies(&mut self, deps: Vec<Dependency>) -> &mut Self {
method message_module_path (line 202) | pub fn message_module_path(&mut self, message_path: &str) -> &mut Self {
method compile (line 207) | pub fn compile(&self) -> Result<(), String> {
method format_code (line 278) | fn format_code(&self) {
method generate_crate_mapping_file (line 306) | fn generate_crate_mapping_file(&self) -> PathBuf {
method default (line 323) | fn default() -> Self {
FILE: tonic-protobuf/src/lib.rs
type ProtoCodec (line 38) | pub struct ProtoCodec<T, U> {
method default (line 43) | fn default() -> Self {
type Encode (line 53) | type Encode = T;
type Decode (line 54) | type Decode = U;
type Encoder (line 56) | type Encoder = ProtoEncoder<T>;
type Decoder (line 57) | type Decoder = ProtoDecoder<U>;
method encoder (line 59) | fn encoder(&mut self) -> Self::Encoder {
method decoder (line 63) | fn decoder(&mut self) -> Self::Decoder {
type ProtoEncoder (line 70) | pub struct ProtoEncoder<T> {
function new (line 76) | pub fn new() -> Self {
type Item (line 82) | type Item = T;
type Error (line 83) | type Error = Status;
method encode (line 85) | fn encode(&mut self, item: Self::Item, buf: &mut EncodeBuf<'_>) -> Resul...
type ProtoDecoder (line 98) | pub struct ProtoDecoder<U> {
function new (line 104) | pub fn new() -> Self {
type Item (line 110) | type Item = U;
type Error (line 111) | type Error = Status;
method decode (line 113) | fn decode(&mut self, buf: &mut DecodeBuf<'_>) -> Result<Option<Self::Ite...
function from_decode_error (line 121) | fn from_decode_error(error: impl std::error::Error) -> tonic::Status {
FILE: tonic-reflection/src/generated/grpc_reflection_v1.rs
type ServerReflectionRequest (line 4) | pub struct ServerReflectionRequest {
type MessageRequest (line 21) | pub enum MessageRequest {
type ExtensionRequest (line 53) | pub struct ExtensionRequest {
type ServerReflectionResponse (line 62) | pub struct ServerReflectionResponse {
type MessageResponse (line 79) | pub enum MessageResponse {
type FileDescriptorResponse (line 103) | pub struct FileDescriptorResponse {
type ExtensionNumberResponse (line 113) | pub struct ExtensionNumberResponse {
type ListServiceResponse (line 123) | pub struct ListServiceResponse {
type ServiceResponse (line 132) | pub struct ServiceResponse {
type ErrorResponse (line 140) | pub struct ErrorResponse {
type ServerReflectionClient (line 159) | pub struct ServerReflectionClient<T> {
function new (line 169) | pub fn new(inner: T) -> Self {
function with_origin (line 173) | pub fn with_origin(inner: T, origin: Uri) -> Self {
function with_interceptor (line 177) | pub fn with_interceptor<F>(
function send_compressed (line 201) | pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
function accept_compressed (line 207) | pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
function max_decoding_message_size (line 215) | pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
function max_encoding_message_size (line 223) | pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
function server_reflection_info (line 229) | pub async fn server_reflection_info(
type ServerReflection (line 274) | pub trait ServerReflection: std::marker::Send + std::marker::Sync + 'sta...
method server_reflection_info (line 286) | async fn server_reflection_info(
type ServerReflectionServer (line 295) | pub struct ServerReflectionServer<T> {
function new (line 303) | pub fn new(inner: T) -> Self {
function from_arc (line 306) | pub fn from_arc(inner: Arc<T>) -> Self {
function with_interceptor (line 315) | pub fn with_interceptor<F>(
function accept_compressed (line 326) | pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
function send_compressed (line 332) | pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
function max_decoding_message_size (line 340) | pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
function max_encoding_message_size (line 348) | pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
type Response (line 359) | type Response = http::Response<tonic::body::Body>;
type Error (line 360) | type Error = std::convert::Infallible;
type Future (line 361) | type Future = BoxFuture<Self::Response, Self::Error>;
function poll_ready (line 362) | fn poll_ready(
function call (line 368) | fn call(&mut self, req: http::Request<B>) -> Self::Future {
method clone (line 445) | fn clone(&self) -> Self {
constant SERVICE_NAME (line 457) | pub const SERVICE_NAME: &str = "grpc.reflection.v1.ServerReflection";
constant NAME (line 459) | const NAME: &'static str = SERVICE_NAME;
FILE: tonic-reflection/src/generated/grpc_reflection_v1alpha.rs
type ServerReflectionRequest (line 4) | pub struct ServerReflectionRequest {
type MessageRequest (line 21) | pub enum MessageRequest {
type ExtensionRequest (line 53) | pub struct ExtensionRequest {
type ServerReflectionResponse (line 62) | pub struct ServerReflectionResponse {
type MessageResponse (line 79) | pub enum MessageResponse {
type FileDescriptorResponse (line 103) | pub struct FileDescriptorResponse {
type ExtensionNumberResponse (line 113) | pub struct ExtensionNumberResponse {
type ListServiceResponse (line 123) | pub struct ListServiceResponse {
type ServiceResponse (line 132) | pub struct ServiceResponse {
type ErrorResponse (line 140) | pub struct ErrorResponse {
type ServerReflectionClient (line 159) | pub struct ServerReflectionClient<T> {
function new (line 169) | pub fn new(inner: T) -> Self {
function with_origin (line 173) | pub fn with_origin(inner: T, origin: Uri) -> Self {
function with_interceptor (line 177) | pub fn with_interceptor<F>(
function send_compressed (line 201) | pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
function accept_compressed (line 207) | pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
function max_decoding_message_size (line 215) | pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
function max_encoding_message_size (line 223) | pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
function server_reflection_info (line 229) | pub async fn server_reflection_info(
type ServerReflection (line 274) | pub trait ServerReflection: std::marker::Send + std::marker::Sync + 'sta...
method server_reflection_info (line 286) | async fn server_reflection_info(
type ServerReflectionServer (line 295) | pub struct ServerReflectionServer<T> {
function new (line 303) | pub fn new(inner: T) -> Self {
function from_arc (line 306) | pub fn from_arc(inner: Arc<T>) -> Self {
function with_interceptor (line 315) | pub fn with_interceptor<F>(
function accept_compressed (line 326) | pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
function send_compressed (line 332) | pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
function max_decoding_message_size (line 340) | pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
function max_encoding_message_size (line 348) | pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
type Response (line 359) | type Response = http::Response<tonic::body::Body>;
type Error (line 360) | type Error = std::convert::Infallible;
type Future (line 361) | type Future = BoxFuture<Self::Response, Self::Error>;
function poll_ready (line 362) | fn poll_ready(
function call (line 368) | fn call(&mut self, req: http::Request<B>) -> Self::Future {
method clone (line 445) | fn clone(&self) -> Self {
constant SERVICE_NAME (line 457) | pub const SERVICE_NAME: &str = "grpc.reflection.v1alpha.ServerReflection";
constant NAME (line 459) | const NAME: &'static str = SERVICE_NAME;
FILE: tonic-reflection/src/generated/reflection_v1_fds.rs
constant FILE_DESCRIPTOR_SET (line 23) | pub const FILE_DESCRIPTOR_SET: &[u8] = &[
FILE: tonic-reflection/src/generated/reflection_v1alpha1_fds.rs
constant FILE_DESCRIPTOR_SET (line 18) | pub const FILE_DESCRIPTOR_SET: &[u8] = &[
FILE: tonic-reflection/src/lib.rs
function v1alpha_file_descriptor_set_is_valid (line 36) | fn v1alpha_file_descriptor_set_is_valid() {
function v1_file_descriptor_set_is_valid (line 41) | fn v1_file_descriptor_set_is_valid() {
FILE: tonic-reflection/src/server/mod.rs
type Builder (line 19) | pub struct Builder<'b> {
function configure (line 30) | pub fn configure() -> Self {
function register_file_descriptor_set (line 43) | pub fn register_file_descriptor_set(mut self, file_descriptor_set: FileD...
function register_encoded_file_descriptor_set (line 50) | pub fn register_encoded_file_descriptor_set(
function include_reflection_service (line 61) | pub fn include_reflection_service(mut self, include: bool) -> Self {
function with_service_name (line 70) | pub fn with_service_name(mut self, name: impl Into<String>) -> Self {
function build_v1 (line 77) | pub fn build_v1(
function build_v1alpha (line 95) | pub fn build_v1alpha(
type ReflectionServiceState (line 115) | struct ReflectionServiceState {
method new (line 122) | fn new(
method process_file (line 160) | fn process_file(
method process_message (line 191) | fn process_message(
method process_enum (line 220) | fn process_enum(
method process_field (line 237) | fn process_field(
method list_services (line 248) | fn list_services(&self) -> &[String] {
method symbol_by_name (line 252) | fn symbol_by_name(&self, symbol: &str) -> Result<Vec<u8>, Status> {
method file_by_filename (line 266) | fn file_by_filename(&self, filename: &str) -> Result<Vec<u8>, Status> {
function extract_name (line 281) | fn extract_name(
type Error (line 302) | pub enum Error {
method from (line 310) | fn from(e: DecodeError) -> Self {
method fmt (line 318) | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
FILE: tonic-reflection/src/server/v1.rs
type ReflectionService (line 18) | pub struct ReflectionService {
method from (line 100) | fn from(state: ReflectionServiceState) -> Self {
type ServerReflectionInfoStream (line 24) | type ServerReflectionInfoStream = ServerReflectionInfoStream;
method server_reflection_info (line 26) | async fn server_reflection_info(
type ServerReflectionInfoStream (line 108) | pub struct ServerReflectionInfoStream {
method new (line 113) | fn new(resp_rx: mpsc::Receiver<Result<ServerReflectionResponse, Status...
method fmt (line 135) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type Item (line 120) | type Item = Result<ServerReflectionResponse, Status>;
method poll_next (line 122) | fn poll_next(
method size_hint (line 129) | fn size_hint(&self) -> (usize, Option<usize>) {
FILE: tonic-reflection/src/server/v1alpha.rs
type ReflectionService (line 18) | pub struct ReflectionService {
method from (line 100) | fn from(state: ReflectionServiceState) -> Self {
type ServerReflectionInfoStream (line 24) | type ServerReflectionInfoStream = ServerReflectionInfoStream;
method server_reflection_info (line 26) | async fn server_reflection_info(
type ServerReflectionInfoStream (line 108) | pub struct ServerReflectionInfoStream {
method new (line 113) | fn new(resp_rx: mpsc::Receiver<Result<ServerReflectionResponse, Status...
method fmt (line 135) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type Item (line 120) | type Item = Result<ServerReflectionResponse, Status>;
method poll_next (line 122) | fn poll_next(
method size_hint (line 129) | fn size_hint(&self) -> (usize, Option<usize>) {
FILE: tonic-reflection/tests/server.rs
function get_encoded_reflection_service_fd (line 17) | pub(crate) fn get_encoded_reflection_service_fd() -> Vec<u8> {
function test_list_services (line 28) | async fn test_list_services() {
function test_file_by_filename (line 48) | async fn test_file_by_filename() {
function test_file_containing_symbol (line 72) | async fn test_file_containing_symbol() {
function make_test_reflection_request (line 95) | async fn make_test_reflection_request(request: ServerReflectionRequest) ...
FILE: tonic-reflection/tests/versions.rs
function test_v1 (line 13) | async fn test_v1() {
function test_v1alpha (line 37) | async fn test_v1alpha() {
function make_v1_request (line 60) | async fn make_v1_request(
function make_v1alpha_request (line 117) | async fn make_v1alpha_request(
FILE: tonic-types/src/generated/google_rpc.rs
type Status (line 10) | pub struct Status {
type ErrorInfo (line 53) | pub struct ErrorInfo {
type RetryInfo (line 98) | pub struct RetryInfo {
type DebugInfo (line 105) | pub struct DebugInfo {
type QuotaFailure (line 125) | pub struct QuotaFailure {
type Violation (line 135) | pub struct Violation {
type PreconditionFailure (line 226) | pub struct PreconditionFailure {
type Violation (line 235) | pub struct Violation {
type BadRequest (line 257) | pub struct BadRequest {
type FieldViolation (line 266) | pub struct FieldViolation {
type RequestInfo (line 328) | pub struct RequestInfo {
type ResourceInfo (line 340) | pub struct ResourceInfo {
type Help (line 369) | pub struct Help {
type Link (line 378) | pub struct Link {
type LocalizedMessage (line 390) | pub struct LocalizedMessage {
FILE: tonic-types/src/generated/types_fds.rs
constant FILE_DESCRIPTOR_SET (line 30) | pub const FILE_DESCRIPTOR_SET: &[u8] = &[
FILE: tonic-types/src/lib.rs
function file_descriptor_set_is_valid (line 164) | fn file_descriptor_set_is_valid() {
type Sealed (line 186) | pub trait Sealed {}
FILE: tonic-types/src/richer_error/error_details/mod.rs
type ErrorDetails (line 17) | pub struct ErrorDetails {
method new (line 59) | pub fn new() -> Self {
method with_retry_info (line 74) | pub fn with_retry_info(retry_delay: Option<time::Duration>) -> Self {
method with_debug_info (line 93) | pub fn with_debug_info(
method with_quota_failure (line 116) | pub fn with_quota_failure(violations: impl Into<Vec<QuotaViolation>>) ...
method with_quota_failure_violation (line 133) | pub fn with_quota_failure_violation(
method with_error_info (line 157) | pub fn with_error_info(
method with_precondition_failure (line 189) | pub fn with_precondition_failure(violations: impl Into<Vec<Preconditio...
method with_precondition_failure_violation (line 211) | pub fn with_precondition_failure_violation(
method with_bad_request (line 239) | pub fn with_bad_request(field_violations: impl Into<Vec<FieldViolation...
method with_bad_request_violation (line 259) | pub fn with_bad_request_violation(
method with_request_info (line 282) | pub fn with_request_info(
method with_resource_info (line 307) | pub fn with_resource_info(
method with_help (line 337) | pub fn with_help(links: impl Into<Vec<HelpLink>>) -> Self {
method with_help_link (line 357) | pub fn with_help_link(description: impl Into<String>, url: impl Into<S...
method with_localized_message (line 377) | pub fn with_localized_message(locale: impl Into<String>, message: impl...
method retry_info (line 385) | pub fn retry_info(&self) -> Option<&RetryInfo> {
method debug_info (line 390) | pub fn debug_info(&self) -> Option<&DebugInfo> {
method quota_failure (line 395) | pub fn quota_failure(&self) -> Option<&QuotaFailure> {
method error_info (line 400) | pub fn error_info(&self) -> Option<&ErrorInfo> {
method precondition_failure (line 405) | pub fn precondition_failure(&self) -> Option<&PreconditionFailure> {
method bad_request (line 410) | pub fn bad_request(&self) -> Option<&BadRequest> {
method request_info (line 415) | pub fn request_info(&self) -> Option<&RequestInfo> {
method resource_info (line 420) | pub fn resource_info(&self) -> Option<&ResourceInfo> {
method help (line 425) | pub fn help(&self) -> Option<&Help> {
method localized_message (line 430) | pub fn localized_message(&self) -> Option<&LocalizedMessage> {
method set_retry_info (line 447) | pub fn set_retry_info(&mut self, retry_delay: Option<time::Duration>) ...
method set_debug_info (line 466) | pub fn set_debug_info(
method set_quota_failure (line 490) | pub fn set_quota_failure(&mut self, violations: impl Into<Vec<QuotaVio...
method add_quota_failure_violation (line 508) | pub fn add_quota_failure_violation(
method has_quota_failure_violations (line 540) | pub fn has_quota_failure_violations(&self) -> bool {
method set_error_info (line 563) | pub fn set_error_info(
method set_precondition_failure (line 596) | pub fn set_precondition_failure(
method add_precondition_failure_violation (line 621) | pub fn add_precondition_failure_violation(
method has_precondition_failure_violations (line 662) | pub fn has_precondition_failure_violations(&self) -> bool {
method set_bad_request (line 684) | pub fn set_bad_request(&mut self, violations: impl Into<Vec<FieldViola...
method add_bad_request_violation (line 702) | pub fn add_bad_request_violation(
method has_bad_request_violations (line 734) | pub fn has_bad_request_violations(&self) -> bool {
Condensed preview — 479 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,824K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 937,
"preview": "---\nname: 🐛 Bug Report\nabout: If something isn't working as expected 🤔.\n\n---\n\n## Bug Report\n<!--\nThank you for reporting"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 653,
"preview": "---\nname: 💡 Feature Request\nabout: I have a suggestion (and may want to implement it 🙂)!\n\n---\n\n## Feature Request\n\n### C"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 726,
"preview": "<!--\nThank you for your Pull Request. Please provide a description above and review\nthe requirements below.\n\nIf this cha"
},
{
"path": ".github/workflows/CI.yml",
"chars": 16990,
"preview": "name: CI\n\non:\n push:\n pull_request: {}\n merge_group:\n branches: [ \"master\" ]\n\nconcurrency:\n group: ${{ github.wor"
},
{
"path": ".gitignore",
"chars": 35,
"preview": "target/\n**/*.rs.bk\nCargo.lock\ntags\n"
},
{
"path": "CHANGELOG.md",
"chars": 61546,
"preview": "# NOTE: ths changelog is no longer used and from version `v0.13.0` onward we will be using github releases and the chang"
},
{
"path": "CONTRIBUTING.md",
"chars": 17928,
"preview": "# Contributing to Tonic\n\n:balloon: Thanks for your help improving the project! We are so happy to have\nyou!\n\nThere are o"
},
{
"path": "Cargo.toml",
"chars": 889,
"preview": "[workspace]\nmembers = [\n \"tonic\",\n \"tonic-build\",\n \"tonic-health\",\n \"tonic-protobuf\",\n \"tonic-protobuf-build\",\n \"t"
},
{
"path": "LICENSE",
"chars": 1056,
"preview": "Copyright (c) 2025 Lucio Franco\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this so"
},
{
"path": "README.md",
"chars": 4931,
"preview": "\n\n\nA rust implementation "
},
{
"path": "SECURITY.md",
"chars": 370,
"preview": "# Security Policy\n\ntonic (and related projects in hyperium) uses the same security policy as the [Tokio project][tokio-s"
},
{
"path": "codegen/Cargo.toml",
"chars": 353,
"preview": "[package]\nname = \"codegen\"\nauthors = [\"Lucio Franco <luciofranco14@gmail.com>\"]\nlicense = \"MIT\"\nedition = \"2024\"\nrust-ve"
},
{
"path": "codegen/src/main.rs",
"chars": 4959,
"preview": "use std::{\n fs::File,\n io::{BufWriter, Write as _},\n path::{Path, PathBuf},\n time::Instant,\n};\n\nuse protox::"
},
{
"path": "examples/Cargo.toml",
"chars": 7997,
"preview": "[package]\nauthors = [\"Lucio Franco <luciofranco14@gmail.com>\"]\nedition = \"2024\"\nlicense = \"MIT\"\nname = \"examples\"\n\n[[bin"
},
{
"path": "examples/README.md",
"chars": 2829,
"preview": "# Examples\n\nSet of examples that show off the features provided by `tonic`.\n\nIn order to build these examples, you must "
},
{
"path": "examples/build.rs",
"chars": 2652,
"preview": "use std::{env, path::PathBuf};\n\nfn main() {\n tonic_prost_build::configure()\n .compile_protos(&[\"proto/routegui"
},
{
"path": "examples/data/gcp/roots.pem",
"chars": 74996,
"preview": "# Operating CA: Comodo Group\n# Issuer: CN=AAA Certificate Services O=Comodo CA Limited\n# Subject: CN=AAA Certificate Ser"
},
{
"path": "examples/data/route_guide_db.json",
"chars": 16570,
"preview": "[\n {\n \"location\": {\n \"latitude\": 407838351,\n \"longitude\": -746143763\n },\n "
},
{
"path": "examples/data/tls/ca.key",
"chars": 3272,
"preview": "-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC6XFF7KXhQGBXf\n0OAcPt7sg8xlsHlYzW2A9N7FzhS"
},
{
"path": "examples/data/tls/ca.pem",
"chars": 1980,
"preview": "-----BEGIN CERTIFICATE-----\nMIIFijCCA3KgAwIBAgIUao+2CjQxejCTMhfk0SNhJJ9gZK4wDQYJKoZIhvcNAQEL\nBQAwKTEOMAwGA1UECgwFVG9uaWM"
},
{
"path": "examples/data/tls/client1.key",
"chars": 3272,
"preview": "-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC3dUytzpnqjxW6\nDh2Ci0b4fB0iA8D251L0fVLIZE9"
},
{
"path": "examples/data/tls/client1.pem",
"chars": 1887,
"preview": "-----BEGIN CERTIFICATE-----\nMIIFRDCCAyygAwIBAgICA+gwDQYJKoZIhvcNAQELBQAwKTEOMAwGA1UECgwFVG9u\naWMxFzAVBgNVBAMMDnRlc3QtY2x"
},
{
"path": "examples/data/tls/client2.key",
"chars": 3272,
"preview": "-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCS5QyVoX2R4cXC\nUU93PnibomqTYDHwPBTcBUaSQ3C"
},
{
"path": "examples/data/tls/client2.pem",
"chars": 1887,
"preview": "-----BEGIN CERTIFICATE-----\nMIIFRDCCAyygAwIBAgICA+gwDQYJKoZIhvcNAQELBQAwKTEOMAwGA1UECgwFVG9u\naWMxFzAVBgNVBAMMDnRlc3QtY2x"
},
{
"path": "examples/data/tls/client_ca.key",
"chars": 3272,
"preview": "-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC0Yc8MUU0XaWXh\nI5IpE5BD7JYWmhDGZnZY/YdCgkw"
},
{
"path": "examples/data/tls/client_ca.pem",
"chars": 1980,
"preview": "-----BEGIN CERTIFICATE-----\nMIIFijCCA3KgAwIBAgIUP0tYMykcdcDwKamtdfqbDg//4O0wDQYJKoZIhvcNAQEL\nBQAwKTEOMAwGA1UECgwFVG9uaWM"
},
{
"path": "examples/data/tls/create.sh",
"chars": 2372,
"preview": "#!/bin/bash\n\n# Create the server CA certs.\nopenssl req -x509 \\\n -newkey rsa:4096 \\\n -nodes \\\n -days 3650 \\\n -keyout "
},
{
"path": "examples/data/tls/openssl.cnf",
"chars": 1141,
"preview": "[req]\ndistinguished_name = req_distinguished_name\nattributes = req_attributes\n\n[req_distinguished_name]\n\n[req_attributes"
},
{
"path": "examples/data/tls/server.key",
"chars": 3268,
"preview": "-----BEGIN PRIVATE KEY-----\nMIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCckNy1wG9TFgHM\n2LlY2YnuaiqqYAyvNtzOH7Dsbgo"
},
{
"path": "examples/data/tls/server.pem",
"chars": 1976,
"preview": "-----BEGIN CERTIFICATE-----\nMIIFhTCCA22gAwIBAgICA+gwDQYJKoZIhvcNAQELBQAwKTEOMAwGA1UECgwFVG9u\naWMxFzAVBgNVBAMMDnRlc3Qtc2V"
},
{
"path": "examples/data/tls/server2.key",
"chars": 3272,
"preview": "-----BEGIN PRIVATE KEY-----\nMIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDDX6SRgoa4jTxv\njbsx8+EXOXe0J5gdbdp1nsDH6tq"
},
{
"path": "examples/data/tls/server2.pem",
"chars": 1883,
"preview": "-----BEGIN CERTIFICATE-----\nMIIFQjCCAyqgAwIBAgICA+gwDQYJKoZIhvcNAQELBQAwKTEOMAwGA1UECgwFVG9u\naWMxFzAVBgNVBAMMDnRlc3Qtc2V"
},
{
"path": "examples/helloworld-tutorial.md",
"chars": 11000,
"preview": "# Getting Started\n\nThis tutorial is meant to be an introduction to Tonic and assumes that you have basic [Rust] experien"
},
{
"path": "examples/proto/attrs/attrs.proto",
"chars": 344,
"preview": "syntax = \"proto3\";\n\npackage attrs;\n\n// EchoRequest is the request for echo.\nmessage EchoRequest {\n string message = 1;\n"
},
{
"path": "examples/proto/echo/echo.proto",
"chars": 1365,
"preview": "/*\n *\n * Copyright 2018 gRPC authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "examples/proto/googleapis/google/api/annotations.proto",
"chars": 1051,
"preview": "// Copyright (c) 2015, Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not "
},
{
"path": "examples/proto/googleapis/google/api/client.proto",
"chars": 3392,
"preview": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use th"
},
{
"path": "examples/proto/googleapis/google/api/field_behavior.proto",
"chars": 3318,
"preview": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use th"
},
{
"path": "examples/proto/googleapis/google/api/http.proto",
"chars": 15140,
"preview": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use th"
},
{
"path": "examples/proto/googleapis/google/api/resource.proto",
"chars": 11347,
"preview": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use th"
},
{
"path": "examples/proto/googleapis/google/pubsub/v1/pubsub.proto",
"chars": 56473,
"preview": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use th"
},
{
"path": "examples/proto/googleapis/google/pubsub/v1/schema.proto",
"chars": 8861,
"preview": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use th"
},
{
"path": "examples/proto/helloworld/helloworld.proto",
"chars": 1093,
"preview": "// Copyright 2015 gRPC authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
},
{
"path": "examples/proto/routeguide/route_guide.proto",
"chars": 3455,
"preview": "// Copyright 2015 gRPC authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
},
{
"path": "examples/proto/unaryecho/echo.proto",
"chars": 981,
"preview": "/*\n *\n * Copyright 2018 gRPC authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "examples/routeguide-tutorial.md",
"chars": 27001,
"preview": "# gRPC Basics: Tonic\n\nThis tutorial, adapted from [grpc-go], provides a basic introduction to working with gRPC\nand Toni"
},
{
"path": "examples/src/authentication/client.rs",
"chars": 794,
"preview": "pub mod pb {\n tonic::include_proto!(\"grpc.examples.unaryecho\");\n}\n\nuse pb::{EchoRequest, echo_client::EchoClient};\nus"
},
{
"path": "examples/src/authentication/server.rs",
"chars": 1187,
"preview": "pub mod pb {\n tonic::include_proto!(\"grpc.examples.unaryecho\");\n}\n\nuse pb::{EchoRequest, EchoResponse};\nuse tonic::{R"
},
{
"path": "examples/src/autoreload/server.rs",
"chars": 1429,
"preview": "use tonic::{Request, Response, Status, transport::Server};\n\nuse hello_world::greeter_server::{Greeter, GreeterServer};\nu"
},
{
"path": "examples/src/blocking/client.rs",
"chars": 1569,
"preview": "use tokio::runtime::{Builder, Runtime};\n\npub mod hello_world {\n tonic::include_proto!(\"helloworld\");\n}\n\nuse hello_wor"
},
{
"path": "examples/src/blocking/server.rs",
"chars": 1104,
"preview": "use tonic::{Request, Response, Status, transport::Server};\n\nuse hello_world::greeter_server::{Greeter, GreeterServer};\nu"
},
{
"path": "examples/src/cancellation/client.rs",
"chars": 800,
"preview": "use hello_world::HelloRequest;\nuse hello_world::greeter_client::GreeterClient;\n\nuse tokio::time::{Duration, timeout};\n\np"
},
{
"path": "examples/src/cancellation/server.rs",
"chars": 2784,
"preview": "use std::future::Future;\n\nuse tokio_util::sync::CancellationToken;\nuse tonic::{Request, Response, Status, transport::Ser"
},
{
"path": "examples/src/codec_buffers/client.rs",
"chars": 965,
"preview": "//! A HelloWorld example that uses a custom codec instead of the default Prost codec.\n//!\n//! Generated code is the outp"
},
{
"path": "examples/src/codec_buffers/common.rs",
"chars": 1448,
"preview": "//! This module defines a common encoder with small buffers. This is useful\n//! when you have many concurrent RPC's, and"
},
{
"path": "examples/src/codec_buffers/server.rs",
"chars": 1475,
"preview": "//! A HelloWorld example that uses a custom codec instead of the default Prost codec.\n//!\n//! Generated code is the outp"
},
{
"path": "examples/src/compression/client.rs",
"chars": 756,
"preview": "use hello_world::HelloRequest;\nuse hello_world::greeter_client::GreeterClient;\nuse tonic::codec::CompressionEncoding;\nus"
},
{
"path": "examples/src/compression/server.rs",
"chars": 1176,
"preview": "use tonic::{Request, Response, Status, transport::Server};\n\nuse hello_world::greeter_server::{Greeter, GreeterServer};\nu"
},
{
"path": "examples/src/dynamic/server.rs",
"chars": 2405,
"preview": "use std::env;\nuse tonic::{Request, Response, Status, service::RoutesBuilder, transport::Server};\n\nuse hello_world::greet"
},
{
"path": "examples/src/dynamic_load_balance/client.rs",
"chars": 2732,
"preview": "pub mod pb {\n tonic::include_proto!(\"grpc.examples.unaryecho\");\n}\n\nuse pb::{EchoRequest, echo_client::EchoClient};\nus"
},
{
"path": "examples/src/dynamic_load_balance/server.rs",
"chars": 1303,
"preview": "pub mod pb {\n tonic::include_proto!(\"grpc.examples.unaryecho\");\n}\n\nuse std::net::SocketAddr;\nuse tokio::sync::mpsc;\nu"
},
{
"path": "examples/src/gcp/README.md",
"chars": 915,
"preview": "# Google Cloud Pubsub example\n\nThis example will attempt to fetch a list of topics using the google\ngRPC protobuf specif"
},
{
"path": "examples/src/gcp/client.rs",
"chars": 1715,
"preview": "pub mod api {\n tonic::include_proto!(\"google.pubsub.v1\");\n}\n\nuse api::{ListTopicsRequest, publisher_client::Publisher"
},
{
"path": "examples/src/grpc-web/client.rs",
"chars": 811,
"preview": "use hello_world::{HelloRequest, greeter_client::GreeterClient};\nuse hyper_util::rt::TokioExecutor;\nuse tonic_web::GrpcWe"
},
{
"path": "examples/src/grpc-web/server.rs",
"chars": 1377,
"preview": "use tonic::{Request, Response, Status, service::LayerExt as _, transport::Server};\n\nuse hello_world::greeter_server::{Gr"
},
{
"path": "examples/src/h2c/client.rs",
"chars": 2687,
"preview": "use hello_world::HelloRequest;\nuse hello_world::greeter_client::GreeterClient;\nuse http::Uri;\nuse hyper_util::client::le"
},
{
"path": "examples/src/h2c/server.rs",
"chars": 3932,
"preview": "use std::net::SocketAddr;\n\nuse hyper_util::rt::{TokioExecutor, TokioIo};\nuse hyper_util::server::conn::auto::Builder;\nus"
},
{
"path": "examples/src/health/README.md",
"chars": 742,
"preview": "# Health checks\n\ngRPC has a [health checking protocol](https://github.com/grpc/grpc/blob/master/doc/health-checking.md) "
},
{
"path": "examples/src/health/server.rs",
"chars": 1950,
"preview": "use tonic::{Request, Response, Status, transport::Server};\n\nuse hello_world::greeter_server::{Greeter, GreeterServer};\nu"
},
{
"path": "examples/src/helloworld/client.rs",
"chars": 495,
"preview": "use hello_world::HelloRequest;\nuse hello_world::greeter_client::GreeterClient;\n\npub mod hello_world {\n tonic::include"
},
{
"path": "examples/src/helloworld/server.rs",
"chars": 1030,
"preview": "use tonic::{Request, Response, Status, transport::Server};\n\nuse hello_world::greeter_server::{Greeter, GreeterServer};\nu"
},
{
"path": "examples/src/interceptor/client.rs",
"chars": 2257,
"preview": "use hello_world::HelloRequest;\nuse hello_world::greeter_client::GreeterClient;\nuse tonic::{\n Request, Status,\n cod"
},
{
"path": "examples/src/interceptor/server.rs",
"chars": 1822,
"preview": "use tonic::{Request, Response, Status, transport::Server};\n\nuse hello_world::greeter_server::{Greeter, GreeterServer};\nu"
},
{
"path": "examples/src/json-codec/client.rs",
"chars": 923,
"preview": "//! A HelloWorld example that uses JSON instead of protobuf as the message serialization format.\n//!\n//! Generated code "
},
{
"path": "examples/src/json-codec/common.rs",
"chars": 2185,
"preview": "//! This module defines common request/response types as well as the JsonCodec that is used by the\n//! json.helloworld.G"
},
{
"path": "examples/src/json-codec/server.rs",
"chars": 1454,
"preview": "//! A HelloWorld example that uses JSON instead of protobuf as the message serialization format.\n//!\n//! Generated code "
},
{
"path": "examples/src/load_balance/client.rs",
"chars": 705,
"preview": "pub mod pb {\n tonic::include_proto!(\"grpc.examples.unaryecho\");\n}\n\nuse pb::{EchoRequest, echo_client::EchoClient};\nus"
},
{
"path": "examples/src/load_balance/server.rs",
"chars": 1303,
"preview": "pub mod pb {\n tonic::include_proto!(\"grpc.examples.unaryecho\");\n}\n\nuse std::net::SocketAddr;\nuse tokio::sync::mpsc;\nu"
},
{
"path": "examples/src/mock/mock.rs",
"chars": 2029,
"preview": "use hyper_util::rt::TokioIo;\nuse tonic::{\n Request, Response, Status,\n transport::{Endpoint, Server, Uri},\n};\nuse "
},
{
"path": "examples/src/multiplex/client.rs",
"chars": 992,
"preview": "pub mod hello_world {\n tonic::include_proto!(\"helloworld\");\n}\n\npub mod echo {\n tonic::include_proto!(\"grpc.example"
},
{
"path": "examples/src/multiplex/server.rs",
"chars": 1466,
"preview": "use tonic::{Request, Response, Status, transport::Server};\n\npub mod hello_world {\n tonic::include_proto!(\"helloworld\""
},
{
"path": "examples/src/reflection/server.rs",
"chars": 1258,
"preview": "use tonic::transport::Server;\nuse tonic::{Request, Response, Status};\n\nmod proto {\n tonic::include_proto!(\"helloworld"
},
{
"path": "examples/src/richer-error/client.rs",
"chars": 1508,
"preview": "use tonic_types::StatusExt;\n\nuse hello_world::HelloRequest;\nuse hello_world::greeter_client::GreeterClient;\n\npub mod hel"
},
{
"path": "examples/src/richer-error/client_vec.rs",
"chars": 1793,
"preview": "use tonic_types::{ErrorDetail, StatusExt};\n\nuse hello_world::HelloRequest;\nuse hello_world::greeter_client::GreeterClien"
},
{
"path": "examples/src/richer-error/server.rs",
"chars": 2081,
"preview": "use tonic::{Code, Request, Response, Status, transport::Server};\nuse tonic_types::{ErrorDetails, StatusExt};\n\nuse hello_"
},
{
"path": "examples/src/richer-error/server_vec.rs",
"chars": 2122,
"preview": "use tonic::{Code, Request, Response, Status, transport::Server};\nuse tonic_types::{BadRequest, Help, LocalizedMessage, S"
},
{
"path": "examples/src/routeguide/client.rs",
"chars": 3343,
"preview": "use std::error::Error;\nuse std::time::Duration;\n\nuse rand::Rng;\nuse rand::rngs::ThreadRng;\nuse tokio::time;\nuse tonic::R"
},
{
"path": "examples/src/routeguide/data.rs",
"chars": 932,
"preview": "use serde::Deserialize;\nuse std::fs::File;\n\n#[derive(Debug, Deserialize)]\nstruct Feature {\n location: Location,\n n"
},
{
"path": "examples/src/routeguide/server.rs",
"chars": 5611,
"preview": "use std::collections::HashMap;\nuse std::pin::Pin;\nuse std::sync::Arc;\nuse std::time::Instant;\n\nuse tokio::sync::mpsc;\nus"
},
{
"path": "examples/src/streaming/client.rs",
"chars": 2797,
"preview": "pub mod pb {\n tonic::include_proto!(\"grpc.examples.echo\");\n}\n\nuse std::time::Duration;\nuse tokio_stream::{Stream, Str"
},
{
"path": "examples/src/streaming/server.rs",
"chars": 5343,
"preview": "pub mod pb {\n tonic::include_proto!(\"grpc.examples.echo\");\n}\n\nuse std::{error::Error, io::ErrorKind, net::ToSocketAdd"
},
{
"path": "examples/src/tls/client.rs",
"chars": 939,
"preview": "pub mod pb {\n tonic::include_proto!(\"/grpc.examples.unaryecho\");\n}\n\nuse pb::{EchoRequest, echo_client::EchoClient};\nu"
},
{
"path": "examples/src/tls/server.rs",
"chars": 1571,
"preview": "pub mod pb {\n tonic::include_proto!(\"/grpc.examples.unaryecho\");\n}\n\nuse pb::{EchoRequest, EchoResponse};\nuse tonic::{"
},
{
"path": "examples/src/tls_client_auth/client.rs",
"chars": 1282,
"preview": "pub mod pb {\n tonic::include_proto!(\"grpc.examples.unaryecho\");\n}\n\nuse pb::{EchoRequest, echo_client::EchoClient};\nus"
},
{
"path": "examples/src/tls_client_auth/server.rs",
"chars": 1641,
"preview": "pub mod pb {\n tonic::include_proto!(\"grpc.examples.unaryecho\");\n}\n\nuse pb::{EchoRequest, EchoResponse};\nuse tonic::tr"
},
{
"path": "examples/src/tls_rustls/client.rs",
"chars": 2533,
"preview": "//! This examples shows how you can combine `hyper-rustls` and `tonic` to\n//! provide a custom `ClientConfig` for the tl"
},
{
"path": "examples/src/tls_rustls/server.rs",
"chars": 3580,
"preview": "pub mod pb {\n tonic::include_proto!(\"/grpc.examples.unaryecho\");\n}\n\nuse hyper::server::conn::http2::Builder;\nuse hype"
},
{
"path": "examples/src/tower/client.rs",
"chars": 2351,
"preview": "use hello_world::HelloRequest;\nuse hello_world::greeter_client::GreeterClient;\nuse service::AuthSvc;\nuse tower::ServiceB"
},
{
"path": "examples/src/tower/server.rs",
"chars": 3016,
"preview": "use std::{\n pin::Pin,\n task::{Context, Poll},\n};\nuse tonic::{Request, Response, Status, transport::Server};\nuse to"
},
{
"path": "examples/src/tracing/client.rs",
"chars": 890,
"preview": "pub mod hello_world {\n tonic::include_proto!(\"helloworld\");\n}\n\nuse hello_world::{HelloRequest, greeter_client::Greete"
},
{
"path": "examples/src/tracing/server.rs",
"chars": 1246,
"preview": "use tonic::{Request, Response, Status, transport::Server};\n\npub mod hello_world {\n tonic::include_proto!(\"helloworld\""
},
{
"path": "examples/src/uds/client_standard.rs",
"chars": 930,
"preview": "#![cfg_attr(not(unix), allow(unused_imports))]\n\npub mod hello_world {\n tonic::include_proto!(\"helloworld\");\n}\n\nuse he"
},
{
"path": "examples/src/uds/client_with_connector.rs",
"chars": 1231,
"preview": "#![cfg_attr(not(unix), allow(unused_imports))]\n\npub mod hello_world {\n tonic::include_proto!(\"helloworld\");\n}\n\nuse he"
},
{
"path": "examples/src/uds/server.rs",
"chars": 1615,
"preview": "#![cfg_attr(not(unix), allow(unused_imports))]\n\nuse std::path::Path;\n#[cfg(unix)]\nuse tokio::net::UnixListener;\n#[cfg(un"
},
{
"path": "flake.nix",
"chars": 4214,
"preview": "{\n description = \"Description for the project\";\n\n inputs = {\n flake-parts.url = \"github:hercules-ci/flake-parts\";\n "
},
{
"path": "grpc/Cargo.toml",
"chars": 2788,
"preview": "[package]\nname = \"grpc\"\nversion = \"0.9.0-alpha.1\"\nedition = \"2024\"\nauthors = [\"gRPC Authors\"]\nlicense = \"MIT\"\nrust-versi"
},
{
"path": "grpc/examples/inmemory.rs",
"chars": 6854,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/proto/echo/echo.proto",
"chars": 1344,
"preview": "/*\n *\n * Copyright 2018 gRPC authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "grpc/src/attributes/linked_list.rs",
"chars": 5763,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/attributes/mod.rs",
"chars": 7533,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/byte_str.rs",
"chars": 1906,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/channel.rs",
"chars": 22870,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/interceptor.rs",
"chars": 31145,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/load_balancing/child_manager.rs",
"chars": 37392,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/load_balancing/graceful_switch.rs",
"chars": 39893,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/load_balancing/mod.rs",
"chars": 20498,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/load_balancing/pick_first.rs",
"chars": 4969,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/load_balancing/registry.rs",
"chars": 2401,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/load_balancing/round_robin.rs",
"chars": 53051,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/load_balancing/test_utils.rs",
"chars": 9385,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/mod.rs",
"chars": 8765,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/name_resolution/backoff.rs",
"chars": 8457,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/name_resolution/dns/mod.rs",
"chars": 14645,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/name_resolution/dns/test.rs",
"chars": 18862,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/name_resolution/mod.rs",
"chars": 15260,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/name_resolution/registry.rs",
"chars": 3540,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/service_config.rs",
"chars": 2164,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/stream_util.rs",
"chars": 16615,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/subchannel.rs",
"chars": 16117,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/transport/mod.rs",
"chars": 3452,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/transport/registry.rs",
"chars": 2911,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/transport/tonic/mod.rs",
"chars": 15714,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/client/transport/tonic/test.rs",
"chars": 10504,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/core/mod.rs",
"chars": 8083,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/call.rs",
"chars": 7722,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/client.rs",
"chars": 12067,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/dyn_wrapper.rs",
"chars": 7620,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/insecure.rs",
"chars": 8750,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/local.rs",
"chars": 10315,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/mod.rs",
"chars": 3437,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/rustls/client/mod.rs",
"chars": 9642,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/rustls/client/test.rs",
"chars": 21101,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/rustls/key_log.rs",
"chars": 3430,
"preview": "// Copyright (c) 2016 Joseph Birr-Pixton <jpixton@gmail.com>\n//\n// Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "grpc/src/credentials/rustls/mod.rs",
"chars": 6462,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/rustls/server/mod.rs",
"chars": 13065,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/rustls/server/test.rs",
"chars": 25860,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/rustls/tls_stream.rs",
"chars": 3933,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/credentials/server.rs",
"chars": 3004,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/generated/echo_fds.rs",
"chars": 4210,
"preview": "// This file is @generated by codegen.\n// \n// \n// Copyright 2018 gRPC authors.\n// \n// Licensed under the Apache Licens"
},
{
"path": "grpc/src/generated/grpc_examples_echo.rs",
"chars": 23956,
"preview": "// This file is @generated by prost-build.\n/// EchoRequest is the request for echo.\n#[derive(Clone, PartialEq, Eq, Hash,"
},
{
"path": "grpc/src/inmemory/mod.rs",
"chars": 12173,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/lib.rs",
"chars": 1829,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/macros.rs",
"chars": 5137,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/rt/hyper_wrapper.rs",
"chars": 5667,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/rt/mod.rs",
"chars": 8253,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/rt/tokio/hickory_resolver.rs",
"chars": 8819,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/rt/tokio/mod.rs",
"chars": 9385,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/send_future.rs",
"chars": 3600,
"preview": "/*\n *\n * Copyright 2026 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/server/mod.rs",
"chars": 6519,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/status/server_status.rs",
"chars": 2967,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/status/status_code.rs",
"chars": 2472,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "grpc/src/status.rs",
"chars": 2318,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "interop/Cargo.toml",
"chars": 1132,
"preview": "[package]\nauthors = [\"Lucio Franco <luciofranco14@gmail.com>\"]\nedition = \"2024\"\nlicense = \"MIT\"\nname = \"interop\"\nrust-ve"
},
{
"path": "interop/build.rs",
"chars": 639,
"preview": "fn main() {\n let proto = \"proto/grpc/testing/test.proto\";\n\n eprintln!(\"{}\", tonic_protobuf_build::protoc());\n l"
},
{
"path": "interop/data/README.md",
"chars": 551,
"preview": "# Tonic Testing Certificates\n\nThis directory contains certificates used for testing interop between Tonic's\nimplementati"
},
{
"path": "interop/data/ca.pem",
"chars": 1196,
"preview": "-----BEGIN CERTIFICATE-----\nMIIDRjCCAi6gAwIBAgIQd5pnuFdwgGxb4RiClYEPMTANBgkqhkiG9w0BAQsFADA9\nMQ4wDAYDVQQKEwVUb2tpbzEQMA4"
},
{
"path": "interop/data/cert-generator/.gitignore",
"chars": 39,
"preview": ".terraform/\n*.tfstate\n*.tfstate.backup\n"
},
{
"path": "interop/data/cert-generator/ca.tf",
"chars": 530,
"preview": "resource \"tls_private_key\" \"root\" {\n algorithm = \"RSA\"\n rsa_bits = \"2048\"\n}\n\nresource \"tls_self_signed_cert\" \"root\" {\n"
},
{
"path": "interop/data/cert-generator/server_certs.tf",
"chars": 849,
"preview": "resource \"tls_private_key\" \"server\" {\n algorithm = \"RSA\"\n rsa_bits = \"2048\"\n}\n\nresource \"tls_cert_request\" \"server\" {\n"
},
{
"path": "interop/data/server1.key",
"chars": 1679,
"preview": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA7iJJ8gLlKsp+r15CR15Iz2rmi3f3OZmA8FZ0hpB5hNkQHfVA\nRlC2yawIfHiLO4tpUmjtX8i"
},
{
"path": "interop/data/server1.pem",
"chars": 1204,
"preview": "-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIRAL1ZcIwdi/AfgLm2T41fHO4wDQYJKoZIhvcNAQELBQAw\nPTEOMAwGA1UEChMFVG9raW8xEDA"
},
{
"path": "interop/proto/grpc/testing/empty.proto",
"chars": 956,
"preview": "// Copyright 2015 gRPC authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
},
{
"path": "interop/proto/grpc/testing/messages.proto",
"chars": 5438,
"preview": "// Copyright 2015-2016 gRPC authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
},
{
"path": "interop/proto/grpc/testing/test.proto",
"chars": 3245,
"preview": "// Copyright 2015-2016 gRPC authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
},
{
"path": "interop/src/bin/client.rs",
"chars": 4746,
"preview": "use interop::client::{InteropTest, InteropTestUnimplemented};\nuse interop::{client_prost, client_protobuf};\nuse std::{st"
},
{
"path": "interop/src/bin/server.rs",
"chars": 2793,
"preview": "use interop::{server_prost, server_protobuf};\nuse std::str::FromStr;\nuse tonic::transport::Server;\nuse tonic::transport:"
},
{
"path": "interop/src/client.rs",
"chars": 1037,
"preview": "use crate::TestAssertion;\nuse tonic::async_trait;\n\n#[async_trait]\npub trait InteropTest: Send {\n async fn empty_unary"
},
{
"path": "interop/src/client_prost.rs",
"chars": 14960,
"preview": "use crate::client::{InteropTest, InteropTestUnimplemented};\nuse crate::{\n TestAssertion, pb::test_service_client::*, "
},
{
"path": "interop/src/client_protobuf.rs",
"chars": 15625,
"preview": "/*\n *\n * Copyright 2025 gRPC authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "interop/src/lib.rs",
"chars": 4808,
"preview": "#![recursion_limit = \"256\"]\n\npub mod client;\npub mod client_prost;\npub mod client_protobuf;\npub mod server_prost;\npub mo"
},
{
"path": "interop/src/server_prost.rs",
"chars": 7232,
"preview": "use crate::pb::{self, *};\nuse async_stream::try_stream;\nuse http::header::{HeaderMap, HeaderName};\nuse http_body_util::B"
},
{
"path": "interop/src/server_protobuf.rs",
"chars": 7346,
"preview": "use crate::grpc_pb::{self, *};\nuse async_stream::try_stream;\nuse http::header::{HeaderMap, HeaderName};\nuse http_body_ut"
},
{
"path": "interop/test.sh",
"chars": 3012,
"preview": "#!/usr/bin/env bash\n\nset -eu\nset -o pipefail\n\n# the go client does not support passing an argument with multiple test ca"
},
{
"path": "interop/update_binaries.sh",
"chars": 837,
"preview": "#!/bin/bash\nset -e\n\n# This script updates server and client go binaries for interop tests.\n# It clones grpc-go, compiles"
},
{
"path": "prepare-release.sh",
"chars": 1123,
"preview": "#!/usr/bin/env bash\n\n# Script which automates modifying source version fields, and creating a release\n# commit and tag. "
},
{
"path": "protoc-gen-rust-grpc/.bazelrc",
"chars": 389,
"preview": "# Define a custom config for common Unix-like flags\nbuild:unix --cxxopt=-std=c++17\nbuild:unix --host_cxxopt=-std=c++17\n\n"
},
{
"path": "protoc-gen-rust-grpc/.gitignore",
"chars": 125,
"preview": "# Bazel\nbazel-bin\nbazel-genfiles\nbazel-out\nbazel-protoc-gen-rust-grpc\nbazel-testlogs\nMODULE.bazel.lock\n\nbuild/*\nCMakeFil"
},
{
"path": "protoc-gen-rust-grpc/CMakeLists.txt",
"chars": 3380,
"preview": "cmake_minimum_required(VERSION 3.14)\nproject(protoc-gen-rust-grpc LANGUAGES CXX)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_C"
},
{
"path": "protoc-gen-rust-grpc/README.md",
"chars": 1352,
"preview": "# protoc-gen-rust-grpc\n\nA protoc plugin that generates Rust gRPC service code using the Tonic framework.\n\n## Build\n\nRequ"
},
{
"path": "protoc-gen-rust-grpc/cmake/FetchProtobuf.cmake",
"chars": 2352,
"preview": "# FetchProtobuf.cmake - Helper to download and configure protobuf\n#\n# This file provides a function to download protobuf"
},
{
"path": "protoc-gen-rust-grpc/src/BUILD",
"chars": 1362,
"preview": "# Copyright 2025 gRPC authors.\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of thi"
},
{
"path": "protoc-gen-rust-grpc/src/grpc_rust_generator.cc",
"chars": 35844,
"preview": "// Copyright 2025 gRPC authors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of"
},
{
"path": "protoc-gen-rust-grpc/src/grpc_rust_generator.h",
"chars": 4130,
"preview": "// Copyright 2025 gRPC authors.\n//\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n//"
},
{
"path": "protoc-gen-rust-grpc/src/grpc_rust_plugin.cc",
"chars": 3743,
"preview": "// Copyright 2025 gRPC authors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of"
},
{
"path": "publish-release.sh",
"chars": 510,
"preview": "#!/usr/bin/env bash\n\n# Script which automates publishing a crates.io release of the prost crates.\n\nset -ex\n\nif [ \"$#\" -n"
},
{
"path": "tests/compile/Cargo.toml",
"chars": 306,
"preview": "[package]\nname = \"test-compile\"\nedition = \"2021\"\nlicense = \"MIT\"\n\n[dependencies]\nprost = \"0.14\"\n\n[dev-dependencies]\nstat"
},
{
"path": "tests/compile/build.rs",
"chars": 1044,
"preview": "fn main() {\n tonic_prost_build::compile_protos(\"proto/result.proto\").unwrap();\n tonic_prost_build::compile_protos("
},
{
"path": "tests/compile/proto/ambiguous_methods.proto",
"chars": 459,
"preview": "syntax = \"proto3\";\n\npackage ambiguous_methods;\n\nmessage DropReq {}\nmessage DropResp {}\n\n// The generated stubs can confu"
},
{
"path": "tests/compile/proto/includee.proto",
"chars": 165,
"preview": "syntax = \"proto3\";\n\npackage includee;\n\nservice Included {\n rpc SomeMethod(SomeRequest) returns (SomeResponse) {}\n}\n\nmes"
},
{
"path": "tests/compile/proto/includer.proto",
"chars": 163,
"preview": "syntax = \"proto3\";\n\npackage includer;\n\nmessage TopMessage {}\n\nservice TopService {\n rpc TopMethod(TopMessage) returns ("
}
]
// ... and 279 more files (download for full content)
About this extraction
This page contains the full source code of the hyperium/tonic GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 479 files (49.9 MB), approximately 698.6k tokens, and a symbol index with 4388 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.