geoson.input - throw an exception if input hasn't been fully consumed
This commit is contained in:
parent
faad6d8543
commit
8562d18cd0
2 changed files with 7 additions and 5 deletions
|
@ -202,7 +202,8 @@ void geojson_datasource::initialise_index(Iterator start, Iterator end)
|
||||||
mapnik::json::boxes_type boxes;
|
mapnik::json::boxes_type boxes;
|
||||||
boost::spirit::standard::space_type space;
|
boost::spirit::standard::space_type space;
|
||||||
Iterator itr = start;
|
Iterator itr = start;
|
||||||
if (!boost::spirit::qi::phrase_parse(itr, end, (geojson_datasource_static_bbox_grammar)(boost::phoenix::ref(boxes)) , space))
|
if (!boost::spirit::qi::phrase_parse(itr, end, (geojson_datasource_static_bbox_grammar)(boost::phoenix::ref(boxes)) , space)
|
||||||
|
|| itr != end)
|
||||||
{
|
{
|
||||||
throw mapnik::datasource_exception("GeoJSON Plugin: could not parse: '" + filename_ + "'");
|
throw mapnik::datasource_exception("GeoJSON Plugin: could not parse: '" + filename_ + "'");
|
||||||
}
|
}
|
||||||
|
@ -222,7 +223,9 @@ void geojson_datasource::initialise_index(Iterator start, Iterator end)
|
||||||
Iterator end2 = itr2 + geometry_index.second;
|
Iterator end2 = itr2 + geometry_index.second;
|
||||||
mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
|
mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
|
||||||
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1));
|
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1));
|
||||||
if (!boost::spirit::qi::phrase_parse(itr2, end2, (geojson_datasource_static_feature_grammar)(boost::phoenix::ref(*feature)), space))
|
if (!boost::spirit::qi::phrase_parse(itr2, end2,
|
||||||
|
(geojson_datasource_static_feature_grammar)(boost::phoenix::ref(*feature)), space)
|
||||||
|
|| itr2 != end2)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Failed to parse geojson feature");
|
throw std::runtime_error("Failed to parse geojson feature");
|
||||||
}
|
}
|
||||||
|
@ -252,7 +255,7 @@ void geojson_datasource::parse_geojson(Iterator start, Iterator end)
|
||||||
bool result = boost::spirit::qi::phrase_parse(start, end, (geojson_datasource_static_fc_grammar)
|
bool result = boost::spirit::qi::phrase_parse(start, end, (geojson_datasource_static_fc_grammar)
|
||||||
(boost::phoenix::ref(ctx),boost::phoenix::ref(start_id), boost::phoenix::ref(callback)),
|
(boost::phoenix::ref(ctx),boost::phoenix::ref(start_id), boost::phoenix::ref(callback)),
|
||||||
space);
|
space);
|
||||||
if (!result)
|
if (!result || start != end)
|
||||||
{
|
{
|
||||||
if (!inline_string_.empty()) throw mapnik::datasource_exception("geojson_datasource: Failed parse GeoJSON file from in-memory string");
|
if (!inline_string_.empty()) throw mapnik::datasource_exception("geojson_datasource: Failed parse GeoJSON file from in-memory string");
|
||||||
else throw mapnik::datasource_exception("geojson_datasource: Failed parse GeoJSON file '" + filename_ + "'");
|
else throw mapnik::datasource_exception("geojson_datasource: Failed parse GeoJSON file '" + filename_ + "'");
|
||||||
|
|
|
@ -65,13 +65,12 @@ mapnik::feature_ptr large_geojson_featureset::next()
|
||||||
using chr_iterator_type = char const*;
|
using chr_iterator_type = char const*;
|
||||||
chr_iterator_type start = json.data();
|
chr_iterator_type start = json.data();
|
||||||
chr_iterator_type end = start + json.size();
|
chr_iterator_type end = start + json.size();
|
||||||
|
|
||||||
static const mapnik::transcoder tr("utf8");
|
static const mapnik::transcoder tr("utf8");
|
||||||
static const mapnik::json::feature_grammar<chr_iterator_type,mapnik::feature_impl> grammar(tr);
|
static const mapnik::json::feature_grammar<chr_iterator_type,mapnik::feature_impl> grammar(tr);
|
||||||
using namespace boost::spirit;
|
using namespace boost::spirit;
|
||||||
standard::space_type space;
|
standard::space_type space;
|
||||||
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx_,1));
|
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx_,1));
|
||||||
if (!qi::phrase_parse(start, end, (grammar)(boost::phoenix::ref(*feature)), space))
|
if (!qi::phrase_parse(start, end, (grammar)(boost::phoenix::ref(*feature)), space) || start != end)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Failed to parse geojson feature");
|
throw std::runtime_error("Failed to parse geojson feature");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue