mirror of
https://github.com/zigzap/zap.git
synced 2025-10-21 07:34:08 +00:00
Fix tiny typos
This commit is contained in:
parent
a231371c3a
commit
ada2bd1837
23 changed files with 559 additions and 534 deletions
15
README.md
15
README.md
|
@ -1,5 +1,3 @@
|
|||
|
||||
|
||||
# ⚡zap⚡ - blazingly fast backends in zig
|
||||
|
||||
 [](https://discord.gg/jQAAN6Ubyj)
|
||||
|
@ -364,16 +362,3 @@ pub fn main() !void {
|
|||
});
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -329,4 +329,3 @@ Vulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional,
|
|||
Vulnerability Srbds: Mitigation; Microcode
|
||||
Vulnerability Tsx async abort: Not affected
|
||||
```
|
||||
|
||||
|
|
|
@ -122,7 +122,7 @@ var map = Map.init(allocator);
|
|||
defer map.deinit();
|
||||
|
||||
// create user / pass entry
|
||||
const user = "Alladdin";
|
||||
const user = "Aladdin";
|
||||
const pass = "opensesame";
|
||||
try map.put(user, pass);
|
||||
|
||||
|
@ -268,5 +268,3 @@ pub fn main() !void {
|
|||
});
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ hashes, as well as a `MY_TAG.tar.gz`.
|
|||
You can then host this via python HTTP server and proceed as if you had
|
||||
downloaded it from github.
|
||||
|
||||
If all goes well, your dependend code should be able to use your freshly-built
|
||||
If all goes well, your dependent code should be able to use your freshly-built
|
||||
zap release, depending on it via localhost URL in its `build.zig.zon`.
|
||||
|
||||
If not, fix bugs, rinse, and repeat.
|
||||
|
@ -97,5 +97,3 @@ with the non-localhost version from the master branch. Commit it, make sure your
|
|||
worktree is clean, and perform above steps again. This time, using a tag that
|
||||
doesn't contain `localhost`. You can then push to your fork and create a release
|
||||
for the future when zig's bug is fixed.
|
||||
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ the `.hash` value in `build.zig.zon`.
|
|||
|
||||
## Using an arbitrary (last) commit
|
||||
|
||||
Use the same workflow as above for tags, excpept for the URL, use this schema:
|
||||
Use the same workflow as above for tags, except for the URL, use this schema:
|
||||
|
||||
```zig
|
||||
.url = "https://github.com/zigzap/zap/archive/[COMMIT-HASH].tar.gz",
|
||||
|
@ -36,5 +36,3 @@ Use the same workflow as above for tags, excpept for the URL, use this schema:
|
|||
|
||||
Replace `[COMMIT-HASH]` with the full commit hash as provided, e.g. by `git
|
||||
log`.
|
||||
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ fn on_request_with_errors(r: zap.SimpleHttpRequest) !void {
|
|||
```
|
||||
|
||||
```zig
|
||||
// THIS IS WHAT YOU PASS TO THE LISTENER / ENDPONT / ...
|
||||
// THIS IS WHAT YOU PASS TO THE LISTENER / ENDPOINT / ...
|
||||
fn on_request(r: zap.SimpleHttpRequest) void {
|
||||
on_request_with_errors(r) catch |err| {
|
||||
// log the error or use:
|
||||
|
@ -84,5 +84,3 @@ To better support the use-case of flask-like error returning, we will "soon":
|
|||
|
||||
- only in debug builds would it return the stack traces and in release builds it
|
||||
would return more generic 50x responses.
|
||||
|
||||
|
||||
|
|
|
@ -92,16 +92,14 @@ pub fn main() !void {
|
|||
Handler.alloc = allocator;
|
||||
|
||||
// setup listener
|
||||
var listener = zap.SimpleHttpListener.init(
|
||||
.{
|
||||
var listener = zap.SimpleHttpListener.init(.{
|
||||
.port = 3000,
|
||||
.on_request = Handler.on_request,
|
||||
.log = true,
|
||||
.max_clients = 10,
|
||||
.max_body_size = 10 * 1024 * 1024,
|
||||
.public_folder = ".",
|
||||
},
|
||||
);
|
||||
});
|
||||
zap.enableDebugLog();
|
||||
try listener.listen();
|
||||
std.log.info("\n\nURL is http://localhost:3000\n", .{});
|
||||
|
|
|
@ -98,15 +98,13 @@ pub fn main() !void {
|
|||
Handler.alloc = allocator;
|
||||
|
||||
// setup listener
|
||||
var listener = zap.SimpleHttpListener.init(
|
||||
.{
|
||||
var listener = zap.SimpleHttpListener.init(.{
|
||||
.port = 3000,
|
||||
.on_request = Handler.on_request,
|
||||
.log = false,
|
||||
.max_clients = 10,
|
||||
.max_body_size = 1 * 1024,
|
||||
},
|
||||
);
|
||||
});
|
||||
zap.enableDebugLog();
|
||||
try listener.listen();
|
||||
std.log.info("\n\nTerminate with CTRL+C", .{});
|
||||
|
|
|
@ -92,7 +92,6 @@ fn postUser(e: *zap.SimpleEndpoint, r: zap.SimpleRequest) void {
|
|||
}
|
||||
} else |err| {
|
||||
std.debug.print("ADDING error: {}\n", .{err});
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,19 +1,55 @@
|
|||
<html lang='en'>
|
||||
|
||||
<head>
|
||||
<meta charset='utf-8'>
|
||||
<meta name='viewport' content='width=device-width'>
|
||||
<title>ZAP Demo</title>
|
||||
<style>
|
||||
body {background-color: #0d1117; }
|
||||
h1 {color: #cdb4db; text-align: center;}
|
||||
h2 {color: #ffafcc; text-align: center;}
|
||||
h3 {color: #ffc8dd; text-align: center; text-decoration: underline;}
|
||||
.brighter {color: #bde0fe;}
|
||||
p {color: #ffc927; padding-left: 50px; margin-right: 50px;}
|
||||
body {
|
||||
background-color: #0d1117;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #cdb4db;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: #ffafcc;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #ffc8dd;
|
||||
text-align: center;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.brighter {
|
||||
color: #bde0fe;
|
||||
}
|
||||
|
||||
p {
|
||||
color: #ffc927;
|
||||
padding-left: 50px;
|
||||
margin-right: 50px;
|
||||
}
|
||||
|
||||
label {
|
||||
color: #B0B0B0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #ffc927;
|
||||
padding-left: 15px;
|
||||
}
|
||||
|
||||
input {
|
||||
color: #B06060;
|
||||
margin-bottom: 20px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
label {color: #B0B0B0;}
|
||||
a {color: #ffc927; padding-left:15px;}
|
||||
input {color: #B06060; margin-bottom: 20px; font-weight: bold; }
|
||||
textarea {
|
||||
background-color: #181818;
|
||||
color: #cdb4db;
|
||||
|
@ -26,6 +62,7 @@
|
|||
width: 80%;
|
||||
height: 18rem;
|
||||
}
|
||||
|
||||
form {
|
||||
border: 2px solid #cdb4db;
|
||||
border-radius: 12px;
|
||||
|
@ -36,6 +73,7 @@
|
|||
text-align: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.tdform {
|
||||
border: none;
|
||||
border-radius: none;
|
||||
|
@ -46,6 +84,7 @@
|
|||
text-align: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: #ffafcc;
|
||||
border-radius: 12px;
|
||||
|
@ -55,34 +94,39 @@
|
|||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.updatebutton {
|
||||
background-color: #B0B0B0;
|
||||
color: #181818;
|
||||
}
|
||||
|
||||
.delbutton {
|
||||
background-color: #B06060;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
table {
|
||||
background-color: #181818;
|
||||
border-radius: 12px;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
th {
|
||||
color: #B06060;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
td {
|
||||
color: #B0B0B0;
|
||||
}
|
||||
tr {
|
||||
}
|
||||
</style>
|
||||
<html>
|
||||
|
||||
<body>
|
||||
<div class="center">
|
||||
<form>
|
||||
|
@ -158,7 +202,7 @@
|
|||
sendJSON(data, "/users", "POST")
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
log("SUCESS: " + JSON.stringify(data));
|
||||
log("SUCCESS: " + JSON.stringify(data));
|
||||
getUserList();
|
||||
})
|
||||
.catch((error) => {
|
||||
|
@ -170,7 +214,7 @@
|
|||
fetch("/users/" + id, { method: "DELETE", })
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
log("SUCESS: " + JSON.stringify(data));
|
||||
log("SUCCESS: " + JSON.stringify(data));
|
||||
getUserList();
|
||||
})
|
||||
.catch((error) => {
|
||||
|
@ -188,7 +232,7 @@
|
|||
sendJSON(data, "/users/" + id, "PATCH")
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
log("SUCESS: " + JSON.stringify(data));
|
||||
log("SUCCESS: " + JSON.stringify(data));
|
||||
getUserList();
|
||||
})
|
||||
.catch((error) => {
|
||||
|
@ -244,7 +288,7 @@
|
|||
fetch("/users", { method: "GET", })
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
log("SUCESS: " + JSON.stringify(data));
|
||||
log("SUCCESS: " + JSON.stringify(data));
|
||||
showTable(data);
|
||||
})
|
||||
.catch((error) => {
|
||||
|
@ -258,4 +302,5 @@
|
|||
init();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
|
@ -98,15 +98,13 @@ pub fn main() !void {
|
|||
Handler.alloc = allocator;
|
||||
|
||||
// setup listener
|
||||
var listener = zap.SimpleHttpListener.init(
|
||||
.{
|
||||
var listener = zap.SimpleHttpListener.init(.{
|
||||
.port = 3000,
|
||||
.on_request = Handler.on_request,
|
||||
.log = false,
|
||||
.max_clients = 10,
|
||||
.max_body_size = 1 * 1024,
|
||||
},
|
||||
);
|
||||
});
|
||||
zap.enableDebugLog();
|
||||
try listener.listen();
|
||||
std.log.info("\n\nTerminate with CTRL+C or by sending query param terminate=true\n", .{});
|
||||
|
|
|
@ -191,7 +191,6 @@ const HtmlEndpoint = struct {
|
|||
|
||||
r.setContentType(.TEXT) catch unreachable;
|
||||
r.sendBody(message) catch unreachable;
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -27,15 +27,13 @@ pub fn on_request(r: zap.SimpleRequest) void {
|
|||
|
||||
pub fn main() !void {
|
||||
// setup listener
|
||||
var listener = zap.SimpleHttpListener.init(
|
||||
.{
|
||||
var listener = zap.SimpleHttpListener.init(.{
|
||||
.port = 3000,
|
||||
.on_request = on_request,
|
||||
.log = true,
|
||||
.max_clients = 10,
|
||||
.max_body_size = 1 * 1024, // careful here
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
zap.enableDebugLog();
|
||||
try listener.listen();
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<style>
|
||||
/* Bordered form */
|
||||
|
@ -7,7 +8,8 @@ form {
|
|||
}
|
||||
|
||||
/* Full-width inputs */
|
||||
input[type=text], input[type=password] {
|
||||
input[type=text],
|
||||
input[type=password] {
|
||||
width: 100%;
|
||||
padding: 12px 20px;
|
||||
margin: 8px 0;
|
||||
|
@ -63,12 +65,14 @@ img.avatar {
|
|||
display: block;
|
||||
float: none;
|
||||
}
|
||||
|
||||
.cancelbtn {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<form action="normal_page" method="post"> <!-- we post directly to the page we want to display if login is successful-->
|
||||
<div class="imgcontainer">
|
||||
|
@ -86,5 +90,5 @@ img.avatar {
|
|||
</div>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
|
@ -65,7 +66,8 @@
|
|||
|
||||
.user {
|
||||
align-self: flex-end;
|
||||
background-color: #cd0f0d;;
|
||||
background-color: #cd0f0d;
|
||||
;
|
||||
color: white;
|
||||
}
|
||||
|
||||
|
@ -83,6 +85,7 @@
|
|||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
|
@ -116,7 +119,8 @@
|
|||
}
|
||||
|
||||
.input-container button {
|
||||
background-color: #cd0f0d;;
|
||||
background-color: #cd0f0d;
|
||||
;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 10px;
|
||||
|
@ -155,29 +159,34 @@
|
|||
/* Green, MediumSeaGreen */
|
||||
background-color: #3CB371;
|
||||
}
|
||||
|
||||
.status-busy {
|
||||
/* Blue, DodgerBlue */
|
||||
background-color: #1E90FF;
|
||||
}
|
||||
|
||||
.status-thinking {
|
||||
/* Light Gray, LightSlateGray */
|
||||
background-color: #778899;
|
||||
}
|
||||
|
||||
.status-offline {
|
||||
/* Red, Tomato */
|
||||
background-color: #FF6347;
|
||||
}
|
||||
|
||||
.status-warning {
|
||||
/* Yellow, Goldenrod */
|
||||
background-color: #DAA520;
|
||||
}
|
||||
|
||||
.status-error {
|
||||
/* Dark-Red, Firebrick */
|
||||
background-color: #B22222;
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<header>
|
||||
|
@ -207,4 +216,5 @@
|
|||
document.head.appendChild(scriptTag);
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
|
@ -45,7 +45,7 @@ Now, on to the guiding principles of Zap.
|
|||
|
||||
## robust
|
||||
|
||||
A common recommendation for doing web stuff in zig is to write the actual HTTP server in Go, and use zig for the real work. While there is a selection of notable and cool HTTP server implementations written in zig out there, at the time of writing, most of them seem to a) depend on zig's async facilities which are unsupported until ca. April 2023 when async will return to the self-hosted compiler, and b) have not matured to a point where **I** feel safe using them in production. These are just my opionions and they could be totally wrong though.
|
||||
A common recommendation for doing web stuff in zig is to write the actual HTTP server in Go, and use zig for the real work. While there is a selection of notable and cool HTTP server implementations written in zig out there, at the time of writing, most of them seem to a) depend on zig's async facilities which are unsupported until ca. April 2023 when async will return to the self-hosted compiler, and b) have not matured to a point where **I** feel safe using them in production. These are just my opinions and they could be totally wrong though.
|
||||
|
||||
However, when I conduct my next online research experiment with thousands of concurrent clients, I cannot afford to run into potential maturity-problems of the HTTP server. These projects typically feature a you-get-one-shot process with little room for errors or re-tries.
|
||||
|
||||
|
@ -91,10 +91,10 @@ I am super excited about both zig and zap's future. I am still impressed by how
|
|||
|
||||
Provided that the incorporated C code is well-written and -tested, WYSIWYG even holds mostly true for combined Zig and C projects.
|
||||
|
||||
You can truly build on the soulders of giants here. Mind you, it took me less than a week to arrive at the current state of zap where I am confident that I can already use it to write the one or other REST API with it and, after stress-testing, just move it into production - from merely researching Zig and C web frameworks a few days ago.
|
||||
You can truly build on the shoulders of giants here. Mind you, it took me less than a week to arrive at the current state of zap where I am confident that I can already use it to write the one or other REST API with it and, after stress-testing, just move it into production - from merely researching Zig and C web frameworks a few days ago.
|
||||
|
||||
Oh, and have I mentioned Zig's built-in build system and testing framework? Those are both super amazing and super convenient. `zig build` is so much more useful than `make` (which I quite like to be honest). And `zig test` is just amazing, too. Zig's physical code layout: which file is located where and how can it be built, imported, tested - it all makes so much sense. Such a coherent, pleasant experience.
|
||||
|
||||
Looking forward, I am also tempted to try adding some log-and-replay facilities as a kind of backup for when things go wrong. I wouldn't be confident to attemt such things in C because I'd view them as being too much work; too much could go wrong. But with Zig, I am rather excited about the possibilities that open up and eager to try such things.
|
||||
Looking forward, I am also tempted to try adding some log-and-replay facilities as a kind of backup for when things go wrong. I wouldn't be confident to attempt such things in C because I'd view them as being too much work; too much could go wrong. But with Zig, I am rather excited about the possibilities that open up and eager to try such things.
|
||||
|
||||
For great justice!
|
||||
|
|
|
@ -156,7 +156,7 @@ pub fn BasicAuth(comptime Lookup: type, comptime kind: BasicAuthStrategy) type {
|
|||
} else |err| {
|
||||
// can't calc slice size --> fallthrough to return false
|
||||
zap.debug(
|
||||
"ERROR: UserPassAuth: cannot calc slize size for encoded `{s}`: {any} \n",
|
||||
"ERROR: UserPassAuth: cannot calc slice size for encoded `{s}`: {any} \n",
|
||||
.{ encoded, err },
|
||||
);
|
||||
return .AuthFailed;
|
||||
|
|
|
@ -80,7 +80,7 @@ pub fn Handler(comptime ContextType: anytype) type {
|
|||
};
|
||||
}
|
||||
|
||||
/// A convenience handler for artibrary zap.SimpleEndpoint
|
||||
/// A convenience handler for arbitrary zap.SimpleEndpoint
|
||||
pub fn EndpointHandler(comptime HandlerType: anytype, comptime ContextType: anytype) type {
|
||||
return struct {
|
||||
handler: HandlerType,
|
||||
|
|
|
@ -74,7 +74,7 @@ test "BasicAuth UserPass" {
|
|||
defer map.deinit();
|
||||
|
||||
// create user / pass entry
|
||||
const user = "Alladdin";
|
||||
const user = "Aladdin";
|
||||
const pass = "opensesame";
|
||||
try map.put(user, pass);
|
||||
|
||||
|
@ -521,7 +521,7 @@ test "BasicAuth UserPass authenticateRequest" {
|
|||
defer map.deinit();
|
||||
|
||||
// create user / pass entry
|
||||
const user = "Alladdin";
|
||||
const user = "Aladdin";
|
||||
const pass = "opensesame";
|
||||
try map.put(user, pass);
|
||||
|
||||
|
@ -587,7 +587,7 @@ test "BasicAuth UserPass authenticateRequest test-unauthorized" {
|
|||
defer map.deinit();
|
||||
|
||||
// create user / pass entry
|
||||
const user = "Alladdin";
|
||||
const user = "Aladdin";
|
||||
const pass = "opensesame";
|
||||
try map.put(user, pass);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue