diff options
Diffstat (limited to 'support/powershell-web-server.ps1')
-rw-r--r-- | support/powershell-web-server.ps1 | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/support/powershell-web-server.ps1 b/support/powershell-web-server.ps1 new file mode 100644 index 0000000..f8a409b --- /dev/null +++ b/support/powershell-web-server.ps1 @@ -0,0 +1,111 @@ +# This is a super **SIMPLE** example of how to create a very basic powershell webserver +# 2019-05-18 UPDATE — Created by me and and evalued by @jakobii and the comunity. + +# Http Server +$http = [System.Net.HttpListener]::new() + +# Hostname and port to listen on +$http.Prefixes.Add("http://localhost:8080/") + +# Start the Http Server +$http.Start() + + + +# Log ready message to terminal +if ($http.IsListening) { + write-host " HTTP Server Ready! " -f 'black' -b 'gre' + write-host "now try going to $($http.Prefixes)" -f 'y' + write-host "then try going to $($http.Prefixes)other/path" -f 'y' +} + + +# INFINTE LOOP +# Used to listen for requests +while ($http.IsListening) { + + + + # Get Request Url + # When a request is made in a web browser the GetContext() method will return a request object + # Our route examples below will use the request object properties to decide how to respond + $context = $http.GetContext() + + + # ROUTE EXAMPLE 1 + # http://127.0.0.1/ + if ($context.Request.HttpMethod -eq 'GET' -and $context.Request.RawUrl -eq '/') { + + # We can log the request to the terminal + write-host "$($context.Request.UserHostAddress) => $($context.Request.Url)" -f 'mag' + + # the html/data you want to send to the browser + # you could replace this with: [string]$html = Get-Content "C:\some\path\index.html" -Raw + [string]$html = "<h1>A Powershell Webserver</h1><p>home page</p>" + + #resposed to the request + $buffer = [System.Text.Encoding]::UTF8.GetBytes($html) # convert htmtl to bytes + $context.Response.ContentLength64 = $buffer.Length + $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) #stream to broswer + $context.Response.OutputStream.Close() # close the response + + } + + + + # ROUTE EXAMPLE 2 + # http://127.0.0.1/some/form' + if ($context.Request.HttpMethod -eq 'GET' -and $context.Request.RawUrl -eq '/some/form') { + + # We can log the request to the terminal + write-host "$($context.Request.UserHostAddress) => $($context.Request.Url)" -f 'mag' + + [string]$html = " + <h1>A Powershell Webserver</h1> + <form action='/some/post' method='post'> + <p>A Basic Form</p> + <p>fullname</p> + <input type='text' name='fullname'> + <p>message</p> + <textarea rows='4' cols='50' name='message'></textarea> + <br> + <input type='submit' value='Submit'> + </form> + " + + #resposed to the request + $buffer = [System.Text.Encoding]::UTF8.GetBytes($html) + $context.Response.ContentLength64 = $buffer.Length + $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) + $context.Response.OutputStream.Close() + } + + # ROUTE EXAMPLE 3 + # http://127.0.0.1/some/post' + if ($context.Request.HttpMethod -eq 'POST' -and $context.Request.RawUrl -eq '/some/post') { + + # decode the form post + # html form members need 'name' attributes as in the example! + $FormContent = [System.IO.StreamReader]::new($context.Request.InputStream).ReadToEnd() + + # We can log the request to the terminal + write-host "$($context.Request.UserHostAddress) => $($context.Request.Url)" -f 'mag' + Write-Host $FormContent -f 'Green' + + # the html/data + [string]$html = "<h1>A Powershell Webserver</h1><p>Post Successful!</p>" + + #resposed to the request + $buffer = [System.Text.Encoding]::UTF8.GetBytes($html) + $context.Response.ContentLength64 = $buffer.Length + $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) + $context.Response.OutputStream.Close() + } + + + # powershell will continue looping and listen for new requests... + +} + +# Note: +# To end the loop you have to kill the powershell terminal. ctrl-c wont work :/
\ No newline at end of file |