3
3
4
4
using System ;
5
5
using System . Collections . Generic ;
6
+ using System . Dynamic ;
6
7
using System . Linq ;
8
+ using Microsoft . Azure . WebJobs . Script . Binding ;
7
9
using Microsoft . Azure . WebJobs . Script . Description ;
10
+ using Newtonsoft . Json ;
11
+ using Newtonsoft . Json . Linq ;
8
12
9
13
namespace Microsoft . Azure . WebJobs . Script . Workers . Http
10
14
{
@@ -16,49 +20,82 @@ public static ScriptInvocationResult ToScriptInvocationResult(this HttpScriptInv
16
20
{
17
21
Outputs = new Dictionary < string , object > ( )
18
22
} ;
19
- if ( httpScriptInvocationResult . Outputs != null && httpScriptInvocationResult . Outputs . Any ( ) )
23
+
24
+ foreach ( var outputBindingMetadata in scriptInvocationContext . FunctionMetadata . OutputBindings )
20
25
{
21
- foreach ( var outputFromHttpWorker in httpScriptInvocationResult . Outputs )
26
+ object outputValue = GetOutputValue ( outputBindingMetadata . Name , outputBindingMetadata . Type , outputBindingMetadata . DataType , httpScriptInvocationResult . Outputs ) ;
27
+ if ( outputValue != null )
22
28
{
23
- BindingMetadata outputBindingMetadata = GetBindingMetadata ( outputFromHttpWorker . Key , scriptInvocationContext ) ;
24
- scriptInvocationResult . Outputs [ outputFromHttpWorker . Key ] = GetOutputValue ( outputBindingMetadata , outputFromHttpWorker . Value ) ;
29
+ scriptInvocationResult . Outputs [ outputBindingMetadata . Name ] = outputValue ;
25
30
}
26
31
}
32
+
27
33
if ( httpScriptInvocationResult . ReturnValue != null )
28
34
{
29
35
BindingMetadata returnParameterBindingMetadata = GetBindingMetadata ( ScriptConstants . SystemReturnParameterBindingName , scriptInvocationContext ) ;
30
- scriptInvocationResult . Return = GetOutputValue ( returnParameterBindingMetadata , httpScriptInvocationResult . ReturnValue ) ;
36
+ scriptInvocationResult . Return = GetBindingValue ( returnParameterBindingMetadata . DataType , httpScriptInvocationResult . ReturnValue ) ;
31
37
}
32
38
return scriptInvocationResult ;
33
39
}
34
40
35
- private static object GetOutputValue ( BindingMetadata bindingMetadata , object outputBindingValue )
41
+ internal static object GetOutputValue ( string outputBindingName , string bindingType , DataType ? bindingDataType , IDictionary < string , object > outputsFromWorker )
42
+ {
43
+ if ( outputsFromWorker == null )
44
+ {
45
+ return null ;
46
+ }
47
+ object outputBindingValue ;
48
+ if ( bindingType == "http" && ! outputBindingName . Equals ( ScriptConstants . SystemReturnParameterBindingName ) )
49
+ {
50
+ return GetHttpOutputBindingResponse ( outputBindingName , outputsFromWorker ) ;
51
+ }
52
+ if ( outputsFromWorker . TryGetValue ( outputBindingName , out outputBindingValue ) )
53
+ {
54
+ return GetBindingValue ( bindingDataType , outputBindingValue ) ;
55
+ }
56
+ return null ;
57
+ }
58
+
59
+ private static object GetBindingValue ( DataType ? bindingDataType , object outputBindingValue )
60
+ {
61
+ if ( bindingDataType == DataType . Binary )
62
+ {
63
+ return outputBindingValue ;
64
+ }
65
+ else
66
+ {
67
+ try
68
+ {
69
+ return Convert . FromBase64String ( ( string ) outputBindingValue ) ;
70
+ }
71
+ catch
72
+ {
73
+ //ignore
74
+ }
75
+ }
76
+ return outputBindingValue ;
77
+ }
78
+
79
+ internal static object GetHttpOutputBindingResponse ( string bindingName , IDictionary < string , object > outputsFromWorker )
36
80
{
37
- if ( bindingMetadata != null && outputBindingValue != null )
81
+ HttpOutputBindingResponse httpOut = new HttpOutputBindingResponse ( ) ;
82
+ if ( outputsFromWorker . TryGetValue ( bindingName , out object outputBindingValue ) )
38
83
{
39
- if ( bindingMetadata . DataType == DataType . Binary )
84
+ try
40
85
{
41
- return outputBindingValue ;
86
+ httpOut = JsonConvert . DeserializeObject < HttpOutputBindingResponse > ( outputBindingValue . ToString ( ) ) ;
42
87
}
43
- else
88
+ catch
44
89
{
45
- try
46
- {
47
- return Convert . FromBase64String ( ( string ) outputBindingValue ) ;
48
- }
49
- catch
50
- {
51
- //ignore
52
- }
90
+ //ignore
53
91
}
54
- return outputBindingValue ;
55
92
}
56
- return null ;
93
+ return JsonConvert . SerializeObject ( httpOut ) ;
57
94
}
58
95
59
96
private static BindingMetadata GetBindingMetadata ( string outputBidingName , ScriptInvocationContext scriptInvocationContext )
60
97
{
61
- // Find dataType for outputbinding if exists
98
+ // Find BindingMetadata that matches output form http response
62
99
return scriptInvocationContext . FunctionMetadata . OutputBindings . FirstOrDefault ( outputBindingMetadata => outputBindingMetadata . Name == outputBidingName ) ;
63
100
}
64
101
}
0 commit comments