Example #1
0
        public static ScriptInvocationResult ToScriptInvocationResult(this HttpScriptInvocationResult httpScriptInvocationResult, ScriptInvocationContext scriptInvocationContext)
        {
            ScriptInvocationResult scriptInvocationResult = new ScriptInvocationResult()
            {
                Outputs = new Dictionary <string, object>()
            };

            foreach (var outputBindingMetadata in scriptInvocationContext.FunctionMetadata.OutputBindings)
            {
                object outputValue = GetOutputValue(outputBindingMetadata.Name, outputBindingMetadata.Type, outputBindingMetadata.DataType, httpScriptInvocationResult.Outputs);
                if (outputValue != null)
                {
                    scriptInvocationResult.Outputs[outputBindingMetadata.Name] = outputValue;
                }
            }

            if (httpScriptInvocationResult.ReturnValue != null)
            {
                BindingMetadata returnParameterBindingMetadata = GetBindingMetadata(ScriptConstants.SystemReturnParameterBindingName, scriptInvocationContext);
                if (returnParameterBindingMetadata != null)
                {
                    scriptInvocationResult.Return = GetBindingValue(returnParameterBindingMetadata.DataType, httpScriptInvocationResult.ReturnValue);
                }
            }
            return(scriptInvocationResult);
        }
        internal async Task ProcessDefaultInvocationRequest(ScriptInvocationContext scriptInvocationContext)
        {
            try
            {
                HttpScriptInvocationContext httpScriptInvocationContext = await scriptInvocationContext.ToHttpScriptInvocationContext();

                string uri = BuildAndGetUri(scriptInvocationContext.FunctionMetadata.Name);

                // Build httpRequestMessage from scriptInvocationContext
                using (HttpRequestMessage httpRequestMessage = httpScriptInvocationContext.ToHttpRequestMessage(uri))
                {
                    AddHeaders(httpRequestMessage, scriptInvocationContext.ExecutionContext.InvocationId.ToString());

                    _logger.LogDebug("Sending http request for function:{functionName} invocationId:{invocationId}", scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId);
                    HttpResponseMessage response = await _httpClient.SendAsync(httpRequestMessage);

                    _logger.LogDebug("Received http response for function:{functionName} invocationId:{invocationId}", scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId);

                    // Only process output bindings if response is succeess code
                    response.EnsureSuccessStatusCode();

                    HttpScriptInvocationResult httpScriptInvocationResult = await response.Content.ReadAsAsync <HttpScriptInvocationResult>();

                    if (httpScriptInvocationResult != null)
                    {
                        if (httpScriptInvocationResult.Outputs == null || !httpScriptInvocationResult.Outputs.Any())
                        {
                            _logger.LogWarning("Outputs not set on http response for invocationId:{invocationId}", scriptInvocationContext.ExecutionContext.InvocationId);
                        }
                        if (httpScriptInvocationResult.ReturnValue == null)
                        {
                            _logger.LogWarning("ReturnValue not set on http response for invocationId:{invocationId}", scriptInvocationContext.ExecutionContext.InvocationId);
                        }

                        ProcessLogsFromHttpResponse(scriptInvocationContext, httpScriptInvocationResult);

                        ScriptInvocationResult scriptInvocationResult = httpScriptInvocationResult.ToScriptInvocationResult(scriptInvocationContext);
                        scriptInvocationContext.ResultSource.SetResult(scriptInvocationResult);
                    }
                }
            }
            catch (Exception responseEx)
            {
                scriptInvocationContext.ResultSource.TrySetException(responseEx);
            }
        }
Example #3
0
        public static ScriptInvocationResult ToScriptInvocationResult(this HttpScriptInvocationResult httpScriptInvocationResult, ScriptInvocationContext scriptInvocationContext)
        {
            ScriptInvocationResult scriptInvocationResult = new ScriptInvocationResult()
            {
                Outputs = new Dictionary <string, object>()
            };

            if (httpScriptInvocationResult.Outputs != null && httpScriptInvocationResult.Outputs.Any())
            {
                foreach (var outputFromHttpWorker in httpScriptInvocationResult.Outputs)
                {
                    BindingMetadata outputBindingMetadata = GetBindingMetadata(outputFromHttpWorker.Key, scriptInvocationContext);
                    scriptInvocationResult.Outputs[outputFromHttpWorker.Key] = GetOutputValue(outputBindingMetadata, outputFromHttpWorker.Value);
                }
            }
            if (httpScriptInvocationResult.ReturnValue != null)
            {
                BindingMetadata returnParameterBindingMetadata = GetBindingMetadata(ScriptConstants.SystemReturnParameterBindingName, scriptInvocationContext);
                scriptInvocationResult.Return = GetOutputValue(returnParameterBindingMetadata, httpScriptInvocationResult.ReturnValue);
            }
            return(scriptInvocationResult);
        }
 internal void ProcessLogsFromHttpResponse(ScriptInvocationContext scriptInvocationContext, HttpScriptInvocationResult invocationResult)
 {
     if (scriptInvocationContext == null)
     {
         throw new ArgumentNullException(nameof(scriptInvocationContext));
     }
     if (invocationResult == null)
     {
         throw new ArgumentNullException(nameof(invocationResult));
     }
     if (invocationResult.Logs != null)
     {
         // Restore the execution context from the original invocation. This allows AsyncLocal state to flow to loggers.
         System.Threading.ExecutionContext.Run(scriptInvocationContext.AsyncExecutionContext, (s) =>
         {
             foreach (var userLog in invocationResult.Logs)
             {
                 scriptInvocationContext.Logger?.LogInformation(userLog);
             }
         }, null);
     }
 }