-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSwitchRegexServer.ps1
More file actions
74 lines (68 loc) · 2.56 KB
/
SwitchRegexServer.ps1
File metadata and controls
74 lines (68 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<#
.SYNOPSIS
Switch -RegEx Server
.DESCRIPTION
A simple server implemented in a single switch -regex.
Any match can provide results.
.EXAMPLE
./SwitchRegexServer.ps1
#>
param(
# The rootUrl of the server. By default, a random loopback address.
[string]$RootUrl=
"http://127.0.0.1:$(Get-Random -Minimum 4200 -Maximum 42000)/",
[Collections.IDictionary]
$Dictionary = [Ordered]@{
"/" = @{ContentType='text/html';Content='<h1>Hello World</h1>'}
}
)
$httpListener = [Net.HttpListener]::new()
$httpListener.Prefixes.Add($RootUrl)
Write-Warning "Listening on $RootUrl $($httpListener.Start())"
$io = [Ordered]@{ # Pack our job input into an IO dictionary
HttpListener = $httpListener ;
}
# Our server is a thread job
Start-ThreadJob -ScriptBlock {param([Collections.IDictionary]$io)
$psvariable = $ExecutionContext.SessionState.PSVariable
foreach ($key in $io.Keys) { # First, let's unpack.
if ($io[$key] -is [PSVariable]) { $psvariable.set($io[$key]) }
else { $psvariable.set($key, $io[$key]) }
}
# Listen for the next request
:nextRequest while ($httpListener.IsListening) {
$getContext = $httpListener.GetContextAsync()
while (-not $getContext.Wait(17)) { }
$time = [DateTime]::Now
$request, $reply =
$getContext.Result.Request, $getContext.Result.Response
$result = $null
$result =
switch -regex ($request.Url.LocalPath) {
'/' {
"<h1>Home Sweet Home</h1>"
}
'/Hello/?' {
"<h1>Hello World</h1>"
}
'/(?<d1>[\d\.]+)x(?<d2>[\d\.]+)/?' {
($matches.d1 -as [double]) * ($matches.d2 -as [double])
}
default {
$timeToRespond = [DateTime]::Now - $time
"$($request.HttpMethod) $($request.Url) $($timeToRespond)"
}
}
if ($result) {
$reply.Close($OutputEncoding.GetBytes("$result"), $false)
} else {
$reply.StatusCode = 404
$reply.Close()
}
}
} -ThrottleLimit 100 -ArgumentList $IO -Name "$RootUrl" | # Output our job,
Add-Member -NotePropertyMembers @{ # but attach a few properties first:
HttpListener=$httpListener # * The listener (so we can stop it)
IO=$IO # * The IO (so we can change it)
Url="$RootUrl" # The URL (so we can easily access it).
} -Force -PassThru # Pass all of that thru and return it to you.