|
1 | 1 | // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
|
2 | 2 |
|
3 | 3 | using System;
|
| 4 | +using System.Collections.Generic; |
4 | 5 | using System.Linq;
|
5 | 6 | using System.Net;
|
6 | 7 | using System.Net.Http;
|
7 | 8 | using System.Text;
|
8 | 9 | using System.Threading.Tasks;
|
| 10 | +using Microsoft.Extensions.Primitives; |
9 | 11 | using Xunit;
|
10 | 12 |
|
11 | 13 | namespace Microsoft.Net.Http.Server
|
@@ -415,6 +417,65 @@ public async Task Headers_FlushAsyncSendsHeaders_Success()
|
415 | 417 | }
|
416 | 418 | }
|
417 | 419 |
|
| 420 | + [Theory] |
| 421 | + [InlineData("Server", "\r\nData")] |
| 422 | + [InlineData("Server", "\0Data")] |
| 423 | + [InlineData("Server", "Data\r")] |
| 424 | + [InlineData("Server", "Da\0ta")] |
| 425 | + [InlineData("Server", "Da\u001Fta")] |
| 426 | + [InlineData("Unknown-Header", "\r\nData")] |
| 427 | + [InlineData("Unknown-Header", "\0Data")] |
| 428 | + [InlineData("Unknown-Header", "Data\0")] |
| 429 | + [InlineData("Unknown-Header", "Da\nta")] |
| 430 | + [InlineData("\r\nServer", "Data")] |
| 431 | + [InlineData("Server\r", "Data")] |
| 432 | + [InlineData("Ser\0ver", "Data")] |
| 433 | + [InlineData("Server\r\n", "Data")] |
| 434 | + [InlineData("\u001FServer", "Data")] |
| 435 | + [InlineData("Unknown-Header\r\n", "Data")] |
| 436 | + [InlineData("\0Unknown-Header", "Data")] |
| 437 | + [InlineData("Unknown\r-Header", "Data")] |
| 438 | + [InlineData("Unk\nown-Header", "Data")] |
| 439 | + public async Task AddingControlCharactersToHeadersThrows(string key, string value) |
| 440 | + { |
| 441 | + string address; |
| 442 | + using (var server = Utilities.CreateHttpServer(out address)) |
| 443 | + { |
| 444 | + Task<HttpResponseMessage> responseTask = SendRequestAsync(address); |
| 445 | + |
| 446 | + var context = await server.GetContextAsync(); |
| 447 | + |
| 448 | + var responseHeaders = context.Response.Headers; |
| 449 | + |
| 450 | + Assert.Throws<InvalidOperationException>(() => { |
| 451 | + responseHeaders[key] = value; |
| 452 | + }); |
| 453 | + |
| 454 | + Assert.Throws<InvalidOperationException>(() => { |
| 455 | + responseHeaders[key] = new StringValues(new[] { "valid", value }); |
| 456 | + }); |
| 457 | + |
| 458 | + Assert.Throws<InvalidOperationException>(() => { |
| 459 | + ((IDictionary<string, StringValues>)responseHeaders)[key] = value; |
| 460 | + }); |
| 461 | + |
| 462 | + Assert.Throws<InvalidOperationException>(() => { |
| 463 | + var kvp = new KeyValuePair<string, StringValues>(key, value); |
| 464 | + ((ICollection<KeyValuePair<string, StringValues>>)responseHeaders).Add(kvp); |
| 465 | + }); |
| 466 | + |
| 467 | + Assert.Throws<InvalidOperationException>(() => { |
| 468 | + var kvp = new KeyValuePair<string, StringValues>(key, value); |
| 469 | + ((IDictionary<string, StringValues>)responseHeaders).Add(key, value); |
| 470 | + }); |
| 471 | + |
| 472 | + context.Dispose(); |
| 473 | + |
| 474 | + HttpResponseMessage response = await responseTask; |
| 475 | + response.EnsureSuccessStatusCode(); |
| 476 | + } |
| 477 | + } |
| 478 | + |
418 | 479 | private async Task<HttpResponseMessage> SendRequestAsync(string uri, bool usehttp11 = true, bool sendKeepAlive = false)
|
419 | 480 | {
|
420 | 481 | using (HttpClient client = new HttpClient())
|
|
0 commit comments