@@ -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}
0 commit comments