protected async Task <object> ProcessMessageRequestAsync(HttpRequest request, GoogleAdapter GoogleAdapter, BotCallbackHandler botCallbackHandler)
        {
            GoogleRequestBody actionRequest;
            Payload           actionPayload;

            var memoryStream = new MemoryStream();

            request.Body.CopyTo(memoryStream);
            memoryStream.Position = 0;

            var projectId = AuthenticationHelpers.GetProjectIdFromRequest(request);

            GoogleAdapter.ActionProjectId = projectId;

            using (var bodyReader = new StreamReader(memoryStream, Encoding.UTF8))
            {
                var skillRequestContent = bodyReader.ReadToEnd();
                try
                {
                    actionRequest = JsonConvert.DeserializeObject <GoogleRequestBody>(skillRequestContent);
                    actionPayload = actionRequest.OriginalDetectIntentRequest.Payload;
                }
                catch
                {
                    actionPayload = JsonConvert.DeserializeObject <Payload>(skillRequestContent);
                }
            }

            var responseBody = await GoogleAdapter.ProcessActivity(
                actionPayload,
                botCallbackHandler);

            return(responseBody);
        }
        public async Task ProcessAsync(HttpRequest httpRequest, HttpResponse httpResponse, IBot bot, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (httpRequest == null)
            {
                throw new ArgumentNullException(nameof(httpRequest));
            }

            if (httpResponse == null)
            {
                throw new ArgumentNullException(nameof(httpResponse));
            }

            if (bot == null)
            {
                throw new ArgumentNullException(nameof(bot));
            }

            var projectId = AuthenticationHelpers.GetProjectIdFromRequest(httpRequest);

            ActionProjectId = projectId;

            GoogleRequestBody actionRequest;
            Payload           actionPayload;

            var memoryStream = new MemoryStream();

            httpRequest.Body.CopyTo(memoryStream);
            memoryStream.Position = 0;

            using (var bodyReader = new StreamReader(memoryStream, Encoding.UTF8))
            {
                var skillRequestContent = bodyReader.ReadToEnd();
                try
                {
                    actionRequest = JsonConvert.DeserializeObject <GoogleRequestBody>(skillRequestContent);
                    actionPayload = actionRequest.OriginalDetectIntentRequest.Payload;
                }
                catch
                {
                    actionPayload = JsonConvert.DeserializeObject <Payload>(skillRequestContent);
                }
            }

            var uniqueRequestId = _httpContextAccessor.HttpContext.Items["GoogleUniqueRequestId"]?.ToString();

            var googleResponse = await ProcessActivity(
                actionPayload,
                bot.OnTurnAsync,
                uniqueRequestId);

            if (googleResponse == null)
            {
                throw new ArgumentNullException(nameof(googleResponse));
            }

            httpResponse.ContentType = "application/json;charset=utf-8";
            httpResponse.StatusCode  = (int)HttpStatusCode.OK;

            using (var writer = new StreamWriter(httpResponse.Body))
            {
                using (var jsonWriter = new JsonTextWriter(writer))
                {
                    GoogleBotMessageSerializer.Serialize(jsonWriter, googleResponse);
                }
            }
        }