Skip to content

Commit 75e3b1b

Browse files
committed
fix put policy lost ForceSaveKey and improve its tests
1 parent 049db22 commit 75e3b1b

File tree

2 files changed

+213
-35
lines changed

2 files changed

+213
-35
lines changed

src/Qiniu/Storage/PutPolicy.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ public class PutPolicy
3232
[JsonProperty("insertOnly", NullValueHandling = NullValueHandling.Ignore)]
3333
public int? InsertOnly { get; set; }
3434

35+
/// <summary>
36+
/// [可选]saveKey 的优先级设置。为 true 时,saveKey不能为空,会忽略客户端指定的key,强制使用saveKey进行文件命名。
37+
/// 默认为 false
38+
/// </summary>
39+
[JsonProperty("forceSaveKey", NullValueHandling = NullValueHandling.Ignore)]
40+
public bool? ForceSaveKey { get; set; }
41+
3542
/// <summary>
3643
/// [可选]保存文件的key
3744
/// </summary>
@@ -105,13 +112,13 @@ public class PutPolicy
105112
public string PersistentPipeline { get; set; }
106113

107114
/// <summary>
108-
/// [可选]上传文件大小限制:最小值
115+
/// [可选]上传文件大小限制:最小值,单位Byte
109116
/// </summary>
110117
[JsonProperty("fsizeMin", NullValueHandling = NullValueHandling.Ignore)]
111118
public int? FsizeMin { get; set; }
112119

113120
/// <summary>
114-
/// [可选]上传文件大小限制:最大值
121+
/// [可选]上传文件大小限制:最大值,单位Byte
115122
/// </summary>
116123
[JsonProperty("fsizeLimit", NullValueHandling = NullValueHandling.Ignore)]
117124
public int? FsizeLimit { get; set; }
Lines changed: 204 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,193 @@
1-
using NUnit.Framework;
1+
using System;
2+
using NUnit.Framework;
23
using Qiniu.Tests;
34
using Qiniu.Util;
4-
using System;
5+
56
namespace Qiniu.Storage.Tests
67
{
78
[TestFixture]
89
public class PutPolicyTests : TestEnv
910
{
1011
[Test]
11-
public void CreateUptokenTest()
12+
public void SimplePutPolicyTest()
1213
{
13-
Mac mac = new Mac(AccessKey, SecretKey);
14-
PutPolicy putPolicy = null;
15-
// 简单上传凭证
16-
putPolicy = new PutPolicy();
14+
PutPolicy putPolicy = new PutPolicy();
1715
putPolicy.Scope = Bucket;
18-
string upToken = Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
19-
Console.WriteLine(upToken);
2016

21-
// 自定义凭证有效期(示例2小时)
22-
putPolicy = new PutPolicy();
17+
string expectedScope = string.Format("\"scope\":\"{0}\"", Bucket);
18+
string deadlineSubstring = DateTimeOffset.UtcNow.AddSeconds(3600).ToUnixTimeSeconds().ToString();
19+
// discard the precision to the second level
20+
deadlineSubstring = deadlineSubstring.Substring(0, deadlineSubstring.Length - 1);
21+
string expectedDeadline = string.Format("\"deadline\":{0}", deadlineSubstring);
22+
string actual = putPolicy.ToJsonString();
23+
24+
Assert.That(actual, Does.Contain(expectedScope));
25+
Assert.That(actual, Does.Contain(expectedDeadline));
26+
}
27+
28+
[Test]
29+
public void InsertOnlyPutPolicyTest()
30+
{
31+
PutPolicy putPolicy = new PutPolicy();
32+
putPolicy.Scope = String.Format("{0}:{1}", Bucket, "key/of/file");
33+
putPolicy.InsertOnly = 1;
34+
35+
string expectedScope = String.Format("\"scope\":\"{0}:{1}\"", Bucket, "key/of/file");
36+
string expectedInsertOnly = "\"insertOnly\":1";
37+
string actual = putPolicy.ToJsonString();
38+
39+
Assert.That(actual, Does.Contain(expectedScope));
40+
Assert.That(actual, Does.Contain(expectedInsertOnly));
41+
}
42+
43+
[Test]
44+
public void IsPrefixalScopePutPolicyTest()
45+
{
46+
PutPolicy putPolicy = new PutPolicy();
47+
putPolicy.Scope = String.Format("{0}:{1}", Bucket, "key/of/prefix-");
48+
putPolicy.isPrefixalScope = 1;
49+
50+
string expectedScope = String.Format("\"scope\":\"{0}:{1}\"", Bucket, "key/of/prefix-");
51+
string expectedIsPrefixalScope = "\"isPrefixalScope\":1";
52+
string actual = putPolicy.ToJsonString();
53+
54+
Assert.That(actual, Does.Contain(expectedScope));
55+
Assert.That(actual, Does.Contain(expectedIsPrefixalScope));
56+
}
57+
58+
[Test]
59+
public void ExpiresPutPolicyTest()
60+
{
61+
PutPolicy putPolicy = new PutPolicy();
2362
putPolicy.Scope = Bucket;
2463
putPolicy.SetExpires(7200);
25-
upToken = Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
26-
Console.WriteLine(upToken);
2764

28-
// 覆盖上传凭证
29-
putPolicy = new PutPolicy();
65+
string deadlineSubstring = DateTimeOffset.UtcNow.AddSeconds(7200).ToUnixTimeSeconds().ToString();
66+
// discard the precision to the second level
67+
deadlineSubstring = deadlineSubstring.Substring(0, deadlineSubstring.Length - 1);
68+
string expectedDeadline = string.Format("\"deadline\":{0}", deadlineSubstring);
69+
string actual = putPolicy.ToJsonString();
70+
71+
Assert.That(actual, Does.Contain(expectedDeadline));
72+
}
73+
74+
[Test]
75+
public void ForceSavaKeyPutPolicyTest()
76+
{
77+
PutPolicy putPolicy = new PutPolicy();
78+
putPolicy.Scope = Bucket;
79+
putPolicy.ForceSaveKey = true;
80+
putPolicy.SaveKey = "key/of/file";
81+
82+
string expectedForceSaveKey = "\"forceSaveKey\":true";
83+
string expectedSaveKey = "\"saveKey\":\"key/of/file\"";
84+
string actual = putPolicy.ToJsonString();
85+
86+
Assert.That(actual, Does.Contain(expectedForceSaveKey));
87+
Assert.That(actual, Does.Contain(expectedSaveKey));
88+
}
89+
90+
[Test]
91+
public void OverwritePutPolicyTest()
92+
{
93+
PutPolicy putPolicy = new PutPolicy();
3094
string keyToOverwrite = "qiniu.png";
3195
putPolicy.Scope = string.Format("{0}:{1}", Bucket, keyToOverwrite);
32-
upToken = Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
33-
Console.WriteLine(upToken);
3496

35-
// 自定义上传回复(非callback模式)凭证
36-
putPolicy = new PutPolicy();
97+
string expectedScope = String.Format("\"scope\":\"{0}:{1}\"", Bucket, keyToOverwrite);
98+
string actual = putPolicy.ToJsonString();
99+
100+
Assert.That(actual, Does.Contain(expectedScope));
101+
}
102+
103+
[Test]
104+
public void CustomReturnBodyPutPolicyTest()
105+
{
106+
PutPolicy putPolicy = new PutPolicy();
37107
putPolicy.Scope = Bucket;
38108
putPolicy.ReturnBody = "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"fsiz\":$(fsize),\"bucket\":\"$(bucket)\",\"name\":\"$(x:name)\"}";
39-
upToken = Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
40-
Console.WriteLine(upToken);
41109

42-
// 带回调业务服务器的凭证(application/json)
43-
putPolicy = new PutPolicy();
110+
string expectedReturnBody = "\"returnBody\":\"{\\\"key\\\":\\\"$(key)\\\",\\\"hash\\\":\\\"$(etag)\\\",\\\"fsiz\\\":$(fsize),\\\"bucket\\\":\\\"$(bucket)\\\",\\\"name\\\":\\\"$(x:name)\\\"}\"";
111+
string actual = putPolicy.ToJsonString();
112+
113+
Assert.That(actual, Does.Contain(expectedReturnBody));
114+
}
115+
116+
[Test]
117+
public void CustomReturnUrlPutPolicyTest()
118+
{
119+
120+
PutPolicy putPolicy = new PutPolicy();
121+
putPolicy.Scope = Bucket;
122+
putPolicy.ReturnUrl = "http://api.example.com/qiniu/upload/return";
123+
124+
string expectedReturnBody = "\"returnUrl\":\"http://api.example.com/qiniu/upload/return\"";
125+
string actual = putPolicy.ToJsonString();
126+
127+
Assert.That(actual, Does.Contain(expectedReturnBody));
128+
}
129+
130+
[Test]
131+
public void CallbackJsonPutPolicyTest()
132+
{
133+
PutPolicy putPolicy = new PutPolicy();
44134
putPolicy.Scope = Bucket;
45135
putPolicy.CallbackUrl = "http://api.example.com/qiniu/upload/callback";
46136
putPolicy.CallbackBody = "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"fsiz\":$(fsize),\"bucket\":\"$(bucket)\",\"name\":\"$(x:name)\"}";
47137
putPolicy.CallbackBodyType = "application/json";
48-
upToken = Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
49-
Console.WriteLine(upToken);
50138

51-
// 带回调业务服务器的凭证(application/x-www-form-urlencoded)
52-
putPolicy = new PutPolicy();
139+
string expectedCallbackUrl = "\"callbackUrl\":\"http://api.example.com/qiniu/upload/callback\"";
140+
string expectedCallbackBody = "\"callbackBody\":\"{\\\"key\\\":\\\"$(key)\\\",\\\"hash\\\":\\\"$(etag)\\\",\\\"fsiz\\\":$(fsize),\\\"bucket\\\":\\\"$(bucket)\\\",\\\"name\\\":\\\"$(x:name)\\\"}\"";
141+
string expectedCallbackBodyType = "\"callbackBodyType\":\"application/json\"";
142+
string actual = putPolicy.ToJsonString();
143+
144+
Assert.That(actual, Does.Contain(expectedCallbackUrl));
145+
Assert.That(actual, Does.Contain(expectedCallbackBody));
146+
Assert.That(actual, Does.Contain(expectedCallbackBodyType));
147+
}
148+
149+
[Test]
150+
public void CallbackUrlEncodedPutPolicyTest()
151+
{
152+
PutPolicy putPolicy = new PutPolicy();
53153
putPolicy.Scope = Bucket;
54154
putPolicy.CallbackUrl = "http://api.example.com/qiniu/upload/callback";
55155
putPolicy.CallbackBody = "key=$(key)&hash=$(etag)&bucket=$(bucket)&fsize=$(fsize)&name=$(x:name)";
56-
upToken = Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
57-
Console.WriteLine(upToken);
156+
putPolicy.CallbackHost = "api.example.com";
157+
158+
string expectedCallbackUrl = "\"callbackUrl\":\"http://api.example.com/qiniu/upload/callback\"";
159+
string expectedCallbackBody = "\"callbackBody\":\"key=$(key)&hash=$(etag)&bucket=$(bucket)&fsize=$(fsize)&name=$(x:name)\"";
160+
string expectedCallbackHost = "\"callbackHost\":\"api.example.com\"";
161+
string actual = putPolicy.ToJsonString();
162+
163+
Assert.That(actual, Does.Contain(expectedCallbackUrl));
164+
Assert.That(actual, Does.Contain(expectedCallbackBody));
165+
Assert.That(actual, Does.Contain(expectedCallbackHost));
166+
}
167+
168+
[Test]
169+
public void CallbackFetchKeyPutPolicyTest()
170+
{
171+
PutPolicy putPolicy = new PutPolicy();
172+
putPolicy.Scope = Bucket;
173+
putPolicy.CallbackUrl = "http://api.example.com/qiniu/upload/callback";
174+
putPolicy.CallbackFetchKey = 1;
175+
putPolicy.CallbackBody = "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"fsiz\":$(fsize),\"bucket\":\"$(bucket)\",\"name\":\"$(x:name)\"}";
58176

59-
// 带数据处理的凭证
60-
putPolicy = new PutPolicy();
177+
string expectedCallbackUrl = "\"callbackUrl\":\"http://api.example.com/qiniu/upload/callback\"";
178+
string expectedCallbackFetchKey = "\"callbackFetchKey\":1";
179+
string expectedCallbackBody = "\"callbackBody\":\"{\\\"key\\\":\\\"$(key)\\\",\\\"hash\\\":\\\"$(etag)\\\",\\\"fsiz\\\":$(fsize),\\\"bucket\\\":\\\"$(bucket)\\\",\\\"name\\\":\\\"$(x:name)\\\"}\"";
180+
string actual = putPolicy.ToJsonString();
181+
182+
Assert.That(actual, Does.Contain(expectedCallbackUrl));
183+
Assert.That(actual, Does.Contain(expectedCallbackFetchKey));
184+
Assert.That(actual, Does.Contain(expectedCallbackBody));
185+
}
186+
187+
[Test]
188+
public void DataProcessPutPolicyTest()
189+
{
190+
PutPolicy putPolicy = new PutPolicy();
61191
string saveMp4Entry = Base64.UrlSafeBase64Encode(Bucket + ":avthumb_test_target.mp4");
62192
string saveJpgEntry = Base64.UrlSafeBase64Encode(Bucket + ":vframe_test_target.jpg");
63193
string avthumbMp4Fop = "avthumb/mp4|saveas/" + saveMp4Entry;
@@ -67,9 +197,50 @@ public void CreateUptokenTest()
67197
putPolicy.PersistentOps = fops;
68198
putPolicy.PersistentPipeline = "video-pipe";
69199
putPolicy.PersistentNotifyUrl = "http://api.example.com/qiniu/pfop/notify";
70-
upToken = Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
71-
Console.WriteLine(upToken);
200+
201+
string expectedPersistentOps = string.Format("\"persistentOps\":\"{0}\"", fops);
202+
string expectedPersistentPipeline = "\"persistentPipeline\":\"video-pipe\"";
203+
string expectedPersistentNotifyUrl = "\"persistentNotifyUrl\":\"http://api.example.com/qiniu/pfop/notify\"";
204+
string actual = putPolicy.ToJsonString();
205+
206+
Assert.That(actual, Does.Contain(expectedPersistentOps));
207+
Assert.That(actual, Does.Contain(expectedPersistentPipeline));
208+
Assert.That(actual, Does.Contain(expectedPersistentNotifyUrl));
209+
}
210+
211+
[Test]
212+
public void EndUserPutPolicyTest()
213+
{
214+
PutPolicy putPolicy = new PutPolicy();
215+
putPolicy.Scope = Bucket;
216+
putPolicy.EndUser = "mock_end_user";
217+
218+
string expectedEndUser = "\"endUser\":\"mock_end_user\"";
219+
string actual = putPolicy.ToJsonString();
220+
221+
Assert.That(actual, Does.Contain(expectedEndUser));
72222
}
73223

224+
[Test]
225+
public void FileLimitPutPolicyTest()
226+
{
227+
PutPolicy putPolicy = new PutPolicy();
228+
putPolicy.Scope = Bucket;
229+
putPolicy.FsizeMin = 1024; // 1KB
230+
putPolicy.FsizeLimit = 1024 * 1024; // 1MB
231+
putPolicy.DetectMime = 1;
232+
putPolicy.MimeLimit = "image/*";
233+
234+
string expectedFsizeMin = "\"fsizeMin\":1024";
235+
string expectedFsizeLimit = "\"fsizeLimit\":1048576";
236+
string expectedDetectMime = "\"detectMime\":1";
237+
string expectedMimeLimit = "\"mimeLimit\":\"image/*\"";
238+
string actual = putPolicy.ToJsonString();
239+
240+
Assert.That(actual, Does.Contain(expectedFsizeMin));
241+
Assert.That(actual, Does.Contain(expectedFsizeLimit));
242+
Assert.That(actual, Does.Contain(expectedDetectMime));
243+
Assert.That(actual, Does.Contain(expectedMimeLimit));
244+
}
74245
}
75246
}

0 commit comments

Comments
 (0)