diff options
author | 2016-12-06 10:43:12 -0800 | |
---|---|---|
committer | 2016-12-06 10:43:12 -0800 | |
commit | cc527cf0e4b36ef7d42992ad43ae10f2d2108929 (patch) | |
tree | 5fa8801707573e852d5f980111aaf1266d7dc103 /src/core/ext/transport | |
parent | bc4403ad74c9d8f082a0bbfb0f0b3fbb249e4b0e (diff) |
Provide a way to exit handshaking early without an error.
Diffstat (limited to 'src/core/ext/transport')
-rw-r--r-- | src/core/ext/transport/chttp2/server/chttp2_server.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/core/ext/transport/chttp2/server/chttp2_server.c b/src/core/ext/transport/chttp2/server/chttp2_server.c index 8ee7e29316..9602fa6ab8 100644 --- a/src/core/ext/transport/chttp2/server/chttp2_server.c +++ b/src/core/ext/transport/chttp2/server/chttp2_server.c @@ -153,12 +153,21 @@ static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg, gpr_free(args->read_buffer); } } else { - grpc_transport *transport = - grpc_create_chttp2_transport(exec_ctx, args->args, args->endpoint, 0); - grpc_server_setup_transport( - exec_ctx, connection_state->server_state->server, transport, - connection_state->accepting_pollset, args->args); - grpc_chttp2_transport_start_reading(exec_ctx, transport, args->read_buffer); + if (args->endpoint != NULL) { + grpc_transport *transport = + grpc_create_chttp2_transport(exec_ctx, args->args, args->endpoint, 0); + grpc_server_setup_transport( + exec_ctx, connection_state->server_state->server, transport, + connection_state->accepting_pollset, args->args); + grpc_chttp2_transport_start_reading(exec_ctx, transport, + args->read_buffer); + } else { + // If the handshaking succeeded but there is no endpoint, then the + // handshaker may have handed off the connection to some external + // code, so we can just clean up here without creating a transport. + grpc_slice_buffer_destroy(args->read_buffer); + gpr_free(args->read_buffer); + } grpc_channel_args_destroy(args->args); } pending_handshake_manager_remove_locked(connection_state->server_state, |