Releases: uNetworking/uWebSockets
v20.64.0
v20.63.0
- Make use of ERR_INVALID_CLOSE_PAYLOAD to better explain such closures.
- Remove C-API as it is no longer maintained here, but rather over at the Bun repo.
- It's invalid to pass nullptr to memcpy even with 0 size according to UndefinedBehaviorSanitizer, so this is now fixed.
v20.62.0
RFC 9110 fix part trois
- DQUOTE is not a valid field name char
- "431 Request Header Fields Too Large" will be emitted more strictly
- Reminder: you can set the environment variable UWS_HTTP_MAX_HEADERS_SIZE higher if you need to
v20.61.0
RFC 9110 fix part deux
Previous release did not fix all problems with, for instance, underscores in HTTP field names. This release properly fixes such cases and also makes the HTTP server 14% faster in user space.
A new benchmarking project has been added for reliably benchmarking the entire user space portion of the server by overriding epoll syscalls with traffic producing alternatives. This is a similar approach to how we currently fuzz the user space.
v20.60.0
RFC 9110 fix
A misinterpretation of the spec. has been fixed re. HTTP field names. If you rely on field names that aren't just alphanum + hyphen, this release should fix your use.
v20.59.0
v20.58.0
Parameter routing fixes
Having multiple URL routes with differently named parameter segments at the same depth in the routing tree would cause the order of matching to be potentially different from what the documentation stated.
This release fixes that, and adds more testing for this scenario.
v20.57.0
Experimental cross-platform uWS::LocalCluster
We've always supported multi-CPU scaling as detailed in the HelloWorldThreaded.cpp
example and benchmarking blog posts. However, this example has only been properly supported on Linux systems and contained some really ugly boiler plate code.
This release adds the uWS::LocalCluster
helper that works properly on Windows, macOS, Linux and makes it easy to take any single-CPU app and make it scale over all available CPU-cores by default:
uWS::App(options).get(pattern, handler).listen(port, handler).run();
simply becomes
uWS::LocalCluster(options, [](uWS::App &app) {
app.get(pattern, handler).listen(port, handler);
});
This is reflected in the updated HelloWorldThreaded.cpp example and works for both SSL and non-SSL clusters.
v20.56.0 on macOS (capped at 99% CPU-time)
![Screenshot 2024-01-22 at 11 46 36](https://private-user-images.githubusercontent.com/110806833/298552700-75ba604f-5c6d-45f1-859e-92fc70fae233.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjAzNDE5OTQsIm5iZiI6MTcyMDM0MTY5NCwicGF0aCI6Ii8xMTA4MDY4MzMvMjk4NTUyNzAwLTc1YmE2MDRmLTVjNmQtNDVmMS04NTllLTkyZmM3MGZhZTIzMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcwN1QwODQxMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04ZjczODI3MjJkZjk5NGNiNTQzMzM2MTAwY2YzZGRmOGM5MGEzN2EyMTY2OTI4M2YxZWEyNTI2OGMxMjBlOTUzJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.l4XAxGYBUdRSmwrpWO8_7vzZCN9FpSzI4l5lrO2t4Kw)
v20.57.0 on macOS (approaches 800% CPU-time)
![Screenshot 2024-01-22 at 11 43 57](https://private-user-images.githubusercontent.com/110806833/298552650-b8af8dc0-35ee-47c0-90c6-70d4f3b7d148.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjAzNDE5OTQsIm5iZiI6MTcyMDM0MTY5NCwicGF0aCI6Ii8xMTA4MDY4MzMvMjk4NTUyNjUwLWI4YWY4ZGMwLTM1ZWUtNDdjMC05MGM2LTcwZDRmM2I3ZDE0OC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzA3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcwN1QwODQxMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0zNmIxM2M0MGVmZjc1NzM4NDI0ZmUwMTVjZjY2NDU2YWNiMTEzMDY2NmI1Y2EyZjZkNGVhMDg3OWU3MTI3OGFmJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.uNW9LrvogBEv1wZjb-LBnIUe0AysPGf_zDsuFFkwLnM)
v20.56.0
SSL fixes
- Don't crash on addServerName when provided files are missing
- Disable a (broken) per-SSL optimization that caused issues with backpressure in certain cases
v20.55.0
- Adds named parameter getters (as complement to integral offset getters) like so:
/* Define a parameter route */
.get("/:first/static/:second", [](auto *res, auto *req) {
/* Use the value of a parameter as response */
res->write("<h1>first is: ");
res->write(req->getParameter("first"));
res->write("</h1>");
res->write("<h1>second is: ");
res->write(req->getParameter("second"));
res->end("</h1>");
})
- Adds new example showing the above in use.