For .NETFramework 4.5 and higher
var settings = new SlickProxySettings { CaseSensitive = false, RouteSameServerRewritesOverNetwork = false };
app.UseSlickProxy(handle =>
{
handle.When(request => request.Path.EndsWith("/boo"), request => request.UseReferer($"{request.BaseAddressWithScheme}", request.ExtensionlessWithExtension("html")));
handle.When(request => request.Path.EndsWith("/boo"), request => request.UseRequestHeaders(headers => headers["Referer"] = $"{request.BaseAddressWithScheme}", request.ExtensionlessWithExtension("html")));
handle.When(request => request.Path.EndsWith("/index"), request => request.ExtensionlessWithExtension("html"));
handle.When(request => request.Path.EndsWith("/indexString"), request => request.RespondWithString("what's up men!"));
handle.When(request => request.Path.EndsWith("/indexObject"), request => request.RespondWithObjectAsJson(DateTime.UtcNow));
handle.When("/cdn2/(.*)", request => request.ForwardToDomain("https://code.jquery.com"));
handle.When("/cdn/(.*)", "/cdn/(.*)", request => $"{request.Scheme}://code.jquery.com/{request.Part(1)}");
handle.When(request => request.QueryStringValueByName("link") == "hello", req => req.Deny());
handle.When("(.*)", req => req.Allow());
//the matches below will never be reached coz of the allow above
handle.DenyAny(HttpStatusCode.BadRequest);
handle.When("(.*)", req => req.DenyWith(HttpStatusCode.OK, null));
handle.When(request => request.QueryStringContainsName("bad"), req => req.Deny());
handle.When("/deny(.*)", request => request.HasNoQueryString(), req => req.Deny());
var list = new List<string>
{ "" };
handle.When("/scene(.*)", req => list.Contains(req.QueryStringValueByName("link")), req => $"{req.BaseAddressWithScheme}");
},settings);