PreconditionTests.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. using Microsoft.Net.Http.Headers;
  2. using System.Net;
  3. using System.Net.Http;
  4. using System.Threading.Tasks;
  5. using Xunit;
  6. namespace Masuit.Tools.Core.UnitTest.AspNetCore
  7. {
  8. public class PreconditionTests : TestBase
  9. {
  10. /// <summary>
  11. /// The precondition if match fail test.
  12. /// </summary>
  13. [Fact]
  14. public async Task PreconditionIfMatchFailTest()
  15. {
  16. // Arrange
  17. Client.DefaultRequestHeaders.Add("If-Match", "\"xyzzy\"");
  18. // Act
  19. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  20. string responseString = await response.Content.ReadAsStringAsync();
  21. // Assert
  22. Assert.Equal(HttpStatusCode.PreconditionFailed, response.StatusCode);
  23. Assert.Equal(string.Empty, responseString);
  24. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  25. Assert.Equal(EntityTag, response.Headers.ETag);
  26. Assert.Null(response.Content.Headers.ContentRange);
  27. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  28. }
  29. [Fact]
  30. public async Task PreconditionIfMatchEmptySuccessTest()
  31. {
  32. // Arrange
  33. Client.DefaultRequestHeaders.Add("If-Match", "\"xyzzy\"");
  34. // Act
  35. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/false");
  36. string responseString = await response.Content.ReadAsStringAsync();
  37. // Assert
  38. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  39. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  40. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  41. Assert.Null(response.Headers.ETag);
  42. Assert.Null(response.Content.Headers.ContentRange);
  43. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  44. }
  45. [Fact]
  46. public async Task PreconditionIfMatchFailWeakTest()
  47. {
  48. // Arrange
  49. string entityTag = EntityTag.ToString();
  50. var tmpNewEntityTag = new EntityTagHeaderValue(entityTag, true);
  51. Client.DefaultRequestHeaders.Add("If-Match", tmpNewEntityTag.ToString());
  52. // Act
  53. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  54. string responseString = await response.Content.ReadAsStringAsync();
  55. // Assert
  56. Assert.Equal(HttpStatusCode.PreconditionFailed, response.StatusCode);
  57. Assert.Equal(string.Empty, responseString);
  58. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  59. Assert.Equal(EntityTag, response.Headers.ETag);
  60. Assert.Null(response.Content.Headers.ContentRange);
  61. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  62. }
  63. [Fact]
  64. public async Task PreconditionIfMatchSuccessAnyTest()
  65. {
  66. // Arrange
  67. Client.DefaultRequestHeaders.Add("If-Match", EntityTagHeaderValue.Any.ToString());
  68. // Act
  69. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  70. response.EnsureSuccessStatusCode();
  71. string responseString = await response.Content.ReadAsStringAsync();
  72. // Assert
  73. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  74. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  75. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  76. Assert.Equal(EntityTag, response.Headers.ETag);
  77. Assert.Null(response.Content.Headers.ContentRange);
  78. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  79. }
  80. [Fact]
  81. public async Task PreconditionIfMatchSuccessTest()
  82. {
  83. // Arrange
  84. Client.DefaultRequestHeaders.Add("If-Match", EntityTag.ToString());
  85. // Act
  86. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  87. response.EnsureSuccessStatusCode();
  88. string responseString = await response.Content.ReadAsStringAsync();
  89. // Assert
  90. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  91. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  92. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  93. Assert.Equal(EntityTag, response.Headers.ETag);
  94. Assert.Null(response.Content.Headers.ContentRange);
  95. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  96. }
  97. [Fact]
  98. public async Task PreconditionIfModifiedSinceFailEqualTest()
  99. {
  100. // Arrange
  101. Client.DefaultRequestHeaders.Add("If-Modified-Since", HeaderUtilities.FormatDate(LastModified));
  102. // Act
  103. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  104. string responseString = await response.Content.ReadAsStringAsync();
  105. // Assert
  106. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  107. Assert.Equal(string.Empty, responseString);
  108. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  109. Assert.Equal(EntityTag, response.Headers.ETag);
  110. Assert.Null(response.Content.Headers.ContentRange);
  111. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  112. }
  113. [Fact]
  114. public async Task PreconditionIfModifiedSinceFailLessTest()
  115. {
  116. // Arrange
  117. Client.DefaultRequestHeaders.Add("If-Modified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(1)));
  118. // Act
  119. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  120. string responseString = await response.Content.ReadAsStringAsync();
  121. // Assert
  122. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  123. Assert.Equal(string.Empty, responseString);
  124. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  125. Assert.Equal(EntityTag, response.Headers.ETag);
  126. Assert.Null(response.Content.Headers.ContentRange);
  127. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  128. }
  129. [Fact]
  130. public async Task PreconditionIfModifiedSinceIfNoneMatchSuccessTest()
  131. {
  132. // Arrange
  133. var tmpNewEntityTag = new EntityTagHeaderValue("\"xyzzy\"", true);
  134. Client.DefaultRequestHeaders.Add("If-None-Match", tmpNewEntityTag.ToString());
  135. Client.DefaultRequestHeaders.Add("If-Modified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(1)));
  136. // Act
  137. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  138. response.EnsureSuccessStatusCode();
  139. string responseString = await response.Content.ReadAsStringAsync();
  140. // Assert
  141. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  142. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  143. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  144. Assert.Equal(EntityTag, response.Headers.ETag);
  145. Assert.Null(response.Content.Headers.ContentRange);
  146. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  147. }
  148. [Fact]
  149. public async Task PreconditionIfModifiedSinceSuccessLessTest()
  150. {
  151. // Arrange
  152. Client.DefaultRequestHeaders.Add("If-Modified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(-1)));
  153. // Act
  154. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  155. string responseString = await response.Content.ReadAsStringAsync();
  156. // Assert
  157. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  158. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  159. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  160. Assert.Equal(EntityTag, response.Headers.ETag);
  161. Assert.Null(response.Content.Headers.ContentRange);
  162. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  163. }
  164. [Fact]
  165. public async Task PreconditionIfModifiedSinceSuccessPutTest()
  166. {
  167. // Arrange
  168. Client.DefaultRequestHeaders.Add("If-Modified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(-1)));
  169. // Act
  170. HttpResponseMessage response = await Client.PutAsync("/file/file", new StringContent(string.Empty));
  171. response.EnsureSuccessStatusCode();
  172. string responseString = await response.Content.ReadAsStringAsync();
  173. // Assert
  174. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  175. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  176. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  177. Assert.Equal(EntityTag, response.Headers.ETag);
  178. Assert.Null(response.Content.Headers.ContentRange);
  179. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  180. }
  181. [Fact]
  182. public async Task PreconditionIfNoneMatchFailAnyGetTest()
  183. {
  184. // Arrange
  185. Client.DefaultRequestHeaders.Add("If-None-Match", EntityTagHeaderValue.Any.ToString());
  186. // Act
  187. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  188. string responseString = await response.Content.ReadAsStringAsync();
  189. // Assert
  190. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  191. Assert.Equal(string.Empty, responseString);
  192. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  193. Assert.Equal(EntityTag, response.Headers.ETag);
  194. Assert.Null(response.Content.Headers.ContentRange);
  195. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  196. }
  197. [Fact]
  198. public async Task PreconditionIfNoneMatchFailAnyPutTest()
  199. {
  200. // Arrange
  201. Client.DefaultRequestHeaders.Add("If-None-Match", EntityTagHeaderValue.Any.ToString());
  202. // Act
  203. HttpResponseMessage response = await Client.PutAsync("/file/file", new StringContent(string.Empty));
  204. string responseString = await response.Content.ReadAsStringAsync();
  205. // Assert
  206. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  207. Assert.Equal(string.Empty, responseString);
  208. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  209. Assert.Equal(EntityTag, response.Headers.ETag);
  210. Assert.Null(response.Content.Headers.ContentRange);
  211. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  212. }
  213. [Fact]
  214. public async Task PreconditionIfNoneMatchGetFailTest()
  215. {
  216. // Arrange
  217. Client.DefaultRequestHeaders.Add("If-None-Match", EntityTag.ToString());
  218. // Act
  219. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  220. string responseString = await response.Content.ReadAsStringAsync();
  221. // Assert
  222. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  223. Assert.Equal(string.Empty, responseString);
  224. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  225. Assert.Equal(EntityTag, response.Headers.ETag);
  226. Assert.Null(response.Content.Headers.ContentRange);
  227. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  228. }
  229. [Fact]
  230. public async Task PreconditionIfNoneMatchGetWeakSuccessTest()
  231. {
  232. // Arrange
  233. string entityTag = EntityTag.ToString();
  234. var tmpNewEntityTag = new EntityTagHeaderValue(entityTag, true);
  235. Client.DefaultRequestHeaders.Add("If-None-Match", tmpNewEntityTag.ToString());
  236. // Act
  237. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  238. string responseString = await response.Content.ReadAsStringAsync();
  239. // Assert
  240. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  241. Assert.Equal(string.Empty, responseString);
  242. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  243. Assert.Equal(EntityTag, response.Headers.ETag);
  244. Assert.Null(response.Content.Headers.ContentRange);
  245. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  246. }
  247. [Fact]
  248. public async Task PreconditionIfNoneMatchHeadFailTest()
  249. {
  250. // Arrange
  251. Client.DefaultRequestHeaders.Add("If-None-Match", EntityTag.ToString());
  252. // Act
  253. HttpResponseMessage response = await Client.SendAsync(new HttpRequestMessage(HttpMethod.Head, "/file/file"));
  254. string responseString = await response.Content.ReadAsStringAsync();
  255. // Assert
  256. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  257. Assert.Equal(string.Empty, responseString);
  258. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  259. Assert.Equal(EntityTag, response.Headers.ETag);
  260. Assert.Null(response.Content.Headers.ContentRange);
  261. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  262. }
  263. [Fact]
  264. public async Task PreconditionIfNoneMatchPutFailTest()
  265. {
  266. // Arrange
  267. Client.DefaultRequestHeaders.Add("If-None-Match", EntityTag.ToString());
  268. // Act
  269. HttpResponseMessage response = await Client.PutAsync("/file/file", new StringContent(string.Empty));
  270. string responseString = await response.Content.ReadAsStringAsync();
  271. // Assert
  272. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  273. Assert.Equal(string.Empty, responseString);
  274. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  275. Assert.Equal(EntityTag, response.Headers.ETag);
  276. Assert.Null(response.Content.Headers.ContentRange);
  277. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  278. }
  279. [Fact]
  280. public async Task PreconditionIfNoneMatchSuccessTest()
  281. {
  282. // Arrange
  283. Client.DefaultRequestHeaders.Add("If-None-Match", "\"xyzzy\"");
  284. // Act
  285. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  286. response.EnsureSuccessStatusCode();
  287. string responseString = await response.Content.ReadAsStringAsync();
  288. // Assert
  289. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  290. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  291. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  292. Assert.Equal(EntityTag, response.Headers.ETag);
  293. Assert.Null(response.Content.Headers.ContentRange);
  294. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  295. }
  296. [Fact]
  297. public async Task PreconditionIfNoneMatchSuccessWeakTest()
  298. {
  299. // Arrange
  300. var tmpNewEntityTag = new EntityTagHeaderValue("\"xyzzy\"", true);
  301. Client.DefaultRequestHeaders.Add("If-None-Match", tmpNewEntityTag.ToString());
  302. // Act
  303. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  304. response.EnsureSuccessStatusCode();
  305. string responseString = await response.Content.ReadAsStringAsync();
  306. // Assert
  307. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  308. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  309. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  310. Assert.Equal(EntityTag, response.Headers.ETag);
  311. Assert.Null(response.Content.Headers.ContentRange);
  312. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  313. }
  314. [Fact]
  315. public async Task PreconditionIfRangeEtagTest()
  316. {
  317. // Arrange
  318. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  319. Client.DefaultRequestHeaders.Add("If-Range", EntityTag.ToString());
  320. // Act
  321. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  322. response.EnsureSuccessStatusCode();
  323. string responseString = await response.Content.ReadAsStringAsync();
  324. // Assert
  325. Assert.Equal(HttpStatusCode.PartialContent, response.StatusCode);
  326. Assert.Equal("1", responseString);
  327. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  328. Assert.Equal(EntityTag, response.Headers.ETag);
  329. Assert.NotNull(response.Content.Headers.ContentRange);
  330. Assert.Equal("bytes 1-1/62", response.Content.Headers.ContentRange.ToString());
  331. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  332. }
  333. [Fact]
  334. public async Task PreconditionIfRangeIgnoreEtagEmptyTest()
  335. {
  336. // Arrange
  337. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  338. Client.DefaultRequestHeaders.Add("If-Range", EntityTag.ToString());
  339. // Act
  340. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/false");
  341. response.EnsureSuccessStatusCode();
  342. string responseString = await response.Content.ReadAsStringAsync();
  343. // Assert
  344. Assert.Equal(HttpStatusCode.PartialContent, response.StatusCode);
  345. Assert.Equal("1", responseString);
  346. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  347. Assert.Null(response.Headers.ETag);
  348. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  349. }
  350. [Fact]
  351. public async Task PreconditionIfRangeIgnoreEtagTest()
  352. {
  353. // Arrange
  354. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  355. Client.DefaultRequestHeaders.Add("If-Range", "\"xyzzy\"");
  356. // Act
  357. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  358. response.EnsureSuccessStatusCode();
  359. string responseString = await response.Content.ReadAsStringAsync();
  360. // Assert
  361. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  362. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  363. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  364. Assert.Equal(EntityTag, response.Headers.ETag);
  365. Assert.Null(response.Content.Headers.ContentRange);
  366. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  367. }
  368. [Fact]
  369. public async Task PreconditionIfRangeIgnoreTest()
  370. {
  371. // Arrange
  372. Client.DefaultRequestHeaders.Add("If-Range", "\"xyzzy\"");
  373. // Act
  374. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  375. response.EnsureSuccessStatusCode();
  376. string responseString = await response.Content.ReadAsStringAsync();
  377. // Assert
  378. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  379. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  380. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  381. Assert.Equal(EntityTag, response.Headers.ETag);
  382. Assert.Null(response.Content.Headers.ContentRange);
  383. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  384. }
  385. [Fact]
  386. public async Task PreconditionIfRangeIgnoreWeakEtagTest()
  387. {
  388. // Arrange
  389. var tmpNewEntityTag = new EntityTagHeaderValue(EntityTag.ToString(), true);
  390. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  391. Client.DefaultRequestHeaders.Add("If-Range", tmpNewEntityTag.ToString());
  392. // Act
  393. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  394. response.EnsureSuccessStatusCode();
  395. string responseString = await response.Content.ReadAsStringAsync();
  396. // Assert
  397. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  398. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  399. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  400. Assert.Equal(EntityTag, response.Headers.ETag);
  401. Assert.Null(response.Content.Headers.ContentRange);
  402. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  403. }
  404. [Fact]
  405. public async Task PreconditionIfRangeLastModifiedEqualTest()
  406. {
  407. // Arrange
  408. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  409. Client.DefaultRequestHeaders.Add("If-Range", HeaderUtilities.FormatDate(LastModified));
  410. // Act
  411. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  412. response.EnsureSuccessStatusCode();
  413. string responseString = await response.Content.ReadAsStringAsync();
  414. // Assert
  415. Assert.Equal(HttpStatusCode.PartialContent, response.StatusCode);
  416. Assert.Equal("1", responseString);
  417. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  418. Assert.Equal(EntityTag, response.Headers.ETag);
  419. Assert.NotNull(response.Content.Headers.ContentRange);
  420. Assert.Equal("bytes 1-1/62", response.Content.Headers.ContentRange.ToString());
  421. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  422. }
  423. [Fact]
  424. public async Task PreconditionIfRangeLastModifiedIgnoreTest()
  425. {
  426. // Arrange
  427. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  428. Client.DefaultRequestHeaders.Add("If-Range", HeaderUtilities.FormatDate(LastModified.AddSeconds(-1)));
  429. // Act
  430. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  431. response.EnsureSuccessStatusCode();
  432. string responseString = await response.Content.ReadAsStringAsync();
  433. // Assert
  434. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  435. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  436. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  437. Assert.Equal(EntityTag, response.Headers.ETag);
  438. Assert.Null(response.Content.Headers.ContentRange);
  439. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  440. }
  441. [Fact]
  442. public async Task PreconditionIfRangeLastModifiedLessTest()
  443. {
  444. // Arrange
  445. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  446. Client.DefaultRequestHeaders.Add("If-Range", HeaderUtilities.FormatDate(LastModified.AddSeconds(1)));
  447. // Act
  448. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  449. response.EnsureSuccessStatusCode();
  450. string responseString = await response.Content.ReadAsStringAsync();
  451. // Assert
  452. // Assert
  453. Assert.Equal(HttpStatusCode.PartialContent, response.StatusCode);
  454. Assert.Equal("1", responseString);
  455. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  456. Assert.Equal(EntityTag, response.Headers.ETag);
  457. Assert.NotNull(response.Content.Headers.ContentRange);
  458. Assert.Equal("bytes 1-1/62", response.Content.Headers.ContentRange.ToString());
  459. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  460. }
  461. [Fact]
  462. public async Task PreconditionIfUnmodifiedSinceFailTest()
  463. {
  464. // Arrange
  465. Client.DefaultRequestHeaders.Add("If-Unmodified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(-1)));
  466. // Act
  467. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  468. string responseString = await response.Content.ReadAsStringAsync();
  469. // Assert
  470. Assert.Equal(HttpStatusCode.PreconditionFailed, response.StatusCode);
  471. Assert.Equal(string.Empty, responseString);
  472. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  473. Assert.Equal(EntityTag, response.Headers.ETag);
  474. Assert.Null(response.Content.Headers.ContentRange);
  475. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  476. }
  477. [Fact]
  478. public async Task PreconditionIfUnmodifiedSinceIfMatchFailTest()
  479. {
  480. // Arrange
  481. Client.DefaultRequestHeaders.Add("If-Match", EntityTag.ToString());
  482. Client.DefaultRequestHeaders.Add("If-Unmodified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(-1)));
  483. // Act
  484. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  485. string responseString = await response.Content.ReadAsStringAsync();
  486. // Assert
  487. Assert.Equal(HttpStatusCode.PreconditionFailed, response.StatusCode);
  488. Assert.Equal(string.Empty, responseString);
  489. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  490. Assert.Equal(EntityTag, response.Headers.ETag);
  491. Assert.Null(response.Content.Headers.ContentRange);
  492. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  493. }
  494. [Fact]
  495. public async Task PreconditionIfUnmodifiedSinceSuccessEqualTest()
  496. {
  497. // Arrange
  498. Client.DefaultRequestHeaders.Add("If-Unmodified-Since", HeaderUtilities.FormatDate(LastModified));
  499. // Act
  500. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  501. string responseString = await response.Content.ReadAsStringAsync();
  502. // Assert
  503. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  504. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  505. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  506. Assert.Equal(EntityTag, response.Headers.ETag);
  507. Assert.Null(response.Content.Headers.ContentRange);
  508. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  509. }
  510. [Fact]
  511. public async Task PreconditionIfUnmodifiedSinceSuccessLessTest()
  512. {
  513. // Arrange
  514. Client.DefaultRequestHeaders.Add("If-Unmodified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(1)));
  515. // Act
  516. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  517. response.EnsureSuccessStatusCode();
  518. string responseString = await response.Content.ReadAsStringAsync();
  519. // Assert
  520. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  521. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  522. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  523. Assert.Equal(EntityTag, response.Headers.ETag);
  524. Assert.Null(response.Content.Headers.ContentRange);
  525. Assert.Equal("attachment", response.Content.Headers.ContentDisposition.DispositionType);
  526. }
  527. }
  528. }