docs: def _put_data(self, ud, ase, offsets, data):
          # type: (Uploader, blobxfer.models.upload.Descriptor,
          #        blobxfer.models.azure.StorageEntity,
          #        blobxfer.models.upload.Offsets, bytes) -> None
          """Put data in Azure
          :param Uploader self: this
          :param blobxfer.models.upload.Descriptor ud: upload descriptor
          :param blobxfer.models.azure.StorageEntity ase: Storage entity
          :param blobxfer.models.upload.Offsets offsets: offsets
          :param bytes data: data to upload
          """
          if ase.mode == blobxfer.models.azure.StorageModes.Append:
              # append block
              if data is not None:
                  blobxfer.operations.azure.blob.append.append_block(ase, data)
          elif ase.mode == blobxfer.models.azure.StorageModes.Block:
              # handle one-shot uploads
              if ud.is_one_shot_block_blob:
                  metadata = ud.generate_metadata()
                  if not ud.entity.is_encrypted and ud.must_compute_md5:
                      digest = blobxfer.util.base64_encode_as_string(
                          ud.md5.digest())
                  else:
                      digest = None
                  blobxfer.operations.azure.blob.block.create_blob(
                      ase, data, digest, metadata)
                  return
              # upload block
              if data is not None:
                  blobxfer.operations.azure.blob.block.put_block(
                      ase, offsets, data)
          elif ase.mode == blobxfer.models.azure.StorageModes.File:
              # upload range
              if data is not None:
                  blobxfer.operations.azure.file.put_file_range(
                      ase, offsets, data)
          elif ase.mode == blobxfer.models.azure.StorageModes.Page:
              if data is None:
                  return
              # compute aligned size
              aligned = blobxfer.util.page_align_content_length(
                  offsets.num_bytes)
              # align page
              if aligned != offsets.num_bytes:
                  data = data.ljust(aligned, b'\0')
              if blobxfer.operations.md5.check_data_is_empty(data):
                  return
              # upload page
              blobxfer.operations.azure.blob.page.put_page(
                  ase, offsets.range_start, offsets.range_start + aligned - 1,
                  data)