cDownloadFile.psm1

[DscResource()]
class cDownloadFile
{

    #This property is the url of the file to be downloaded
    [DscProperty(Key)]
    [string]$Url

    #This is the fully qualified path for the file that is expected to be 'Present' or 'Absent'
    [DscProperty(Mandatory)]
    [string]$DestinationPath

    [DscProperty()]
    [bool] $UpdateOnDiff

    [DscProperty()]
    [string]$SASToken

    [void]Set()
    {
        write-verbose "Starting download from url: $($this.Url)"
        if($this.SASToken -ne $null){
            $downloadUrl = $this.Url + $this.SASToken
            $client = New-Object System.Net.WebClient
            $client.DownloadFile($downloadUrl, $this.DestinationPath)
        }else{
            $client = New-Object System.Net.WebClient
            $client.DownloadFile($this.Url,$this.DestinationPath)
        }
        
    }

    [bool]Test()
    {
        
        Write-Verbose "Checking if $($this.DestinationPath) exists"
        $file = Test-Path $this.DestinationPath

        if($file){
            Write-Verbose "File Exists"
            if(!$this.UpdateOnDiff){
                return $true
            }

            $client = New-Object System.Net.WebClient
            $client.OpenRead($this.Url)|Out-Null
            $ServerFileLenght = $client.ResponseHeaders['Content-Lenght']

            if($ServerFileLenght -eq $file.Length){
                Write-Verbose 'File on server is identical to from existing file.'
                return $true
            }
        }
        Write-Verbose "New version of file not found!"
        return $false
    }

    [cDownloadFile]Get()
    {
        $returnValue = @{
            Url = [System.String]
            DestinationPath = [System.String]
            UpdateOnDiff = [System.Boolean]
            SASToken = [System.String]
        }

        return $returnValue
    }
}