コード例 #1
0
        /// <summary>
        /// Parse the <see cref="IOwinRequest"/> into an <see cref="ILtiRequest"/>.
        /// </summary>
        /// <param name="request">The <see cref="IOwinRequest"/> to parse.</param>
        /// <returns>The <see cref="ILtiRequest"/>.</returns>
        public static async Task <ILtiRequest> ParseLtiRequestAsync(this IOwinRequest request)
        {
            var ltiRequest = new LtiRequest(null)
            {
                Url        = request.Uri,
                HttpMethod = request.Method
            };

            // LTI launch and content item requests are sent as form posts
            if (request.ContentType.Equals("application/x-www-form-urlencoded"))
            {
                var form = await request.ReadFormAsync();

                foreach (var pair in form)
                {
                    ltiRequest.Parameters.Add(pair.Key, string.Join(",", pair.Value));
                }
                return(ltiRequest);
            }

            // LTI Outcome requests and responses are sent as Plain Old XML
            if (request.ContentType.Equals("application/xml"))
            {
                using (var ms = new MemoryStream())
                {
                    try
                    {
                        await request.Body.CopyToAsync(ms);

                        using (var reader = new StreamReader(ms))
                        {
                            ltiRequest.ImsxPoxEnvelope = await reader.ReadToEndAsync();
                        }
                    }
                    finally
                    {
                        if (request.Body.CanSeek)
                        {
                            request.Body.Position = 0;
                        }
                    }
                }
                var authorizationHeader = request.GetAuthorizationHeader();
                ltiRequest.Parameters.Add(authorizationHeader.Parameters);
                return(ltiRequest);
            }
            return(ltiRequest);
        }