Skip to content

Commit bd607ea

Browse files
committed
support to unencode slash in presigned url path.
1 parent 17b16ed commit bd607ea

File tree

5 files changed

+98
-2
lines changed

5 files changed

+98
-2
lines changed

sdk/include/alibabacloud/oss/model/GeneratePresignedUrlRequest.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,15 @@ namespace OSS
4444
void addResponseHeaders(RequestResponseHeader header, const std::string& value);
4545
void addParameter(const std::string& key, const std::string& value);
4646
MetaData& UserMetaData();
47+
void setUnencodedSlash(bool value);
4748
private:
4849
friend class OssClientImpl;
4950
std::string bucket_;
5051
std::string key_;
5152
Http::Method method_;
5253
ObjectMetaData metaData_;
5354
ParameterCollection parameters_;
55+
bool unencodedSlash_;
5456
};
5557
}
5658
}

sdk/src/OssClientImpl.cc

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1313,9 +1313,16 @@ StringOutcome OssClientImpl::GeneratePresignedUrl(const GeneratePresignedUrlRequ
13131313
parameters["OSSAccessKeyId"] = credentials.AccessKeyId();
13141314
parameters["Signature"] = signature;
13151315

1316+
//host
13161317
std::stringstream ss;
13171318
ss << CombineHostString(endpoint_, request.bucket_, configuration().isCname);
1318-
ss << CombinePathString(endpoint_, request.bucket_, request.key_);
1319+
//path
1320+
auto path = CombinePathString(endpoint_, request.bucket_, request.key_);
1321+
if (request.unencodedSlash_) {
1322+
StringReplace(path, "%2F", "/");
1323+
}
1324+
ss << path;
1325+
//query
13191326
ss << "?";
13201327
ss << CombineQueryString(parameters);
13211328

sdk/src/model/GeneratePresignedUrlRequest.cc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ GeneratePresignedUrlRequest::GeneratePresignedUrlRequest(const std::string &buck
3030
GeneratePresignedUrlRequest::GeneratePresignedUrlRequest(const std::string &bucket, const std::string &key, Http::Method method):
3131
bucket_(bucket),
3232
key_(key),
33-
method_(method)
33+
method_(method),
34+
unencodedSlash_(false)
3435
{
3536
//defalt 15 min
3637
std::time_t t = std::time(nullptr) + 15*60;
@@ -102,3 +103,8 @@ MetaData &GeneratePresignedUrlRequest::UserMetaData()
102103
{
103104
return metaData_.UserMetaData();
104105
}
106+
107+
void GeneratePresignedUrlRequest::setUnencodedSlash(bool value)
108+
{
109+
unencodedSlash_ = value;
110+
}

test/src/Object/ObjectSignedUrlTest.cc

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,83 @@ TEST_F(ObjectSignedUrlTest, PutObjectByUrlRequestFunctionTest)
590590
EXPECT_TRUE(paramters.empty());
591591
}
592592

593+
TEST_F(ObjectSignedUrlTest, UnencodedSlashTest)
594+
{
595+
std::string key = TestUtils::GetObjectKey("UnencodedSlashTest/123/456%2F/123");
596+
std::shared_ptr<std::iostream> content = TestUtils::GetRandomStream(2048);
597+
598+
std::string md5 = ComputeContentMD5(*content.get());
599+
600+
GeneratePresignedUrlRequest request(BucketName, key, Http::Put);
601+
request.setExpires(GetExpiresDelayS(120));
602+
request.setContentMd5(md5);
603+
request.setContentType("text/rtf");
604+
request.UserMetaData()["Author"] = "oss";
605+
request.UserMetaData()["Test"] = "test";
606+
request.addParameter("x-param-null", "");
607+
request.addParameter("x-param-space0", " ");
608+
request.addParameter("x-param-value", "value");
609+
request.addParameter("x-param-space1", " ");
610+
611+
auto urlOutcome = Client->GeneratePresignedUrl(request);
612+
EXPECT_EQ(urlOutcome.isSuccess(), true);
613+
EXPECT_TRUE(urlOutcome.result().find("UnencodedSlashTest%2F123%2F456%252F%2F123") != std::string::npos);
614+
615+
ObjectMetaData meta;
616+
meta.setContentMd5(md5);
617+
meta.setContentType("text/rtf");
618+
meta.UserMetaData()["Author"] = "oss";
619+
meta.UserMetaData()["Test"] = "test";
620+
621+
auto pOutcome = Client->PutObjectByUrl(urlOutcome.result(), content, meta);
622+
EXPECT_EQ(pOutcome.isSuccess(), true);
623+
EXPECT_EQ(TestUtils::ObjectExists(*Client, BucketName, key), true);
624+
625+
auto metaOutcome = Client->HeadObject(BucketName, key);
626+
EXPECT_EQ(metaOutcome.isSuccess(), true);
627+
EXPECT_STREQ(metaOutcome.result().ContentType().c_str(), "text/rtf");
628+
EXPECT_STREQ(metaOutcome.result().UserMetaData().at("Author").c_str(), "oss");
629+
EXPECT_STREQ(metaOutcome.result().UserMetaData().at("author").c_str(), "oss");
630+
EXPECT_STREQ(metaOutcome.result().UserMetaData().at("Test").c_str(), "test");
631+
EXPECT_STREQ(metaOutcome.result().UserMetaData().at("tesT").c_str(), "test");
632+
633+
//
634+
request = GeneratePresignedUrlRequest(BucketName, key, Http::Put);
635+
request.setExpires(GetExpiresDelayS(120));
636+
request.setContentMd5(md5);
637+
request.setContentType("text/rtf");
638+
request.UserMetaData()["Author"] = "oss1";
639+
request.UserMetaData()["Test"] = "test1";
640+
request.addParameter("x-param-null", "");
641+
request.addParameter("x-param-space0", " ");
642+
request.addParameter("x-param-value", "value");
643+
request.addParameter("x-param-space1", " ");
644+
request.setUnencodedSlash(true);
645+
646+
urlOutcome = Client->GeneratePresignedUrl(request);
647+
EXPECT_EQ(urlOutcome.isSuccess(), true);
648+
EXPECT_TRUE(urlOutcome.result().find("UnencodedSlashTest/123/456%252F/123") != std::string::npos);
649+
650+
meta = ObjectMetaData();
651+
meta.setContentMd5(md5);
652+
meta.setContentType("text/rtf");
653+
meta.UserMetaData()["Author"] = "oss1";
654+
meta.UserMetaData()["Test"] = "test1";
655+
656+
pOutcome = Client->PutObjectByUrl(urlOutcome.result(), content, meta);
657+
EXPECT_EQ(pOutcome.isSuccess(), true);
658+
EXPECT_EQ(TestUtils::ObjectExists(*Client, BucketName, key), true);
659+
660+
metaOutcome = Client->HeadObject(BucketName, key);
661+
EXPECT_EQ(metaOutcome.isSuccess(), true);
662+
EXPECT_STREQ(metaOutcome.result().ContentType().c_str(), "text/rtf");
663+
EXPECT_STREQ(metaOutcome.result().UserMetaData().at("Author").c_str(), "oss1");
664+
EXPECT_STREQ(metaOutcome.result().UserMetaData().at("author").c_str(), "oss1");
665+
EXPECT_STREQ(metaOutcome.result().UserMetaData().at("Test").c_str(), "test1");
666+
EXPECT_STREQ(metaOutcome.result().UserMetaData().at("tesT").c_str(), "test1");
667+
}
668+
669+
593670

594671
}
595672
}

test/src/Other/UtilsFunctionTest.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,10 @@ TEST_F(UtilsFunctionTest, StringReplaceTest)
606606

607607
StringReplace(test, "abcd", "A");
608608
EXPECT_EQ(test, "1234AABCD1234");
609+
610+
test = "12212";
611+
StringReplace(test, "12", "21");
612+
EXPECT_EQ(test, "21221");
609613
}
610614

611615
TEST_F(UtilsFunctionTest, UploadAndDownloadObject)

0 commit comments

Comments
 (0)