From 9074aa4c937c2618136e703703118cbda88030bf Mon Sep 17 00:00:00 2001
From: Tal Auslander <tal@cloudshare.com>
Date: Mon, 8 Jun 2015 14:45:20 +0300
Subject: [PATCH] win_get_url re-download file only if modified

---
 windows/win_get_url.ps1 | 38 +++++++++++++++++++++++++++++++-------
 1 file changed, 31 insertions(+), 7 deletions(-)

diff --git a/windows/win_get_url.ps1 b/windows/win_get_url.ps1
index b555cc7a52c..96189d69113 100644
--- a/windows/win_get_url.ps1
+++ b/windows/win_get_url.ps1
@@ -1,7 +1,7 @@
 #!powershell
 # This file is part of Ansible.
 #
-# Copyright 2014, Paul Durivage <paul.durivage@rackspace.com>
+# (c)) 2015, Paul Durivage <paul.durivage@rackspace.com>, Tal Auslander <tal@cloudshare.com>
 #
 # Ansible is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -40,14 +40,38 @@ Else {
     Fail-Json $result "missing required argument: dest"
 }
 
-$client = New-Object System.Net.WebClient
+If (-not (Test-Path $dest)) {
+    $client = New-Object System.Net.WebClient
 
-Try {
-    $client.DownloadFile($url, $dest)
-    $result.changed = $true
+    Try {
+        $client.DownloadFile($url, $dest)
+        $result.changed = $true
+    }
+    Catch {
+        Fail-Json $result "Error downloading $url to $dest"
+    }
 }
-Catch {
-    Fail-Json $result "Error downloading $url to $dest"
+Else {
+    Try {
+        $webRequest = [System.Net.HttpWebRequest]::Create($url)
+        $webRequest.IfModifiedSince = ([System.IO.FileInfo]$dest).LastWriteTime
+        $webRequest.Method = "GET"
+        [System.Net.HttpWebResponse]$webResponse = $webRequest.GetResponse()
+        
+        $stream = New-Object System.IO.StreamReader($response.GetResponseStream())
+        
+        $stream.ReadToEnd() | Set-Content -Path $dest -Force
+        
+        $result.changed = $true
+    }
+    Catch [System.Net.WebException] {
+        If ($_.Exception.Response.StatusCode -ne [System.Net.HttpStatusCode]::NotModified) {
+            Fail-Json $result "Error downloading $url to $dest"
+        }
+    }
+    Catch {
+        Fail-Json $result "Error downloading $url to $dest"
+    }
 }
 
 Set-Attr $result.win_get_url "url" $url