diff --git a/test/test_registry.d b/test/test_registry.d old mode 100644 new mode 100755 index dfeb358..7f270ad --- a/test/test_registry.d +++ b/test/test_registry.d @@ -1,11 +1,38 @@ +#!/usr/bin/env dub /+dub.sdl: -dependency "vibe-d" version="~>0.8.3-alpha.1" +dependency "vibe-d" version="~>0.8.5" versions "VibeNoSSL" +/ +import vibe.d; + +/* +Provide a special API File Handler as Vibe.d's builtin serveStaticFiles +doesn't deal well with query params. +This will blindly check if the requestURI payload exists on the filesystem and if so, return the file. +Params: + skip = initial part of the requestURI to skip over + folder = the base directory from which to serve API requests from +*/ +auto apiFileHandler(string skip, string folder) { + import std.functional : toDelegate; + void handler(HTTPServerRequest req, HTTPServerResponse res) { + import std.algorithm : skipOver; + import std.path : buildPath; + import std.file : exists; + auto requestURI = req.requestURI; + requestURI.skipOver(skip); + const reqFile = buildPath(folder, requestURI); + if (reqFile.exists) { + return req.sendFile(res, PosixPath(reqFile)); + } + } + return toDelegate(&handler); +} + void main(string[] args) { - import std.conv, vibe.d; + import std.conv; immutable folder = readRequiredOption!string("folder", "Folder to service files from."); immutable port = readRequiredOption!uint("port", "Port to use"); auto router = new URLRouter; @@ -18,6 +45,8 @@ }); router.get("*", folder.serveStaticFiles); router.get("/fallback/*", folder.serveStaticFiles(new HTTPFileServerSettings("/fallback"))); + router.get("/api/*", apiFileHandler("/", folder)); + router.get("/fallback/api/*", apiFileHandler("/fallback/", folder)); listenHTTP(text(":", port), router); runApplication(); }