Skip to content

Commit a3939c2

Browse files
committed
Added comment & style fix & new unit test for issue #82
1 parent 38f62bc commit a3939c2

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

src/FubarDev.FtpServer/Networking/StreamPipeWriterService.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ public StreamPipeWriterService(
3939
Stream = stream;
4040
_pipeReader = pipeReader;
4141
}
42+
43+
/// <summary>
44+
/// Gets the stream used to write the output.
45+
/// </summary>
4246
protected Stream Stream { get; }
4347

4448
/// <inheritdoc />
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// <copyright file="Issue82ProtocolViolation.cs" company="Fubar Development Junker">
2+
// Copyright (c) Fubar Development Junker. All rights reserved.
3+
// </copyright>
4+
5+
using System.Collections.Generic;
6+
using System.IO;
7+
using System.Net;
8+
using System.Threading.Tasks;
9+
10+
using Xunit;
11+
12+
namespace FubarDev.FtpServer.Tests.Issues
13+
{
14+
public class Issue82ProtocolViolation : IClassFixture<FtpServerFixture>
15+
{
16+
private readonly IFtpServer _server;
17+
18+
public Issue82ProtocolViolation(FtpServerFixture ftpServerFixture)
19+
{
20+
_server = ftpServerFixture.Server;
21+
}
22+
23+
[Fact]
24+
public async Task TestParallelRequests()
25+
{
26+
var tasks = new List<Task>();
27+
var maxTasks = 100;
28+
for (var i = 0; i != maxTasks; i++)
29+
{
30+
var task = Task.Run(GetFilesAsync);
31+
tasks.Add(task);
32+
}
33+
34+
await Task.WhenAll(tasks).ConfigureAwait(false);
35+
}
36+
37+
private async Task<IList<string>> GetFilesAsync()
38+
{
39+
var requestUri = $"ftp://127.0.0.1:{_server.Port}";
40+
var request = (FtpWebRequest)WebRequest.Create(requestUri);
41+
request.Method = WebRequestMethods.Ftp.ListDirectory;
42+
request.Credentials = new NetworkCredential("anonymous", "foo@bar.com");
43+
request.KeepAlive = false;
44+
45+
var files = new List<string>();
46+
using (var response = await request.GetResponseAsync().ConfigureAwait(false))
47+
{
48+
using var responseStream = response.GetResponseStream();
49+
using var reader = new StreamReader(responseStream);
50+
string line;
51+
while ((line = reader.ReadLine()) != null)
52+
{
53+
files.Add(Path.GetFileName(line));
54+
}
55+
56+
reader.Close();
57+
responseStream.Close();
58+
}
59+
60+
return files;
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)