1
- using Newtonsoft . Json ;
2
- using Supabase . Core ;
3
- using Supabase . Core . Extensions ;
4
- using Supabase . Functions . Interfaces ;
5
- using Supabase . Functions . Responses ;
6
- using System ;
1
+ using System ;
7
2
using System . Collections . Generic ;
8
3
using System . Net . Http ;
9
4
using System . Runtime . CompilerServices ;
10
5
using System . Text ;
11
6
using System . Threading . Tasks ;
12
7
using System . Web ;
8
+ using Newtonsoft . Json ;
9
+ using Supabase . Core ;
10
+ using Supabase . Core . Extensions ;
13
11
using Supabase . Functions . Exceptions ;
12
+ using Supabase . Functions . Interfaces ;
14
13
15
14
[ assembly: InternalsVisibleTo ( "FunctionsTests" ) ]
16
15
@@ -21,10 +20,11 @@ public partial class Client : IFunctionsClient
21
20
{
22
21
private HttpClient _httpClient = new HttpClient ( ) ;
23
22
private readonly string _baseUrl ;
23
+ private readonly FunctionRegion _region ;
24
24
25
25
/// <summary>
26
26
/// Function that can be set to return dynamic headers.
27
- ///
27
+ ///
28
28
/// Headers specified in the method parameters will ALWAYS take precedence over headers returned by this function.
29
29
/// </summary>
30
30
public Func < Dictionary < string , string > > ? GetHeaders { get ; set ; }
@@ -33,9 +33,11 @@ public partial class Client : IFunctionsClient
33
33
/// Initializes a functions client
34
34
/// </summary>
35
35
/// <param name="baseUrl"></param>
36
- public Client ( string baseUrl )
36
+ /// <param name="region"></param>
37
+ public Client ( string baseUrl , FunctionRegion ? region = null )
37
38
{
38
39
_baseUrl = baseUrl ;
40
+ _region = region ?? FunctionRegion . Any ;
39
41
}
40
42
41
43
/// <summary>
@@ -45,8 +47,11 @@ public Client(string baseUrl)
45
47
/// <param name="token">Anon Key.</param>
46
48
/// <param name="options">Options</param>
47
49
/// <returns></returns>
48
- public async Task < HttpContent > RawInvoke ( string functionName , string ? token = null ,
49
- InvokeFunctionOptions ? options = null )
50
+ public async Task < HttpContent > RawInvoke (
51
+ string functionName ,
52
+ string ? token = null ,
53
+ InvokeFunctionOptions ? options = null
54
+ )
50
55
{
51
56
var url = $ "{ _baseUrl } /{ functionName } ";
52
57
@@ -60,8 +65,11 @@ public async Task<HttpContent> RawInvoke(string functionName, string? token = nu
60
65
/// <param name="token">Anon Key.</param>
61
66
/// <param name="options">Options</param>
62
67
/// <returns></returns>
63
- public async Task < string > Invoke ( string functionName , string ? token = null ,
64
- InvokeFunctionOptions ? options = null )
68
+ public async Task < string > Invoke (
69
+ string functionName ,
70
+ string ? token = null ,
71
+ InvokeFunctionOptions ? options = null
72
+ )
65
73
{
66
74
var url = $ "{ _baseUrl } /{ functionName } ";
67
75
var response = await HandleRequest ( url , token , options ) ;
@@ -77,8 +85,12 @@ public async Task<string> Invoke(string functionName, string? token = null,
77
85
/// <param name="token">Anon Key.</param>
78
86
/// <param name="options">Options</param>
79
87
/// <returns></returns>
80
- public async Task < T ? > Invoke < T > ( string functionName , string ? token = null ,
81
- InvokeFunctionOptions ? options = null ) where T : class
88
+ public async Task < T ? > Invoke < T > (
89
+ string functionName ,
90
+ string ? token = null ,
91
+ InvokeFunctionOptions ? options = null
92
+ )
93
+ where T : class
82
94
{
83
95
var url = $ "{ _baseUrl } /{ functionName } ";
84
96
var response = await HandleRequest ( url , token , options ) ;
@@ -96,8 +108,11 @@ public async Task<string> Invoke(string functionName, string? token = null,
96
108
/// <param name="options"></param>
97
109
/// <returns></returns>
98
110
/// <exception cref="FunctionsException"></exception>
99
- private async Task < HttpResponseMessage > HandleRequest ( string url , string ? token = null ,
100
- InvokeFunctionOptions ? options = null )
111
+ private async Task < HttpResponseMessage > HandleRequest (
112
+ string url ,
113
+ string ? token = null ,
114
+ InvokeFunctionOptions ? options = null
115
+ )
101
116
{
102
117
options ??= new InvokeFunctionOptions ( ) ;
103
118
@@ -113,26 +128,40 @@ private async Task<HttpResponseMessage> HandleRequest(string url, string? token
113
128
114
129
options . Headers [ "X-Client-Info" ] = Util . GetAssemblyVersion ( typeof ( Client ) ) ;
115
130
131
+ var region = options . FunctionRegion ;
132
+ if ( region == null )
133
+ {
134
+ region = _region ;
135
+ }
136
+
137
+ if ( region != FunctionRegion . Any )
138
+ {
139
+ options . Headers [ "x-region" ] = region . ToString ( ) ;
140
+ }
141
+
116
142
var builder = new UriBuilder ( url ) ;
117
143
var query = HttpUtility . ParseQueryString ( builder . Query ) ;
118
144
119
145
builder . Query = query . ToString ( ) ;
120
146
121
- using var requestMessage = new HttpRequestMessage ( HttpMethod . Post , builder . Uri ) ;
122
- requestMessage . Content = new StringContent ( JsonConvert . SerializeObject ( options . Body ) , Encoding . UTF8 ,
123
- "application/json" ) ;
147
+ using var requestMessage = new HttpRequestMessage ( options . HttpMethod , builder . Uri ) ;
148
+ requestMessage . Content = new StringContent (
149
+ JsonConvert . SerializeObject ( options . Body ) ,
150
+ Encoding . UTF8 ,
151
+ "application/json"
152
+ ) ;
124
153
125
154
foreach ( var kvp in options . Headers )
126
155
{
127
156
requestMessage . Headers . TryAddWithoutValidation ( kvp . Key , kvp . Value ) ;
128
157
}
129
-
158
+
130
159
if ( _httpClient . Timeout != options . HttpTimeout )
131
160
{
132
161
_httpClient = new HttpClient ( ) ;
133
162
_httpClient . Timeout = options . HttpTimeout ;
134
163
}
135
-
164
+
136
165
var response = await _httpClient . SendAsync ( requestMessage ) ;
137
166
138
167
if ( response . IsSuccessStatusCode && ! response . Headers . Contains ( "x-relay-error" ) )
@@ -143,10 +172,10 @@ private async Task<HttpResponseMessage> HandleRequest(string url, string? token
143
172
{
144
173
Content = content ,
145
174
Response = response ,
146
- StatusCode = ( int ) response . StatusCode
175
+ StatusCode = ( int ) response . StatusCode ,
147
176
} ;
148
177
exception . AddReason ( ) ;
149
178
throw exception ;
150
179
}
151
180
}
152
- }
181
+ }
0 commit comments