/// <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); }