Skip to content

Commit 3093a6c

Browse files
committed
encode the query parameters
1 parent fee7104 commit 3093a6c

File tree

2 files changed

+84
-3
lines changed

2 files changed

+84
-3
lines changed

src/AlibabaCloud.OSS.V2/Internal/ClientImpl.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ provider is not Credentials.AnonymousCredentialsProvider &&
159159
result.SignedHeaders = signedHeaders;
160160
}
161161

162-
result.Url = request.RequestUri.ToString();
162+
result.Url = request.RequestUri.AbsoluteUri;
163163
result.Method = request.Method;
164164

165165
return result;
@@ -509,10 +509,10 @@ private static string CombineQueryString(IDictionary<string, string>? parameters
509509

510510
isFirst = false;
511511

512-
queryString.Append(p.Key);
512+
queryString.Append(p.Key.UrlEncode());
513513

514514
if (!string.IsNullOrEmpty(p.Value))
515-
queryString.Append("=").Append(WebUtility.UrlEncode(p.Value));
515+
queryString.Append("=").Append(p.Value.UrlEncode());
516516
}
517517

518518
return queryString.ToString();

test/AlibabaCloud.OSS.V2.IntegrationTests/ClientMiscTest.cs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,4 +924,85 @@ public async Task TestPutGetObjectByFilePathWithProgress()
924924
Assert.Equal(fileInfo.Length, transferred);
925925
Assert.Equal(fileInfo.Length, increment);
926926
}
927+
928+
[Fact]
929+
public async Task TestQueryWithSpecialChar()
930+
{
931+
var client = Utils.GetDefaultClient();
932+
933+
//default
934+
var bucketName = Utils.RandomBucketName(BucketNamePrefix);
935+
936+
var result = await client.PutBucketAsync(
937+
new()
938+
{
939+
Bucket = bucketName
940+
}
941+
);
942+
943+
Assert.NotNull(result);
944+
Assert.Equal(200, result.StatusCode);
945+
Assert.NotNull(result.RequestId);
946+
947+
// only body
948+
var objectName = "special/char-123+ 456.txt";
949+
const string content = "hello world, hi oss!";
950+
951+
var putRequest = new PutObjectRequest()
952+
{
953+
Bucket = bucketName,
954+
Key = objectName,
955+
};
956+
putRequest.Parameters.Add("with-plus", "123+456");
957+
putRequest.Parameters.Add("with-space", "123 456");
958+
putRequest.Parameters.Add("key-plus+", "value-key1");
959+
putRequest.Parameters.Add("key space", "value-key2");
960+
961+
var preResult = client.Presign(putRequest);
962+
963+
Assert.NotNull(preResult);
964+
Assert.Empty(preResult.SignedHeaders);
965+
Assert.Equal("PUT", preResult.Method);
966+
Assert.NotNull(preResult.Expiration);
967+
Assert.Contains("with-plus=123%2B456", preResult.Url);
968+
Assert.Contains("with-space=123%20456", preResult.Url);
969+
Assert.Contains("special/char-123%2B%20456.txt", preResult.Url);
970+
Assert.Contains("key-plus%2B=value-key1", preResult.Url);
971+
Assert.Contains("key%20space=value-key2", preResult.Url);
972+
973+
using var hc = new HttpClient();
974+
var httpResult = await hc.PutAsync(preResult.Url, new ByteArrayContent(Encoding.UTF8.GetBytes(content)));
975+
Assert.NotNull(httpResult);
976+
Assert.True(httpResult.IsSuccessStatusCode);
977+
978+
var getRequest = new GetObjectRequest()
979+
{
980+
Bucket = bucketName,
981+
Key = objectName,
982+
};
983+
getRequest.Parameters.Add("with-plus", "123+456");
984+
getRequest.Parameters.Add("with-space", "123 456");
985+
getRequest.Parameters.Add("key-plus+", "value-key1");
986+
getRequest.Parameters.Add("key space", "value-key2");
987+
988+
preResult = client.Presign(getRequest);
989+
Assert.NotNull(preResult);
990+
Assert.Empty(preResult.SignedHeaders);
991+
Assert.Equal("GET", preResult.Method);
992+
Assert.NotNull(preResult.Expiration);
993+
994+
httpResult = await hc.GetAsync(preResult.Url);
995+
Assert.NotNull(httpResult);
996+
Assert.True(httpResult.IsSuccessStatusCode);
997+
var stream = await httpResult.Content.ReadAsStreamAsync();
998+
using var reader = new StreamReader(stream);
999+
var got = await reader.ReadToEndAsync();
1000+
Assert.Equal(content, got);
1001+
1002+
var getResult = await client.GetObjectAsync(getRequest);
1003+
Assert.NotNull(getResult);
1004+
using var reader1 = new StreamReader(getResult.Body);
1005+
var got1 = await reader1.ReadToEndAsync();
1006+
Assert.Equal(content, got1);
1007+
}
9271008
}

0 commit comments

Comments
 (0)