static void s_on_accept_channel_setup()

in source/event_stream_rpc_server.c [249:307]


static void s_on_accept_channel_setup(
    struct aws_server_bootstrap *bootstrap,
    int error_code,
    struct aws_channel *channel,
    void *user_data) {
    (void)bootstrap;

    struct aws_event_stream_rpc_server_listener *server = user_data;

    if (!error_code) {
        AWS_LOGF_INFO(
            AWS_LS_EVENT_STREAM_RPC_SERVER,
            "id=%p: incoming connection with channel %p.",
            (void *)server,
            (void *)channel);
        AWS_FATAL_ASSERT(channel && "Channel should never be null with a 0 error code.");

        struct aws_event_stream_rpc_server_connection *connection = s_create_connection_on_channel(server, channel);

        if (!connection) {
            int error = aws_last_error();
            server->on_new_connection(NULL, error, NULL, server->user_data);
            aws_channel_shutdown(channel, error);
        }

        struct aws_event_stream_rpc_connection_options connection_options;
        AWS_ZERO_STRUCT(connection_options);

        aws_event_stream_rpc_server_connection_acquire(connection);
        AWS_LOGF_TRACE(
            AWS_LS_EVENT_STREAM_RPC_SERVER,
            "id=%p: invoking on_new_connection with connection %p.",
            (void *)server,
            (void *)connection);

        if (server->on_new_connection(connection, AWS_ERROR_SUCCESS, &connection_options, server->user_data)) {
            aws_channel_shutdown(channel, aws_last_error());
            aws_event_stream_rpc_server_connection_release(connection);
            return;
        }

        AWS_FATAL_ASSERT(
            connection_options.on_connection_protocol_message && "on_connection_protocol_message must be specified!");
        AWS_FATAL_ASSERT(connection_options.on_incoming_stream && "on_connection_protocol_message must be specified");
        connection->on_incoming_stream = connection_options.on_incoming_stream;
        connection->on_connection_protocol_message = connection_options.on_connection_protocol_message;
        connection->user_data = connection_options.user_data;
        connection->bootstrap_owned = true;
        aws_event_stream_rpc_server_connection_release(connection);

    } else {
        AWS_LOGF_ERROR(
            AWS_LS_EVENT_STREAM_RPC_SERVER,
            "id=%p: invoking on_new_connection with error %s",
            (void *)server,
            aws_error_debug_str(error_code));
        server->on_new_connection(NULL, error_code, NULL, server->user_data);
    }
}