/// <summary>
 /// TODO: Turn request validation back on before going live.
 /// </summary>
 public override bool OnRequestValidation(
     SpeechletRequestValidationResult result,
     DateTime referenceTimeUtc,
     SpeechletRequestEnvelope requestEnvelope)
 {
     return(true);
 }
        /// <summary>
        /// Verifies request timestamp
        /// </summary>
        public static bool VerifyRequestTimestamp(SpeechletRequestEnvelope requestEnvelope, DateTime referenceTimeUtc)
        {
            // verify timestamp is within tolerance
            var diff = referenceTimeUtc - requestEnvelope.Request.Timestamp;

            Debug.WriteLine("Request was timestamped {0:0.00} seconds ago.", diff.TotalSeconds);
            return(Math.Abs((decimal)diff.TotalSeconds) <= Sdk.TIMESTAMP_TOLERANCE_SEC);
        }
Exemple #3
0
        public async Task <SpeechletResponseEnvelope> GetPostRequest(SpeechletRequestEnvelope requestMsg)
        {
            HttpResponseMessage response = await server.CreateRequest("/Alexa")
                                           .And(request => request.Content = new ObjectContent(typeof(SpeechletRequestEnvelope), requestMsg, new JsonMediaTypeFormatter()))
                                           .PostAsync();

            return(await response.Content.ReadAsAsync <SpeechletResponseEnvelope>());
        }
Exemple #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestEnvelope"></param>
        /// <returns></returns>
        public async Task <string> DoProcessRequestAsync(SpeechletRequestEnvelope requestEnvelope)
        {
            Session           session  = requestEnvelope.Session;
            Context           context  = requestEnvelope.Context;
            SpeechletResponse response = null;

            switch (requestEnvelope.Request)
            {
            case LaunchRequest request:
            {
                if (requestEnvelope.Session.IsNew)
                {
                    await OnSessionStartedAsync(requestEnvelope);
                }
                response = await OnLaunchAsync(request, session, context);
            }
            break;

            case AudioPlayerRequest request:
            {
                response = await OnAudioIntentAsync(request, session, context);
            }
            break;

            // process intent request
            case IntentRequest request:
            {
                // Do session management prior to calling OnSessionStarted and OnIntentAsync
                // to allow dev to change session values if behavior is not desired
                DoSessionManagement(request, session);

                if (requestEnvelope.Session.IsNew)
                {
                    await OnSessionStartedAsync(requestEnvelope);
                }
                response = await OnIntentAsync(request, session, context);
            }
            break;

            // process session ended request
            case SessionEndedRequest request:
            {
                await OnSessionEndedAsync(request, session, context);
            }
            break;
            }

            if (response == null)
            {
                return new SpeechletResponseEnvelope
                       {
                           Version  = requestEnvelope.Version,
                           Response = new SpeechletResponse()
                           {
                               ShouldEndSession = null
                           }
                       }
            }
        public async Task <SpeechletRequestEnvelope> GetRequestAsync(string content, string chainUrl, string signature)
        {
            var validationResult = SpeechletRequestValidationResult.OK;

            if (string.IsNullOrEmpty(chainUrl))
            {
                validationResult |= SpeechletRequestValidationResult.NoCertHeader;
            }

            if (string.IsNullOrEmpty(signature))
            {
                validationResult |= SpeechletRequestValidationResult.NoSignatureHeader;
            }

            // attempt to verify signature only if we were able to locate certificate and signature headers
            if (validationResult == SpeechletRequestValidationResult.OK)
            {
                var alexaBytes = Encoding.UTF8.GetBytes(content);

                if (!await SpeechletRequestSignatureVerifier.VerifyRequestSignatureAsync(alexaBytes, signature, chainUrl))
                {
                    validationResult |= SpeechletRequestValidationResult.InvalidSignature;
                }
            }

            SpeechletRequestEnvelope result = null;

            try {
                result = SpeechletRequestEnvelope.FromJson(content);
            }
            catch (Exception ex)
                when(ex is Newtonsoft.Json.JsonReaderException || ex is InvalidCastException || ex is FormatException)
                {
                    validationResult |= SpeechletRequestValidationResult.InvalidJson;
                }

            var success = false;

            // attempt to verify timestamp only if we were able to parse request body
            if (result != null)
            {
                var now = DateTime.UtcNow; // reference time for this request

                if (!SpeechletRequestTimestampVerifier.VerifyRequestTimestamp(result, now))
                {
                    validationResult |= SpeechletRequestValidationResult.InvalidTimestamp;
                }

                success = speechlet?.OnRequestValidation(validationResult, now, result) ?? (validationResult == SpeechletRequestValidationResult.OK);
            }

            if (!success)
            {
                throw new SpeechletValidationException(validationResult);
            }

            return(result);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestContent"></param>
        /// <returns></returns>
        public async virtual Task <string> DoProcessRequestAsync(SpeechletRequestEnvelope requestEnvelope)
        {
            Session           session  = requestEnvelope.Session;
            SpeechletResponse response = null;

            // verify timestamp is within tolerance
            var diff = DateTime.UtcNow - requestEnvelope.Request.Timestamp;

            Debug.WriteLine("Request was timestamped {0:0.00} seconds ago.", diff.TotalSeconds);
            if (Math.Abs((decimal)diff.TotalSeconds) > Sdk.TIMESTAMP_TOLERANCE_SEC)
            {
                return(String.Empty);
            }

            // process launch request
            if (requestEnvelope.Request is LaunchRequest)
            {
                var request = requestEnvelope.Request as LaunchRequest;
                if (requestEnvelope.Session.IsNew)
                {
                    await OnSessionStartedAsync(
                        new SessionStartedRequest(request.RequestId, request.Timestamp), session);
                }
                response = await OnLaunchAsync(request, session);
            }

            // process intent request
            else if (requestEnvelope.Request is IntentRequest)
            {
                var request = requestEnvelope.Request as IntentRequest;

                // Do session management prior to calling OnSessionStarted and OnIntentAsync
                // to allow dev to change session values if behavior is not desired
                DoSessionManagement(request, session);

                if (requestEnvelope.Session.IsNew)
                {
                    await OnSessionStartedAsync(
                        new SessionStartedRequest(request.RequestId, request.Timestamp), session);
                }
                response = await OnIntentAsync(request, session);
            }

            // process session ended request
            else if (requestEnvelope.Request is SessionEndedRequest)
            {
                var request = requestEnvelope.Request as SessionEndedRequest;
                await OnSessionEndedAsync(request, session);
            }

            var responseEnvelope = new SpeechletResponseEnvelope {
                Version           = requestEnvelope.Version,
                Response          = response,
                SessionAttributes = session.Attributes
            };

            return(responseEnvelope.ToJson());
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestEnvelope"></param>
        /// <returns></returns>
        private string DoProcessRequest(SpeechletRequestEnvelope requestEnvelope)
        {
            Session           session  = requestEnvelope.Session;
            Context           context  = requestEnvelope.Context;
            SpeechletResponse response = null;

            // process launch request
            if (requestEnvelope.Request is LaunchRequest)
            {
                var request = requestEnvelope.Request as LaunchRequest;
                if (requestEnvelope.Session.IsNew)
                {
                    OnSessionStarted(
                        new SessionStartedRequest(request.RequestId, request.Timestamp), session);
                }
                response = OnLaunch(request, session);
            }
            else if (requestEnvelope.Request is AudioPlayerRequest)
            {
                var request = requestEnvelope.Request as AudioPlayerRequest;
                response = OnAudioIntent(request, context);
            }
            // process intent request
            else if (requestEnvelope.Request is IntentRequest)
            {
                var request = requestEnvelope.Request as IntentRequest;

                // Do session management prior to calling OnSessionStarted and OnIntentAsync
                // to allow dev to change session values if behavior is not desired
                DoSessionManagement(request, session);

                if (requestEnvelope.Session.IsNew)
                {
                    OnSessionStarted(
                        new SessionStartedRequest(request.RequestId, request.Timestamp), session);
                }
                response = OnIntent(request, session, requestEnvelope.Context);
            }

            // process session ended request
            else if (requestEnvelope.Request is SessionEndedRequest)
            {
                var request = requestEnvelope.Request as SessionEndedRequest;
                OnSessionEnded(request, session);
            }

            var responseEnvelope = new SpeechletResponseEnvelope {
                Version           = requestEnvelope.Version,
                Response          = response,
                SessionAttributes = session?.Attributes ?? new Dictionary <string, string>()//requestEnvelope.Session?.Attributes
            };

            return(responseEnvelope.ToJson());
        }
Exemple #8
0
        public void Parse_AlexaRequest()
        {
            var requestContent  = File.ReadAllText(@"Json\request.json");
            var requestEnvelope = SpeechletRequestEnvelope.FromJson(requestContent);

            Assert.IsNotNull(requestEnvelope);
            Assert.IsNotNull(requestEnvelope.Context);
            Assert.IsNotNull(requestEnvelope.Request);
            Assert.IsNotNull(requestEnvelope.Session);
            Assert.IsNotNull(requestEnvelope.Version);
            Assert.AreEqual(requestEnvelope.Version, Sdk.VERSION);


            // intentRequest
            Assert.IsInstanceOfType(requestEnvelope.Request, typeof(IntentRequest));
            var intentRequest = requestEnvelope.Request as IntentRequest;

            Assert.AreEqual(intentRequest.RequestId, "amzn1.echo-api.request.00000000-0000-0000-0000-000000000000");
            Assert.AreEqual(intentRequest.DialogState, DialogStateEnum.IN_PROGRESS);
            Assert.AreEqual(intentRequest.Timestamp, new DateTime(2017, 1, 2, 3, 4, 5, DateTimeKind.Utc));

            // Intent
            Assert.IsNotNull(intentRequest.Intent);
            Assert.AreEqual(intentRequest.Intent.ConfirmationStatus, ConfirmationStatusEnum.CONFIRMED);
            Assert.AreEqual(intentRequest.Intent.Name, "test");

            // Slots
            Assert.IsNotNull(intentRequest.Intent.Slots);
            Assert.AreEqual(intentRequest.Intent.Slots.Count, 1);
            Assert.IsTrue(intentRequest.Intent.Slots.ContainsKey("Testslot"));

            var slot = intentRequest.Intent.Slots["Testslot"];

            Assert.IsNotNull(slot);

            Assert.AreEqual(slot.Name, "Testslot");
            Assert.AreEqual(slot.Value, "Testvalue");
            Assert.AreEqual(slot.ConfirmationStatus, ConfirmationStatusEnum.CONFIRMED);

            // resolutions
            Assert.IsNotNull(slot.Resolutions);
            Assert.IsNotNull(slot.Resolutions.ResolutionsPerAuthority);
            Assert.AreEqual(slot.Resolutions.ResolutionsPerAuthority.Count, 1);
            Assert.AreEqual(slot.Resolutions.ResolutionsPerAuthority[0].Authority, "amzn1.er-authority.echo-sdk.amzn1.ask.skill.00000000-0000-0000-0000-000000000000.Testslot");
            Assert.IsNotNull(slot.Resolutions.ResolutionsPerAuthority[0].Status);
            Assert.AreEqual(slot.Resolutions.ResolutionsPerAuthority[0].Status.Code, Resolution.ResolutionStatusCodeEnum.ER_SUCCESS_MATCH);
            Assert.AreEqual(slot.Resolutions.ResolutionsPerAuthority[0].Values.Count, 1);
            Assert.AreEqual(slot.Resolutions.ResolutionsPerAuthority[0].Values[0].Value.Id, "1");
            Assert.AreEqual(slot.Resolutions.ResolutionsPerAuthority[0].Values[0].Value.Name, "Testvalue");
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestEnvelope"></param>
        /// <returns></returns>
        private async Task <string> DoProcessRequestAsync(SpeechletRequestEnvelope requestEnvelope)
        {
            Session           session  = requestEnvelope.Session;
            SpeechletResponse response = null;

            // process launch request
            if (requestEnvelope.Request is LaunchRequest)
            {
                var request = requestEnvelope.Request as LaunchRequest;
                if (requestEnvelope.Session.IsNew)
                {
                    await OnSessionStartedAsync(
                        new SessionStartedRequest(request.RequestId, request.Timestamp), session);
                }
                response = await OnLaunchAsync(request, session);
            }

            // process intent request
            else if (requestEnvelope.Request is IntentRequest)
            {
                var request = requestEnvelope.Request as IntentRequest;

                // Do session management prior to calling OnSessionStarted and OnIntentAsync
                // to allow dev to change session values if behavior is not desired
                DoSessionManagement(request, session);

                if (requestEnvelope.Session.IsNew)
                {
                    await OnSessionStartedAsync(
                        new SessionStartedRequest(request.RequestId, request.Timestamp), session);
                }
                response = await OnIntentAsync(request, session);
            }

            // process session ended request
            else if (requestEnvelope.Request is SessionEndedRequest)
            {
                var request = requestEnvelope.Request as SessionEndedRequest;
                await OnSessionEndedAsync(request, session);
            }

            var responseEnvelope = new SpeechletResponseEnvelope {
                Version           = requestEnvelope.Version,
                Response          = response,
                SessionAttributes = session.Attributes
            };

            return(responseEnvelope.ToJson());
        }
Exemple #10
0
        /// <summary>
        /// A simple function that takes a string and does a ToUpper
        /// </summary>
        /// <param name="input"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public SpeechletResponseEnvelope FunctionHandler(SpeechletRequestEnvelope input, ILambdaContext context)
        {
            context.Logger.Log(JsonConvert.SerializeObject(input));

            return(new SpeechletResponseEnvelope
            {
                Response = new SpeechletResponse
                {
                    OutputSpeech = new PlainTextOutputSpeech
                    {
                        Text = ((IntentRequest)input.Request).Intent.Slots["Word"].Value
                    }
                }
            });
        }
Exemple #11
0
        public void RequestWithInvalidTimestampTest()
        {
            const string TestDataFile = @"TestData\RequestWithInvalidTimestamp.json";

            SpeechletRequestValidationResult validationResult = SpeechletRequestValidationResult.OK;
            SpeechletRequestEnvelope         alexaRequest     = null;
            var alexaContent = File.ReadAllText(TestDataFile);

            try {
                alexaRequest = SpeechletRequestEnvelope.FromJson(alexaContent);
            }
            catch (Exception ex)
                when(ex is Newtonsoft.Json.JsonReaderException || ex is InvalidCastException || ex is FormatException)
                {
                    validationResult = validationResult | SpeechletRequestValidationResult.InvalidJson;
                }

            Assert.True(validationResult == SpeechletRequestValidationResult.InvalidJson);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestEnvelope"></param>
        /// <returns></returns>
        public async Task <SpeechletResponseEnvelope> ProcessRequestAsync(SpeechletRequestEnvelope requestEnvelope)
        {
            var session = requestEnvelope.Session;
            var context = requestEnvelope.Context;
            var request = requestEnvelope.Request;

            var response = !(request is ExtendedSpeechletRequest) ?
                           await HandleStandardRequestAsync(request, session, context) :
                           await HandleExtendedRequestAsync(request as ExtendedSpeechletRequest, context);

            if (response == null)
            {
                response = new SpeechletResponse();
            }

            var responseEnvelope = new SpeechletResponseEnvelope {
                Version           = requestEnvelope.Version,
                Response          = response,
                SessionAttributes = session?.Attributes
            };

            return(responseEnvelope);
        }
Exemple #13
0
        /// <summary>
        /// Processes Alexa request AND validates request signature
        /// </summary>
        /// <param name="httpRequest"></param>
        /// <returns></returns>
        public virtual async Task <HttpResponseMessage> GetResponseAsync(HttpRequestMessage httpRequest)
        {
            DateTime now = DateTime.UtcNow; // reference time for this request


            RequestHeader requestHeader = new RequestHeader();

            requestHeader.Read(httpRequest);
            await OnRequestIncomeAsync(requestHeader);

#if HasBouncyCastle
            var cerValidator = new BouncyCastleCertValidator();
#else
            var cerValidator = new DotNetCertValidator();
#endif
            var validationResult = await cerValidator.VerifyAsync(requestHeader);

            if (!await OnRequestValidationAsync(requestHeader, validationResult))
            {
                return(new HttpResponseMessage(HttpStatusCode.BadRequest)
                {
                    ReasonPhrase = validationResult.ToString()
                });
            }

            try
            {
                RequestEnvelope = SpeechletRequestEnvelope.FromJson(requestHeader.RequestAsString);

                if (!SpeechletRequestTimestampVerifier.VerifyRequestTimestamp(RequestEnvelope, now))
                {
                    validationResult = validationResult | SpeechletRequestValidationResult.InvalidTimestamp;
                }
            }
            catch (Exception e1)
            {
                await OnParsingErrorAsync(e1);

                validationResult = SpeechletRequestValidationResult.InvalidJson;
            }


            try
            {
                string alexaResponsejson = await DoProcessRequestAsync(RequestEnvelope);

                if (alexaResponsejson == null)
                {
                    await OnResponseOutgoingAsync("->alexaResponsejson == null");

                    return(null);
                }

                await OnResponseOutgoingAsync(alexaResponsejson);

                return(new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(alexaResponsejson, Encoding.UTF8, "application/json")
                });;
            }
            catch (NotImplementedException)
            {
                return(null);
            }
            catch (Exception e2)
            {
                await OnParsingErrorAsync(e2);

                return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
            }
        }
        /// <summary>
        /// Processes Alexa request AND validates request signature
        /// </summary>
        /// <param name="httpRequest"></param>
        /// <returns></returns>
        public virtual HttpResponseMessage GetResponse(HttpRequestMessage httpRequest)
        {
            SpeechletRequestValidationResult validationResult = SpeechletRequestValidationResult.OK;
            DateTime now = DateTime.UtcNow; // reference time for this request

            string chainUrl = null;

            if (!httpRequest.Headers.Contains(Sdk.SIGNATURE_CERT_URL_REQUEST_HEADER) ||
                String.IsNullOrEmpty(chainUrl = httpRequest.Headers.GetValues(Sdk.SIGNATURE_CERT_URL_REQUEST_HEADER).First()))
            {
                validationResult = validationResult | SpeechletRequestValidationResult.NoCertHeader;
            }

            string signature = null;

            if (!httpRequest.Headers.Contains(Sdk.SIGNATURE_REQUEST_HEADER) ||
                String.IsNullOrEmpty(signature = httpRequest.Headers.GetValues(Sdk.SIGNATURE_REQUEST_HEADER).First()))
            {
                validationResult = validationResult | SpeechletRequestValidationResult.NoSignatureHeader;
            }

            var alexaBytes = AsyncHelpers.RunSync <byte[]>(() => httpRequest.Content.ReadAsByteArrayAsync());

            Debug.WriteLine(httpRequest.ToLogString());

            // attempt to verify signature only if we were able to locate certificate and signature headers
            if (validationResult == SpeechletRequestValidationResult.OK)
            {
                if (!SpeechletRequestSignatureVerifier.VerifyRequestSignature(alexaBytes, signature, chainUrl))
                {
                    validationResult = validationResult | SpeechletRequestValidationResult.InvalidSignature;
                }
            }

            SpeechletRequestEnvelope alexaRequest = null;

            try {
                var alexaContent = UTF8Encoding.UTF8.GetString(alexaBytes);
                alexaRequest = SpeechletRequestEnvelope.FromJson(alexaContent);
            }
            catch (Newtonsoft.Json.JsonReaderException) {
                validationResult = validationResult | SpeechletRequestValidationResult.InvalidJson;
            }
            catch (InvalidCastException) {
                validationResult = validationResult | SpeechletRequestValidationResult.InvalidJson;
            }

            // attempt to verify timestamp only if we were able to parse request body
            if (alexaRequest != null)
            {
                if (!SpeechletRequestTimestampVerifier.VerifyRequestTimestamp(alexaRequest, now))
                {
                    validationResult = validationResult | SpeechletRequestValidationResult.InvalidTimestamp;
                }
            }

            if (alexaRequest == null || !OnRequestValidation(validationResult, now, alexaRequest))
            {
                return(new HttpResponseMessage(HttpStatusCode.BadRequest)
                {
                    ReasonPhrase = validationResult.ToString()
                });
            }

            string alexaResponse = DoProcessRequest(alexaRequest);

            HttpResponseMessage httpResponse;

            if (alexaResponse != null)
            {
                httpResponse         = new HttpResponseMessage(HttpStatusCode.OK);
                httpResponse.Content = new StringContent(alexaResponse, Encoding.UTF8, "application/json");
                // Debug.WriteLine(httpResponse.ToLogString());
            }
            else
            {
                httpResponse = new HttpResponseMessage(HttpStatusCode.InternalServerError);
            }

            return(httpResponse);
        }
Exemple #15
0
        /// <summary>
        /// Processes Alexa request AND validates request signature
        /// </summary>
        /// <returns></returns>
        public virtual string GetResponse(Dictionary <string, string[]> Headers, byte[] Content, out HttpStatusCode HttpStatusCode)
        {
            SpeechletRequestValidationResult validationResult = SpeechletRequestValidationResult.OK;
            DateTime now = DateTime.UtcNow; // reference time for this request

            string chainUrl = null;

            if (!Headers.ContainsKey(Sdk.SIGNATURE_CERT_URL_REQUEST_HEADER) ||
                String.IsNullOrEmpty(chainUrl = Headers[Sdk.SIGNATURE_CERT_URL_REQUEST_HEADER].First()))
            {
                validationResult = validationResult | SpeechletRequestValidationResult.NoCertHeader;
            }

            string signature = null;

            if (!Headers.ContainsKey(Sdk.SIGNATURE_REQUEST_HEADER) ||
                String.IsNullOrEmpty(signature = Headers[Sdk.SIGNATURE_REQUEST_HEADER].First()))
            {
                validationResult = validationResult | SpeechletRequestValidationResult.NoSignatureHeader;
            }

            // attempt to verify signature only if we were able to locate certificate and signature headers
            if (validationResult == SpeechletRequestValidationResult.OK)
            {
                if (!SpeechletRequestSignatureVerifier.VerifyRequestSignature(Content, signature, chainUrl))
                {
                    validationResult = validationResult | SpeechletRequestValidationResult.InvalidSignature;
                }
            }

            SpeechletRequestEnvelope alexaRequest = null;

            try
            {
                var alexaContent = UTF8Encoding.UTF8.GetString(Content);
                alexaRequest = SpeechletRequestEnvelope.FromJson(alexaContent);
            }
            catch (Newtonsoft.Json.JsonReaderException)
            {
                validationResult = validationResult | SpeechletRequestValidationResult.InvalidJson;
            }
            catch (InvalidCastException)
            {
                validationResult = validationResult | SpeechletRequestValidationResult.InvalidJson;
            }

            // attempt to verify timestamp only if we were able to parse request body
            if (alexaRequest != null)
            {
                if (!SpeechletRequestTimestampVerifier.VerifyRequestTimestamp(alexaRequest, now))
                {
                    validationResult = validationResult | SpeechletRequestValidationResult.InvalidTimestamp;
                }
            }

            if (alexaRequest == null || !OnRequestValidation(validationResult, now, alexaRequest))
            {
                HttpStatusCode = HttpStatusCode.BadRequest;
                return(validationResult.ToString());
            }

            string alexaResponse = DoProcessRequest(alexaRequest);

            if (alexaResponse == null)
            {
                HttpStatusCode = HttpStatusCode.InternalServerError;
                return(null);
            }
            else
            {
                HttpStatusCode = HttpStatusCode.OK;
                return(alexaResponse);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestJson"></param>
        /// <returns></returns>
        public virtual string ProcessRequest(JObject requestJson)
        {
            var requestEnvelope = SpeechletRequestEnvelope.FromJson(requestJson);

            return(DoProcessRequest(requestEnvelope));
        }
 /// <summary>
 /// Opportunity to set policy for handling requests with invalid signatures and/or timestamps
 /// </summary>
 /// <returns>true if request processing should continue, otherwise false</returns>
 public virtual bool OnRequestValidation(
     SpeechletRequestValidationResult result, DateTime referenceTimeUtc, SpeechletRequestEnvelope requestEnvelope)
 {
     return(result == SpeechletRequestValidationResult.OK);
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestEnvelope"></param>
        /// <returns></returns>
        private async Task <string> DoProcessRequestAsync(SpeechletRequestEnvelope requestEnvelope)
        {
            Session           session  = requestEnvelope.Session;
            SpeechletResponse response = null;

            Trace.TraceInformation("In DoProcessRequestAsync");
            // process launch request
            if (requestEnvelope.Request is LaunchRequest)
            {
                var request = requestEnvelope.Request as LaunchRequest;
                if (requestEnvelope.Session.IsNew)
                {
                    await OnSessionStartedAsync(
                        new SessionStartedRequest(request.RequestId, request.Timestamp), session);
                }
                Trace.TraceInformation("request is LaunchRquest--about to call OnLaunchAsync");

                response = await OnLaunchAsync(request, session);
            }

            // process intent request
            else if (requestEnvelope.Request is IntentRequest)
            {
                var request = requestEnvelope.Request as IntentRequest;
                Trace.TraceInformation("In DoProcessRequestAsync, request is IntentRequest");

                // Do session management prior to calling OnSessionStarted and OnIntentAsync
                // to allow dev to change session values if behavior is not desired
                DoSessionManagement(request, session);

                if (requestEnvelope.Session.IsNew)
                {
                    await OnSessionStartedAsync(
                        new SessionStartedRequest(request.RequestId, request.Timestamp), session);
                }
                Trace.TraceInformation("--about to call OnIntentAsync");

                response = await OnIntentAsync(request, session);
            }


            // perform enqueue next audio request (to-do: others as well)
            else if (requestEnvelope.Request is AudioIntentRequest)
            {
                var     request = requestEnvelope.Request as AudioIntentRequest;
                Context context = requestEnvelope.Context;
                response = await OnAudioIntentAsync(request, context);

                session = new Session();
            }

            // perform enqueue next audio request (to-do: others as well)
            else if (requestEnvelope.Request is AudioPlayerRequest)
            {
                var     request = requestEnvelope.Request as AudioPlayerRequest;
                Context context = requestEnvelope.Context;
                response = await OnAudioPlayerAsync(request, context);

                session = new Session();
            }

            // process session ended request
            else if (requestEnvelope.Request is SessionEndedRequest)
            {
                var request = requestEnvelope.Request as SessionEndedRequest;
                await OnSessionEndedAsync(request, session);
            }

            var responseEnvelope = new SpeechletResponseEnvelope
            {
                Version           = requestEnvelope.Version,
                Response          = response,
                SessionAttributes = session.Attributes
            };

            Trace.TraceInformation($"Reached the bottom of DoProcessRequestAsync, requestEnvelope.Request is {requestEnvelope.Request.ToString()}");

            return(responseEnvelope.ToJson());
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestContent"></param>
        /// <returns></returns>
        public virtual string ProcessRequest(string requestContent)
        {
            var requestEnvelope = SpeechletRequestEnvelope.FromJson(requestContent);

            return(DoProcessRequest(requestEnvelope));
        }
        /// <summary>
        /// Processes Alexa request but does NOT validate request signature
        /// </summary>
        /// <param name="requestJson"></param>
        /// <returns></returns>
        public async virtual Task <string> ProcessRequestAsync(JObject requestJson)
        {
            var requestEnvelope = SpeechletRequestEnvelope.FromJson(requestJson);

            return(await DoProcessRequestAsync(requestEnvelope));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestEnvelope"></param>
        /// <returns></returns>
        private string DoProcessRequest(SpeechletRequestEnvelope requestEnvelope)
        {
            Session           session  = requestEnvelope.Session;
            Context           context  = requestEnvelope.Context;
            SpeechletResponse response = null;

            switch (requestEnvelope.Request)
            {
            case LaunchRequest request:
            {
                if (requestEnvelope.Session.IsNew)
                {
                    OnSessionStarted(requestEnvelope);
                }
                response = OnLaunch(request, session, context);
            }
            break;

            case AudioPlayerRequest request:
            {
                response = OnAudioIntent(request, session, context);
            }
            break;

            // process intent request
            case IntentRequest request:
            {
                // Do session management prior to calling OnSessionStarted and OnIntentAsync
                // to allow dev to change session values if behavior is not desired
                DoSessionManagement(request, session);

                if (requestEnvelope.Session.IsNew)
                {
                    OnSessionStarted(requestEnvelope);
                }
                response = OnIntent(request, session, context);
            }
            break;

            // process session ended request
            case SessionEndedRequest request:
            {
                OnSessionEnded(request, session, context);
            }
            break;
            }

            if (response == null)
            {
                return(new SpeechletResponseEnvelope
                {
                    Version = requestEnvelope.Version,
                    Response = new SpeechletResponse()
                    {
                        ShouldEndSession = null
                    }
                }.ToJson());
            }


            var responseEnvelope = new SpeechletResponseEnvelope
            {
                Version           = requestEnvelope.Version,
                Response          = response,
                SessionAttributes = requestEnvelope.Session?.Attributes ?? new Dictionary <string, string>()
            };

            return(responseEnvelope.ToJson());
        }
Exemple #22
0
 public override bool OnRequestValidation(SpeechletRequestValidationResult result, DateTime referenceTimeUtc, SpeechletRequestEnvelope requestEnvelope)
 {
     if (requestEnvelope?.Session?.Application?.Id?.Equals("amzn1.ask.skill.77ffa04a-699d-452d-b8d5-4c128079a1b2") == false)
     {
         WebApiApplication.telemetry.TrackEvent("Request envelope does not contain the appid");
         return(false);
     }
     return(base.OnRequestValidation(result, referenceTimeUtc, requestEnvelope));
 }
        /// <summary>
        /// Processes Alexa request but does NOT validate request signature
        /// </summary>
        /// <param name="requestContent"></param>
        /// <returns></returns>
        public async virtual Task <string> ProcessRequestAsync(string requestContent)
        {
            var requestEnvelope = SpeechletRequestEnvelope.FromJson(requestContent);

            return(await DoProcessRequestAsync(requestEnvelope));
        }
Exemple #24
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestEnvelope"></param>
        /// <returns></returns>
        private async Task <string> DoProcessRequestAsync(SpeechletRequestEnvelope requestEnvelope)
        {
            Session            session  = requestEnvelope.Session;
            var                context  = requestEnvelope.Context;
            var                request  = requestEnvelope.Request;
            ISpeechletResponse response = null;

            if (session != null)
            {
                // Do session management prior to calling OnSessionStarted and OnIntentAsync
                // to allow dev to change session values if behavior is not desired
                DoSessionManagement(request as IntentRequest, session);

                if (session.IsNew)
                {
                    await OnSessionStartedAsync(
                        new SessionStartedRequest(request.RequestId, request.Timestamp, request.Locale), session);
                }
            }

            // process launch request
            if (requestEnvelope.Request is LaunchRequest)
            {
                response = await OnLaunchAsync(request as LaunchRequest, session);
            }

            // process audio player request
            else if (requestEnvelope.Request is AudioPlayerRequest)
            {
                response = await OnAudioPlayerAsync(request as AudioPlayerRequest, context);
            }

            // process playback controller request
            else if (requestEnvelope.Request is PlaybackControllerRequest)
            {
                response = await OnPlaybackControllerAsync(request as PlaybackControllerRequest, context);
            }

            // process display request
            else if (requestEnvelope.Request is DisplayRequest)
            {
                response = await OnDisplayAsync(request as DisplayRequest, context);
            }

            // process system request
            else if (requestEnvelope.Request is SystemExceptionEncounteredRequest)
            {
                await OnSystemExceptionEncounteredAsync(request as SystemExceptionEncounteredRequest, context);
            }

            // process intent request
            else if (requestEnvelope.Request is IntentRequest)
            {
                response = await OnIntentAsync(request as IntentRequest, session, context);
            }

            // process session ended request
            else if (requestEnvelope.Request is SessionEndedRequest)
            {
                await OnSessionEndedAsync(request as SessionEndedRequest, session);
            }

            var responseEnvelope = new SpeechletResponseEnvelope {
                Version           = requestEnvelope.Version,
                Response          = response,
                SessionAttributes = session?.Attributes
            };

            return(responseEnvelope.ToJson());
        }
 public override bool OnRequestValidation(SpeechletRequestValidationResult result, DateTime referenceTimeUtc, SpeechletRequestEnvelope requestEnvelope)
 {
     //if (requestEnvelope?.Session?.Application?.Id?.Equals("<your Alexa skill's application id here>") == false)
     //{
     //    //WebApiApplication.telemetry.TrackEvent("Request envelope does not contain the appid");
     //    return false;
     //}
     return(base.OnRequestValidation(0, referenceTimeUtc, requestEnvelope));
 }
 public override bool OnRequestValidation(SpeechletRequestValidationResult result, DateTime referenceTimeUtc, SpeechletRequestEnvelope requestEnvelope)
 {
     //return true;
     return(base.OnRequestValidation(result, referenceTimeUtc, requestEnvelope));
 }
Exemple #27
0
 public override bool OnRequestValidation(SpeechletRequestValidationResult result, DateTime referenceTimeUtc, SpeechletRequestEnvelope requestEnvelope)
 {
     if (requestEnvelope?.Session?.Application?.Id?.Equals("amzn1.ask.skill.052afe5d-6417-4e89-b6aa-b4ee3c0bb75a") == false)
     {
         return(false);
     }
     return(base.OnRequestValidation(result, referenceTimeUtc, requestEnvelope));
 }
Exemple #28
0
        public async Task <string> ProcessRequestAsync(JObject requestJson)
        {
            var requestEnvelope = SpeechletRequestEnvelope.FromJson(requestJson);

            return((await Service.ProcessRequestAsync(requestEnvelope))?.ToJson());
        }
 public bool OnRequestValidation(
     SpeechletRequestValidationResult result, DateTime referenceTimeUtc, SpeechletRequestEnvelope requestEnvelope)
 {
     return(speechlet.OnRequestValidation(result, referenceTimeUtc, requestEnvelope));
 }
 public virtual void OnSessionStarted(SpeechletRequestEnvelope requestEnvelope)
 {
 }