Skip to content

Commit a152a09

Browse files
committed
Add the IMultipartFormDataParser interface
1 parent e290340 commit a152a09

2 files changed

Lines changed: 38 additions & 14 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Collections.Generic;
2+
3+
namespace HttpMultipartParser
4+
{
5+
/// <summary>
6+
/// Provides methods to parse a
7+
/// <see href="http://www.ietf.org/rfc/rfc2388.txt">
8+
/// <c>multipart/form-data</c>
9+
/// </see>
10+
/// stream into it's parameters and file data.
11+
/// </summary>
12+
public interface IMultipartFormDataParser
13+
{
14+
/// <summary>
15+
/// Gets the mapping of parameters parsed files. The name of a given field
16+
/// maps to the parsed file data.
17+
/// </summary>
18+
IReadOnlyList<FilePart> Files { get; }
19+
20+
/// <summary>
21+
/// Gets the parameters. Several ParameterParts may share the same name.
22+
/// </summary>
23+
IReadOnlyList<ParameterPart> Parameters { get; }
24+
}
25+
}

Source/HttpMultipartParser/MultipartFormDataParser.cs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ namespace HttpMultipartParser
8181
/// }
8282
/// </code>
8383
/// </example>
84-
public class MultipartFormDataParser
84+
public class MultipartFormDataParser : IMultipartFormDataParser
8585
{
86-
#region Constants
86+
#region Constants and fields
8787

8888
/// <summary>
8989
/// The default buffer size.
@@ -95,6 +95,9 @@ public class MultipartFormDataParser
9595
/// </remarks>
9696
private const int DefaultBufferSize = 4096;
9797

98+
private readonly List<FilePart> _files;
99+
private readonly List<ParameterPart> _parameters;
100+
98101
#endregion
99102

100103
#region Constructors and Destructors
@@ -104,6 +107,8 @@ public class MultipartFormDataParser
104107
/// </summary>
105108
private MultipartFormDataParser()
106109
{
110+
_files = new List<FilePart>();
111+
_parameters = new List<ParameterPart>();
107112
}
108113

109114
#endregion
@@ -114,12 +119,12 @@ private MultipartFormDataParser()
114119
/// Gets the mapping of parameters parsed files. The name of a given field
115120
/// maps to the parsed file data.
116121
/// </summary>
117-
public List<FilePart> Files { get; private set; }
122+
public IReadOnlyList<FilePart> Files => _files.AsReadOnly();
118123

119124
/// <summary>
120125
/// Gets the parameters. Several ParameterParts may share the same name.
121126
/// </summary>
122-
public List<ParameterPart> Parameters { get; private set; }
127+
public IReadOnlyList<ParameterPart> Parameters => _parameters.AsReadOnly();
123128

124129
#endregion
125130

@@ -304,18 +309,15 @@ public IEnumerable<string> GetParameterValues(string name)
304309
/// </param>
305310
private void ParseStream(Stream stream, string boundary, Encoding encoding, int binaryBufferSize, string[] binaryMimeTypes)
306311
{
307-
Files = new List<FilePart>();
308-
Parameters = new List<ParameterPart>();
309-
310312
var streamingParser = new StreamingMultipartFormDataParser(stream, boundary, encoding ?? Encoding.UTF8, binaryBufferSize, binaryMimeTypes);
311-
streamingParser.ParameterHandler += parameterPart => Parameters.Add(parameterPart);
313+
streamingParser.ParameterHandler += parameterPart => _parameters.Add(parameterPart);
312314

313315
streamingParser.FileHandler += (name, fileName, type, disposition, buffer, bytes, partNumber, additionalProperties) =>
314316
{
315317
if (partNumber == 0)
316318
{
317319
// create file with first partNo
318-
Files.Add(new FilePart(name, fileName, Utilities.MemoryStreamManager.GetStream($"{typeof(MultipartFormDataParser).FullName}.{nameof(ParseStream)}"), additionalProperties, type, disposition));
320+
_files.Add(new FilePart(name, fileName, Utilities.MemoryStreamManager.GetStream($"{typeof(MultipartFormDataParser).FullName}.{nameof(ParseStream)}"), additionalProperties, type, disposition));
319321
}
320322

321323
Files[Files.Count - 1].Data.Write(buffer, 0, bytes);
@@ -352,18 +354,15 @@ private void ParseStream(Stream stream, string boundary, Encoding encoding, int
352354
/// </param>
353355
private async Task ParseStreamAsync(Stream stream, string boundary, Encoding encoding, int binaryBufferSize, string[] binaryMimeTypes)
354356
{
355-
Files = new List<FilePart>();
356-
Parameters = new List<ParameterPart>();
357-
358357
var streamingParser = new StreamingMultipartFormDataParser(stream, boundary, encoding ?? Encoding.UTF8, binaryBufferSize, binaryMimeTypes);
359-
streamingParser.ParameterHandler += parameterPart => Parameters.Add(parameterPart);
358+
streamingParser.ParameterHandler += parameterPart => _parameters.Add(parameterPart);
360359

361360
streamingParser.FileHandler += (name, fileName, type, disposition, buffer, bytes, partNumber, additionalProperties) =>
362361
{
363362
if (partNumber == 0)
364363
{
365364
// create file with first partNo
366-
Files.Add(new FilePart(name, fileName, Utilities.MemoryStreamManager.GetStream($"{typeof(MultipartFormDataParser).FullName}.{nameof(ParseStreamAsync)}"), additionalProperties, type, disposition));
365+
_files.Add(new FilePart(name, fileName, Utilities.MemoryStreamManager.GetStream($"{typeof(MultipartFormDataParser).FullName}.{nameof(ParseStreamAsync)}"), additionalProperties, type, disposition));
367366
}
368367

369368
Files[Files.Count - 1].Data.Write(buffer, 0, bytes);

0 commit comments

Comments
 (0)