Skip to content

Commit

Permalink
Fix FileUploadService
Browse files Browse the repository at this point in the history
  • Loading branch information
ob-stripe committed Sep 21, 2018
1 parent d589749 commit fefc6aa
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 27 deletions.
24 changes: 16 additions & 8 deletions src/Stripe.net/Infrastructure/Requestor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ public static StripeResponse Delete(string url, RequestOptions requestOptions)
return ExecuteRequest(wr);
}

public static StripeResponse PostFile(string url, string fileName, Stream fileStream, string purpose, RequestOptions requestOptions)
public static StripeResponse PostFile(string url, Stream stream, string purpose, RequestOptions requestOptions)
{
var wr = GetRequestMessage(url, HttpMethod.Post, requestOptions);

ApplyMultiPartFileToRequest(wr, fileName, fileStream, purpose);
ApplyMultiPartFileToRequest(wr, stream, purpose);

return ExecuteRequest(wr);
}
Expand Down Expand Up @@ -94,11 +94,11 @@ private static StripeResponse ExecuteRequest(HttpRequestMessage requestMessage)
return ExecuteRequestAsync(wr, cancellationToken);
}

public static Task<StripeResponse> PostFileAsync(string url, string fileName, Stream fileStream, string purpose, RequestOptions requestOptions, CancellationToken cancellationToken = default(CancellationToken))
public static Task<StripeResponse> PostFileAsync(string url, Stream stream, string purpose, RequestOptions requestOptions, CancellationToken cancellationToken = default(CancellationToken))
{
var wr = GetRequestMessage(url, HttpMethod.Post, requestOptions);

ApplyMultiPartFileToRequest(wr, fileName, fileStream, purpose);
ApplyMultiPartFileToRequest(wr, stream, purpose);

return ExecuteRequestAsync(wr, cancellationToken);
}
Expand Down Expand Up @@ -187,16 +187,24 @@ private static string GetAuthorizationHeaderValue(string apiKey)
return $"Bearer {apiKey}";
}

private static void ApplyMultiPartFileToRequest(HttpRequestMessage requestMessage, string fileName, Stream fileStream, string purpose)
private static void ApplyMultiPartFileToRequest(HttpRequestMessage requestMessage, Stream stream, string purpose)
{
requestMessage.Headers.ExpectContinue = true;

if (string.IsNullOrEmpty(fileName))
string fileName = "blob";

#if NET45
// Doing this on .NET Standard would require us to bump the minimum framework version
// to .NET Standard 1.3, which isn't worth it since the filename is basically ignored
// by the server.
FileStream fileStream = stream as FileStream;
if ((fileStream != null) && (!string.IsNullOrEmpty(fileStream.Name)))
{
fileName = "blob";
fileName = fileStream.Name;
}
#endif

var fileContent = new StreamContent(fileStream);
var fileContent = new StreamContent(stream);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "\"file\"",
Expand Down
24 changes: 24 additions & 0 deletions src/Stripe.net/Services/FileUploads/FileUploadCreateOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
namespace Stripe
{
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

public class FileUploadCreateOptions : BaseOptions
{
/// <summary>
/// REQUIRED. A file to upload. The file should follow the specifications of RFC 2388
/// (which defines file transfers for the <c>multipart/form-data</c> protocol).
/// </summary>
[JsonProperty("file")]
public Stream File { get; set; }

/// <summary>
/// REQUIRED. The purpose of the uploaded file. Possible values are <c>business_logo</c>,
/// <c>customer_signature</c>, <c>dispute_evidence</c>, <c>identity_document</c>,
/// <c>pci_document</c>, or <c>tax_document_user_upload</c>
/// </summary>
[JsonProperty("purpose")]
public string Purpose { get; set; }
}
}
39 changes: 24 additions & 15 deletions src/Stripe.net/Services/FileUploads/FileUploadService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,34 +18,35 @@ public FileUploadService(string apiKey)
{
}

public virtual FileUpload Create(string fileName, Stream fileStream, string purpose, RequestOptions requestOptions = null)
public virtual FileUpload Create(FileUploadCreateOptions options, RequestOptions requestOptions = null)
{
return Mapper<FileUpload>.MapFromJson(
Requestor.PostFile(Urls.FileUploads, fileName, fileStream, purpose, this.SetupRequestOptions(requestOptions)));
Requestor.PostFile(
Urls.FileUploads,
options.File,
options.Purpose,
this.SetupRequestOptions(requestOptions)));
}

public virtual FileUpload Get(string fileUploadId, RequestOptions requestOptions = null)
public virtual async Task<FileUpload> CreateAsync(FileUploadCreateOptions options, RequestOptions requestOptions = null, CancellationToken cancellationToken = default(CancellationToken))
{
return Mapper<FileUpload>.MapFromJson(
Requestor.GetString(
this.ApplyAllParameters(null, $"{Urls.FileUploads}/{fileUploadId}"),
this.SetupRequestOptions(requestOptions)));
await Requestor.PostFileAsync(
Urls.FileUploads,
options.File,
options.Purpose,
this.SetupRequestOptions(requestOptions),
cancellationToken).ConfigureAwait(false));
}

public virtual StripeList<FileUpload> List(FileUploadListOptions listOptions = null, RequestOptions requestOptions = null)
public virtual FileUpload Get(string fileUploadId, RequestOptions requestOptions = null)
{
return Mapper<StripeList<FileUpload>>.MapFromJson(
return Mapper<FileUpload>.MapFromJson(
Requestor.GetString(
this.ApplyAllParameters(listOptions, Urls.FileUploads, true),
this.ApplyAllParameters(null, $"{Urls.FileUploads}/{fileUploadId}"),
this.SetupRequestOptions(requestOptions)));
}

public virtual async Task<FileUpload> CreateAsync(string fileName, Stream fileStream, string purpose, RequestOptions requestOptions = null, CancellationToken cancellationToken = default(CancellationToken))
{
return Mapper<FileUpload>.MapFromJson(
await Requestor.PostFileAsync(Urls.FileUploads, fileName, fileStream, purpose, this.SetupRequestOptions(requestOptions), cancellationToken).ConfigureAwait(false));
}

public virtual async Task<FileUpload> GetAsync(string fileUploadId, RequestOptions requestOptions = null, CancellationToken cancellationToken = default(CancellationToken))
{
return Mapper<FileUpload>.MapFromJson(
Expand All @@ -55,6 +56,14 @@ await Requestor.GetStringAsync(
cancellationToken).ConfigureAwait(false));
}

public virtual StripeList<FileUpload> List(FileUploadListOptions listOptions = null, RequestOptions requestOptions = null)
{
return Mapper<StripeList<FileUpload>>.MapFromJson(
Requestor.GetString(
this.ApplyAllParameters(listOptions, Urls.FileUploads, true),
this.SetupRequestOptions(requestOptions)));
}

public virtual async Task<StripeList<FileUpload>> ListAsync(FileUploadListOptions listOptions = null, RequestOptions requestOptions = null, CancellationToken cancellationToken = default(CancellationToken))
{
return Mapper<StripeList<FileUpload>>.MapFromJson(
Expand Down
Empty file modified src/Stripe.net/Stripe.net.csproj
100755 → 100644
Empty file.
12 changes: 8 additions & 4 deletions src/StripeTests/Services/FileUploads/FileUploadServiceTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,19 @@ public class FileUploadServiceTest : BaseStripeTest
private const string FileUploadId = "file_123";
private const string FileName = "StripeTests.Resources.file_upload_logo.png";

private Stream stream;
private FileUploadService service;
private FileUploadCreateOptions createOptions;
private FileUploadListOptions listOptions;

public FileUploadServiceTest()
{
this.service = new FileUploadService();

this.stream = typeof(FileUploadServiceTest).GetTypeInfo().Assembly.GetManifestResourceStream(FileName);
this.createOptions = new FileUploadCreateOptions()
{
File = typeof(FileUploadServiceTest).GetTypeInfo().Assembly.GetManifestResourceStream(FileName),
Purpose = FilePurpose.BusinessLogo,
};

this.listOptions = new FileUploadListOptions()
{
Expand All @@ -33,15 +37,15 @@ public FileUploadServiceTest()
[Fact]
public void Create()
{
var fileUpload = this.service.Create(FileName, this.stream, FilePurpose.BusinessLogo);
var fileUpload = this.service.Create(createOptions);
Assert.NotNull(fileUpload);
Assert.Equal("file_upload", fileUpload.Object);
}

[Fact]
public async Task CreateAsync()
{
var fileUpload = await this.service.CreateAsync(FileName, this.stream, FilePurpose.BusinessLogo);
var fileUpload = await this.service.CreateAsync(createOptions);
Assert.NotNull(fileUpload);
Assert.Equal("file_upload", fileUpload.Object);
}
Expand Down

0 comments on commit fefc6aa

Please sign in to comment.