Skip to content

Commit

Permalink
correct URL encoding for a REST path parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
IgorStepanov committed Jun 22, 2015
1 parent 9fcf224 commit 8a78d18
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 2 deletions.
12 changes: 10 additions & 2 deletions source/vibe/web/rest.d
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,14 @@ class RestInterfaceClient(I) : I

URL url = m_baseURL;

if (name.length) url ~= Path(name);
if (name.length)
{
string sep = "";
if (name[0] != '/' && (!url.pathString.length || url.pathString[0] != '/'))
sep = "/";
url.pathString = url.pathString ~ sep ~ name;
}

if (query.length) url.queryString = query;

Json ret;
Expand Down Expand Up @@ -661,14 +668,15 @@ private HTTPServerRequestDelegate jsonMethodHandler(T, alias Func)(T inst, RestI
logDebug("Body param: %s <- %s", PWPAT[0].identifier, par);
} else static assert (false, "Internal error: Origin "~to!string(PWPAT[0].origin)~" is not implemented.");
} else static if (ParamNames[i].startsWith("_")) {
import vibe.textfilter.urlencode;
// URL parameter
static if (ParamNames[i] != "_dummy") {
enforceBadRequest(
ParamNames[i][1 .. $] in req.params,
format("req.param[%s] was not set!", ParamNames[i][1 .. $])
);
logDebug("param %s %s", ParamNames[i], req.params[ParamNames[i][1 .. $]]);
params[i] = fromRestString!P(req.params[ParamNames[i][1 .. $]]);
params[i] = fromRestString!P(urlDecode(req.params[ParamNames[i][1 .. $]]));
}
} else {
// normal parameter
Expand Down
1 change: 1 addition & 0 deletions tests/vibe.web.rest.1140/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1140
7 changes: 7 additions & 0 deletions tests/vibe.web.rest.1140/dub.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"name": "1140",
"dependencies": {
"vibe-d": { "path": "../../" }
},
"versions": ["VibeDefaultMain"]
}
65 changes: 65 additions & 0 deletions tests/vibe.web.rest.1140/source/app.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import std.datetime;
import vibe.d;

interface IOrientDBRoot
{
@property IOrientDBQuery query();
}

interface IOrientDBQuery
{
@method(HTTPMethod.GET)
@path(":db_name/sql/:query/:result_set_size")
Json sql(string _db_name, string _query, int _result_set_size);

@method(HTTPMethod.GET)
@path(":db_name/sql2/:query/:result_set_size")
Json sql2(string _db_name, string _query, int _result_set_size);
}

class OrientDBRoot : IOrientDBRoot {
private OrientDBQuery m_query;
override @property IOrientDBQuery query() { return m_query; }
public this() { this.m_query = new OrientDBQuery(); }
}

class OrientDBQuery : IOrientDBQuery {
override Json sql(string _db_name, string _query, int _result_set_size) {
assert(_db_name == Param1, _db_name);
assert(_query == Param2, _query);
assert(_result_set_size == Param3, to!string(_result_set_size));
return Json.emptyObject;
}

override Json sql2(string _db_name, string _query, int _result_set_size) {
assert(_db_name == Param1, _db_name);
assert(_query == Param2ALT, _query);
assert(_result_set_size == Param3, to!string(_result_set_size));
return Json.emptyObject;
}
}

enum Param1 = "twitter_data";
enum Param2 = "select DownloadedDateTime from Message";
enum Param2ALT = "tricky/param/eter";
enum Param3 = 1;

shared static this()
{
auto settings = new HTTPServerSettings;
// 10k + issue number -> Avoid bind errors
settings.port = 11140;
settings.bindAddresses = ["::1", "127.0.0.1"];

auto router = new URLRouter;
router.registerRestInterface(new OrientDBRoot);
listenHTTP(settings, router);

setTimer(1.seconds, {
scope (exit) exitEventLoop(true);
auto api = new RestInterfaceClient!IOrientDBRoot(
"http://127.0.0.1:11140/");
api.query.sql(Param1, Param2, Param3);
api.query.sql2(Param1, Param2ALT, Param3);
});
}

0 comments on commit 8a78d18

Please sign in to comment.