浏览代码

Bug 1939: Compatibility with Google Cloud Storage when using S3 protocol to access the buckets

https://winscp.net/tracker/1939
(cherry picked from commit 461327a9962f0c61f048e294fbe68803d7a6338c)

Source commit: c54b5630d7656cd3d81e2d2170ed3a9857b73443
Martin Prikryl 4 年之前
父节点
当前提交
ba1a5978d8
共有 3 个文件被更改,包括 19 次插入0 次删除
  1. 7 0
      source/core/S3FileSystem.cpp
  2. 9 0
      source/core/SessionData.cpp
  3. 3 0
      source/core/SessionData.h

+ 7 - 0
source/core/S3FileSystem.cpp

@@ -894,6 +894,13 @@ void TS3FileSystem::ReadDirectoryInternal(
 
       Retry = false;
 
+      if ((FTerminal->SessionData->S3MaxKeys == asOff) ||
+          ((FTerminal->SessionData->S3MaxKeys == asAuto) &&
+           SameText(L"storage.googleapis.com", FTerminal->SessionData->HostNameExpanded)))
+      {
+        MaxKeys = 0;
+      }
+
       S3_list_service(
         FLibS3Protocol, FAccessKeyId.c_str(), FSecretAccessKey.c_str(), FSecurityToken, (FHostName + FPortSuffix).c_str(),
         StrToS3(FAuthRegion), MaxKeys, FRequestContext, FTimeout, &ListServiceHandler, &Data);

+ 9 - 0
source/core/SessionData.cpp

@@ -236,6 +236,7 @@ void __fastcall TSessionData::DefaultSettings()
   S3DefaultRegion = L"";
   S3SessionToken = L"";
   S3UrlStyle = s3usVirtualHost;
+  S3MaxKeys = asAuto;
 
   // SFTP
   SftpServer = L"";
@@ -396,6 +397,7 @@ void __fastcall TSessionData::NonPersistant()
   PROPERTY(S3DefaultRegion); \
   PROPERTY(S3SessionToken); \
   PROPERTY(S3UrlStyle); \
+  PROPERTY(S3MaxKeys); \
   \
   PROPERTY(ProxyMethod); \
   PROPERTY(ProxyHost); \
@@ -729,6 +731,7 @@ void __fastcall TSessionData::DoLoad(THierarchicalStorage * Storage, bool PuttyI
   S3DefaultRegion = Storage->ReadString(L"S3DefaultRegion", S3DefaultRegion);
   S3SessionToken = Storage->ReadString(L"S3SessionToken", S3SessionToken);
   S3UrlStyle = (TS3UrlStyle)Storage->ReadInteger(L"S3UrlStyle", S3UrlStyle);
+  S3MaxKeys = (TAutoSwitch)Storage->ReadInteger(L"S3MaxKeys", S3MaxKeys);
 
   // PuTTY defaults to TcpNoDelay, but the psftp/pscp ignores this preference, and always set this to off (what is our default too)
   if (!PuttyImport)
@@ -1111,6 +1114,7 @@ void __fastcall TSessionData::DoSave(THierarchicalStorage * Storage,
     WRITE_DATA(String, S3DefaultRegion);
     WRITE_DATA(String, S3SessionToken);
     WRITE_DATA(Integer, S3UrlStyle);
+    WRITE_DATA(Integer, S3MaxKeys);
     WRITE_DATA(Integer, SendBuf);
     WRITE_DATA(String, SourceAddress);
     WRITE_DATA(String, ProtocolFeatures);
@@ -4101,6 +4105,11 @@ void __fastcall TSessionData::SetS3UrlStyle(TS3UrlStyle value)
   SET_SESSION_PROPERTY(S3UrlStyle);
 }
 //---------------------------------------------------------------------
+void __fastcall TSessionData::SetS3MaxKeys(TAutoSwitch value)
+{
+  SET_SESSION_PROPERTY(S3MaxKeys);
+}
+//---------------------------------------------------------------------
 void __fastcall TSessionData::SetIsWorkspace(bool value)
 {
   SET_SESSION_PROPERTY(IsWorkspace);

+ 3 - 0
source/core/SessionData.h

@@ -225,6 +225,7 @@ private:
   UnicodeString FS3DefaultRegion;
   UnicodeString FS3SessionToken;
   TS3UrlStyle FS3UrlStyle;
+  TAutoSwitch FS3MaxKeys;
   bool FIsWorkspace;
   UnicodeString FLink;
   UnicodeString FNameOverride;
@@ -407,6 +408,7 @@ private:
   void __fastcall SetS3DefaultRegion(UnicodeString value);
   void __fastcall SetS3SessionToken(UnicodeString value);
   void __fastcall SetS3UrlStyle(TS3UrlStyle value);
+  void __fastcall SetS3MaxKeys(TAutoSwitch value);
   void __fastcall SetLogicalHostName(UnicodeString value);
   void __fastcall SetIsWorkspace(bool value);
   void __fastcall SetLink(UnicodeString value);
@@ -673,6 +675,7 @@ public:
   __property UnicodeString S3DefaultRegion = { read = FS3DefaultRegion, write = SetS3DefaultRegion };
   __property UnicodeString S3SessionToken = { read = FS3SessionToken, write = SetS3SessionToken };
   __property TS3UrlStyle S3UrlStyle = { read = FS3UrlStyle, write = SetS3UrlStyle };
+  __property TAutoSwitch S3MaxKeys = { read = FS3MaxKeys, write = SetS3MaxKeys };
   __property bool IsWorkspace = { read = FIsWorkspace, write = SetIsWorkspace };
   __property UnicodeString Link = { read = FLink, write = SetLink };
   __property UnicodeString NameOverride = { read = FNameOverride, write = SetNameOverride };