@@ -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