diff --git a/environments/dotnet/ExecutorModule.cs b/environments/dotnet/ExecutorModule.cs index ef1d7fd2..311140fb 100644 --- a/environments/dotnet/ExecutorModule.cs +++ b/environments/dotnet/ExecutorModule.cs @@ -64,10 +64,10 @@ namespace Fission.DotNetCore response.StatusCode = HttpStatusCode.InternalServerError; return response; } - var args = ((DynamicDictionary)Request.Query).ToDictionary(); + try { - return _userFunc.Invoke(new FissionContext(args, new Logger())); + return _userFunc.Invoke(FissionContext.Build(Request, new Logger())); } catch (Exception e) { diff --git a/environments/dotnet/FissionContext.cs b/environments/dotnet/FissionContext.cs index 977444c7..a2dbeee0 100644 --- a/environments/dotnet/FissionContext.cs +++ b/environments/dotnet/FissionContext.cs @@ -1,46 +1,66 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Security.Cryptography.X509Certificates; +using Nancy; namespace Fission.DotNetCore.Api { public class FissionContext { - public FissionContext(Dictionary args, Logger logger) + public FissionContext(Dictionary args, Logger logger, FissionHttpRequest request) { if (args == null) throw new ArgumentNullException(nameof(args)); if (logger == null) throw new ArgumentNullException(nameof(logger)); + if (request == null) throw new ArgumentNullException(nameof(request)); Arguments = args; Logger = logger; + Request = request; } public Dictionary Arguments { get; private set; } + + public FissionHttpRequest Request { get; private set; } + public Logger Logger { get; private set; } + + public static FissionContext Build(Request request, Logger logger) + { + return new FissionContext(((DynamicDictionary)request.Query).ToDictionary(), + logger, + new FissionHttpRequest(request)); + } } public class Logger { public void Write(Severity severity, string format, params object[] args) { - Console.WriteLine($"{DateTime.Now.ToString("MM/dd/yy H:mm:ss zzz")} {severity}: " + format, args); + Console.WriteLine($"{DateTime.Now.ToString("MM/dd/yy H:mm:ss zzz")} {severity}: " + format, args); } - public void WriteInfo(string format, params object[] args){ + public void WriteInfo(string format, params object[] args) + { Write(Severity.Info, format, args); } - public void WriteWarning(string format, params object[] args){ + public void WriteWarning(string format, params object[] args) + { Write(Severity.Warning, format, args); } - public void WriteError(string format, params object[] args){ + public void WriteError(string format, params object[] args) + { Write(Severity.Error, format, args); } - public void WriteCritical(string format, params object[] args){ + public void WriteCritical(string format, params object[] args) + { Write(Severity.Critical, format, args); } - public void WriteVerbose(string format, params object[] args){ + public void WriteVerbose(string format, params object[] args) + { Write(Severity.Verbose, format, args); } } @@ -53,4 +73,32 @@ namespace Fission.DotNetCore.Api Critical, Verbose } + + public class FissionHttpRequest + { + private readonly Request _request; + internal FissionHttpRequest(Request request) + { + if (request == null) throw new ArgumentNullException(nameof(request)); + _request = request; + } + + public Stream Body { get { return _request.Body; } } + public Dictionary> Headers + { + get + { + var headers = new Dictionary>(); + foreach (var kv in _request.Headers) + { + headers.Add(kv.Key, kv.Value); + } + return headers; + } + } + + public X509Certificate Certificate { get { return _request.ClientCertificate; } } + public string Url { get { return _request.Url.ToString(); } } + public string Method { get { return _request.Method; } } + } } \ No newline at end of file diff --git a/environments/dotnet/README.md b/environments/dotnet/README.md index 9f012558..f3869862 100644 --- a/environments/dotnet/README.md +++ b/environments/dotnet/README.md @@ -163,6 +163,60 @@ $ curl "http://$FISSION_ROUTER/add?x=30&y=12" 42 ``` +## Accessing Http request information example + +### Setup fission environment +First you need to setup the fission according to your cluster setup as +specified here: https://github.com/fission/fission + + +### Create the class to run + +Secondly you need to create a file /tmp/func.cs containing the following code: + +``` +using System; +using Fission.DotNetCore.Api; + +public class FissionFunction +{ + public string Execute(FissionContext context){ + var buffer = new System.Text.StringBuilder(); + foreach(var header in context.Request.Headers){ + buffer.AppendLine(header.Key); + foreach(var item in header.Value){ + buffer.AppendLine($"\t{item}"); + } + } + buffer.AppendLine($"Url: {context.Request.Url}, method: {context.Request.Method}"); + return buffer.ToString(); + } +} + +``` +### Run the example + +Lastly to run the example: + +``` +$ fission env create --name dotnet --image fission/dotnet-env + +$ fission function create --name httpinfo --env dotnet --code /tmp/func.cs + +$ fission route create --method GET --url /http_info --function httpinfo + +$ curl "http://$FISSION_ROUTER/http_info" +Accept + */*;q=1 +Host + fissionserver:8888 +User-Agent + curl/7.47.0 +Url: http://fissionserver:8888, method: GET + +``` + + ## Developing/debugging the enviroment locally The easiest way to debug the environment is to open the directory in