PageRenderTime 26ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/test/System.Net.Http.Formatting.Test.Unit/HttpContentMessageExtensionsTests.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 531 lines | 474 code | 57 blank | 0 comment | 5 complexity | 5992e91f6d901fc7917e08faf01ebfe8 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Text;
  5. using Microsoft.TestCommon;
  6. using Xunit;
  7. using Xunit.Extensions;
  8. using Assert = Microsoft.TestCommon.AssertEx;
  9. namespace System.Net.Http
  10. {
  11. public class HttpContentMessageExtensionsTests
  12. {
  13. [Fact]
  14. public void TypeIsCorrect()
  15. {
  16. Assert.Type.HasProperties(
  17. typeof(HttpContentMessageExtensions),
  18. TypeAssert.TypeProperties.IsPublicVisibleClass |
  19. TypeAssert.TypeProperties.IsStatic);
  20. }
  21. private static HttpContent CreateContent(bool isRequest, bool hasEntity)
  22. {
  23. string message;
  24. if (isRequest)
  25. {
  26. message = hasEntity ? ParserData.HttpRequestWithEntity : ParserData.HttpRequest;
  27. }
  28. else
  29. {
  30. message = hasEntity ? ParserData.HttpResponseWithEntity : ParserData.HttpResponse;
  31. }
  32. StringContent content = new StringContent(message);
  33. content.Headers.ContentType = isRequest ? ParserData.HttpRequestMediaType : ParserData.HttpResponseMediaType;
  34. return content;
  35. }
  36. private static HttpContent CreateContent(bool isRequest, IEnumerable<string> header, string body)
  37. {
  38. StringBuilder message = new StringBuilder();
  39. foreach (string h in header)
  40. {
  41. message.Append(h);
  42. message.Append("\r\n");
  43. }
  44. message.Append("\r\n");
  45. if (body != null)
  46. {
  47. message.Append(body);
  48. }
  49. StringContent content = new StringContent(message.ToString());
  50. content.Headers.ContentType = isRequest ? ParserData.HttpRequestMediaType : ParserData.HttpResponseMediaType;
  51. return content;
  52. }
  53. private static void ValidateEntity(HttpContent content)
  54. {
  55. Assert.NotNull(content);
  56. Assert.Equal(ParserData.TextContentType, content.Headers.ContentType.ToString());
  57. string entity = content.ReadAsStringAsync().Result;
  58. Assert.Equal(ParserData.HttpMessageEntity, entity);
  59. }
  60. private static void ValidateRequestMessage(HttpRequestMessage request, bool hasEntity)
  61. {
  62. Assert.NotNull(request);
  63. Assert.Equal(Version.Parse("1.2"), request.Version);
  64. Assert.Equal(ParserData.HttpMethod, request.Method.ToString());
  65. Assert.Equal(ParserData.HttpRequestUri, request.RequestUri);
  66. Assert.Equal(ParserData.HttpHostName, request.Headers.Host);
  67. Assert.True(request.Headers.Contains("N1"), "request did not contain expected N1 header.");
  68. Assert.True(request.Headers.Contains("N2"), "request did not contain expected N2 header.");
  69. if (hasEntity)
  70. {
  71. ValidateEntity(request.Content);
  72. }
  73. }
  74. private static void ValidateResponseMessage(HttpResponseMessage response, bool hasEntity)
  75. {
  76. Assert.NotNull(response);
  77. Assert.Equal(new Version("1.2"), response.Version);
  78. Assert.Equal(ParserData.HttpStatus, response.StatusCode);
  79. Assert.Equal(ParserData.HttpReasonPhrase, response.ReasonPhrase);
  80. Assert.True(response.Headers.Contains("N1"), "Response did not contain expected N1 header.");
  81. Assert.True(response.Headers.Contains("N2"), "Response did not contain expected N2 header.");
  82. if (hasEntity)
  83. {
  84. ValidateEntity(response.Content);
  85. }
  86. }
  87. [Fact]
  88. public void ReadAsHttpRequestMessageVerifyArguments()
  89. {
  90. Assert.ThrowsArgumentNull(() => HttpContentMessageExtensions.ReadAsHttpRequestMessageAsync(null), "content");
  91. Assert.ThrowsArgument(() => new ByteArrayContent(new byte[] { }).ReadAsHttpRequestMessageAsync(), "content");
  92. Assert.ThrowsArgument(() => new StringContent(String.Empty).ReadAsHttpRequestMessageAsync(), "content");
  93. Assert.ThrowsArgument(() => new StringContent(String.Empty, Encoding.UTF8, "application/http").ReadAsHttpRequestMessageAsync(), "content");
  94. Assert.ThrowsArgument(() =>
  95. {
  96. HttpContent content = new StringContent(String.Empty);
  97. content.Headers.ContentType = ParserData.HttpResponseMediaType;
  98. content.ReadAsHttpRequestMessageAsync();
  99. }, "content");
  100. Assert.ThrowsArgumentNull(() =>
  101. {
  102. HttpContent content = new StringContent(String.Empty);
  103. content.Headers.ContentType = ParserData.HttpRequestMediaType;
  104. content.ReadAsHttpRequestMessageAsync(null);
  105. }, "uriScheme");
  106. Assert.ThrowsArgument(() =>
  107. {
  108. HttpContent content = new StringContent(String.Empty);
  109. content.Headers.ContentType = ParserData.HttpRequestMediaType;
  110. content.ReadAsHttpRequestMessageAsync("i n v a l i d");
  111. }, "uriScheme");
  112. Assert.ThrowsArgumentGreaterThanOrEqualTo(() =>
  113. {
  114. HttpContent content = new StringContent(String.Empty);
  115. content.Headers.ContentType = ParserData.HttpRequestMediaType;
  116. content.ReadAsHttpRequestMessageAsync(Uri.UriSchemeHttp, ParserData.MinBufferSize - 1);
  117. }, "bufferSize", ParserData.MinBufferSize.ToString(), ParserData.MinBufferSize - 1);
  118. }
  119. [Fact]
  120. public void ReadAsHttpResponseMessageVerifyArguments()
  121. {
  122. Assert.ThrowsArgumentNull(() => HttpContentMessageExtensions.ReadAsHttpResponseMessageAsync(null), "content");
  123. Assert.ThrowsArgument(() => new ByteArrayContent(new byte[] { }).ReadAsHttpResponseMessageAsync(), "content");
  124. Assert.ThrowsArgument(() => new StringContent(String.Empty).ReadAsHttpResponseMessageAsync(), "content");
  125. Assert.ThrowsArgument(() => new StringContent(String.Empty, Encoding.UTF8, "application/http").ReadAsHttpResponseMessageAsync(), "content");
  126. Assert.ThrowsArgument(() =>
  127. {
  128. HttpContent content = new StringContent(String.Empty);
  129. content.Headers.ContentType = ParserData.HttpRequestMediaType;
  130. content.ReadAsHttpResponseMessageAsync();
  131. }, "content");
  132. Assert.ThrowsArgumentGreaterThanOrEqualTo(() =>
  133. {
  134. HttpContent content = new StringContent(String.Empty);
  135. content.Headers.ContentType = ParserData.HttpResponseMediaType;
  136. content.ReadAsHttpResponseMessageAsync(ParserData.MinBufferSize - 1);
  137. }, "bufferSize", ParserData.MinBufferSize.ToString(), ParserData.MinBufferSize - 1);
  138. }
  139. [Fact]
  140. public void IsHttpRequestMessageContentVerifyArguments()
  141. {
  142. Assert.ThrowsArgumentNull(() => HttpContentMessageExtensions.IsHttpRequestMessageContent(null), "content");
  143. }
  144. [Fact]
  145. public void IsHttpResponseMessageContentVerifyArguments()
  146. {
  147. Assert.ThrowsArgumentNull(() =>
  148. {
  149. HttpContent content = null;
  150. HttpContentMessageExtensions.IsHttpResponseMessageContent(content);
  151. }, "content");
  152. }
  153. public static TheoryDataSet<HttpContent> NotHttpMessageContent
  154. {
  155. get
  156. {
  157. return new TheoryDataSet<HttpContent>
  158. {
  159. new ByteArrayContent(new byte[] { }),
  160. new StringContent(String.Empty),
  161. new StringContent(String.Empty, Encoding.UTF8, "application/http"),
  162. };
  163. }
  164. }
  165. [Theory]
  166. [PropertyData("NotHttpMessageContent")]
  167. public void IsHttpRequestMessageContentRespondsFalse(HttpContent notHttpMessageContent)
  168. {
  169. Assert.False(notHttpMessageContent.IsHttpRequestMessageContent());
  170. }
  171. [Fact]
  172. public void IsHttpRequestMessageContentRespondsTrue()
  173. {
  174. HttpContent content = new StringContent(String.Empty);
  175. content.Headers.ContentType = ParserData.HttpRequestMediaType;
  176. Assert.True(content.IsHttpRequestMessageContent(), "Content should be HTTP request.");
  177. }
  178. [Theory]
  179. [PropertyData("NotHttpMessageContent")]
  180. public void IsHttpResponseMessageContent(HttpContent notHttpMessageContent)
  181. {
  182. Assert.False(notHttpMessageContent.IsHttpResponseMessageContent());
  183. }
  184. [Fact]
  185. public void IsHttpResponseMessageContentRespondsTrue()
  186. {
  187. HttpContent content = new StringContent(String.Empty);
  188. content.Headers.ContentType = ParserData.HttpResponseMediaType;
  189. Assert.True(content.IsHttpResponseMessageContent(), "Content should be HTTP response.");
  190. }
  191. [Fact]
  192. public void ReadAsHttpRequestMessageAsync_RequestWithoutEntity_ShouldReturnHttpRequestMessage()
  193. {
  194. HttpContent content = CreateContent(isRequest: true, hasEntity: false);
  195. HttpRequestMessage httpRequest = content.ReadAsHttpRequestMessageAsync().Result;
  196. ValidateRequestMessage(httpRequest, hasEntity: false);
  197. }
  198. [Fact]
  199. public void ReadAsHttpRequestMessageAsync_RequestWithEntity_ShouldReturnHttpRequestMessage()
  200. {
  201. HttpContent content = CreateContent(isRequest: true, hasEntity: true);
  202. HttpRequestMessage httpRequest = content.ReadAsHttpRequestMessageAsync().Result;
  203. ValidateRequestMessage(httpRequest, hasEntity: true);
  204. }
  205. [Fact]
  206. public void ReadAsHttpRequestMessageAsync_WithHttpsUriScheme_ReturnsUriWithHttps()
  207. {
  208. HttpContent content = CreateContent(isRequest: true, hasEntity: true);
  209. HttpRequestMessage httpRequest = content.ReadAsHttpRequestMessageAsync(Uri.UriSchemeHttps).Result;
  210. Assert.Equal(ParserData.HttpsRequestUri, httpRequest.RequestUri);
  211. }
  212. [Fact]
  213. public void ReadAsHttpResponseMessageAsync_ResponseWithoutEntity_ShouldReturnHttpResponseMessage()
  214. {
  215. HttpContent content = CreateContent(isRequest: false, hasEntity: false);
  216. HttpResponseMessage httpResponse = content.ReadAsHttpResponseMessageAsync().Result;
  217. ValidateResponseMessage(httpResponse, hasEntity: false);
  218. }
  219. [Fact]
  220. public void ReadAsHttpResponseMessageAsync_ResponseWithEntity_ShouldReturnHttpResponseMessage()
  221. {
  222. HttpContent content = CreateContent(isRequest: false, hasEntity: true);
  223. HttpResponseMessage httpResponse = content.ReadAsHttpResponseMessageAsync().Result;
  224. ValidateResponseMessage(httpResponse, hasEntity: true);
  225. }
  226. [Fact]
  227. public void ReadAsHttpRequestMessageAsync_NoHostHeader_ThrowsIOException()
  228. {
  229. string[] request = new[] {
  230. @"GET / HTTP/1.1",
  231. };
  232. HttpContent content = CreateContent(true, request, null);
  233. Assert.Throws<IOException>(() => content.ReadAsHttpRequestMessageAsync().Result);
  234. }
  235. [Fact]
  236. [Trait("Description", "ReadAsHttpRequestMessage should return HttpRequestMessage.")]
  237. public void ReadAsHttpRequestMessageAsync_TwoHostHeaders_ThrowsIOException()
  238. {
  239. string[] request = new[] {
  240. @"GET / HTTP/1.1",
  241. @"Host: somehost.com",
  242. @"Host: otherhost.com",
  243. };
  244. HttpContent content = CreateContent(true, request, null);
  245. Assert.Throws<IOException>(() => content.ReadAsHttpRequestMessageAsync().Result);
  246. }
  247. [Fact]
  248. [Trait("Description", "ReadAsHttpRequestMessage sorts request vs entity headers correctly.")]
  249. public void ReadAsHttpRequestMessageAsync_SortHeaders()
  250. {
  251. string[] request = new[] {
  252. @"GET / HTTP/1.1",
  253. @"Host: somehost.com",
  254. @"Content-Language: xx",
  255. @"Request-Header: zz",
  256. };
  257. HttpContent content = CreateContent(true, request, "sample body");
  258. HttpRequestMessage httpRequest = content.ReadAsHttpRequestMessageAsync().Result;
  259. Assert.Equal("xx", httpRequest.Content.Headers.ContentLanguage.ToString());
  260. IEnumerable<string> requestHeaderValues;
  261. Assert.True(httpRequest.Headers.TryGetValues("request-header", out requestHeaderValues));
  262. Assert.Equal("zz", requestHeaderValues.First());
  263. }
  264. [Fact]
  265. [Trait("Description", "ReadAsHttpResponseMessage sorts response vs entity headers correctly.")]
  266. public void ReadAsHttpResponseMessageAsync_SortHeaders()
  267. {
  268. string[] response = new[] {
  269. @"HTTP/1.1 200 OK",
  270. @"Content-Language: xx",
  271. @"Response-Header: zz",
  272. };
  273. HttpContent content = CreateContent(false, response, "sample body");
  274. HttpResponseMessage httpResponse = content.ReadAsHttpResponseMessageAsync().Result;
  275. Assert.Equal("xx", httpResponse.Content.Headers.ContentLanguage.ToString());
  276. IEnumerable<string> ResponseHeaderValues;
  277. Assert.True(httpResponse.Headers.TryGetValues("Response-header", out ResponseHeaderValues));
  278. Assert.Equal("zz", ResponseHeaderValues.First());
  279. }
  280. [Fact]
  281. public void ReadAsHttpRequestMessageAsync_IE_ShouldBeDeserializedCorrectly()
  282. {
  283. string[] request = new[] {
  284. @"GET / HTTP/1.1",
  285. @"Accept: text/html, application/xhtml+xml, */*",
  286. @"Accept-Language: en-US",
  287. @"User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
  288. @"Accept-Encoding: gzip, deflate",
  289. @"Proxy-Connection: Keep-Alive",
  290. @"Host: msdn.microsoft.com",
  291. @"Cookie: omniID=1297715979621_9f45_1519_3f8a_f22f85346ac6; WT_FPC=id=65.55.227.138-2323234032.30136233:lv=1309374389020:ss=1309374389020; A=I&I=AxUFAAAAAACNCAAADYEZ7CFPss7Swnujy4PXZA!!&M=1&CS=126mAa0002ZB51a02gZB51a; MC1=GUID=568428660ad44d4ab8f46133f4b03738&HASH=6628&LV=20113&V=3; WT_NVR_RU=0=msdn:1=:2=; MUID=A44DE185EA1B4E8088CCF7B348C5D65F; MSID=Microsoft.CreationDate=03/04/2011 23:38:15&Microsoft.LastVisitDate=06/20/2011 04:15:08&Microsoft.VisitStartDate=06/20/2011 04:15:08&Microsoft.CookieId=f658f3f2-e6d6-42ab-b86b-96791b942b6f&Microsoft.TokenId=ffffffff-ffff-ffff-ffff-ffffffffffff&Microsoft.NumberOfVisits=106&Microsoft.CookieFirstVisit=1&Microsoft.IdentityToken=AA==&Microsoft.MicrosoftId=0441-6141-1523-9969; msresearch=%7B%22version%22%3A%224.6%22%2C%22state%22%3A%7B%22name%22%3A%22IDLE%22%2C%22url%22%3Aundefined%2C%22timestamp%22%3A1299281911415%7D%2C%22lastinvited%22%3A1299281911415%2C%22userid%22%3A%2212992819114151265672533023080%22%2C%22vendorid%22%3A1%2C%22surveys%22%3A%5Bundefined%5D%7D; CodeSnippetContainerLang=C#; msdn=L=1033; ADS=SN=175A21EF; s_cc=true; s_sq=%5B%5BB%5D%5D; TocHashCookie=ms310241(n)/aa187916(n)/aa187917(n)/dd273952(n)/dd295083(n)/ff472634(n)/ee667046(n)/ee667070(n)/gg259047(n)/gg618436(n)/; WT_NVR=0=/:1=query|library|en-us:2=en-us/vcsharp|en-us/library",
  292. };
  293. HttpContent content = CreateContent(true, request, null);
  294. HttpRequestMessage httpRequest = content.ReadAsHttpRequestMessageAsync().Result;
  295. Assert.True(httpRequest.Headers.Contains("cookie"));
  296. }
  297. [Fact]
  298. public void ReadAsHttpRequestMessageAsync_Firefox_ShouldBeDeserializedCorrectly()
  299. {
  300. string[] request = new[] {
  301. @"GET / HTTP/1.1",
  302. @"Host: msdn.microsoft.com",
  303. @"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0",
  304. @"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
  305. @"Accept-Language: en-us,en;q=0.5",
  306. @"Accept-Encoding: gzip, deflate",
  307. @"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
  308. @"Proxy-Connection: keep-alive",
  309. };
  310. HttpContent content = CreateContent(true, request, null);
  311. HttpRequestMessage httpRequest = content.ReadAsHttpRequestMessageAsync().Result;
  312. Assert.True(httpRequest.Headers.Contains("proxy-connection"));
  313. }
  314. [Fact]
  315. public void ReadAsHttpRequestMessageAsync_Chrome_ShouldBeDeserializedCorrectly()
  316. {
  317. string[] request = new string[] {
  318. @"GET / HTTP/1.1",
  319. @"Host: msdn.microsoft.com",
  320. @"Proxy-Connection: keep-alive",
  321. @"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30",
  322. @"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
  323. @"Accept-Encoding: gzip,deflate,sdch",
  324. @"Accept-Language: en-US,en;q=0.8",
  325. @"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3",
  326. };
  327. HttpContent content = CreateContent(true, request, null);
  328. HttpRequestMessage httpRequest = content.ReadAsHttpRequestMessageAsync().Result;
  329. Assert.True(httpRequest.Headers.Contains("accept-charset"));
  330. }
  331. [Fact]
  332. public void ReadAsHttpRequestMessageAsync_Safari_ShouldBeDeserializedCorrectly()
  333. {
  334. string[] request = new string[] {
  335. @"GET / HTTP/1.1",
  336. @"Host: msdn.microsoft.com",
  337. @"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1",
  338. @"Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
  339. @"Accept-Language: en-US",
  340. @"Accept-Encoding: gzip, deflate",
  341. @"Connection: keep-alive",
  342. @"Proxy-Connection: keep-alive",
  343. };
  344. HttpContent content = CreateContent(true, request, null);
  345. HttpRequestMessage httpRequest = content.ReadAsHttpRequestMessageAsync().Result;
  346. Assert.True(httpRequest.Headers.Contains("proxy-connection"));
  347. }
  348. [Fact]
  349. public void ReadAsHttpRequestMessageAsync_Opera_ShouldBeDeserializedCorrectly()
  350. {
  351. string[] request = new string[] {
  352. @"GET / HTTP/1.0",
  353. @"User-Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
  354. @"Host: msdn.microsoft.com",
  355. @"Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1",
  356. @"Accept-Language: en-US,en;q=0.9",
  357. @"Accept-Encoding: gzip, deflate",
  358. @"Proxy-Connection: Keep-Alive",
  359. };
  360. HttpContent content = CreateContent(true, request, null);
  361. HttpRequestMessage httpRequest = content.ReadAsHttpRequestMessageAsync().Result;
  362. Assert.True(httpRequest.Headers.Contains("proxy-connection"));
  363. }
  364. [Fact]
  365. public void ReadAsHttpResponseMessageAsync_Asp_ShouldBeDeserializedCorrectly()
  366. {
  367. string[] response = new string[] {
  368. @"HTTP/1.1 302 Found",
  369. @"Proxy-Connection: Keep-Alive",
  370. @"Connection: Keep-Alive",
  371. @"Content-Length: 124",
  372. @"Via: 1.1 RED-PRXY-23",
  373. @"Date: Thu, 30 Jun 2011 00:16:35 GMT",
  374. @"Location: /en-us/",
  375. @"Content-Type: text/html; charset=utf-8",
  376. @"Server: Microsoft-IIS/7.5",
  377. @"Cache-Control: private",
  378. @"P3P: CP=""ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI""",
  379. @"Set-Cookie: A=I&I=AxUFAAAAAAD7BwAA8Jx0njhGoW3MGASDmzeaGw!!&M=1; domain=.microsoft.com; expires=Sun, 30-Jun-2041 00:16:35 GMT; path=/",
  380. @"Set-Cookie: ADS=SN=175A21EF; domain=.microsoft.com; path=/",
  381. @"Set-Cookie: Sto.UserLocale=en-us; path=/",
  382. @"X-AspNetMvc-Version: 3.0",
  383. @"X-AspNet-Version: 4.0.30319",
  384. @"X-Powered-By: ASP.NET",
  385. @"Set-Cookie: A=I&I=AxUFAAAAAAD7BwAA8Jx0njhGoW3MGASDmzeaGw!!&M=1; domain=.microsoft.com; expires=Sun, 30-Jun-2041 00:16:35 GMT; path=/; path=/",
  386. @"Set-Cookie: ADS=SN=175A21EF; domain=.microsoft.com; path=/; path=/",
  387. @"P3P: CP=""ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI""",
  388. @"X-Powered-By: ASP.NET",
  389. };
  390. string expectedEntity = @"<html><head><title>Object moved</title></head><body><h2>Object moved to <a href=""/en-us/"">here</a>.</h2></body></html>";
  391. HttpContent content = CreateContent(false, response, expectedEntity);
  392. HttpResponseMessage httpResponse = content.ReadAsHttpResponseMessageAsync().Result;
  393. Assert.True(httpResponse.Headers.Contains("x-powered-by"));
  394. string actualEntity = httpResponse.Content.ReadAsStringAsync().Result;
  395. Assert.Equal(expectedEntity, actualEntity);
  396. }
  397. public static TheoryDataSet<IEnumerable<string>> ServerRoundTripData
  398. {
  399. get
  400. {
  401. return new TheoryDataSet<IEnumerable<string>>
  402. {
  403. new string[]
  404. {
  405. @"HTTP/1.1 200 OK",
  406. @"Server: nginx",
  407. @"Date: Mon, 26 Dec 2011 16:33:07 GMT",
  408. @"Connection: keep-alive",
  409. @"Set-Cookie: CG=US:WA:Bellevue; path=/",
  410. @"Vary: Accept-Encoding, User-Agent",
  411. @"Cache-Control: max-age=60, private",
  412. @"Content-Length: 124",
  413. @"Content-Type: text/html; charset=UTF-8",
  414. },
  415. new string[]
  416. {
  417. @"HTTP/1.1 302 Found",
  418. @"Proxy-Connection: Keep-Alive",
  419. @"Connection: Keep-Alive",
  420. @"Via: 1.1 RED-PRXY-23",
  421. @"Date: Thu, 30 Jun 2011 00:16:35 GMT",
  422. @"Location: /en-us/",
  423. @"Server: Microsoft-IIS/7.5",
  424. @"Cache-Control: private",
  425. @"P3P: CP=""ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI"", CP=""ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI""",
  426. @"Set-Cookie: A=I&I=AxUFAAAAAAD7BwAA8Jx0njhGoW3MGASDmzeaGw!!&M=1; domain=.microsoft.com; expires=Sun, 30-Jun-2041 00:16:35 GMT; path=/",
  427. @"Set-Cookie: ADS=SN=175A21EF; domain=.microsoft.com; path=/",
  428. @"Set-Cookie: Sto.UserLocale=en-us; path=/",
  429. @"Set-Cookie: A=I&I=AxUFAAAAAAD7BwAA8Jx0njhGoW3MGASDmzeaGw!!&M=1; domain=.microsoft.com; expires=Sun, 30-Jun-2041 00:16:35 GMT; path=/; path=/",
  430. @"Set-Cookie: ADS=SN=175A21EF; domain=.microsoft.com; path=/; path=/",
  431. @"X-AspNetMvc-Version: 3.0",
  432. @"X-AspNet-Version: 4.0.30319",
  433. @"X-Powered-By: ASP.NET",
  434. @"X-Powered-By: ASP.NET",
  435. @"Content-Length: 124",
  436. @"Content-Type: text/html; charset=utf-8",
  437. },
  438. new string[]
  439. {
  440. @"HTTP/1.1 200 OK",
  441. @"Proxy-Connection: Keep-Alive",
  442. @"Connection: Keep-Alive",
  443. @"Transfer-Encoding: chunked",
  444. @"Via: 1.1 RED-PRXY-07",
  445. @"Date: Mon, 26 Dec 2011 19:11:47 GMT",
  446. @"Server: gws",
  447. @"Cache-Control: max-age=0, private",
  448. @"Set-Cookie: PREF=ID=e91cfd77b562e989:FF=0:TM=1324926707:LM=1324926707:S=4w8_eSySJPXCCjhT; expires=Wed, 25-Dec-2013 19:11:47 GMT; path=/; domain=.google.com",
  449. @"Set-Cookie: NID=54=bSMpxl0q0MVlvG-eZYSBtQuYTF1clqrA-TSIZT8wZcbhrrsdkP9G5zPiXGSBmiNu656QR3xfTXKUPkP-HqY_nSnsjj1fb-ipoZ3DUcyXb9oS9_8tjz3NZ3A44GPCmRPx; expires=Tue, 26-Jun-2012 19:11:47 GMT; path=/; domain=.google.com; HttpOnly",
  450. @"P3P: CP=""This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info.""",
  451. @"X-XSS-Protection: 1; mode=block",
  452. @"X-Frame-Options: SAMEORIGIN",
  453. @"Expires: -1",
  454. @"Content-Type: text/html; charset=ISO-8859-1",
  455. },
  456. };
  457. }
  458. }
  459. [Theory]
  460. [PropertyData("ServerRoundTripData")]
  461. public void RoundtripServerResponse(IEnumerable<string> message)
  462. {
  463. HttpContent content = CreateContent(false, message, @"<html><head><title>Object moved</title></head><body><h2>Object moved to <a href=""/en-us/"">here</a>.</h2></body></html>");
  464. HttpResponseMessage httpResponse = content.ReadAsHttpResponseMessageAsync().Result;
  465. HttpMessageContent httpMessageContent = new HttpMessageContent(httpResponse);
  466. MemoryStream destination = new MemoryStream();
  467. httpMessageContent.CopyToAsync(destination).Wait();
  468. destination.Seek(0, SeekOrigin.Begin);
  469. string destinationMessage = new StreamReader(destination).ReadToEnd();
  470. string sourceMessage = content.ReadAsStringAsync().Result;
  471. Assert.Equal(sourceMessage, destinationMessage);
  472. }
  473. }
  474. }