blob: 21c94f074e51418db1e70a7420bb390228ed896f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json.Linq;
namespace Apache.OpenWhisk.Runtime.Common
{
public class Run
{
private readonly Type _type;
private readonly MethodInfo _method;
private readonly ConstructorInfo _constructor;
private readonly bool _awaitableMethod;
public Run(Type type, MethodInfo method, ConstructorInfo constructor, bool awaitableMethod)
{
_type = type;
_method = method;
_constructor = constructor;
_awaitableMethod = awaitableMethod;
}
public async Task HandleRequest(HttpContext httpContext)
{
if (_type == null || _method == null || _constructor == null)
{
await httpContext.Response.WriteError("Cannot invoke an uninitialized action.");
return;
}
try
{
string body = await new StreamReader(httpContext.Request.Body).ReadToEndAsync();
JObject inputObject = string.IsNullOrEmpty(body) ? null : JObject.Parse(body);
JObject valObject = null;
if (inputObject != null)
{
valObject = inputObject["value"] as JObject;
foreach (JToken token in inputObject.Children())
{
try
{
if (token.Path.Equals("value", StringComparison.InvariantCultureIgnoreCase))
continue;
string envKey = $"__OW_{token.Path.ToUpperInvariant()}";
string envVal = token.First.ToString();
Environment.SetEnvironmentVariable(envKey, envVal);
//Console.WriteLine($"Set environment variable \"{envKey}\" to \"{envVal}\".");
}
catch (Exception)
{
await Console.Error.WriteLineAsync(
$"Unable to set environment variable for the \"{token.Path}\" token.");
}
}
}
object owObject = _constructor.Invoke(new object[] { });
try
{
JObject output;
if(_awaitableMethod) {
output = (JObject) await (dynamic) _method.Invoke(owObject, new object[] {valObject});
}
else {
output = (JObject) _method.Invoke(owObject, new object[] {valObject});
}
if (output == null)
{
await httpContext.Response.WriteError("The action returned null");
Console.Error.WriteLine("The action returned null");
return;
}
await httpContext.Response.WriteResponse(200, output.ToString());
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.StackTrace);
await httpContext.Response.WriteError(ex.Message
#if DEBUG
+ ", " + ex.StackTrace
#endif
);
}
}
finally
{
Startup.WriteLogMarkers();
}
}
}
}