diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..e2495d6 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,15 @@ +.dub +docs.json +__dummy.html +docs/ +/web +web.so +web.dylib +web.dll +web.a +web.lib +web-test-* +*.exe +*.o +*.obj +*.lst diff --git a/web/dub.sdl b/web/dub.sdl new file mode 100644 index 0000000..019660a --- /dev/null +++ b/web/dub.sdl @@ -0,0 +1,8 @@ +name "web" +description "Asino web version" +authors "danseraf" +copyright "Copyright © 2019, danseraf" +license "GPLv3" +dependency "vibe-d" version="~>0.8.5" +versions "VibeDefaultMain" +dflags "-J view/" diff --git a/web/dub.selections.json b/web/dub.selections.json new file mode 100644 index 0000000..0d9492a --- /dev/null +++ b/web/dub.selections.json @@ -0,0 +1,19 @@ +{ + "fileVersion": 1, + "versions": { + "botan": "1.12.10", + "botan-math": "1.0.3", + "diet-ng": "1.5.0", + "eventcore": "0.8.42", + "libasync": "0.8.4", + "libevent": "2.0.2+2.0.16", + "memutils": "0.4.13", + "mir-linux-kernel": "1.0.1", + "openssl": "1.1.6+1.0.1g", + "stdx-allocator": "2.77.5", + "sumtype": "0.8.6", + "taggedalgebraic": "0.11.4", + "vibe-core": "1.6.2", + "vibe-d": "0.8.5" + } +} diff --git a/web/source/app.d b/web/source/app.d new file mode 100644 index 0000000..3a7d6fe --- /dev/null +++ b/web/source/app.d @@ -0,0 +1,80 @@ +import vibe.appmain; +import vibe.http.server; +import std.stdio; +import std.range; +import std.string; +import std.exception; +import std.array; +import std.random; +import std.file; + +const (string[]) shuffle(string[] args, const string t) +{ + if(t == "mt"){ + Mt19937 gen; + gen.seed(unpredictableSeed); + args.randomShuffle(gen); + } else if (t == "x"){ + Xorshift32 gen; + gen.seed(unpredictableSeed); + args.randomShuffle(gen); + } else if (t == "du"){ + auto gen = DevRandomGen!"/dev/urandom"(); + args.randomShuffle(gen); + } else if (t == "dr"){ + auto gen = DevRandomGen!"/dev/random"(); + args.randomShuffle(gen); + } else { + throw new Exception("Wrong arguments"); + } + return args; +} + + +template DevRandomGen(string gen) + if (gen == "/dev/random" || gen == "/dev/urandom") +{ + struct DevRandomGen + { + + alias UIntType = uint; + public: + enum bool isUniformRandom = true; + enum empty = false; + /// Smallest generated value. + enum UIntType min = 0; + /// Largest generated value. + enum UIntType max = ubyte.max; + string src = gen; + + void seed(UIntType x0) @safe pure nothrow @nogc {} + void popFront() @safe pure nothrow @nogc {} + + @property + UIntType front() const { return (cast(ubyte[])(src.read(ubyte.sizeof)))[0]; } + + @property + typeof(this) save() @safe pure nothrow @nogc { return this; } + } +} + +void handleRequest(scope HTTPServerRequest req, scope HTTPServerResponse res) +{ + immutable path = req.requestPath.bySegment.array; + enforce(path.length == 3); // path[0] == "" + auto engine = path[1].toString; + auto args = path[2].toString.split(","); + const result = shuffle(args, engine); + immutable body = "Asino says:
"; + res.headers["Content-Type"] = "text/html"; + res.writeBody(body); +} + +shared static this() +{ + auto settings = new HTTPServerSettings; + settings.port = 8080; + settings.bindAddresses = ["::1", "127.0.0.1"]; + + listenHTTP(settings, &handleRequest); +}