working server
This commit is contained in:
parent
6941ea4b27
commit
20522a7555
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
event-processor
|
||||||
|
zig-cache/
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "routez"]
|
||||||
|
path = routez
|
||||||
|
url = https://github.com/elerch/routez.git
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 Emil Lerch
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
10
Makefile
Normal file
10
Makefile
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
event-processor: zig-cache/bin/event-processor
|
||||||
|
@cp zig-cache/bin/event-processor event-processor
|
||||||
|
@strip event-processor
|
||||||
|
|
||||||
|
zig-cache/bin/event-processor: src/main.zig
|
||||||
|
@zig build -Drelease-safe=true
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -r zig-cache
|
||||||
|
@rm event-processor
|
18
README.md
Normal file
18
README.md
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Event processor
|
||||||
|
|
||||||
|
This project creates a web server, listening on port 9090, that will capture
|
||||||
|
all requests and send the path, method, headers and body in JSON format
|
||||||
|
asynchronously to a program called "event-processor", which can then do
|
||||||
|
whatever it wants with it.
|
||||||
|
|
||||||
|
# Building
|
||||||
|
|
||||||
|
Install zig 0.7.1 from https://ziglang.org/download/. Once downloaded, you
|
||||||
|
can unpackage the download and get the main executable in your path (zig
|
||||||
|
figures out the other files it needs based on where the main executable lies).
|
||||||
|
|
||||||
|
You can either run "make" using the Makefile provided, or run `zig build`.
|
||||||
|
Doing the latter will land the binary in ./zig-cache/bin. The makefile uses
|
||||||
|
-Drelease-safe=true to provide a small, statically-linked reproducible binary,
|
||||||
|
which is then stripped and copied to "event-processor-backend" in the
|
||||||
|
current directory.
|
33
build.zig
Normal file
33
build.zig
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
const std = @import("std");
|
||||||
|
const Builder = std.build.Builder;
|
||||||
|
|
||||||
|
pub fn build(b: *Builder) void {
|
||||||
|
// Standard target options allows the person running `zig build` to choose
|
||||||
|
// what target to build for. Here we do not override the defaults, which
|
||||||
|
// means any target is allowed, and the default is native. Other options
|
||||||
|
// for restricting supported target set are available.
|
||||||
|
const target = b.standardTargetOptions(.{});
|
||||||
|
|
||||||
|
// Standard release options allow the person running `zig build` to select
|
||||||
|
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
|
||||||
|
const mode = b.standardReleaseOptions();
|
||||||
|
|
||||||
|
const exe = b.addExecutable("event-processor", "src/main.zig");
|
||||||
|
exe.addPackage(.{
|
||||||
|
.name = "routez",
|
||||||
|
.path = "routez/src/routez.zig",
|
||||||
|
.dependencies = &[_]std.build.Pkg{.{
|
||||||
|
.name = "zuri",
|
||||||
|
.path = "routez/zuri/src/zuri.zig",
|
||||||
|
}},
|
||||||
|
});
|
||||||
|
exe.setTarget(target);
|
||||||
|
exe.setBuildMode(mode);
|
||||||
|
exe.install();
|
||||||
|
|
||||||
|
const run_cmd = exe.run();
|
||||||
|
run_cmd.step.dependOn(b.getInstallStep());
|
||||||
|
|
||||||
|
const run_step = b.step("run", "Run the app");
|
||||||
|
run_step.dependOn(&run_cmd.step);
|
||||||
|
}
|
1
routez
Submodule
1
routez
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 1c688374385d570784647f1bb80bee61e55fffb1
|
70
src/main.zig
Normal file
70
src/main.zig
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
const std = @import("std");
|
||||||
|
const fmt = std.fmt;
|
||||||
|
const json = std.json;
|
||||||
|
const Address = std.net.Address;
|
||||||
|
usingnamespace @import("routez");
|
||||||
|
const allocator = std.heap.page_allocator;
|
||||||
|
|
||||||
|
// zig compiler error spawning processes with >0.6.0 evented IO
|
||||||
|
//pub const io_mode = .evented;
|
||||||
|
|
||||||
|
pub const RequestResponse = struct {
|
||||||
|
method: []const u8,
|
||||||
|
headers: Headers,
|
||||||
|
path: []const u8,
|
||||||
|
query: []const u8,
|
||||||
|
body: []const u8,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn main() !void {
|
||||||
|
var server = Server.init(
|
||||||
|
allocator,
|
||||||
|
.{},
|
||||||
|
.{
|
||||||
|
all("*", allHandler),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
var addr = try Address.parseIp("0.0.0.0", 9090);
|
||||||
|
try server.listen(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn allHandler(req: Request, res: Response) !void {
|
||||||
|
const Header = struct {
|
||||||
|
name: []const u8,
|
||||||
|
value: []const u8,
|
||||||
|
};
|
||||||
|
const Res_response = struct {
|
||||||
|
method: []const u8,
|
||||||
|
headers: []Header,
|
||||||
|
path: []const u8,
|
||||||
|
query: []const u8,
|
||||||
|
body: []const u8,
|
||||||
|
//version: Version,
|
||||||
|
};
|
||||||
|
var res_headers = try allocator.alloc(Header, req.headers.list.items.len);
|
||||||
|
defer allocator.free(res_headers);
|
||||||
|
for (req.headers.list.items) |h, i| {
|
||||||
|
res_headers[i] = Header{ .name = h.name, .value = h.value };
|
||||||
|
}
|
||||||
|
|
||||||
|
var arr = std.ArrayList(u8).init(allocator);
|
||||||
|
defer arr.deinit();
|
||||||
|
try json.stringify(Res_response{
|
||||||
|
.method = req.method,
|
||||||
|
.headers = res_headers,
|
||||||
|
.path = req.path,
|
||||||
|
.query = req.query,
|
||||||
|
.body = req.body,
|
||||||
|
}, json.StringifyOptions{}, arr.writer());
|
||||||
|
|
||||||
|
_ = async launchProcess(arr.items);
|
||||||
|
|
||||||
|
res.status_code = StatusCode.Accepted;
|
||||||
|
try res.body.writeAll("Accepted\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn launchProcess(items: []const u8) !void {
|
||||||
|
const process = try std.ChildProcess.init(&[_][]const u8{ "event-processor-backend", items }, allocator);
|
||||||
|
defer process.deinit();
|
||||||
|
_ = try process.spawnAndWait();
|
||||||
|
}
|
Reference in New Issue
Block a user