Можно ли добавить пользовательский `ChannelInboundHandler` в Micronaut?

Я хотел бы добавить пользовательский ChannelInboundHandler в свой сервис Micronaut, чтобы я мог прослушивать SslHandshakeCompletionEvent, созданный после попытки рукопожатия TLS.

Кажется, я могу добавить ChannelOutboundHandler достаточно просто, аннотировав его с помощью @Singleton, однако, когда я пытаюсь сделать то же самое с ChannelInboundHandler, кажется, что он не добавляется в конвейер.

Как правильно это сделать?

Редактировать

Выглядит многообещающе: https://docs.micronaut.io/snapshot/guide/index.html#nettyPipeline


43
1

Ответ:

Решено

Вы можете создать реализацию BeanCreatedEventListener<ChannelPipelineCustomizer> и предоставить реализацию метода onCreated, например.

    @Override
    public ChannelPipelineCustomizer onCreated(BeanCreatedEvent<ChannelPipelineCustomizer> event) {
        ChannelPipelineCustomizer customizer = event.getBean();

        if (!customizer.isServerChannel()) {
            customizer.doOnConnect(pipeline -> {
                pipeline.addAfter(
                    ChannelPipelineCustomizer.HANDLER_HTTP_CLIENT_CODEC,
                    "my-handler",
                    new MyChannelInboundHandler()
                );
                return pipeline;
            });
        }

        return customizer;
    }

Затем в своем классе MyChannelInboundHandler реализуйте метод userEventTriggered и прослушайте событие SslHandshakeCompletionEvent.SUCCESS. Затем вы можете сделать некоторые утверждения, например. открытый ключ некоторых сертификатов в цепочке, если вы делаете HPKP.