internal void InvokeResponse(InvocationResponse invokeResponse) { _workerChannelLogger.LogDebug("InvocationResponse received for invocation id: {Id}", invokeResponse.InvocationId); if (_executingInvocations.TryRemove(invokeResponse.InvocationId, out ScriptInvocationContext context) && invokeResponse.Result.IsSuccess(context.ResultSource)) { try { IDictionary <string, object> bindingsDictionary = invokeResponse.OutputData .ToDictionary(binding => binding.Name, binding => binding.Data.ToObject()); var result = new ScriptInvocationResult() { Outputs = bindingsDictionary, Return = invokeResponse?.ReturnValue?.ToObject() }; context.ResultSource.SetResult(result); } catch (Exception responseEx) { context.ResultSource.TrySetException(responseEx); } } }
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 ProcessHttpInAndOutInvocationRequest(ScriptInvocationContext scriptInvocationContext) { _logger.LogDebug("Will invoke simple httpTrigger function: '{functionName}' invocationId: '{invocationId}'", scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId); ScriptInvocationResult scriptInvocationResult = new ScriptInvocationResult() { Outputs = new Dictionary <string, object>() }; HttpRequestMessage httpRequestMessage = null; (string name, DataType type, object request)input = scriptInvocationContext.Inputs.First(); HttpRequest httpRequest = input.request as HttpRequest; if (httpRequest == null) { throw new InvalidOperationException($"HttpTrigger value for: `{input.name}` is null"); } try { // Build HttpRequestMessage from HttpTrigger binding HttpRequestMessageFeature httpRequestMessageFeature = new HttpRequestMessageFeature(httpRequest.HttpContext); httpRequestMessage = httpRequestMessageFeature.HttpRequestMessage; AddRequestHeadersAndSetRequestUri(httpRequestMessage, scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId.ToString()); // Populate query params from httpTrigger string httpWorkerUri = QueryHelpers.AddQueryString(httpRequestMessage.RequestUri.ToString(), httpRequest.GetQueryCollectionAsDictionary()); httpRequestMessage.RequestUri = new Uri(httpWorkerUri); _logger.LogDebug("Sending http request message for simple httpTrigger function: '{functionName}' invocationId: '{invocationId}'", scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId); HttpResponseMessage invocationResponse = await _httpClient.SendAsync(httpRequestMessage); _logger.LogDebug("Received http response for simple httpTrigger function: '{functionName}' invocationId: '{invocationId}'", scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId); BindingMetadata httpOutputBinding = scriptInvocationContext.FunctionMetadata.OutputBindings.FirstOrDefault(); if (httpOutputBinding != null) { // handle http output binding scriptInvocationResult.Outputs.Add(httpOutputBinding.Name, invocationResponse); // handle $return scriptInvocationResult.Return = invocationResponse; } scriptInvocationContext.ResultSource.SetResult(scriptInvocationResult); } catch (Exception responseEx) { scriptInvocationContext.ResultSource.TrySetException(responseEx); } }
internal async Task ProcessHttpInAndOutInvocationRequest(ScriptInvocationContext scriptInvocationContext) { _logger.LogDebug("Will invoke simple httpTrigger function: '{functionName}' invocationId: '{invocationId}'", scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId); ScriptInvocationResult scriptInvocationResult = new ScriptInvocationResult() { Outputs = new Dictionary <string, object>() }; (string name, DataType type, object request)input = scriptInvocationContext.Inputs.First(); HttpRequest httpRequest = input.request as HttpRequest; if (httpRequest == null) { throw new InvalidOperationException($"HttpTrigger value for: `{input.name}` is null"); } try { string uriPathValue = GetPathValue(_httpWorkerOptions, scriptInvocationContext.FunctionMetadata.Name, httpRequest); string uri = BuildAndGetUri(uriPathValue); using (HttpRequestMessage httpRequestMessage = httpRequest.ToHttpRequestMessage(uri)) { AddHeaders(httpRequestMessage, scriptInvocationContext.ExecutionContext.InvocationId.ToString()); _logger.LogDebug("Forwarding http request for httpTrigger function: '{functionName}' invocationId: '{invocationId}'", scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId); HttpResponseMessage invocationResponse = await _httpClient.SendAsync(httpRequestMessage); _logger.LogDebug("Received http response for httpTrigger function: '{functionName}' invocationId: '{invocationId}'", scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId); BindingMetadata httpOutputBinding = scriptInvocationContext.FunctionMetadata.OutputBindings.FirstOrDefault(); if (httpOutputBinding != null) { // handle http output binding scriptInvocationResult.Outputs.Add(httpOutputBinding.Name, invocationResponse); // handle $return scriptInvocationResult.Return = invocationResponse; } scriptInvocationContext.ResultSource.SetResult(scriptInvocationResult); } } catch (Exception responseEx) { scriptInvocationContext.ResultSource.TrySetException(responseEx); } }
internal void InvokeResponse(InvocationResponse invokeResponse) { if (_executingInvocations.TryRemove(invokeResponse.InvocationId, out ScriptInvocationContext context) && invokeResponse.Result.IsSuccess(context.ResultSource)) { IDictionary <string, object> bindingsDictionary = invokeResponse.OutputData .ToDictionary(binding => binding.Name, binding => binding.Data.ToObject()); var result = new ScriptInvocationResult() { Outputs = bindingsDictionary, Return = invokeResponse?.ReturnValue?.ToObject() }; context.ResultSource.SetResult(result); } }
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); } }
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 async Task InvokeResponse(InvocationResponse invokeResponse) { _workerChannelLogger.LogDebug("InvocationResponse received for invocation id: {Id}", invokeResponse.InvocationId); if (_executingInvocations.TryRemove(invokeResponse.InvocationId, out ScriptInvocationContext context) && invokeResponse.Result.IsSuccess(context.ResultSource)) { try { StringBuilder logBuilder = new StringBuilder(); bool usedSharedMemory = false; foreach (ParameterBinding binding in invokeResponse.OutputData) { switch (binding.RpcDataCase) { case ParameterBindingType.RpcSharedMemory: logBuilder.AppendFormat("{0}:{1},", binding.Name, binding.RpcSharedMemory.Count); usedSharedMemory = true; break; default: break; } } if (usedSharedMemory) { _workerChannelLogger.LogDebug("Shared memory usage for response of invocation Id: {Id} is {SharedMemoryUsage}", invokeResponse.InvocationId, logBuilder.ToString()); } IDictionary <string, object> bindingsDictionary = await invokeResponse.OutputData .ToDictionaryAsync(binding => binding.Name, binding => GetBindingDataAsync(binding, invokeResponse.InvocationId)); var result = new ScriptInvocationResult() { Outputs = bindingsDictionary, Return = invokeResponse?.ReturnValue?.ToObject() }; context.ResultSource.SetResult(result); } catch (Exception responseEx) { context.ResultSource.TrySetException(responseEx); } finally { // Free memory allocated by the host (for input bindings) if (!_sharedMemoryManager.TryFreeSharedMemoryMapsForInvocation(invokeResponse.InvocationId)) { _workerChannelLogger.LogWarning($"Cannot free all shared memory resources for invocation: {invokeResponse.InvocationId}"); } // List of shared memory maps that were produced by the worker (for output bindings) IList <string> outputMaps = GetOutputMaps(invokeResponse.OutputData); if (outputMaps.Count > 0) { // If this invocation was using any shared memory maps produced by the worker, close them to free memory SendCloseSharedMemoryResourcesForInvocationRequest(outputMaps); } } } }