Skip to content

Instantly share code, notes, and snippets.

@lazywinadmin
Forked from jakobii/HTTPServer.ps1
Created August 4, 2018 01:29
Show Gist options
  • Save lazywinadmin/68aeb698110092dc6a7f926857ee90dc to your computer and use it in GitHub Desktop.
Save lazywinadmin/68aeb698110092dc6a7f926857ee90dc to your computer and use it in GitHub Desktop.
A Basic Powershell Webserver

This is a super simple Exmple of how to create a very basic powershell webserver

Http Server

$listener = [System.Net.HttpListener]::new()

Hostname and port to listen on

$listener.Prefixes.Add("http://localhost:8080/")

Start the Http Server

$listener.Start()

INFINTE LOOP

Used to listen for requests

while ($listener.IsListening) {

# Get Request Url
# When a request is made in a web browser the GetContext() method will retuen the request url
# Our routes will use this to decide how to respond
$context = $listener.GetContext()


# ROUTE EXAMPLE 1
if ($context.Request.RawUrl -eq '/') {


    # the html/data you want to send to the browser
    # you could replace this with Get-Content "C:\some\path\index.html"
    [string]$content = "<h1>A Powershell Webserver</h1><p>Root Route</p>" 


    #resposed to the request and 
    $response = $context.Response
    $buffer = [System.Text.Encoding]::UTF8.GetBytes($content) # convert htmtl to bytes
    $response.ContentLength64 = $buffer.Length
    $response.OutputStream.Write($buffer, 0, $buffer.Length) #stream to broswer
    $response.OutputStream.Close() # close the respose

}



# ROUTE EXAMPLE 2
if ($context.Request.RawUrl -eq '/some/path') {


    # the html/data you want to send to the browser
    # you could replace this with Get-Content "C:\some\path\index.html"
    [string]$content = "<h1>A Powershell Webserver</h1><p>Some Other Route</p>" 


    #resposed to the request and 
    $response = $context.Response
    $buffer = [System.Text.Encoding]::UTF8.GetBytes($content) # convert htmtl to bytes
    $response.ContentLength64 = $buffer.Length
    $response.OutputStream.Write($buffer, 0, $buffer.Length) #stream to broswer
    $response.OutputStream.Close() # close the respose

}


# 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 :/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment