Salut à tous, aujourd’hui j’ai eu un besoin d’envoyer un CSV en HTTP en PowerShell. J’ai fait ça pour automatiser un envoi de fichier de résultat de script entre 2 serveurs. Ma grosse contrainte était que je pouvais pas faire du mode ‘Push’ (cf. transfert SCP sans mot de passe) comme je partais d’une zone de sécurité moindre que celle de destination. Et comme, le fichier source venait d’un Windows, je ne voulais pas mettre en place un serveur Web IIS sur le serveur pour un pauvre fichier CSV à transférer 2 fois par jour…
Du coup, j’ai bricolé quelques lignes à la fin de mon script PowerShell pour exposer le fichier en HTTP et permettre au serveur destination de venir les « Puller » pour respecter le sens d’établissement du flux.
Et sans transition le script pour envoyer un CSV en HTTP en PowerShell :
Function New-SimpleHTTPListener {
Param (
[Parameter()] [Int] $Port = 7443
)
Begin{
$listener = New-Object System.Net.HttpListener
$prefix = "http://localhost:$Port/"
$listener.Prefixes.Add($prefix)
}
Process{
try{
$listener.Start()
Write-Host "Listening on $Port ..."
$pathwd = Get-Location
while ($listener.IsListening) {
$context = $listener.GetContext()
if ($context.Request.HttpMethod -eq 'GET' -and $context.Request.RawUrl -eq '/quit')
{
$listener.Close()
break;
}
$HTTPresponse = $context.Response
$HTTPresponse.StatusCode = "200"
$HTTPResponse.Headers.Add("Content-Type","text/csv")
$RequestUrl = $context.Request.Url.OriginalString
$data = [System.Text.UTF8Encoding]::UTF8.GetBytes([System.IO.File]::ReadAllText("$pathwd" + '\' + ($RequestUrl.Split('/')[-1])))
$HTTPresponse.ContentLength64 = $data.Length
$output = $HTTPresponse.OutputStream
$output.Write($data,0,$data.Length)
$output.Close()
}
}catch{
Write-Warning "Error with Server : $_"
}Finally{
Write-Warning "terminating Server : $_"
$listener.Stop()
}
}
End{
}
}
New-SimpleHTTPListener
Alors clairement, c’est du bon gros « quick and dirty … Lire la suite