浏览代码

Bug 1667: Support redirected WebDAV downloads (even to other hosts) – 2nd (preserving query strings)

https://winscp.net/tracker/1667

Source commit: 64372e53b3d64e4236b4db50c305d4401c440f2a
Martin Prikryl 3 年之前
父节点
当前提交
718ed232c1
共有 2 个文件被更改,包括 13 次插入7 次删除
  1. 12 6
      source/core/WebDAVFileSystem.cpp
  2. 1 1
      source/core/WebDAVFileSystem.h

+ 12 - 6
source/core/WebDAVFileSystem.cpp

@@ -273,9 +273,9 @@ void TWebDAVFileSystem::NeonClientOpenSessionInternal(UnicodeString & CorrectedU
     FSessionInfo.CSCipher = EmptyStr;
     FSessionInfo.SCCipher = EmptyStr;
 
-    UTF8String Path;
+    UTF8String Path, DiscardQuery;
     DebugAssert(FSessionContext == NULL);
-    FSessionContext = NeonOpen(Url, Path);
+    FSessionContext = NeonOpen(Url, Path, DiscardQuery);
 
     bool Ssl = IsTlsSession(FSessionContext->NeonSession);
     FSessionInfo.SecurityProtocolName = Ssl ? LoadStr(FTPS_IMPLICIT) : EmptyStr;
@@ -335,7 +335,7 @@ void __fastcall TWebDAVFileSystem::InitSession(TSessionContext * SessionContext,
   ne_set_session_flag(Session, NE_SESSFLAG_LIBERAL_ESCAPING, Data->WebDavLiberalEscaping || FOneDrive);
 }
 //---------------------------------------------------------------------------
-TWebDAVFileSystem::TSessionContext * TWebDAVFileSystem::NeonOpen(const UnicodeString & Url, UTF8String & Path)
+TWebDAVFileSystem::TSessionContext * TWebDAVFileSystem::NeonOpen(const UnicodeString & Url, UTF8String & Path, UTF8String & Query)
 {
   ne_uri uri;
   NeonParseUrl(Url, uri);
@@ -350,6 +350,7 @@ TWebDAVFileSystem::TSessionContext * TWebDAVFileSystem::NeonOpen(const UnicodeSt
   InitSession(Result.get(), Result->NeonSession);
 
   Path = uri.path;
+  Query = uri.query;
   bool Ssl = IsTlsUri(uri);
   ne_uri_free(&uri);
   ne_set_aux_request_init(Result->NeonSession, NeonAuxRequestInit, Result.get());
@@ -1772,9 +1773,14 @@ void __fastcall TWebDAVFileSystem::Sink(
       if (IsValidRedirect(NeonStatus, DiscardPath))
       {
         UnicodeString CorrectedUrl = GetRedirectUrl();
-        UTF8String CorrectedFileName;
-        std::unique_ptr<TSessionContext> CorrectedSessionContext(NeonOpen(CorrectedUrl, CorrectedFileName));
-        NeonStatus = ne_get(CorrectedSessionContext->NeonSession, CorrectedFileName.c_str(), FD);
+        UTF8String CorrectedFileName, Query;
+        std::unique_ptr<TSessionContext> CorrectedSessionContext(NeonOpen(CorrectedUrl, CorrectedFileName, Query));
+        UTF8String RedirectUrl = CorrectedFileName;
+        if (!Query.IsEmpty())
+        {
+          RedirectUrl += L"?" + Query;
+        }
+        NeonStatus = ne_get(CorrectedSessionContext->NeonSession, RedirectUrl.c_str(), FD);
         CheckStatus(CorrectedSessionContext.get(), NeonStatus);
       }
       else

+ 1 - 1
source/core/WebDAVFileSystem.h

@@ -116,7 +116,7 @@ protected:
   static int NeonBodyAccepter(void * UserData, ne_request * Request, const ne_status * Status);
   static void NeonCreateRequest(ne_request * Request, void * UserData, const char * Method, const char * Uri);
   static int NeonRequestAuth(void * UserData, const char * Realm, int Attempt, char * UserName, char * Password);
-  TSessionContext * NeonOpen(const UnicodeString & Url, UTF8String & Path);
+  TSessionContext * NeonOpen(const UnicodeString & Url, UTF8String & Path, UTF8String & Query);
   void NeonClientOpenSessionInternal(UnicodeString & CorrectedUrl, UnicodeString Url);
   static void NeonNotifier(void * UserData, ne_session_status Status, const ne_session_status_info * StatusInfo);
   static ssize_t NeonUploadBodyProvider(void * UserData, char * Buffer, size_t BufLen);