gradido/login_server/src/cpp/HTTPInterface/PageRequestMessagedHandler.cpp
Ulf Gebhardt ac99a7097e Add 'login_server/' from commit 'ca71af1817a801db9a108c205bc298250d498c4b'
git-subtree-dir: login_server
git-subtree-mainline: 09ebb40de21084bb10ee466429d900a5e757d349
git-subtree-split: ca71af1817a801db9a108c205bc298250d498c4b
2021-03-17 22:05:25 +01:00

72 lines
2.2 KiB
C++

#include "PageRequestMessagedHandler.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "../ServerConfig.h"
//const Poco::RegularExpression PageRequestMessagedHandler::mDetectLanguageGET("^(?:/[a-zA-Z0-9_-]*)?/(en|de)");
// detect also lang field from form get
const Poco::RegularExpression PageRequestMessagedHandler::mDetectLanguageGET("^(?:/[a-zA-Z0-9/_-]*)?(?:/(en|de)|\\?.*lang=(en|de))");
Languages PageRequestMessagedHandler::chooseLanguage(Poco::Net::HTTPServerRequest& request, std::string lang_btn /*= ""*/)
{
// from Form
Languages lang = LanguageManager::languageFromString(lang_btn);
if (lang == LANG_NULL) {
// from URL
std::string uri = request.getURI();
std::vector<std::string> matches;
//std::string lang_str;
mDetectLanguageGET.split(uri, matches);
if (matches.size() > 0) {
//for (auto it = matches.begin(); it != matches.end(); it++) {
// printf("Matches: %s\n", it->data());
//}
lang = LanguageManager::languageFromString(matches[matches.size()-1]);
}
else {
// from Header
/*
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
$acceptLang = ['fr', 'it', 'en'];
$lang = in_array($lang, $acceptLang) ? $lang : 'en';
*/
std::string accept_languages = request.get("HTTP_ACCEPT_LANGUAGE", "");
//printf("[PageRequestMessagedHandler::chooseLanguage] accept header: %s\n", accept_languages.data());
}
}
if (lang == LANG_NULL) {
//lang = ServerConfig::g_default_locale;
}
return lang;
}
unsigned long long PageRequestMessagedHandler::getLastGetAsU64(const std::string& uri)
{
unsigned long long result = 0;
size_t pos = uri.find_last_of("/");
try {
auto str = uri.substr(pos + 1);
result = stoull(uri.substr(pos + 1));
}
catch (const std::invalid_argument& ia) {
std::cerr << __FUNCTION__ << " Invalid argument: " << ia.what() << ", str: " << uri.substr(pos + 1) << '\n';
return 0;
}
catch (const std::out_of_range& oor) {
std::cerr << __FUNCTION__ << " Out of Range error: " << oor.what() << '\n';
return 0;
}
catch (const std::logic_error & ler) {
std::cerr << __FUNCTION__ << " Logical error: " << ler.what() << '\n';
return 0;
}
catch (...) {
std::cerr << __FUNCTION__ << " Unknown error" << '\n';
return 0;
}
return result;
}