mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 19:10:06 +00:00
Handle query string in supplied placefile URL, and improve error messages
This commit is contained in:
parent
dcace24579
commit
6f44d9f4e0
1 changed files with 51 additions and 8 deletions
|
|
@ -7,9 +7,11 @@
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/asio/post.hpp>
|
#include <boost/asio/post.hpp>
|
||||||
#include <boost/asio/steady_timer.hpp>
|
#include <boost/asio/steady_timer.hpp>
|
||||||
#include <boost/asio/thread_pool.hpp>
|
#include <boost/asio/thread_pool.hpp>
|
||||||
|
#include <boost/tokenizer.hpp>
|
||||||
#include <cpr/cpr.h>
|
#include <cpr/cpr.h>
|
||||||
|
|
||||||
namespace scwx
|
namespace scwx
|
||||||
|
|
@ -314,21 +316,62 @@ void PlacefileRecord::Update()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO: Update hard coded parameters
|
std::string decodedUrl {name};
|
||||||
auto response = cpr::Get(
|
auto queryPos = decodedUrl.find('?');
|
||||||
cpr::Url {name},
|
if (queryPos != std::string::npos)
|
||||||
cpr::Header {{"User-Agent", "Supercell Wx/0.2.2"}},
|
{
|
||||||
cpr::Parameters {
|
decodedUrl.erase(queryPos);
|
||||||
{"version", "1.2"}, {"lat", "38.699"}, {"lon", "-90.683"}});
|
}
|
||||||
|
|
||||||
if (response.status_code == cpr::status::HTTP_OK)
|
// TODO: Update hard coded parameters
|
||||||
|
auto parameters = cpr::Parameters {
|
||||||
|
{"version", "1.2"}, {"lat", "38.699"}, {"lon", "-90.683"}};
|
||||||
|
|
||||||
|
// Iterate through each query parameter in the URL
|
||||||
|
if (url.hasQuery())
|
||||||
|
{
|
||||||
|
auto query = url.query(QUrl::ComponentFormattingOption::FullyEncoded)
|
||||||
|
.toStdString();
|
||||||
|
|
||||||
|
boost::char_separator<char> delimiter("&");
|
||||||
|
boost::tokenizer tokens(query, delimiter);
|
||||||
|
|
||||||
|
for (auto& token : tokens)
|
||||||
|
{
|
||||||
|
std::vector<std::string> split {};
|
||||||
|
boost::split(split, token, boost::is_any_of("="));
|
||||||
|
if (split.size() >= 2)
|
||||||
|
{
|
||||||
|
// Token is a key=value parameter
|
||||||
|
parameters.Add({split[0], split[1]});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Token is a single key with no value
|
||||||
|
parameters.Add({token, {}});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send HTTP GET request
|
||||||
|
// TODO: Update hard coded User-Agent
|
||||||
|
auto response =
|
||||||
|
cpr::Get(cpr::Url {decodedUrl},
|
||||||
|
cpr::Header {{"User-Agent", "SupercellWx/0.2.2"}},
|
||||||
|
parameters);
|
||||||
|
|
||||||
|
if (cpr::status::is_success(response.status_code))
|
||||||
{
|
{
|
||||||
std::istringstream responseBody {response.text};
|
std::istringstream responseBody {response.text};
|
||||||
updatedPlacefile = gr::Placefile::Load(name, responseBody);
|
updatedPlacefile = gr::Placefile::Load(name, responseBody);
|
||||||
}
|
}
|
||||||
|
else if (response.status_code == 0)
|
||||||
|
{
|
||||||
|
logger_->error("Error loading placefile: {}", response.error.message);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logger_->warn("Error loading placefile: {}", response.error.message);
|
logger_->error("Error loading placefile: {}", response.status_line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue