diff options
Diffstat (limited to 'users/tazjin/cursed')
-rw-r--r-- | users/tazjin/cursed/default.nix | 9 | ||||
-rw-r--r-- | users/tazjin/cursed/responder.nix | 76 |
2 files changed, 85 insertions, 0 deletions
diff --git a/users/tazjin/cursed/default.nix b/users/tazjin/cursed/default.nix new file mode 100644 index 000000000000..fa1ae9271fee --- /dev/null +++ b/users/tazjin/cursed/default.nix @@ -0,0 +1,9 @@ +{ depot, ... }: + +let + inherit (depot.web) bubblegum; +in +bubblegum.writeCGI +{ + name = "cursed"; +} ./responder.nix diff --git a/users/tazjin/cursed/responder.nix b/users/tazjin/cursed/responder.nix new file mode 100644 index 000000000000..9aa6a2d55807 --- /dev/null +++ b/users/tazjin/cursed/responder.nix @@ -0,0 +1,76 @@ +{ depot, ... }: + +let + inherit (depot.users.sterni.nix.html) + __findFile + esc + withDoctype + ; + + # CGI envvars: https://www.instanet.com/cgi/env.html + method = builtins.getEnv "REQUEST_METHOD"; + path = builtins.getEnv "PATH_INFO"; + + rawQuery = builtins.getEnv "QUERY_STRING"; + query = with builtins; let + pairs = (filter (s: isString s && s != "") (split "&" rawQuery)); + tuples = filter (l: length l > 0) (map (p: filter (s: isString s) (split "=" p)) pairs); + mkAttr = t: { + name = elemAt t 0; + value = elemAt t 1; + }; + in + listToAttrs (map mkAttr tuples); + + default = let { + hasQuery = if builtins.length (builtins.attrNames query) > 0 then "?" else ""; + body = (withDoctype (<html> { lang = "en"; } [ + (<head> { } [ + (<title> { } "some cursed nix") + ]) + (<body> { } [ + (<p> { } "hello volgasprint") + (<p> { } [ method " " path hasQuery rawQuery ]) + (<p> { } (builtins.toJSON query)) + ]) + ])); + }; + + greeter = withDoctype (<html> { lang = "en"; } [ + (<head> { } [ + (<title> { } "hello there") + ]) + (<body> { } [ + (<p> { } "hello ${query.name or "unknown"}") + ]) + ]); + + weather = let { + town = query.town or "Kazan"; + w = builtins.fetchurl "https://wttr.in/${town}?"; + rendered = with depot.third_party.nixpkgs; runCommand "weather-${town}" { } '' + cat ${w} | ${ansi2html}/bin/ansi2html > $out + ''; + + body = builtins.readFile "${rendered}"; + }; + + routes = { + "/other" = (withDoctype (<html> { lang = "en"; } [ + (<head> { } [ + (<title> { } "other endpoint") + ]) + (<body> { } [ + (<p> { } "this is another route") + ]) + ])); + "/greeter" = greeter; + "/weather" = weather; + }."${path}" or default; + +in +depot.web.bubblegum.respond "OK" +{ + "Content-Type" = "text/html"; +} + routes |