Interestingly enough, this code DOES work:

    import std.net.curl;

	auto data = serializeToJson(["user": ["email": username, "password": password]]).toString();

	auto client = HTTP("localhost:3000/users/login");
	client.postData = data;
	client.addRequestHeader("Accept", "application/json");
	client.addRequestHeader("Content-Type", "application/json");
	client.perform();
	auto status = client.statusLine;
	logInfo("Status: %s", status);
	if (status.code == 201) return true;
	return false;

I'm not sure what the vibe libraries are doing differently or if it really is a bug?