mirror of
https://github.com/CrowCpp/Crow.git
synced 2024-06-07 21:10:44 +00:00
Merged upstream
This commit is contained in:
commit
c2f75a7de1
@ -9,6 +9,9 @@ Crow is C++ microframework for web. (inspired by Python Flask)
|
||||
- Easy routing
|
||||
- Similiar to Flask
|
||||
- Type-safe Handlers (see Example)
|
||||
- Very Fast
|
||||
- ![Benchmark Result in one chart](https://docs.google.com/spreadsheets/d/1KidO9XpuwCRZ2p_JRDJj2aep61H8Sh_KDOhApizv4LE/pubchart?oid=2041467789&format=image)
|
||||
- More data on [crow-benchmark](https://github.com/ipkn/crow-benchmark)
|
||||
- Fast built-in JSON parser (crow::json)
|
||||
- [Mustache](http://mustache.github.io/) based templating library (crow::mustache)
|
||||
- Header only
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -41,8 +41,11 @@ namespace crow
|
||||
explicit response(int code) : code(code) {}
|
||||
response(std::string body) : body(std::move(body)) {}
|
||||
response(json::wvalue&& json_value) : json_value(std::move(json_value)) {}
|
||||
response(const json::wvalue& json_value) : body(json::dump(json_value)) {}
|
||||
response(int code, std::string body) : body(std::move(body)), code(code) {}
|
||||
response(const json::wvalue& json_value) : body(json::dump(json_value))
|
||||
{
|
||||
set_header("Content-Type", "application/json");
|
||||
}
|
||||
|
||||
response(response&& r)
|
||||
{
|
||||
|
@ -284,6 +284,15 @@ namespace crow
|
||||
return boost::lexical_cast<double>(start_, end_-start_);
|
||||
}
|
||||
|
||||
bool b() const
|
||||
{
|
||||
#ifndef CROW_JSON_NO_ERROR_CHECK
|
||||
if (t() != type::True && t() != type::False)
|
||||
throw std::runtime_error("value is not boolean");
|
||||
#endif
|
||||
return t() == type::True;
|
||||
}
|
||||
|
||||
void unescape() const
|
||||
{
|
||||
if (*(start_-1))
|
||||
@ -824,9 +833,9 @@ namespace crow
|
||||
return {};*/
|
||||
break;
|
||||
case '.':
|
||||
state = (NumberParsingState)"\7\7\7\4\7\7\7"[state];
|
||||
state = (NumberParsingState)"\7\7\4\4\7\7\7"[state];
|
||||
/*
|
||||
if (state == NumberParsingState::Digits)
|
||||
if (state == NumberParsingState::Digits || state == NumberParsingState::ZeroFirst)
|
||||
{
|
||||
state = NumberParsingState::DigitsAfterPoints;
|
||||
}
|
||||
@ -1134,7 +1143,7 @@ namespace crow
|
||||
return *this;
|
||||
}
|
||||
|
||||
wvalue& operator = (uint16_t value)
|
||||
wvalue& operator = (unsigned short value)
|
||||
{
|
||||
reset();
|
||||
t_ = type::Number;
|
||||
@ -1142,7 +1151,7 @@ namespace crow
|
||||
return *this;
|
||||
}
|
||||
|
||||
wvalue& operator = (int16_t value)
|
||||
wvalue& operator = (short value)
|
||||
{
|
||||
reset();
|
||||
t_ = type::Number;
|
||||
@ -1150,7 +1159,7 @@ namespace crow
|
||||
return *this;
|
||||
}
|
||||
|
||||
wvalue& operator = (uint32_t value)
|
||||
wvalue& operator = (long long value)
|
||||
{
|
||||
reset();
|
||||
t_ = type::Number;
|
||||
@ -1158,7 +1167,7 @@ namespace crow
|
||||
return *this;
|
||||
}
|
||||
|
||||
wvalue& operator = (int32_t value)
|
||||
wvalue& operator = (long value)
|
||||
{
|
||||
reset();
|
||||
t_ = type::Number;
|
||||
@ -1166,7 +1175,7 @@ namespace crow
|
||||
return *this;
|
||||
}
|
||||
|
||||
wvalue& operator = (uint64_t value)
|
||||
wvalue& operator = (int value)
|
||||
{
|
||||
reset();
|
||||
t_ = type::Number;
|
||||
@ -1174,7 +1183,23 @@ namespace crow
|
||||
return *this;
|
||||
}
|
||||
|
||||
wvalue& operator = (int64_t value)
|
||||
wvalue& operator = (unsigned long long value)
|
||||
{
|
||||
reset();
|
||||
t_ = type::Number;
|
||||
d = (double)value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
wvalue& operator = (unsigned long value)
|
||||
{
|
||||
reset();
|
||||
t_ = type::Number;
|
||||
d = (double)value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
wvalue& operator = (unsigned int value)
|
||||
{
|
||||
reset();
|
||||
t_ = type::Number;
|
||||
|
@ -245,6 +245,39 @@ namespace crow
|
||||
|
||||
}
|
||||
|
||||
query_string(const query_string& qs)
|
||||
: url_(qs.url_)
|
||||
{
|
||||
for(auto p:qs.key_value_pairs_)
|
||||
{
|
||||
key_value_pairs_.push_back((char*)(p-qs.url_.c_str()+url_.c_str()));
|
||||
}
|
||||
}
|
||||
|
||||
query_string& operator = (const query_string& qs)
|
||||
{
|
||||
url_ = qs.url_;
|
||||
key_value_pairs_.clear();
|
||||
for(auto p:qs.key_value_pairs_)
|
||||
{
|
||||
key_value_pairs_.push_back((char*)(p-qs.url_.c_str()+url_.c_str()));
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
query_string& operator = (query_string&& qs)
|
||||
{
|
||||
key_value_pairs_ = std::move(qs.key_value_pairs_);
|
||||
char* old_data = (char*)qs.url_.c_str();
|
||||
url_ = std::move(qs.url_);
|
||||
for(auto& p:key_value_pairs_)
|
||||
{
|
||||
p += (char*)url_.c_str() - old_data;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
query_string(std::string url)
|
||||
: url_(std::move(url))
|
||||
{
|
||||
|
@ -453,6 +453,40 @@ TEST(json_read)
|
||||
q = y["ints"][2].i();
|
||||
ASSERT_EQUAL(3, q);
|
||||
|
||||
std::string s2 = R"({"bools":[true, false], "doubles":[1.2, -3.4]})";
|
||||
auto z = json::load(s2);
|
||||
ASSERT_EQUAL(2, z["bools"].size());
|
||||
ASSERT_EQUAL(2, z["doubles"].size());
|
||||
ASSERT_EQUAL(true, z["bools"][0].b());
|
||||
ASSERT_EQUAL(false, z["bools"][1].b());
|
||||
ASSERT_EQUAL(1.2, z["doubles"][0].d());
|
||||
ASSERT_EQUAL(-3.4, z["doubles"][1].d());
|
||||
}
|
||||
|
||||
TEST(json_read_real)
|
||||
{
|
||||
vector<std::string> v{"0.036303908355795146", "0.18320417789757412",
|
||||
"0.05319940476190476", "0.15224702380952382", "0", "0.3296201145552561",
|
||||
"0.47921580188679247", "0.05873511904761905", "0.1577827380952381",
|
||||
"0.4996841307277628", "0.6425412735849056", "0.052113095238095236",
|
||||
"0.12830357142857143", "0.7871041105121294", "0.954220013477089",
|
||||
"0.05869047619047619", "0.1625", "0.8144794474393531",
|
||||
"0.9721613881401617", "0.1399404761904762", "0.24470238095238095",
|
||||
"0.04527459568733154", "0.2096950808625337", "0.35267857142857145",
|
||||
"0.42791666666666667", "0.855731974393531", "0.9352467991913747",
|
||||
"0.3816220238095238", "0.4282886904761905", "0.39414167789757415",
|
||||
"0.5316079851752021", "0.3809375", "0.4571279761904762",
|
||||
"0.03522995283018868", "0.1915641846361186", "0.6164136904761904",
|
||||
"0.7192708333333333", "0.05675117924528302", "0.21308541105121293",
|
||||
"0.7045386904761904", "0.8016815476190476"};
|
||||
for(auto x:v)
|
||||
{
|
||||
CROW_LOG_DEBUG << x;
|
||||
ASSERT_EQUAL(json::load(x).d(), boost::lexical_cast<double>(x));
|
||||
}
|
||||
|
||||
auto ret = json::load(R"---({"balloons":[{"mode":"ellipse","left":0.036303908355795146,"right":0.18320417789757412,"top":0.05319940476190476,"bottom":0.15224702380952382,"index":"0"},{"mode":"ellipse","left":0.3296201145552561,"right":0.47921580188679247,"top":0.05873511904761905,"bottom":0.1577827380952381,"index":"1"},{"mode":"ellipse","left":0.4996841307277628,"right":0.6425412735849056,"top":0.052113095238095236,"bottom":0.12830357142857143,"index":"2"},{"mode":"ellipse","left":0.7871041105121294,"right":0.954220013477089,"top":0.05869047619047619,"bottom":0.1625,"index":"3"},{"mode":"ellipse","left":0.8144794474393531,"right":0.9721613881401617,"top":0.1399404761904762,"bottom":0.24470238095238095,"index":"4"},{"mode":"ellipse","left":0.04527459568733154,"right":0.2096950808625337,"top":0.35267857142857145,"bottom":0.42791666666666667,"index":"5"},{"mode":"ellipse","left":0.855731974393531,"right":0.9352467991913747,"top":0.3816220238095238,"bottom":0.4282886904761905,"index":"6"},{"mode":"ellipse","left":0.39414167789757415,"right":0.5316079851752021,"top":0.3809375,"bottom":0.4571279761904762,"index":"7"},{"mode":"ellipse","left":0.03522995283018868,"right":0.1915641846361186,"top":0.6164136904761904,"bottom":0.7192708333333333,"index":"8"},{"mode":"ellipse","left":0.05675117924528302,"right":0.21308541105121293,"top":0.7045386904761904,"bottom":0.8016815476190476,"index":"9"}]})---");
|
||||
ASSERT_TRUE(ret);
|
||||
}
|
||||
|
||||
TEST(json_read_unescaping)
|
||||
|
Loading…
Reference in New Issue
Block a user