diff options
author | Andrew Arnott <andrewarnott@gmail.com> | 2012-10-09 09:33:08 -0700 |
---|---|---|
committer | Andrew Arnott <andrewarnott@gmail.com> | 2012-10-09 09:33:08 -0700 |
commit | 07d382d611458245b521ce79f2b9bb956a58468a (patch) | |
tree | 17e3309b42af77bf9c390022f1b5033bbd827fde | |
parent | 50585d83046b7950ad3efd8385eba05c4d1dec05 (diff) | |
download | DotNetOpenAuth-07d382d611458245b521ce79f2b9bb956a58468a.zip DotNetOpenAuth-07d382d611458245b521ce79f2b9bb956a58468a.tar.gz DotNetOpenAuth-07d382d611458245b521ce79f2b9bb956a58468a.tar.bz2 |
Added OutgoingWebResponse.AsHttpResponseMessage extension method.
-rw-r--r-- | src/DotNetOpenAuth.Core/Messaging/MessagingUtilities.cs | 25 | ||||
-rw-r--r-- | src/DotNetOpenAuth.Test/Messaging/MessagingUtilitiesTests.cs | 30 |
2 files changed, 54 insertions, 1 deletions
diff --git a/src/DotNetOpenAuth.Core/Messaging/MessagingUtilities.cs b/src/DotNetOpenAuth.Core/Messaging/MessagingUtilities.cs index 5390da5..ab56d8b 100644 --- a/src/DotNetOpenAuth.Core/Messaging/MessagingUtilities.cs +++ b/src/DotNetOpenAuth.Core/Messaging/MessagingUtilities.cs @@ -15,6 +15,9 @@ namespace DotNetOpenAuth.Messaging { using System.IO.Compression; using System.Linq; using System.Net; +#if CLR4 + using System.Net.Http; +#endif using System.Net.Mime; using System.Runtime.Serialization.Json; using System.Security; @@ -161,6 +164,28 @@ namespace DotNetOpenAuth.Messaging { return new OutgoingWebResponseActionResult(response); } +#if CLR4 + /// <summary> + /// Transforms an OutgoingWebResponse to a Web API-friendly HttpResponseMessage. + /// </summary> + /// <param name="outgoingResponse">The response to send to the user agent.</param> + /// <returns>The <see cref="HttpResponseMessage"/> instance to be returned by the Web API method.</returns> + public static HttpResponseMessage AsHttpResponseMessage(this OutgoingWebResponse outgoingResponse) { + HttpResponseMessage response = new HttpResponseMessage(outgoingResponse.Status) { + Content = new StreamContent(outgoingResponse.ResponseStream) + }; + + var responseHeaders = outgoingResponse.Headers; + foreach (var header in responseHeaders.AllKeys) { + if (!response.Headers.TryAddWithoutValidation(header, responseHeaders[header])) { + response.Content.Headers.TryAddWithoutValidation(header, responseHeaders[header]); + } + } + + return response; + } +#endif + /// <summary> /// Gets the original request URL, as seen from the browser before any URL rewrites on the server if any. /// Cookieless session directory (if applicable) is also included. diff --git a/src/DotNetOpenAuth.Test/Messaging/MessagingUtilitiesTests.cs b/src/DotNetOpenAuth.Test/Messaging/MessagingUtilitiesTests.cs index 5c3870c..45583bf 100644 --- a/src/DotNetOpenAuth.Test/Messaging/MessagingUtilitiesTests.cs +++ b/src/DotNetOpenAuth.Test/Messaging/MessagingUtilitiesTests.cs @@ -9,13 +9,17 @@ namespace DotNetOpenAuth.Test.Messaging { using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; + using System.Globalization; using System.IO; + using System.Linq; using System.Net; + using System.Net.Http; using System.Text; using System.Text.RegularExpressions; using System.Web; using DotNetOpenAuth.Messaging; using DotNetOpenAuth.Test.Mocks; + using Moq; using NUnit.Framework; [TestFixture] @@ -63,6 +67,30 @@ namespace DotNetOpenAuth.Test.Messaging { } [Test] + public void AsHttpResponseMessage() { + var responseContent = new byte[10]; + (new Random()).NextBytes(responseContent); + var responseStream = new MemoryStream(responseContent); + var outgoingResponse = new OutgoingWebResponse(); + outgoingResponse.Headers.Add("X-SOME-HEADER", "value"); + outgoingResponse.Headers.Add("Content-Length", responseContent.Length.ToString(CultureInfo.InvariantCulture)); + outgoingResponse.ResponseStream = responseStream; + + var httpResponseMessage = outgoingResponse.AsHttpResponseMessage(); + Assert.That(httpResponseMessage, Is.Not.Null); + Assert.That(httpResponseMessage.Headers.GetValues("X-SOME-HEADER").ToList(), Is.EqualTo(new[] { "value" })); + Assert.That( + httpResponseMessage.Content.Headers.GetValues("Content-Length").ToList(), + Is.EqualTo(new[] { responseContent.Length.ToString(CultureInfo.InvariantCulture) })); + var actualContent = new byte[responseContent.Length + 1]; // give the opportunity to provide a bit more data than we expect. + var bytesRead = httpResponseMessage.Content.ReadAsStreamAsync().Result.Read(actualContent, 0, actualContent.Length); + Assert.That(bytesRead, Is.EqualTo(responseContent.Length)); // verify that only the data we expected came back. + var trimmedActualContent = new byte[bytesRead]; + Array.Copy(actualContent, trimmedActualContent, bytesRead); + Assert.That(trimmedActualContent, Is.EqualTo(responseContent)); + } + + [Test] public void ToDictionary() { NameValueCollection nvc = new NameValueCollection(); nvc["a"] = "b"; @@ -151,7 +179,7 @@ namespace DotNetOpenAuth.Test.Messaging { var httpHandler = new TestWebRequestHandler(); bool callbackTriggered = false; httpHandler.Callback = req => { - Match m = Regex.Match(req.ContentType, "multipart/form-data; boundary=(.+)"); + var m = Regex.Match(req.ContentType, "multipart/form-data; boundary=(.+)"); Assert.IsTrue(m.Success, "Content-Type HTTP header not set correctly."); string boundary = m.Groups[1].Value; boundary = boundary.Substring(0, boundary.IndexOf(';')); // trim off charset |