1{ lib, ... }:
2
3let
4 domain = "h2o.local";
5
6 port = 8080;
7
8 sawatdi_chao_lok = "สวัสดีชาวโลก";
9in
10{
11 name = "h2o-mruby";
12
13 meta = {
14 maintainers = with lib.maintainers; [ toastal ];
15 };
16
17 nodes = {
18 server =
19 { pkgs, ... }:
20 {
21 services.h2o = {
22 enable = true;
23 package = pkgs.h2o.override { withMruby = true; };
24 settings = {
25 listen = port;
26 hosts = {
27 "${domain}" = {
28 paths = {
29 "/hello_world" = {
30 "mruby.handler" = # ruby
31 ''
32 Proc.new do |env|
33 [200, {'content-type' => 'text/plain'}, ["${sawatdi_chao_lok}"]]
34 end
35 '';
36 };
37 "/file_handler" = {
38 "mruby.handler-file" = ./file_handler.rb;
39 };
40 };
41 };
42 };
43 };
44 };
45
46 networking.extraHosts = ''
47 127.0.0.1 ${domain}
48 '';
49 };
50 };
51
52 testScript =
53 let
54 portStr = builtins.toString port;
55 in
56 # python
57 ''
58 server.wait_for_unit("h2o.service")
59 server.wait_for_open_port(${portStr})
60
61 assert "${sawatdi_chao_lok}" in server.succeed("curl --fail-with-body http://${domain}:${portStr}/hello_world")
62
63 assert "FILE_HANDLER" in server.succeed("curl --fail-with-body http://${domain}:${portStr}/file_handler")
64 '';
65}