Skip to content

Commit 421dd93

Browse files
Edge function helpers (#13)
1 parent 146b685 commit 421dd93

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

edge-function/Component.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,44 @@
11
namespace EdgeFunctionWorld.wit.exports.wasi.http.v0_2_0;
22
using System.Text;
3+
using System.Text.Json;
4+
using System.Text.Json.Serialization;
35

46
using EdgeFunctionWorld;
57
using EdgeFunctionWorld.wit.exports.wasi.http.v0_2_0;
68
using EdgeFunctionWorld.wit.imports.wasi.http.v0_2_0;
79
using EdgeFunctionWorld.wit.imports.wasi.io.v0_2_0;
810

11+
public class Settings
12+
{
13+
[JsonPropertyName("example")]
14+
public string Example { get; set; }
15+
}
16+
17+
[JsonSerializable(typeof(Settings))]
18+
internal partial class SettingsJsonContext : JsonSerializerContext
19+
{
20+
}
21+
22+
23+
924
public class IncomingHandlerImpl: IIncomingHandler {
1025
public static void Handle(ITypes.IncomingRequest request, ITypes.ResponseOutparam responseOut) {
26+
var incomingHeaders = RequestUtility.ParseHeaders(request);
27+
var incomingBody = RequestUtility.ParseBody(request);
28+
var settings = RequestUtility.ParseSetting(incomingHeaders);
29+
30+
Console.WriteLine($"Received request with headers: {string.Join(", ", incomingHeaders.Select(kv => $"{kv.Key}: {Encoding.UTF8.GetString(kv.Value)}"))}");
31+
if (incomingBody != null)
32+
{
33+
Console.WriteLine($"Request body: {Encoding.UTF8.GetString(incomingBody)}");
34+
}
35+
else
36+
{
37+
Console.WriteLine("Request body: null");
38+
}
39+
Console.WriteLine($"Settings: {settings?.Example ?? "No settings provided"}");
40+
41+
// write output
1142
byte[] content = "Hello, World!"u8.ToArray();
1243
List<(string, byte[])> headers =
1344
[

edge-function/RequestUtility.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using System.Text;
2+
using System.Text.Json;
3+
using System.Text.Json.Serialization;
4+
5+
using EdgeFunctionWorld;
6+
using EdgeFunctionWorld.wit.exports.wasi.http.v0_2_0;
7+
using EdgeFunctionWorld.wit.imports.wasi.http.v0_2_0;
8+
using EdgeFunctionWorld.wit.imports.wasi.io.v0_2_0;
9+
10+
public static class RequestUtility {
11+
public static Dictionary<string, byte[]> ParseHeaders(ITypes.IncomingRequest request) {
12+
var requestHeaders = new Dictionary<string, byte[]>();
13+
foreach ((var key, var value) in request.Headers().Entries())
14+
{
15+
requestHeaders.Add(key, value);
16+
}
17+
return requestHeaders;
18+
}
19+
20+
public static byte[]? ParseBody(ITypes.IncomingRequest request) {
21+
var body_handle = request.Consume();
22+
var stream = body_handle.Stream();
23+
var bodyChunks = new List<byte>();
24+
25+
try {
26+
while (true) {
27+
var chunk = stream.Read(1024);
28+
if (chunk.Length == 0) {
29+
break;
30+
}
31+
bodyChunks.AddRange(chunk);
32+
}
33+
}
34+
catch (EdgeFunctionWorld.WitException e) {
35+
switch (e.Value) {
36+
case global::EdgeFunctionWorld.wit.imports.wasi.io.v0_2_0.IStreams.StreamError streamError:
37+
break;
38+
default:
39+
throw;
40+
}
41+
}
42+
finally {}
43+
return bodyChunks.ToArray();
44+
}
45+
46+
public static Settings ParseSetting(Dictionary<string, byte[]> headers) {
47+
return JsonSerializer.Deserialize<Settings>(headers["x-edgee-component-settings"], SettingsJsonContext.Default.Settings);
48+
}
49+
}

0 commit comments

Comments
 (0)