public async Task InvokeAsync(HttpContext context)
        {
            if (!context.Request.Method.Equals("POST", StringComparison.OrdinalIgnoreCase))
            {
                await _next(context);

                return;
            }

            var wallet = await _walletService.GetWalletAsync(_walletOptions.WalletConfiguration,
                                                             _walletOptions.WalletCredentials);

            var endpoint = await _provisioningService.GetProvisioningAsync(wallet);

            if (context.Request.ContentLength != null)
            {
                var body = new byte[(int)context.Request.ContentLength];

                await context.Request.Body.ReadAsync(body, 0, body.Length);

                var decrypted =
                    await _messageSerializer.UnpackAsync <IEnvelopeMessage>(body, wallet, endpoint.Endpoint.Verkey);

                var decoded = JsonConvert.DeserializeObject <IContentMessage>(decrypted.Content);

                switch (decoded)
                {
                case ConnectionRequestMessage request:
                    await _connectionService.ProcessRequestAsync(wallet, request);

                    break;

                case ConnectionResponseMessage response:
                    await _connectionService.ProcessResponseAsync(wallet, response);

                    break;

                case CredentialOfferMessage offer:
                    await _credentialService.ProcessOfferAsync(wallet, offer);

                    break;

                case CredentialRequestMessage request:
                    await _credentialService.ProcessCredentialRequestAsync(wallet, request);

                    break;

                case CredentialMessage credential:
                    var pool = await _poolService.GetPoolAsync(_poolOptions.PoolName, _poolOptions.ProtocolVersion);

                    await _credentialService.ProcessCredentialAsync(pool, wallet, credential);

                    break;

                case ProofMessage _:
                    break;
                }

                context.Response.StatusCode = 200;
                await context.Response.WriteAsync(string.Empty);

                return;
            }

            throw new Exception("Empty content length");
        }