Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions edge-function/Component.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,44 @@
namespace EdgeFunctionWorld.wit.exports.wasi.http.v0_2_0;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;

using EdgeFunctionWorld;
using EdgeFunctionWorld.wit.exports.wasi.http.v0_2_0;
using EdgeFunctionWorld.wit.imports.wasi.http.v0_2_0;
using EdgeFunctionWorld.wit.imports.wasi.io.v0_2_0;

public class Settings
{
[JsonPropertyName("example")]
public string Example { get; set; }
}

[JsonSerializable(typeof(Settings))]
internal partial class SettingsJsonContext : JsonSerializerContext
{
}



public class IncomingHandlerImpl: IIncomingHandler {
public static void Handle(ITypes.IncomingRequest request, ITypes.ResponseOutparam responseOut) {
var incomingHeaders = RequestUtility.ParseHeaders(request);
var incomingBody = RequestUtility.ParseBody(request);
var settings = RequestUtility.ParseSetting(incomingHeaders);

Console.WriteLine($"Received request with headers: {string.Join(", ", incomingHeaders.Select(kv => $"{kv.Key}: {Encoding.UTF8.GetString(kv.Value)}"))}");
if (incomingBody != null)
{
Console.WriteLine($"Request body: {Encoding.UTF8.GetString(incomingBody)}");
}
else
{
Console.WriteLine("Request body: null");
}
Console.WriteLine($"Settings: {settings?.Example ?? "No settings provided"}");

// write output
byte[] content = "Hello, World!"u8.ToArray();
List<(string, byte[])> headers =
[
Expand Down
49 changes: 49 additions & 0 deletions edge-function/RequestUtility.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;

using EdgeFunctionWorld;
using EdgeFunctionWorld.wit.exports.wasi.http.v0_2_0;
using EdgeFunctionWorld.wit.imports.wasi.http.v0_2_0;
using EdgeFunctionWorld.wit.imports.wasi.io.v0_2_0;

public static class RequestUtility {
public static Dictionary<string, byte[]> ParseHeaders(ITypes.IncomingRequest request) {
var requestHeaders = new Dictionary<string, byte[]>();
foreach ((var key, var value) in request.Headers().Entries())
{
requestHeaders.Add(key, value);
}
return requestHeaders;
}

public static byte[]? ParseBody(ITypes.IncomingRequest request) {
var body_handle = request.Consume();
var stream = body_handle.Stream();
var bodyChunks = new List<byte>();

try {
while (true) {
var chunk = stream.Read(1024);
if (chunk.Length == 0) {
break;
}
bodyChunks.AddRange(chunk);
}
}
catch (EdgeFunctionWorld.WitException e) {
switch (e.Value) {
case global::EdgeFunctionWorld.wit.imports.wasi.io.v0_2_0.IStreams.StreamError streamError:
break;
default:
throw;
}
}
finally {}
return bodyChunks.ToArray();
}

public static Settings ParseSetting(Dictionary<string, byte[]> headers) {
return JsonSerializer.Deserialize<Settings>(headers["x-edgee-component-settings"], SettingsJsonContext.Default.Settings);
}
}