Skip to content

Commit a24dddb

Browse files
committed
Fix FileUploadService
1 parent d4634b9 commit a24dddb

File tree

5 files changed

+72
-27
lines changed

5 files changed

+72
-27
lines changed

src/Stripe.net/Infrastructure/Requestor.cs

+16-8
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ public static StripeResponse Delete(string url, RequestOptions requestOptions)
4949
return ExecuteRequest(wr);
5050
}
5151

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

56-
ApplyMultiPartFileToRequest(wr, fileName, fileStream, purpose);
56+
ApplyMultiPartFileToRequest(wr, stream, purpose);
5757

5858
return ExecuteRequest(wr);
5959
}
@@ -94,11 +94,11 @@ private static StripeResponse ExecuteRequest(HttpRequestMessage requestMessage)
9494
return ExecuteRequestAsync(wr, cancellationToken);
9595
}
9696

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

101-
ApplyMultiPartFileToRequest(wr, fileName, fileStream, purpose);
101+
ApplyMultiPartFileToRequest(wr, stream, purpose);
102102

103103
return ExecuteRequestAsync(wr, cancellationToken);
104104
}
@@ -187,16 +187,24 @@ private static string GetAuthorizationHeaderValue(string apiKey)
187187
return $"Bearer {apiKey}";
188188
}
189189

190-
private static void ApplyMultiPartFileToRequest(HttpRequestMessage requestMessage, string fileName, Stream fileStream, string purpose)
190+
private static void ApplyMultiPartFileToRequest(HttpRequestMessage requestMessage, Stream stream, string purpose)
191191
{
192192
requestMessage.Headers.ExpectContinue = true;
193193

194-
if (string.IsNullOrEmpty(fileName))
194+
string fileName = "blob";
195+
196+
#if NET45
197+
// Doing this on .NET Standard would require us to bump the minimum framework version
198+
// to .NET Standard 1.3, which isn't worth it since the filename is basically ignored
199+
// by the server.
200+
FileStream fileStream = stream as FileStream;
201+
if ((fileStream != null) && (!string.IsNullOrEmpty(fileStream.Name)))
195202
{
196-
fileName = "blob";
203+
fileName = fileStream.Name;
197204
}
205+
#endif
198206

199-
var fileContent = new StreamContent(fileStream);
207+
var fileContent = new StreamContent(stream);
200208
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
201209
{
202210
Name = "\"file\"",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
namespace Stripe
2+
{
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using Newtonsoft.Json;
6+
7+
public class FileUploadCreateOptions : BaseOptions
8+
{
9+
/// <summary>
10+
/// REQUIRED. A file to upload. The file should follow the specifications of RFC 2388
11+
/// (which defines file transfers for the <c>multipart/form-data</c> protocol).
12+
/// </summary>
13+
[JsonProperty("file")]
14+
public Stream File { get; set; }
15+
16+
/// <summary>
17+
/// REQUIRED. The purpose of the uploaded file. Possible values are <c>business_logo</c>,
18+
/// <c>customer_signature</c>, <c>dispute_evidence</c>, <c>identity_document</c>,
19+
/// <c>pci_document</c>, or <c>tax_document_user_upload</c>
20+
/// </summary>
21+
[JsonProperty("purpose")]
22+
public string Purpose { get; set; }
23+
}
24+
}

src/Stripe.net/Services/FileUploads/FileUploadService.cs

+24-15
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,35 @@ public FileUploadService(string apiKey)
1818
{
1919
}
2020

21-
public virtual FileUpload Create(string fileName, Stream fileStream, string purpose, RequestOptions requestOptions = null)
21+
public virtual FileUpload Create(FileUploadCreateOptions options, RequestOptions requestOptions = null)
2222
{
2323
return Mapper<FileUpload>.MapFromJson(
24-
Requestor.PostFile(Urls.FileUploads, fileName, fileStream, purpose, this.SetupRequestOptions(requestOptions)));
24+
Requestor.PostFile(
25+
Urls.FileUploads,
26+
options.File,
27+
options.Purpose,
28+
this.SetupRequestOptions(requestOptions)));
2529
}
2630

27-
public virtual FileUpload Get(string fileUploadId, RequestOptions requestOptions = null)
31+
public virtual async Task<FileUpload> CreateAsync(FileUploadCreateOptions options, RequestOptions requestOptions = null, CancellationToken cancellationToken = default(CancellationToken))
2832
{
2933
return Mapper<FileUpload>.MapFromJson(
30-
Requestor.GetString(
31-
this.ApplyAllParameters(null, $"{Urls.FileUploads}/{fileUploadId}"),
32-
this.SetupRequestOptions(requestOptions)));
34+
await Requestor.PostFileAsync(
35+
Urls.FileUploads,
36+
options.File,
37+
options.Purpose,
38+
this.SetupRequestOptions(requestOptions),
39+
cancellationToken).ConfigureAwait(false));
3340
}
3441

35-
public virtual StripeList<FileUpload> List(FileUploadListOptions listOptions = null, RequestOptions requestOptions = null)
42+
public virtual FileUpload Get(string fileUploadId, RequestOptions requestOptions = null)
3643
{
37-
return Mapper<StripeList<FileUpload>>.MapFromJson(
44+
return Mapper<FileUpload>.MapFromJson(
3845
Requestor.GetString(
39-
this.ApplyAllParameters(listOptions, Urls.FileUploads, true),
46+
this.ApplyAllParameters(null, $"{Urls.FileUploads}/{fileUploadId}"),
4047
this.SetupRequestOptions(requestOptions)));
4148
}
4249

43-
public virtual async Task<FileUpload> CreateAsync(string fileName, Stream fileStream, string purpose, RequestOptions requestOptions = null, CancellationToken cancellationToken = default(CancellationToken))
44-
{
45-
return Mapper<FileUpload>.MapFromJson(
46-
await Requestor.PostFileAsync(Urls.FileUploads, fileName, fileStream, purpose, this.SetupRequestOptions(requestOptions), cancellationToken).ConfigureAwait(false));
47-
}
48-
4950
public virtual async Task<FileUpload> GetAsync(string fileUploadId, RequestOptions requestOptions = null, CancellationToken cancellationToken = default(CancellationToken))
5051
{
5152
return Mapper<FileUpload>.MapFromJson(
@@ -55,6 +56,14 @@ await Requestor.GetStringAsync(
5556
cancellationToken).ConfigureAwait(false));
5657
}
5758

59+
public virtual StripeList<FileUpload> List(FileUploadListOptions listOptions = null, RequestOptions requestOptions = null)
60+
{
61+
return Mapper<StripeList<FileUpload>>.MapFromJson(
62+
Requestor.GetString(
63+
this.ApplyAllParameters(listOptions, Urls.FileUploads, true),
64+
this.SetupRequestOptions(requestOptions)));
65+
}
66+
5867
public virtual async Task<StripeList<FileUpload>> ListAsync(FileUploadListOptions listOptions = null, RequestOptions requestOptions = null, CancellationToken cancellationToken = default(CancellationToken))
5968
{
6069
return Mapper<StripeList<FileUpload>>.MapFromJson(

src/Stripe.net/Stripe.net.csproj

100755100644
File mode changed.

src/StripeTests/Services/FileUploads/FileUploadServiceTest.cs

+8-4
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,19 @@ public class FileUploadServiceTest : BaseStripeTest
1414
private const string FileUploadId = "file_123";
1515
private const string FileName = "StripeTests.Resources.file_upload_logo.png";
1616

17-
private Stream stream;
1817
private FileUploadService service;
18+
private FileUploadCreateOptions createOptions;
1919
private FileUploadListOptions listOptions;
2020

2121
public FileUploadServiceTest()
2222
{
2323
this.service = new FileUploadService();
2424

25-
this.stream = typeof(FileUploadServiceTest).GetTypeInfo().Assembly.GetManifestResourceStream(FileName);
25+
this.createOptions = new FileUploadCreateOptions()
26+
{
27+
File = typeof(FileUploadServiceTest).GetTypeInfo().Assembly.GetManifestResourceStream(FileName),
28+
Purpose = FilePurpose.BusinessLogo,
29+
};
2630

2731
this.listOptions = new FileUploadListOptions()
2832
{
@@ -33,15 +37,15 @@ public FileUploadServiceTest()
3337
[Fact]
3438
public void Create()
3539
{
36-
var fileUpload = this.service.Create(FileName, this.stream, FilePurpose.BusinessLogo);
40+
var fileUpload = this.service.Create(createOptions);
3741
Assert.NotNull(fileUpload);
3842
Assert.Equal("file_upload", fileUpload.Object);
3943
}
4044

4145
[Fact]
4246
public async Task CreateAsync()
4347
{
44-
var fileUpload = await this.service.CreateAsync(FileName, this.stream, FilePurpose.BusinessLogo);
48+
var fileUpload = await this.service.CreateAsync(createOptions);
4549
Assert.NotNull(fileUpload);
4650
Assert.Equal("file_upload", fileUpload.Object);
4751
}

0 commit comments

Comments
 (0)