Skip to content

Update the example and fix two bugs in worker #34

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Sep 7, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 24 additions & 17 deletions examples/PSCoreApp/MyHttpTrigger/run.ps1
Original file line number Diff line number Diff line change
@@ -1,26 +1,33 @@
# Invoked with Invoke-RestMethod:
# irm http://localhost:7071/api/MyHttpTrigger?Name=Tyler
# Input bindings are added via param block
# Trigger the function by running Invoke-RestMethod:
# (via get method): Invoke-RestMethod -Uri http://localhost:7071/api/MyHttpTrigger?Name=Joe
# (via post method): Invoke-RestMethod `
# -Uri http://localhost:7071/api/MyHttpTrigger `
# -Method Post `
# -Body (ConvertTo-Json @{ Name="Joe" }) `
# -Headers @{'Content-Type' = 'application/json' }`

# Input bindings are passed in via param block.
param($req, $TriggerMetadata)

# If no name was passed by query parameter
$name = 'World'
# You can write to the Azure Functions log streams as you would in a normal PowerShell script.
Write-Verbose "PowerShell HTTP trigger function processed a request." -Verbose

# You can interact with query parameters, the body of the request, etc.
if($req.Query.Name) {
$name = $req.Query.Name
}

# you can write to the same streams as you would in a normal PowerShell script
Write-Verbose "Verbose $name" -Verbose
Write-Warning "Warning $name"
$name = $req.Query.Name
if (-not $name) { $name = $req.Body.Name }

# items in the pipeline get logged
$name
if($name) {
$status = 200
$body = "Hello " + $name
}
else {
$status = 400
$body = "Please pass a name on the query string or in the request body."
}

# You set the value of your output bindings by assignment `$nameOfOutputBinding = 'foo'`
# You associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name res -Value ([HttpResponseContext]@{
Body = @{ Hello = $name }
ContentType = 'application/json'
StatusCode = $status
Body = $body
})

10 changes: 6 additions & 4 deletions src/PowerShell/PowerShellManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,12 +113,14 @@ internal Hashtable InvokeFunction(
{
// Log everything we received from the pipeline and set the last one to be the ReturnObject
Collection<PSObject> pipelineItems = _pwsh.InvokeAndClearCommands<PSObject>();
foreach (var psobject in pipelineItems)
if (pipelineItems.Count > 0)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is needed?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's for the returnObject = pipelineItems[pipelineItems.Count - 1]; statement below. When nothing is written to the output, this will crash the worker. Since we need to check for count anyway, better to put it before the iteration.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch!

{
_logger.Log(LogLevel.Information, $"OUTPUT: {psobject.ToString()}");
foreach (var psobject in pipelineItems)
{
_logger.Log(LogLevel.Information, $"OUTPUT: {psobject.ToString()}");
}
returnObject = pipelineItems[pipelineItems.Count - 1];
}

returnObject = pipelineItems[pipelineItems.Count - 1];
}

var result = _pwsh.AddCommand("Azure.Functions.PowerShell.Worker.Module\\Get-OutputBinding")
Expand Down
3 changes: 2 additions & 1 deletion src/Utility/TypeExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ public static object ToObject (this TypedData data)
switch (data.DataCase)
{
case TypedData.DataOneofCase.Json:
return JsonConvert.DeserializeObject<Hashtable>(data.Json);
var hashtable = JsonConvert.DeserializeObject<Hashtable>(data.Json);
return new Hashtable(hashtable, StringComparer.OrdinalIgnoreCase);
case TypedData.DataOneofCase.Bytes:
return data.Bytes.ToByteArray();
case TypedData.DataOneofCase.Double:
Expand Down