Response FileClient::Download()

in sdk/storage/azure-storage-files-shares/src/rest_client.cpp [3418:3617]


    Response<Models::_detail::DownloadFileResult> FileClient::Download(
        Core::Http::_internal::HttpPipeline& pipeline,
        const Core::Url& url,
        const DownloadFileOptions& options,
        const Core::Context& context)
    {
      auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url, false);
      if (options.AllowTrailingDot.HasValue())
      {
        request.SetHeader(
            "x-ms-allow-trailing-dot", options.AllowTrailingDot.Value() ? "true" : "false");
      }
      request.SetHeader("x-ms-version", "2025-05-05");
      if (options.Range.HasValue() && !options.Range.Value().empty())
      {
        request.SetHeader("x-ms-range", options.Range.Value());
      }
      if (options.RangeGetContentMD5.HasValue())
      {
        request.SetHeader(
            "x-ms-range-get-content-md5", options.RangeGetContentMD5.Value() ? "true" : "false");
      }
      if (options.LeaseId.HasValue() && !options.LeaseId.Value().empty())
      {
        request.SetHeader("x-ms-lease-id", options.LeaseId.Value());
      }
      if (options.FileRequestIntent.HasValue()
          && !options.FileRequestIntent.Value().ToString().empty())
      {
        request.SetHeader("x-ms-file-request-intent", options.FileRequestIntent.Value().ToString());
      }
      auto pRawResponse = pipeline.Send(request, context);
      auto httpStatusCode = pRawResponse->GetStatusCode();
      if (!(httpStatusCode == Core::Http::HttpStatusCode::Ok
            || httpStatusCode == Core::Http::HttpStatusCode::PartialContent))
      {
        throw StorageException::CreateFromResponse(std::move(pRawResponse));
      }
      Models::_detail::DownloadFileResult response;
      response.BodyStream = pRawResponse->ExtractBodyStream();
      response.Details.LastModified = DateTime::Parse(
          pRawResponse->GetHeaders().at("Last-Modified"), Azure::DateTime::DateFormat::Rfc1123);
      for (auto i = pRawResponse->GetHeaders().lower_bound("x-ms-meta-");
           i != pRawResponse->GetHeaders().end() && i->first.substr(0, 10) == "x-ms-meta-";
           ++i)
      {
        response.Details.Metadata.emplace(i->first.substr(10), i->second);
      }
      if (pRawResponse->GetHeaders().count("Content-Type") != 0)
      {
        response.HttpHeaders.ContentType = pRawResponse->GetHeaders().at("Content-Type");
      }
      response.Details.ETag = ETag(pRawResponse->GetHeaders().at("ETag"));
      if (httpStatusCode == Core::Http::HttpStatusCode::Ok)
      {
        if (pRawResponse->GetHeaders().count("Content-MD5") != 0)
        {
          response.HttpHeaders.ContentHash.Value
              = Core::Convert::Base64Decode(pRawResponse->GetHeaders().at("Content-MD5"));
          response.HttpHeaders.ContentHash.Algorithm = HashAlgorithm::Md5;
        }
      }
      if (httpStatusCode == Core::Http::HttpStatusCode::Ok)
      {
        if (pRawResponse->GetHeaders().count("Content-MD5") != 0)
        {
          response.TransactionalContentHash = ContentHash();
          response.TransactionalContentHash.Value().Value
              = Core::Convert::Base64Decode(pRawResponse->GetHeaders().at("Content-MD5"));
          response.TransactionalContentHash.Value().Algorithm = HashAlgorithm::Md5;
        }
      }
      if (pRawResponse->GetHeaders().count("Content-Encoding") != 0)
      {
        response.HttpHeaders.ContentEncoding = pRawResponse->GetHeaders().at("Content-Encoding");
      }
      if (pRawResponse->GetHeaders().count("Cache-Control") != 0)
      {
        response.HttpHeaders.CacheControl = pRawResponse->GetHeaders().at("Cache-Control");
      }
      if (pRawResponse->GetHeaders().count("Content-Disposition") != 0)
      {
        response.HttpHeaders.ContentDisposition
            = pRawResponse->GetHeaders().at("Content-Disposition");
      }
      if (pRawResponse->GetHeaders().count("Content-Language") != 0)
      {
        response.HttpHeaders.ContentLanguage = pRawResponse->GetHeaders().at("Content-Language");
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-completion-time") != 0)
      {
        response.Details.CopyCompletedOn = DateTime::Parse(
            pRawResponse->GetHeaders().at("x-ms-copy-completion-time"),
            Azure::DateTime::DateFormat::Rfc1123);
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-status-description") != 0)
      {
        response.Details.CopyStatusDescription
            = pRawResponse->GetHeaders().at("x-ms-copy-status-description");
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-id") != 0)
      {
        response.Details.CopyId = pRawResponse->GetHeaders().at("x-ms-copy-id");
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-progress") != 0)
      {
        response.Details.CopyProgress = pRawResponse->GetHeaders().at("x-ms-copy-progress");
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-source") != 0)
      {
        response.Details.CopySource = pRawResponse->GetHeaders().at("x-ms-copy-source");
      }
      if (pRawResponse->GetHeaders().count("x-ms-copy-status") != 0)
      {
        response.Details.CopyStatus
            = Models::CopyStatus(pRawResponse->GetHeaders().at("x-ms-copy-status"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-content-md5") != 0)
      {
        response.HttpHeaders.ContentHash.Value
            = Core::Convert::Base64Decode(pRawResponse->GetHeaders().at("x-ms-content-md5"));
        response.HttpHeaders.ContentHash.Algorithm = HashAlgorithm::Md5;
      }
      response.Details.IsServerEncrypted
          = pRawResponse->GetHeaders().at("x-ms-server-encrypted") == std::string("true");
      if (pRawResponse->GetHeaders().count("x-ms-file-attributes") != 0)
      {
        response.Details.SmbProperties.Attributes
            = Models::FileAttributes(pRawResponse->GetHeaders().at("x-ms-file-attributes"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-file-creation-time") != 0)
      {
        response.Details.SmbProperties.CreatedOn = DateTime::Parse(
            pRawResponse->GetHeaders().at("x-ms-file-creation-time"),
            Azure::DateTime::DateFormat::Rfc3339);
      }
      if (pRawResponse->GetHeaders().count("x-ms-file-last-write-time") != 0)
      {
        response.Details.SmbProperties.LastWrittenOn = DateTime::Parse(
            pRawResponse->GetHeaders().at("x-ms-file-last-write-time"),
            Azure::DateTime::DateFormat::Rfc3339);
      }
      if (pRawResponse->GetHeaders().count("x-ms-file-change-time") != 0)
      {
        response.Details.SmbProperties.ChangedOn = DateTime::Parse(
            pRawResponse->GetHeaders().at("x-ms-file-change-time"),
            Azure::DateTime::DateFormat::Rfc3339);
      }
      if (pRawResponse->GetHeaders().count("x-ms-file-permission-key") != 0)
      {
        response.Details.SmbProperties.PermissionKey
            = pRawResponse->GetHeaders().at("x-ms-file-permission-key");
      }
      response.Details.SmbProperties.FileId = pRawResponse->GetHeaders().at("x-ms-file-id");
      response.Details.SmbProperties.ParentFileId
          = pRawResponse->GetHeaders().at("x-ms-file-parent-id");
      if (pRawResponse->GetHeaders().count("x-ms-lease-duration") != 0)
      {
        response.Details.LeaseDuration
            = Models::LeaseDurationType(pRawResponse->GetHeaders().at("x-ms-lease-duration"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-lease-state") != 0)
      {
        response.Details.LeaseState
            = Models::LeaseState(pRawResponse->GetHeaders().at("x-ms-lease-state"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-lease-status") != 0)
      {
        response.Details.LeaseStatus
            = Models::LeaseStatus(pRawResponse->GetHeaders().at("x-ms-lease-status"));
      }
      if (pRawResponse->GetHeaders().count("x-ms-mode") != 0)
      {
        response.Details.FileMode = pRawResponse->GetHeaders().at("x-ms-mode");
      }
      if (pRawResponse->GetHeaders().count("x-ms-owner") != 0)
      {
        response.Details.Owner = pRawResponse->GetHeaders().at("x-ms-owner");
      }
      if (pRawResponse->GetHeaders().count("x-ms-group") != 0)
      {
        response.Details.Group = pRawResponse->GetHeaders().at("x-ms-group");
      }
      if (pRawResponse->GetHeaders().count("x-ms-link-count") != 0)
      {
        response.Details.LinkCount = std::stoll(pRawResponse->GetHeaders().at("x-ms-link-count"));
      }
      if (httpStatusCode == Core::Http::HttpStatusCode::PartialContent)
      {
        if (pRawResponse->GetHeaders().count("Content-MD5") != 0)
        {
          response.TransactionalContentHash = ContentHash();
          response.TransactionalContentHash.Value().Value
              = Core::Convert::Base64Decode(pRawResponse->GetHeaders().at("Content-MD5"));
          response.TransactionalContentHash.Value().Algorithm = HashAlgorithm::Md5;
        }
      }
      return Response<Models::_detail::DownloadFileResult>(
          std::move(response), std::move(pRawResponse));
    }