|
1 | 1 | Add-Type -AssemblyName System.Web
|
2 | 2 |
|
| 3 | +Class FunctionContext{ |
| 4 | + [string] $Method; |
| 5 | + [string] $Request; |
| 6 | + [string] $Body; |
| 7 | + [System.Net.WebHeaderCollection] $Headers; |
| 8 | + [System.Collections.Specialized.NameValueCollection] $Query; |
| 9 | + [string] $Path; |
| 10 | +} |
| 11 | + |
| 12 | +Class FunctionResponse{ |
| 13 | + [string] $Body; |
| 14 | + [System.Net.WebHeaderCollection] $Headers; |
| 15 | + [int] $Status; |
| 16 | +} |
| 17 | + |
3 | 18 | $listener = New-Object System.Net.HttpListener
|
4 | 19 | $listener.Prefixes.Add("http://*:8081/")
|
5 | 20 | $listener.Start()
|
|
14 | 29 |
|
15 | 30 | $reader = [System.IO.StreamReader]::new($reqStream, $reqEncoding)
|
16 | 31 |
|
17 |
| - $reqBody = $reader.ReadToEnd() |
| 32 | + $fnContext = [FunctionContext]::new() |
| 33 | + $fnContext.Body = $reader.ReadToEnd() |
| 34 | + $fnContext.Headers = $context.Request.Headers |
| 35 | + $fnContext.Method = $context.Request.HttpMethod |
| 36 | + $fnContext.Query = $context.Request.QueryString |
| 37 | + $fnContext.Path = $context.Request.Url.LocalPath |
| 38 | + $fnContext.Request = $context.Request |
18 | 39 |
|
| 40 | + $fnResponse = [FunctionResponse]::new() |
| 41 | + $fnResponse.Headers = [System.Net.WebHeaderCollection]::new() |
19 | 42 | try {
|
20 |
| - $funcResult = . .\function\handler.ps1 $reqBody |
| 43 | + . .\function\handler.ps1 -fnContext $fnContext -fnResponse $fnResponse |
21 | 44 |
|
22 |
| - $Content = [System.Text.Encoding]::UTF8.GetBytes($funcResult) |
23 |
| - $response.StatusCode = 200 |
| 45 | + $Content = [System.Text.Encoding]::UTF8.GetBytes($fnResponse.Body) |
| 46 | + $response.StatusCode = $(If ($fnResponse.Status) {$fnResponse.Status} Else {200}) #default to 200 response if not set |
24 | 47 | }
|
25 | 48 | catch {
|
26 |
| - $Content = [System.Text.Encoding]::UTF8.GetBytes("$_.Exception.Message") |
27 |
| - $response.StatusCode = 500 |
| 49 | + $responseBody = $(If ($_.Exception.Message) {$_.Exception.Message} Else {$fnResponse.Body}) |
| 50 | + $Content = [System.Text.Encoding]::UTF8.GetBytes($responseBody) |
| 51 | + $response.StatusCode = $(If ($fnResponse.Status) {$fnResponse.Status} Else {500}) #default to 500 response for exceptions |
28 | 52 | }
|
29 | 53 |
|
| 54 | + $response.Headers = $fnResponse.Headers |
30 | 55 | $response.ContentLength64 = $Content.Length
|
31 | 56 | $response.OutputStream.Write($Content, 0, $Content.Length)
|
32 | 57 | $response.Close()
|
|
0 commit comments