-CertificateHash ((Get-ChildItem -Path cert:\LocalMachine\My|Where-Object{$_.FriendlyName -eq "WinCC8"}).Thumbprint) -CertificateStoreName "My" -IpPort "0.0.0.0:443" -NullEncryption $false
$HttpListener = New-Object System.Net.HttpListener
$HttpListener.Prefixes.Add("https://+:443/")
$HttpListener.Start()
while ($HttpListener.IsListening) {
$HttpContext = $HttpListener.GetContext()
$HttpRequest = $HttpContext.Request
$HttpResponse = $HttpContext.Response
$RawUrl = $HttpRequest.RawUrl
if($RawUrl -eq "/exit"){$HttpResponse.StatusCode=302;$HttpResponse.AddHeader("location","https://"+($HttpRequest.Url|Select-String -Pattern 'https://(.+?)/').Matches.Groups[1].Value+":444")}
else{
$HttpResponse.StatusCode = 200;$HttpResponse.Headers.Add("Content-Type","text/html; charset=UTF-8")
$section="main";$page="index"
$req=($HttpRequest.Url|Select-String -Pattern '/([^?#/]+)' -AllMatches).Matches
if($req.Length -eq 3){$section=$req[1].Groups[1].Value;$page=$req[2].Groups[1].Value}
$buffer=Get-Content -Path ($PWD.Path+"\pages\"+$section+"\"+$page+".html") -Encoding UTF8
if($buffer -ne $null){
$tags_name=@{};($buffer|Select-String -Pattern '%(.+?)%\.\w+' -AllMatches).Matches.ForEach({if (-Not $tags_name.ContainsKey($_.Groups[1].Value)){$tags_name.Add($_.Groups[1].Value,$null)}})
try{
$TagSet=(New-Object -ComObject CCHMIRuntime.HMIRuntime).Tags.CreateTagSet()
$tags_name.Keys.ForEach({$TagSet.Add($_)})
$TagSet.Read()
}catch{}
if($TagSet -ne $null){$buffer=$buffer -replace '%(.+?)%\.(\w+)', {$TagSet[$_.Groups[1].Value].($_.Groups[2].Value)}}
$ResponseBuffer = [System.Text.Encoding]::UTF8.GetBytes($buffer)
$HttpResponse.ContentLength64 = $ResponseBuffer.Length
$HttpResponse.OutputStream.Write($ResponseBuffer,0,$ResponseBuffer.Length)
}
}$HttpResponse.Close()
}$HttpListener.Stop()
Выглядит конечно жестоко) Я пробовал в контейнере небольшие вебсервисы на поше поднимать в докере, юзая вот эту штуку - https://github.com/Badgerati/Pode В целом достаточно прикольно получилось)
Я, если честно, и ожидал, что человек возьмёт какой-то фреймворк на pwsh. А он прям так взял и сразу быка за рога.
Мне нужно было чтобы минимум внешних зависимостей, лучше всего один файл (не считая шаблонов страниц) А так по сути нагуглил все кирпичики и просто вместе их сложил )
Ещё бы PS 5.1.xxxx не подложил свинью со своим зависанием - вопще ляпота б была!
если этот, то он же однопоточный
Да, однопоточный, на JS у меня тоже однопоточное синхронное решение
Обсуждают сегодня