Tags: zigzap/zap
Tags
__Update to Zig 0.13__
With the help of our awesome contributers, we have a new release:
- Zap is now officially based on Zig 0.13.0!
- Thx to Lois Pearson, we now have `mimetypeRegister` and `mimetypeClear`
- Thx to geemili, we don't need to link facil.io in our build.zigs anymore
- Thx to Sören Michaels, `methodAsEnum` supports the `HEAD` method.
- ... and more, see the changelog below
**Note:** there now is a `zig-master` branch that gets updated with breaking changes of Zig master on a somewhat regular basis. Please feel free to send PRs.
Many thanks again to everyone who helped out:
Giuseppe Cesarano (1):
fix: _debug typo in startWithLogging
Joe Koop (1):
update http.zig to rfc9110 using MDN as a reference
Lord Asdi (1):
fix: use std.process.getEnvVarOwned instead of std.posix.getenv
Louis Pearson (8):
fix: last_modifed -> last_modified
fix: docserver: server wasm with correct mimetype
feat: Wrap mimetypeRegister and mimetypeClear
fix: move getHeaderCommon to zap.zig
feat: add parseAccept
feat: make example for parseAccept
fix: simplify accept header api somewhat
feat: pre-allocate enough space for accept items
Michael Wendt (1):
feat: remove deprecated path
Rene Schallner (18):
Update hello_json.zig
fix docserver invocation from build.zig
proposed change to parseAccept API
make zap master build with zig master
update zig version
updated zig-master check in CI
update badge in README
corrected release templates
Sören Michaels (1):
feat: add HEAD Method to `methodAsEnum`
geemili (1):
feat: streamline depending on zap by linking facil.io to module
__Update to Zig 0.12__ With the help of our awesome contributers, we have a new release: - zap is now officially based on Zig 0.12.0! - tests have been updated to use the latest `std.http` client - @desttinghim added `getHeaderCommon` to `zap.Request` - @leroycep improved error return traces in `zap.Request.sendError()` - @dasimmet and @dweiller fixed the use of @fieldParentPtr to the new style - @xflow-systems improved the write function of websockets Users of `sendError()`: the API has changed! The doc comment has been updated. The new way of using it is: ```ts r.sendError(err, if (@errorReturnTrace()) |t| t.* else null, 505); ``` The new version outputs much nicer error traces. **Note:** there will likely be a `zig-master` branch in the future that gets updated with breaking changes of Zig master. For sanity reasons, it will not be called `zig-0.13.0` but `zig-master`. I'll update the README accordingly then. **Note 2:** I merged PRs and fixed the tests while waiting for my plane to board, then finished on the plane. If I might have rushed it and oopsied something up, I'll apologize and follow up with a bugfix release. One open issue is using openssl on macOS, especially with openssl in custom locations, like homebrew-installed versions. If anyone wants to look into that: PRs are welcome 😊! Many thanks again to everyone who helped out!
__Breaking change in zap.Router__ Latest zig master does not allow for multiple copies of the same anonymous type anymore. This broke zap.RequestHandler used by zap.Router. So I rewrote zap.Router and zap.RequestHandler is gone. To keep the APIs identical for both zig versions, I applied the rewrite patch also to the zig 0.11.0 (master) branch. - [simple_router example](https://github.com/zigzap/zap/blob/master/examples/simple_router/simple_router.zig) - [zap.Router documentation](https://zigzap.org/zap/#zap.router) From a user perspective not much changed: - for unbound route handlers, use `zap.Router.handle_route_unbound`. - use `zap.Router.on_request_handler()` to get the request function to pass to a Listener. **Note:** the 0.12.0 branch is currently broken with regard to tests due to changes in `std.http`. __**Changelog**__ in alphabetical order: GitHub Action (1): Update README Rene Schallner (2): trying to add mastercheck badge to README re-write of zap.Router, fix #83
__Request.methodAsEnum() and Windows build error message__
This is a small update of recent PRs. Thanks for the great contributions!
See the changelog below for individual contributions.
- `zap.Request.methodAsEnum()` returns HTTP method as enum or .UNKNOWN
- the reason the method is not an enum by default is to avoid the
string comparisons on every request when we might not need them
- build attempts on Windows now produce a meaningful error message
- `zap.Request` now supports `getParamSlice()` and `getParamSlices()`
which return optional string slices of the raw query string.
- PRO: no allocation
- CON: no decoding: "hello+zap" will not be decoded into "hello zap"
- if you need decoding, you can still use `getParamStr()`.
I updated the docs and zig-0.12.0 branch, too, as with all recent and future releases.
__**Changelog**__ in alphabetical order:
Froxcey (4):
Use std.http.Method for Request.method
Use custom method enum
Provide Windows error message
Use debug.err and exit 1 for windows fail message
Joe Liotta (1):
fixed unneeded optional unwrap in hello_json
Rene Schallner (8):
Update README.md to point out even more prominently the zig master situation
Merge pull request #72 from Chiissu/master
Merge pull request #75 from Chiissu/windows-errmsg
access raw query params w/o allocator, close #40
cosmetics
Merge pull request #79 from joeypas/master
fix workflow to detect failing builds of individual samples
in http.methodToEnum use std.meta.stringToEnum
performance: revert r.method enum back to ?[]const u8
(new http.Method enum is available via r.methodAsEnum())
use methodAsEnum() in Endpoint, and in json example
__Introducing: zap.Router__ Thanks to StringNick, we now have `zap.Router` with handler closures support! See the `simple_router` example. `zap.Router` is missing doc comments, so if anyone wants to step up, please feel free to send a PR against the `zig-0.12.0` my way. BTW: Documentation (built on zig-0.12.0 branch) is now live at: <https://zigzap.org/zap> Doc update PRs are welcome. I am especially excited about the _guides_ feature: <https://zigzap.org/zap/#G;> __**Introduced:**__ - `zap.Router`: the router itself - `zap.RequestHandler : a nice way to capture "self" pointers of containers of request functions. - `simple_router`: example demonstrating the above Thanks again to StringNick! I updated the zig-0.12.0 branch, too, as with all recent and future releases.
__Breaking API Cleanup__ **Documentation (built on zig-0.12.0 branch) is now live at: <https://zigzap.org/zap>** Doc update PRs are welcome. I am especially excited about the _guides_ feature: <https://zigzap.org/zap/#G;> So, I spent a few days with a first pass of cleaning up Zap's API, informed by using it in production for over half a year now. **__Refactored:__** - no more type names starting with `Simple`. - zap.SimpleEndpoint -> zap.Endpoint - zap.SimpleRequest -> zap.Request - zap.SimpleHttpListener -> zap.HttpListener - ... - zap.Endpoint : zap.Endpoint, zap.Endpoint.Authenticating - zap.Endpoint.Listener.register() // was: zap.EndpointListener.addEndpoint - zap.Auth : zap.Auth.Basic, zap.Auth.BearerSingle, ... - zap.Mustache : stayed the same - zap.Request : refactored into its own file, along with supporting types and functions (e.g. http params related) - added setContentTypeFromFilename thx @hauleth. - zap.Middleware: no more MixContexts - (zig structs are fine) - check example - zap.fio : facilio C FFI stuff does not pollute zap namespace anymore - it is still available via `zap.fio`. - allocators are always first-ish param: either first or after self - more docstrings All examples and tests have been updated. Also, check out the documentation (work in progress).
__-Dopenssl is back && breaking mustache changes__ Thanks to @Vemahk, `-Dopenssl=true` is back! Apparently, while trying to pass user-defined options from a dependent project to zap, I typoed the working solution, and several people pointed out to me that it's as simple as: ```zig const zap = b.dependency("zap", .{ .target = target, .optimize = optimize, .openssl = false, // set to true to enable TLS support }); ``` As a result, we re-introduced `-Dopenssl`, use it if present, and fall back to the `ZAP_USE_OPENSSL` env var (set to `true` to enable) if not. Aaand: thanks to @chooky (BrookJeynes on GH), we have a new, clean, zig-iomatic, documented Mustache API in Zap now: ```zig var mustache = try Mustache.fromData("{{some_item}} {{& nested.item }}"); defer mustache.deinit(); const b = mustache.build(.{ .some_item = 42, .nested = .{ .item = 69, }, }); defer b.deinit(); if(b.str()) |s| { std.debug.print("{s}", .{s}); }; ``` Checkout mustache.zig and the mustache example to learn more.
__TLS / HTTPS / openssl build change!!!__
Previously, zap required `-Dopenssl=true` to build openssl support. Turns out, for projects using zap, it's insanely hard if not impossible to pass the user provided option `openssl=true` down to the zap dependency.
As a workaround, I changed the build so that it now expects an environment variable `ZAP_USE_OPENSSL` be set to `true`.
So, to build the _https_ example, run:
`ZAP_USE_OPENSSL=true zig build run-https`
*The Example*
Create the certificate and key file:
```console
$ openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:2048 -keyout mykey.pem -out mycert.pem
```
Build / run the example
```console
$ ZAP_USE_OPENSSL=true zig build https
$ ZAP_USE_OPENSSL=true zig build -Dopenssl=true run-https
```
Issue an HTTPS request:
```console
$ curl -v -k https://localhost:4443/build.zig
```
Using openssl in your code is super simple:
```zig
const tls = zap.fio_tls_new(
"localhost:4443",
CERT_FILE,
KEY_FILE,
null, // key file is not password-protected
);
defer tls.deinit();
```
That `tls` data is then passed to the `SimpleHttpListener`:
```zig
var listener = zap.SimpleHttpListener.init(.{
.port = 4443,
.on_request = on_request_verbose,
.log = true,
.max_clients = 100000,
.tls = tls, // <----- h e r e
});
try listener.listen();
```
__Community PR update: HTTP options support!__ Hey, things are moving rapidly in ZAP land these days. StringNick (on GitHub) provided a PR adding HTTP options support! Many thanks for the great PR! BTW: New stuff is cooking in the 0.12.0 branch. Check out @chooky 's new mustache ;-). Maybe even in the API docs? (`zig build run-docserver` is your friend)
__Community PR update: HTTP options support!__ Hey, things are moving rapidly in ZAP land these days. StringNick (on GitHub) provided a PR adding HTTP options support! Many thanks for the great PR! BTW: New stuff is cooking in the 0.12.0 branch. Check out @chooky 's new mustache ;-). Maybe even in the API docs? (`zig build run-docserver` is your friend)