10
10
using System . Text ;
11
11
using System . Threading . Tasks ;
12
12
using System . Web ;
13
+ using Supabase . Functions . Exceptions ;
13
14
14
15
[ assembly: InternalsVisibleTo ( "FunctionsTests" ) ]
16
+
15
17
namespace Supabase . Functions
16
18
{
17
-
19
+ /// <inheritdoc />
18
20
public partial class Client : IFunctionsClient
19
21
{
20
- private static readonly HttpClient client = new HttpClient ( ) ;
21
- private string baseUrl ;
22
+ private static readonly HttpClient HttpClient = new HttpClient ( ) ;
23
+ private readonly string _baseUrl ;
22
24
23
25
/// <summary>
24
26
/// Function that can be set to return dynamic headers.
25
27
///
26
- /// Headers specified in the method parameters will ALWAYS take precendece over headers returned by this function.
28
+ /// Headers specified in the method parameters will ALWAYS take precedence over headers returned by this function.
27
29
/// </summary>
28
30
public Func < Dictionary < string , string > > ? GetHeaders { get ; set ; }
29
31
32
+ /// <summary>
33
+ /// Initializes a functions client
34
+ /// </summary>
35
+ /// <param name="baseUrl"></param>
30
36
public Client ( string baseUrl )
31
37
{
32
- this . baseUrl = baseUrl ;
38
+ _baseUrl = baseUrl ;
33
39
}
34
40
35
41
/// <summary>
@@ -39,9 +45,10 @@ public Client(string baseUrl)
39
45
/// <param name="token">Anon Key.</param>
40
46
/// <param name="options">Options</param>
41
47
/// <returns></returns>
42
- public async Task < HttpContent > RawInvoke ( string functionName , string ? token = null , InvokeFunctionOptions ? options = null )
48
+ public async Task < HttpContent > RawInvoke ( string functionName , string ? token = null ,
49
+ InvokeFunctionOptions ? options = null )
43
50
{
44
- var url = $ "{ baseUrl } /{ functionName } ";
51
+ var url = $ "{ _baseUrl } /{ functionName } ";
45
52
46
53
return ( await HandleRequest ( url , token , options ) ) . Content ;
47
54
}
@@ -53,9 +60,10 @@ public async Task<HttpContent> RawInvoke(string functionName, string? token = nu
53
60
/// <param name="token">Anon Key.</param>
54
61
/// <param name="options">Options</param>
55
62
/// <returns></returns>
56
- public async Task < string > Invoke ( string functionName , string ? token = null , InvokeFunctionOptions ? options = null )
63
+ public async Task < string > Invoke ( string functionName , string ? token = null ,
64
+ InvokeFunctionOptions ? options = null )
57
65
{
58
- var url = $ "{ baseUrl } /{ functionName } ";
66
+ var url = $ "{ _baseUrl } /{ functionName } ";
59
67
var response = await HandleRequest ( url , token , options ) ;
60
68
61
69
return await response . Content . ReadAsStringAsync ( ) ;
@@ -65,13 +73,14 @@ public async Task<string> Invoke(string functionName, string? token = null, Invo
65
73
/// Invokes a function and returns a JSON Deserialized object according to the supplied generic Type <typeparamref name="T"/>
66
74
/// </summary>
67
75
/// <typeparam name="T"></typeparam>
68
- /// <param name="functionsName ">Function Name, will be appended to BaseUrl</param>
76
+ /// <param name="functionName ">Function Name, will be appended to BaseUrl</param>
69
77
/// <param name="token">Anon Key.</param>
70
78
/// <param name="options">Options</param>
71
79
/// <returns></returns>
72
- public async Task < T ? > Invoke < T > ( string functionName , string ? token = null , InvokeFunctionOptions ? options = null ) where T : class
80
+ public async Task < T ? > Invoke < T > ( string functionName , string ? token = null ,
81
+ InvokeFunctionOptions ? options = null ) where T : class
73
82
{
74
- var url = $ "{ baseUrl } /{ functionName } ";
83
+ var url = $ "{ _baseUrl } /{ functionName } ";
75
84
var response = await HandleRequest ( url , token , options ) ;
76
85
77
86
var content = await response . Content . ReadAsStringAsync ( ) ;
@@ -86,13 +95,11 @@ public async Task<string> Invoke(string functionName, string? token = null, Invo
86
95
/// <param name="token"></param>
87
96
/// <param name="options"></param>
88
97
/// <returns></returns>
89
- /// <exception cref="RequestException"></exception>
90
- internal async Task < HttpResponseMessage > HandleRequest ( string url , string ? token = null , InvokeFunctionOptions ? options = null )
98
+ /// <exception cref="FunctionsException"></exception>
99
+ private async Task < HttpResponseMessage > HandleRequest ( string url , string ? token = null ,
100
+ InvokeFunctionOptions ? options = null )
91
101
{
92
- if ( options == null )
93
- {
94
- options = new InvokeFunctionOptions ( ) ;
95
- }
102
+ options ??= new InvokeFunctionOptions ( ) ;
96
103
97
104
if ( GetHeaders != null )
98
105
{
@@ -111,46 +118,29 @@ internal async Task<HttpResponseMessage> HandleRequest(string url, string? token
111
118
112
119
builder . Query = query . ToString ( ) ;
113
120
114
- using ( var requestMessage = new HttpRequestMessage ( HttpMethod . Post , builder . Uri ) )
115
- {
116
- requestMessage . Content = new StringContent ( JsonConvert . SerializeObject ( options . Body ) , Encoding . UTF8 , "application/json" ) ;
117
-
118
- if ( options . Headers != null )
119
- {
120
- foreach ( var kvp in options . Headers )
121
- {
122
- requestMessage . Headers . TryAddWithoutValidation ( kvp . Key , kvp . Value ) ;
123
- }
124
- }
125
-
126
- var response = await client . SendAsync ( requestMessage ) ;
127
-
128
- if ( ! response . IsSuccessStatusCode || response . Headers . Contains ( "x-relay-error" ) )
129
- {
130
- var content = await response . Content . ReadAsStringAsync ( ) ;
131
-
132
- var obj = new ErrorResponse
133
- {
134
- Content = content ,
135
- Message = content
136
- } ;
137
- throw new RequestException ( response , obj ) ;
138
- }
121
+ using var requestMessage = new HttpRequestMessage ( HttpMethod . Post , builder . Uri ) ;
122
+ requestMessage . Content = new StringContent ( JsonConvert . SerializeObject ( options . Body ) , Encoding . UTF8 ,
123
+ "application/json" ) ;
139
124
140
- return response ;
125
+ foreach ( var kvp in options . Headers )
126
+ {
127
+ requestMessage . Headers . TryAddWithoutValidation ( kvp . Key , kvp . Value ) ;
141
128
}
142
- }
143
129
144
- public class RequestException : Exception
145
- {
146
- public HttpResponseMessage Response { get ; private set ; }
147
- public ErrorResponse Error { get ; private set ; }
130
+ var response = await HttpClient . SendAsync ( requestMessage ) ;
148
131
149
- public RequestException ( HttpResponseMessage response , ErrorResponse error ) : base ( error . Message )
132
+ if ( response . IsSuccessStatusCode && ! response . Headers . Contains ( "x-relay-error" ) )
133
+ return response ;
134
+
135
+ var content = await response . Content . ReadAsStringAsync ( ) ;
136
+ var exception = new FunctionsException ( content )
150
137
{
151
- Response = response ;
152
- Error = error ;
153
- }
138
+ Content = content ,
139
+ Response = response ,
140
+ StatusCode = ( int ) response . StatusCode
141
+ } ;
142
+ exception . AddReason ( ) ;
143
+ throw exception ;
154
144
}
155
145
}
156
- }
146
+ }
0 commit comments