Skip to content

Commit

Permalink
Add support for HttpFile.Name on HttpListener + ASP.NET
Browse files Browse the repository at this point in the history
  • Loading branch information
mythz committed Feb 6, 2016
1 parent ae31a91 commit 071e1ee
Show file tree
Hide file tree
Showing 8 changed files with 85 additions and 63 deletions.
4 changes: 2 additions & 2 deletions src/ServiceStack/Host/AspNet/AspNetRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -370,12 +370,12 @@ public IHttpFile[] Files
if (httpFiles == null)
{
httpFiles = new IHttpFile[request.Files.Count];
for (var i = 0; i < request.Files.Count; i++)
for (int i = 0; i < request.Files.Count; i++)
{
var reqFile = request.Files[i];

httpFiles[i] = new HttpFile
{
Name = request.Files.AllKeys[i],
ContentType = reqFile.ContentType,
ContentLength = reqFile.ContentLength,
FileName = reqFile.FileName,
Expand Down
15 changes: 8 additions & 7 deletions src/ServiceStack/Host/HttpFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@

namespace ServiceStack.Host
{
public class HttpFile : IHttpFile
{
public string FileName { get; set; }
public long ContentLength { get; set; }
public string ContentType { get; set; }
public Stream InputStream { get; set; }
}
public class HttpFile : IHttpFile
{
public string Name { get; set; }
public string FileName { get; set; }
public long ContentLength { get; set; }
public string ContentType { get; set; }
public Stream InputStream { get; set; }
}
}
4 changes: 2 additions & 2 deletions src/ServiceStack/Host/HttpListener/ListenerRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -335,12 +335,12 @@ public IHttpFile[] Files
return httpFiles = new IHttpFile[0];

httpFiles = new IHttpFile[files.Count];
for (var i = 0; i < files.Count; i++)
for (int i = 0; i < files.Count; i++)
{
var reqFile = files[i];

httpFiles[i] = new HttpFile
{
Name = files.AllKeys[i],
ContentType = reqFile.ContentType,
ContentLength = reqFile.ContentLength,
FileName = reqFile.FileName,
Expand Down
2 changes: 2 additions & 0 deletions src/ServiceStack/RequestExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using ServiceStack.Caching;
using ServiceStack.Host;
using ServiceStack.Web;
Expand Down
8 changes: 8 additions & 0 deletions tests/ServiceStack.WebHost.Endpoints.Tests/FileUploadTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ public void Can_POST_upload_file()
AssertResponse<FileUploadResponse>((HttpWebResponse)webResponse, r =>
{
var expectedContents = new StreamReader(uploadFile.OpenRead()).ReadToEnd();
Assert.That(r.Name, Is.EqualTo("file"));
Assert.That(r.FileName, Is.EqualTo(uploadFile.Name));
Assert.That(r.ContentLength, Is.EqualTo(uploadFile.Length));
Assert.That(r.ContentType, Is.EqualTo(MimeTypes.GetMimeType(uploadFile.Name)));
Expand All @@ -119,6 +120,7 @@ public void Can_POST_upload_file_using_ServiceClient()


var expectedContents = new StreamReader(uploadFile.OpenRead()).ReadToEnd();
Assert.That(response.Name, Is.EqualTo("file"));
Assert.That(response.FileName, Is.EqualTo(uploadFile.Name));
Assert.That(response.ContentLength, Is.EqualTo(uploadFile.Length));
Assert.That(response.ContentType, Is.EqualTo(MimeTypes.GetMimeType(uploadFile.Name)));
Expand All @@ -136,6 +138,7 @@ public void Can_POST_upload_file_using_ServiceClient_with_request()
var response = client.PostFileWithRequest<FileUploadResponse>(ListeningOn + "/fileuploads", uploadFile, request);

var expectedContents = new StreamReader(uploadFile.OpenRead()).ReadToEnd();
Assert.That(response.Name, Is.EqualTo("upload"));
Assert.That(response.FileName, Is.EqualTo(uploadFile.Name));
Assert.That(response.ContentLength, Is.EqualTo(uploadFile.Length));
Assert.That(response.Contents, Is.EqualTo(expectedContents));
Expand All @@ -156,6 +159,7 @@ public void Can_POST_upload_file_using_ServiceClient_with_request_and_QueryStrin
uploadFile, request);

var expectedContents = new StreamReader(uploadFile.OpenRead()).ReadToEnd();
Assert.That(response.Name, Is.EqualTo("upload"));
Assert.That(response.FileName, Is.EqualTo(uploadFile.Name));
Assert.That(response.ContentLength, Is.EqualTo(uploadFile.Length));
Assert.That(response.Contents, Is.EqualTo(expectedContents));
Expand All @@ -173,6 +177,7 @@ public void Can_POST_upload_file_using_ServiceClient_with_request_containing_utf
var response = client.PostFileWithRequest<FileUploadResponse>(ListeningOn + "/fileuploads", uploadFile, request);

var expectedContents = new StreamReader(uploadFile.OpenRead()).ReadToEnd();
Assert.That(response.Name, Is.EqualTo("upload"));
Assert.That(response.FileName, Is.EqualTo(uploadFile.Name));
Assert.That(response.ContentLength, Is.EqualTo(uploadFile.Length));
Assert.That(response.Contents, Is.EqualTo(expectedContents));
Expand Down Expand Up @@ -235,6 +240,7 @@ public void Can_POST_upload_file_and_apply_filter_using_ServiceClient()

var expectedContents = new StreamReader(uploadFile.OpenRead()).ReadToEnd();
Assert.That(isFilterCalled);
Assert.That(response.Name, Is.EqualTo("file"));
Assert.That(response.FileName, Is.EqualTo(uploadFile.Name));
Assert.That(response.ContentLength, Is.EqualTo(uploadFile.Length));
Assert.That(response.ContentType, Is.EqualTo(MimeTypes.GetMimeType(uploadFile.Name)));
Expand Down Expand Up @@ -269,6 +275,7 @@ public void Can_POST_upload_stream_using_ServiceClient()
var expectedContents = new StreamReader(fileStream).ReadToEnd();

Assert.That(isFilterCalled);
Assert.That(response.Name, Is.EqualTo("file"));
Assert.That(response.FileName, Is.EqualTo(fileName));
Assert.That(response.ContentLength, Is.EqualTo(fileStream.Length));
Assert.That(response.ContentType, Is.EqualTo(MimeTypes.GetMimeType(fileName)));
Expand Down Expand Up @@ -304,6 +311,7 @@ public void Can_POST_upload_stream_using_JsonHttpClient()
var expectedContents = new StreamReader(fileStream).ReadToEnd();

Assert.That(isFilterCalled);
Assert.That(response.Name, Is.EqualTo("file"));
Assert.That(response.FileName, Is.EqualTo(fileName));
Assert.That(response.ContentLength, Is.EqualTo(fileStream.Length));
Assert.That(response.ContentType, Is.EqualTo(MimeTypes.GetMimeType(fileName)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@

namespace ServiceStack.WebHost.Endpoints.Tests.Support.Services
{
[DataContract]
[Route("/fileuploads/{RelativePath*}")]
[Route("/fileuploads", HttpMethods.Post)]
[DataContract]
[Route("/fileuploads/{RelativePath*}")]
[Route("/fileuploads", HttpMethods.Post)]
public class FileUpload : IReturn<FileUploadResponse>
{
[DataMember]
public string RelativePath { get; set; }
{
[DataMember]
public string RelativePath { get; set; }

[DataMember]
public string CustomerName { get; set; }
Expand All @@ -22,23 +22,26 @@ public class FileUpload : IReturn<FileUploadResponse>
public DateTime CreatedDate { get; set; }
}

[DataContract]
public class FileUploadResponse : IHasResponseStatus
{
[DataMember]
public string FileName { get; set; }
[DataContract]
public class FileUploadResponse : IHasResponseStatus
{
[DataMember]
public string Name { get; set; }

[DataMember]
public long ContentLength { get; set; }
[DataMember]
public string FileName { get; set; }

[DataMember]
public string ContentType { get; set; }
[DataMember]
public long ContentLength { get; set; }

[DataMember]
public string Contents { get; set; }
[DataMember]
public string ContentType { get; set; }

[DataMember]
public ResponseStatus ResponseStatus { get; set; }
[DataMember]
public string Contents { get; set; }

[DataMember]
public ResponseStatus ResponseStatus { get; set; }

[DataMember]
public string CustomerName { get; set; }
Expand All @@ -50,41 +53,42 @@ public class FileUploadResponse : IHasResponseStatus
public DateTime CreatedDate { get; set; }
}

public class FileUploadService : Service
{
public object Get(FileUpload request)
{
if (request.RelativePath.IsNullOrEmpty())
throw new ArgumentNullException("RelativePath");

var filePath = ("~/" + request.RelativePath).MapProjectPath();
if (!File.Exists(filePath))
throw new FileNotFoundException(request.RelativePath);

var result = new HttpResult(new FileInfo(filePath));
return result;
}

public object Post(FileUpload request)
{
if (this.Request.Files.Length == 0)
throw new FileNotFoundException("UploadError", "No such file exists");

if (request.RelativePath == "ThrowError")
throw new NotSupportedException("ThrowError");

var file = this.Request.Files[0];
return new FileUploadResponse
{
FileName = file.FileName,
ContentLength = file.ContentLength,
ContentType = file.ContentType,
Contents = new StreamReader(file.InputStream).ReadToEnd(),
public class FileUploadService : Service
{
public object Get(FileUpload request)
{
if (request.RelativePath.IsNullOrEmpty())
throw new ArgumentNullException("RelativePath");

var filePath = ("~/" + request.RelativePath).MapProjectPath();
if (!File.Exists(filePath))
throw new FileNotFoundException(request.RelativePath);

var result = new HttpResult(new FileInfo(filePath));
return result;
}

public object Post(FileUpload request)
{
if (this.Request.Files.Length == 0)
throw new FileNotFoundException("UploadError", "No such file exists");

if (request.RelativePath == "ThrowError")
throw new NotSupportedException("ThrowError");

var file = this.Request.Files[0];
return new FileUploadResponse
{
Name = file.Name,
FileName = file.FileName,
ContentLength = file.ContentLength,
ContentType = file.ContentType,
Contents = new StreamReader(file.InputStream).ReadToEnd(),
CustomerId = request.CustomerId,
CustomerName = request.CustomerName,
CreatedDate = request.CreatedDate
};
}
};
}

public object Put(FileUpload request)
{
Expand All @@ -95,5 +99,5 @@ public object Put(FileUpload request)
CreatedDate = request.CreatedDate
};
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ public class FileUpload : IReturn<FileUploadResponse>
[DataContract]
public class FileUploadResponse : IHasResponseStatus
{
[DataMember]
public string Name { get; set; }

[DataMember]
public string FileName { get; set; }

Expand Down Expand Up @@ -80,6 +83,7 @@ public object Post(FileUpload request)
var file = this.Request.Files[0];
return new FileUploadResponse
{
Name = file.Name,
FileName = file.FileName,
ContentLength = file.ContentLength,
ContentType = file.ContentType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ public void Can_POST_upload_file()
AssertResponse<FileUploadResponse>((HttpWebResponse)webResponse, r =>
{
var expectedContents = new StreamReader(uploadForm.OpenRead()).ReadToEnd();
Assert.That(r.Name, Is.EqualTo("upload"));
Assert.That(r.FileName, Is.EqualTo(uploadForm.Name));
Assert.That(r.ContentLength, Is.EqualTo(uploadForm.Length));
Assert.That(r.ContentType, Is.EqualTo(MimeTypes.GetMimeType(uploadForm.Name)));
Expand Down Expand Up @@ -118,6 +119,7 @@ public void Can_POST_upload_file_using_ServiceClient_with_request()
var response = client.PostFileWithRequest<FileUploadResponse>(Config.ServiceStackBaseUri + "/fileuploads", uploadFile, request);

var expectedContents = new StreamReader(uploadFile.OpenRead()).ReadToEnd();
Assert.That(response.Name, Is.EqualTo("upload"));
Assert.That(response.FileName, Is.EqualTo(uploadFile.Name));
Assert.That(response.ContentLength, Is.EqualTo(uploadFile.Length));
Assert.That(response.Contents, Is.EqualTo(expectedContents));
Expand All @@ -138,6 +140,7 @@ public void Can_POST_upload_file_using_ServiceClient_with_request_and_QueryStrin
uploadFile, request);

var expectedContents = new StreamReader(uploadFile.OpenRead()).ReadToEnd();
Assert.That(response.Name, Is.EqualTo("upload"));
Assert.That(response.FileName, Is.EqualTo(uploadFile.Name));
Assert.That(response.ContentLength, Is.EqualTo(uploadFile.Length));
Assert.That(response.Contents, Is.EqualTo(expectedContents));
Expand Down

0 comments on commit 071e1ee

Please sign in to comment.