dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
15.03k stars 4.68k forks source link

[wasi] Support `wasi-sockets` and `wasi-http` #98957

Open dicej opened 7 months ago

dicej commented 7 months ago

WASI 0.2.0 introduces two new networking APIs: wasi-sockets (for TCP/UDP networking and hostname lookup) and wasi-http (a high-level API for handling inbound HTTP requests and sending outbound ones). Ideally, the WASI port of the .NET should support both.

Dave Bakker and I have implemented wasi-sockets in a temporary fork of wasi-libc, and I'm currently in the process of incrementally merging that work upstream, with the aim of making it available as part of the forthcoming WASI-SDK 22 release. I've also created temporary forks of Rust and CPython based on the wasi-libc work and plan to upstream those changes as well. Similarly, I'm hoping it will be straightforward to add wasi-sockets support to .NET as well by way of the POSIX APIs provided by wasi-libc.

Given that there's no C standard library or POSIX interface for HTTP, it won't be supported as part of wasi-libc, so porting e.g. System.Net.Http to use wasi-http will presumably involve wrapping wit-bindgen-generated C or C# code, depending on how solid the C# binding generator is.

I should note that I have close to zero experience with .NET, so I'm happy to defer to the experts here about the details of how all this should proceed. I'm also happy to learn and contribute as appropriate.

ghost commented 7 months ago

Tagging subscribers to this area: @dotnet/ncl See info in area-owners.md if you want to be subscribed.

Issue Details
WASI 0.2.0 introduces two new networking APIs: [wasi-sockets](https://github.com/WebAssembly/wasi-sockets) (for TCP/UDP networking and hostname lookup) and [wasi-http](https://github.com/WebAssembly/wasi-http) (a high-level API for handling inbound HTTP requests and sending outbound ones). Ideally, the WASI port of the .NET should support both. Dave Bakker and I have implemented `wasi-sockets` in [a temporary fork](https://github.com/WebAssembly/wasi-libc/pull/449) of `wasi-libc`, and I'm currently in the process of incrementally merging that work upstream, with the aim of making it available as part of the forthcoming WASI-SDK 22 release. I've also created temporary forks of Rust and CPython based on the `wasi-libc` work and plan to upstream those changes as well. Similarly, I'm hoping it will be straightforward to add `wasi-sockets` support to .NET as well by way of the POSIX APIs provided by `wasi-libc`. Given that there's no C standard library or POSIX interface for HTTP, it won't be supported as part of `wasi-libc`, so porting e.g. `System.Net.Http` to use `wasi-http` will presumably involve wrapping `wit-bindgen`-generated C or C# code, depending on how solid the C# binding generator is. I should note that I have close to zero experience with .NET, so I'm happy to defer to the experts here about the details of how all this should proceed. I'm also happy to learn and contribute as appropriate.
Author: dicej
Assignees: -
Labels: `area-System.Net.Http`, `untriaged`
Milestone: -
ghost commented 7 months ago

Tagging subscribers to 'arch-wasm': @lewing See info in area-owners.md if you want to be subscribed.

Issue Details
WASI 0.2.0 introduces two new networking APIs: [wasi-sockets](https://github.com/WebAssembly/wasi-sockets) (for TCP/UDP networking and hostname lookup) and [wasi-http](https://github.com/WebAssembly/wasi-http) (a high-level API for handling inbound HTTP requests and sending outbound ones). Ideally, the WASI port of the .NET should support both. Dave Bakker and I have implemented `wasi-sockets` in [a temporary fork](https://github.com/WebAssembly/wasi-libc/pull/449) of `wasi-libc`, and I'm currently in the process of incrementally merging that work upstream, with the aim of making it available as part of the forthcoming WASI-SDK 22 release. I've also created temporary forks of Rust and CPython based on the `wasi-libc` work and plan to upstream those changes as well. Similarly, I'm hoping it will be straightforward to add `wasi-sockets` support to .NET as well by way of the POSIX APIs provided by `wasi-libc`. Given that there's no C standard library or POSIX interface for HTTP, it won't be supported as part of `wasi-libc`, so porting e.g. `System.Net.Http` to use `wasi-http` will presumably involve wrapping `wit-bindgen`-generated C or C# code, depending on how solid the C# binding generator is. I should note that I have close to zero experience with .NET, so I'm happy to defer to the experts here about the details of how all this should proceed. I'm also happy to learn and contribute as appropriate.
Author: dicej
Assignees: -
Labels: `arch-wasm`, `area-System.Net.Http`, `untriaged`, `os-wasi`
Milestone: -
MichalPetryka commented 7 months ago

Would wasi-sockets require some new API like WebSockets and WebRTC do or are they compatible with normal Sockets?

dicej commented 7 months ago

Would wasi-sockets require some new API like WebSockets and WebRTC do or are they compatible with normal Sockets?

Unlike WebSockets and WebRTC, which represent novel protocols, wasi-sockets is only concerned with TCP and UDP network sockets (plus domain name lookups). It intentionally mirrors the Berkeley/POSIX interface for Internet sockets, with tweaks to make it more capability-oriented in keeping with the WASI security model. And even that capability model is abstracted away by wasi-libc, so .NET's existing System.Net.Sockets APIs should work fine. In fact, we should be able to share the existing implementation of those APIs with other POSIX-style systems .NET already supports.

pavelsavara commented 2 months ago

let's do it 😄