Merge branch 'master' of https://git.did.science/WolverinDEV/TeaSpeak-SharedLib
# Conflicts: # src/Error.h
This commit is contained in:
commit
228bde912a
@ -1,4 +1,4 @@
|
|||||||
1
|
1
|
||||||
success
|
success
|
||||||
bd69955e34daa3cc0e923a3789ff627451991441
|
cb73d9df3258eaf59e4799c9e54d5f865e891734
|
||||||
07 Jul 2019 19:14:36
|
22 Sep 2019 13:38:56
|
||||||
|
@ -5,6 +5,11 @@ set(CMAKE_CXX_STANDARD 17)
|
|||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wno-reorder -Wno-sign-compare -fpermissive -ftemplate-depth=1000 ${MEMORY_DEBUG_FLAGS}")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wno-reorder -Wno-sign-compare -fpermissive -ftemplate-depth=1000 ${MEMORY_DEBUG_FLAGS}")
|
||||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
else()
|
||||||
|
#For Windows
|
||||||
|
add_definitions(-D_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING)
|
||||||
|
|
||||||
|
add_compile_options(/wd4996) #'std::result_of_t': warning STL4014: std::result_of and std::result_of_t are deprecated in C++17.
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_PLATFORM_INCLUDE AND NOT CMAKE_PLATFORM_INCLUDE STREQUAL "")
|
if(CMAKE_PLATFORM_INCLUDE AND NOT CMAKE_PLATFORM_INCLUDE STREQUAL "")
|
||||||
|
@ -117,12 +117,12 @@ bool BasicChannel::passwordMatch(std::string password, bool hashed) {
|
|||||||
return this->properties()[property::CHANNEL_PASSWORD].as<string>() == password;
|
return this->properties()[property::CHANNEL_PASSWORD].as<string>() == password;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BasicChannel::emptySince() {
|
int64_t BasicChannel::emptySince() {
|
||||||
if (!properties().hasProperty(property::CHANNEL_LAST_LEFT))
|
if (!properties().hasProperty(property::CHANNEL_LAST_LEFT))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
time_point<system_clock> lastLeft = time_point<system_clock>() + milliseconds(properties()[property::CHANNEL_LAST_LEFT].as<uint64_t>());
|
time_point<system_clock> lastLeft = time_point<system_clock>() + milliseconds(properties()[property::CHANNEL_LAST_LEFT].as<uint64_t>());
|
||||||
return duration_cast<seconds>(system_clock::now() - lastLeft).count();
|
return (int64_t) duration_cast<seconds>(system_clock::now() - lastLeft).count();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BasicChannel::setLinkedHandle(const std::weak_ptr<TreeView::LinkedTreeEntry> &ptr) {
|
void BasicChannel::setLinkedHandle(const std::weak_ptr<TreeView::LinkedTreeEntry> &ptr) {
|
||||||
|
@ -52,7 +52,7 @@ namespace ts {
|
|||||||
|
|
||||||
bool passwordMatch(std::string password, bool hashed = false);
|
bool passwordMatch(std::string password, bool hashed = false);
|
||||||
bool defaultChannel() { return (*this->_properties)[property::CHANNEL_FLAG_DEFAULT]; }
|
bool defaultChannel() { return (*this->_properties)[property::CHANNEL_FLAG_DEFAULT]; }
|
||||||
int emptySince();
|
int64_t emptySince();
|
||||||
|
|
||||||
inline std::chrono::system_clock::time_point createdTimestamp() {
|
inline std::chrono::system_clock::time_point createdTimestamp() {
|
||||||
return std::chrono::system_clock::time_point() + std::chrono::milliseconds(this->properties()[property::CHANNEL_CREATED_AT].as<int64_t>());
|
return std::chrono::system_clock::time_point() + std::chrono::milliseconds(this->properties()[property::CHANNEL_CREATED_AT].as<int64_t>());
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <utility>
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
@ -261,9 +263,8 @@ namespace ts {
|
|||||||
static ErrorType VSError;
|
static ErrorType VSError;
|
||||||
static ErrorType DBEmpty;
|
static ErrorType DBEmpty;
|
||||||
|
|
||||||
ErrorType(const uint16_t errorId, const std::string &name, const std::string &message) : errorId(errorId), name(name), message(message) {}
|
ErrorType(const uint16_t errorId, std::string name, std::string message) : errorId(errorId), name(std::move(name)), message(std::move(message)) {}
|
||||||
|
ErrorType(const ErrorType& ref) = default;
|
||||||
ErrorType(const ErrorType& ref) : errorId(ref.errorId), name(ref.name), message(ref.message) {}
|
|
||||||
ErrorType(ErrorType&& ref) : errorId(ref.errorId), name(std::move(ref.name)), message(std::move(ref.message)) {}
|
ErrorType(ErrorType&& ref) : errorId(ref.errorId), name(std::move(ref.name)), message(std::move(ref.message)) {}
|
||||||
|
|
||||||
uint16_t errorId;
|
uint16_t errorId;
|
||||||
|
@ -263,7 +263,7 @@ void LicenseChain::print() {
|
|||||||
|
|
||||||
auto key = this->generatePublicKey();
|
auto key = this->generatePublicKey();
|
||||||
cout << "Public key: " << endl;
|
cout << "Public key: " << endl;
|
||||||
hexDump((char*) key.data(), key.length(), key.length(), key.length(), [](string message) { cout << message << endl; });
|
hexDump((char*) key.data(), (int) key.length(), (int) key.length(), (int) key.length(), [](string message) { cout << message << endl; });
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string LicenseChain::exportChain() {
|
std::string LicenseChain::exportChain() {
|
||||||
|
@ -637,7 +637,6 @@ namespace ts {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Permission(Permission &) = delete;
|
|
||||||
Permission(const Permission &) = delete;
|
Permission(const Permission &) = delete;
|
||||||
|
|
||||||
Permission() = delete;
|
Permission() = delete;
|
||||||
|
@ -20,7 +20,7 @@ bool Properties::has(property::PropertyType type, int index) {
|
|||||||
if(!*it) continue;
|
if(!*it) continue;
|
||||||
if(it->get()->type != type) continue;
|
if(it->get()->type != type) continue;
|
||||||
|
|
||||||
index -= it->get()->offset;
|
index -= (int) it->get()->offset;
|
||||||
if(index < 0) return false;
|
if(index < 0) return false;
|
||||||
return index < it->get()->length;
|
return index < it->get()->length;
|
||||||
}
|
}
|
||||||
@ -33,7 +33,7 @@ PropertyWrapper Properties::find(property::PropertyType type, int index) {
|
|||||||
if(bulk->type != type)
|
if(bulk->type != type)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
index -= bulk->offset;
|
index -= (int) bulk->offset;
|
||||||
if(index < 0)
|
if(index < 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ bool Properties::register_property_type(ts::property::PropertyType type, size_t
|
|||||||
new (&property.casted_value) any();
|
new (&property.casted_value) any();
|
||||||
new (&property.value_lock) spin_lock();
|
new (&property.value_lock) spin_lock();
|
||||||
new (&property.value) string();
|
new (&property.value) string();
|
||||||
new (&property.description) shared_ptr<property::PropertyDescription>(property::impl::info(type, offset + index));
|
new (&property.description) shared_ptr<property::PropertyDescription>(property::impl::info(type, (int) (offset + index)));
|
||||||
property.flag_modified = false;
|
property.flag_modified = false;
|
||||||
property.flag_db_reference = false;
|
property.flag_db_reference = false;
|
||||||
|
|
||||||
|
@ -613,13 +613,19 @@ namespace ts {
|
|||||||
bool flag_modified;
|
bool flag_modified;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#pragma warning( push )
|
||||||
|
#pragma warning( disable : 4200 )
|
||||||
|
#endif
|
||||||
struct PropertyBundle {
|
struct PropertyBundle {
|
||||||
property::PropertyType type;
|
property::PropertyType type;
|
||||||
size_t length;
|
size_t length;
|
||||||
size_t offset;
|
size_t offset;
|
||||||
|
|
||||||
PropertyData properties[0];
|
PropertyData properties[0];
|
||||||
};
|
};
|
||||||
|
#ifdef WIN32
|
||||||
|
#pragma warning( pop )
|
||||||
|
#endif
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct PropertyAccess {
|
struct PropertyAccess {
|
||||||
|
@ -127,10 +127,10 @@ DEFINE_VARIABLE_TRANSFORM(char*, VARTYPE_TEXT, std::string((const char*) in), (c
|
|||||||
DEFINE_VARIABLE_TRANSFORM(const char*, VARTYPE_TEXT, std::string((const char*) in), in.value().c_str());
|
DEFINE_VARIABLE_TRANSFORM(const char*, VARTYPE_TEXT, std::string((const char*) in), in.value().c_str());
|
||||||
|
|
||||||
DEFINE_VARIABLE_TRANSFORM(int8_t, VARTYPE_INT, std::to_string(in), std::stoi(in.value()));
|
DEFINE_VARIABLE_TRANSFORM(int8_t, VARTYPE_INT, std::to_string(in), std::stoi(in.value()));
|
||||||
DEFINE_VARIABLE_TRANSFORM(uint8_t, VARTYPE_INT, std::to_string(in), std::stoul(in.value()));
|
DEFINE_VARIABLE_TRANSFORM(uint8_t, VARTYPE_INT, std::to_string(in), (uint8_t) std::stoul(in.value()));
|
||||||
|
|
||||||
DEFINE_VARIABLE_TRANSFORM(int16_t, VARTYPE_INT, std::to_string(in), std::stoi(in.value()));
|
DEFINE_VARIABLE_TRANSFORM(int16_t, VARTYPE_INT, std::to_string(in), std::stoi(in.value()));
|
||||||
DEFINE_VARIABLE_TRANSFORM(uint16_t, VARTYPE_INT, std::to_string(in), std::stoul(in.value()));
|
DEFINE_VARIABLE_TRANSFORM(uint16_t, VARTYPE_INT, std::to_string(in), (uint16_t) std::stoul(in.value()));
|
||||||
|
|
||||||
DEFINE_VARIABLE_TRANSFORM(int32_t, VARTYPE_INT, std::to_string(in), std::stoi(in.value()));
|
DEFINE_VARIABLE_TRANSFORM(int32_t, VARTYPE_INT, std::to_string(in), std::stoi(in.value()));
|
||||||
DEFINE_VARIABLE_TRANSFORM(uint32_t, VARTYPE_INT, std::to_string(in), std::stoul(in.value()));
|
DEFINE_VARIABLE_TRANSFORM(uint32_t, VARTYPE_INT, std::to_string(in), std::stoul(in.value()));
|
||||||
|
@ -16,7 +16,7 @@ namespace fs = std::experimental::filesystem;
|
|||||||
#define ASYNC_LOG
|
#define ASYNC_LOG
|
||||||
namespace logger {
|
namespace logger {
|
||||||
recursive_mutex loggerLock;
|
recursive_mutex loggerLock;
|
||||||
map<int, std::shared_ptr<spdlog::logger>> loggers;
|
map<size_t, std::shared_ptr<spdlog::logger>> loggers;
|
||||||
shared_ptr<LoggerConfig> logConfig;
|
shared_ptr<LoggerConfig> logConfig;
|
||||||
shared_ptr<::logger::TerminalSink> terminalSink;
|
shared_ptr<::logger::TerminalSink> terminalSink;
|
||||||
shared_ptr<::logger::CostumeFormatter> costumeFormatter;
|
shared_ptr<::logger::CostumeFormatter> costumeFormatter;
|
||||||
@ -25,7 +25,7 @@ namespace logger {
|
|||||||
if(!::logger::currentConfig())
|
if(!::logger::currentConfig())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
int group = 0;
|
size_t group = 0;
|
||||||
if(::logger::currentConfig()->vs_group_size > 0 && serverId > 0)
|
if(::logger::currentConfig()->vs_group_size > 0 && serverId > 0)
|
||||||
group = serverId / ::logger::currentConfig()->vs_group_size;
|
group = serverId / ::logger::currentConfig()->vs_group_size;
|
||||||
else group = -1;
|
else group = -1;
|
||||||
@ -46,10 +46,15 @@ namespace logger {
|
|||||||
strvar::FunctionValue("time", (strvar::FunctionValue::FValueFNEasy) [](std::deque<std::string> value) -> std::string {
|
strvar::FunctionValue("time", (strvar::FunctionValue::FValueFNEasy) [](std::deque<std::string> value) -> std::string {
|
||||||
auto pattern = !value.empty() ? value[0] : "%Y-%m-%d_%H:%M:%S";
|
auto pattern = !value.empty() ? value[0] : "%Y-%m-%d_%H:%M:%S";
|
||||||
|
|
||||||
tm* tm_info;
|
|
||||||
auto secs = duration_cast<seconds>(logConfig->timestamp.time_since_epoch()).count();
|
auto secs = duration_cast<seconds>(logConfig->timestamp.time_since_epoch()).count();
|
||||||
|
tm* tm_info;
|
||||||
|
#ifdef WIN32
|
||||||
|
tm _tm_info{};
|
||||||
|
localtime_s(&_tm_info, &secs);
|
||||||
|
tm_info = &_tm_info;
|
||||||
|
#else
|
||||||
tm_info = localtime((time_t*) &secs);
|
tm_info = localtime((time_t*) &secs);
|
||||||
|
#endif
|
||||||
char timeBuffer[1024];
|
char timeBuffer[1024];
|
||||||
if(strftime(timeBuffer, 1024, pattern.c_str(), tm_info) == 0) {
|
if(strftime(timeBuffer, 1024, pattern.c_str(), tm_info) == 0) {
|
||||||
return string("string is longer than the buffer");
|
return string("string is longer than the buffer");
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
std::string base64::decode(const char* input, size_t size) {
|
std::string base64::decode(const char* input, size_t size) {
|
||||||
auto out = new unsigned char[size];
|
auto out = new unsigned char[size];
|
||||||
if(base64_strict_decode((unsigned char*) input, size, out, (unsigned long*) &size) != CRYPT_OK){
|
if(base64_strict_decode((unsigned char*) input, (unsigned long) size, out, (unsigned long*) &size) != CRYPT_OK){
|
||||||
std::cerr << "Invalid base 64 string '" << input << "'" << std::endl;
|
std::cerr << "Invalid base 64 string '" << input << "'" << std::endl;
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ namespace base64 {
|
|||||||
* @param input The input string to Base64-encode
|
* @param input The input string to Base64-encode
|
||||||
* @return A Base64-encoded version of the encoded string
|
* @return A Base64-encoded version of the encoded string
|
||||||
*/
|
*/
|
||||||
inline std::string encode(const std::string& input) { return encode(input.c_str(), input.size()); }
|
inline std::string encode(const std::string& input) { return encode(input.c_str(), (unsigned long) input.size()); }
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -48,4 +48,4 @@ namespace base64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
inline std::string base64_encode(const char* input, const unsigned long inputSize) { return base64::encode(input, inputSize); }
|
inline std::string base64_encode(const char* input, const unsigned long inputSize) { return base64::encode(input, inputSize); }
|
||||||
inline std::string base64_encode(const std::string& input) { return base64::encode(input.c_str(), input.size()); }
|
inline std::string base64_encode(const std::string& input) { return base64::encode(input.c_str(), (unsigned long) input.size()); }
|
@ -2,12 +2,12 @@
|
|||||||
#ifdef NO_OPEN_SSL
|
#ifdef NO_OPEN_SSL
|
||||||
#include <tomcrypt.h>
|
#include <tomcrypt.h>
|
||||||
|
|
||||||
#define DECLARE_DIGEST(name, digestLength) \
|
#define DECLARE_DIGEST(name, digestLength) \
|
||||||
void digest::tomcrypt::name(const char* input, size_t length, uint8_t* result) { \
|
void digest::tomcrypt::name(const char* input, size_t length, uint8_t* result) { \
|
||||||
hash_state hash{}; \
|
hash_state hash{}; \
|
||||||
\
|
\
|
||||||
name ##_init(&hash); \
|
name ##_init(&hash); \
|
||||||
name ##_process(&hash, (uint8_t*) input, length); \
|
name ##_process(&hash, (uint8_t*) input, (unsigned long) length); \
|
||||||
name ##_done(&hash, result); \
|
name ##_done(&hash, result); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ namespace ts {
|
|||||||
delete this->data;
|
delete this->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
PacketTypeInfo::PacketTypeInfo(PacketTypeInfo &red) : data(red.data) { }
|
|
||||||
PacketTypeInfo::PacketTypeInfo(const PacketTypeInfo &red) : data(red.data) { }
|
PacketTypeInfo::PacketTypeInfo(const PacketTypeInfo &red) : data(red.data) { }
|
||||||
|
|
||||||
std::map<int, PacketTypeInfo> PacketTypeInfo::types;
|
std::map<int, PacketTypeInfo> PacketTypeInfo::types;
|
||||||
@ -65,13 +64,13 @@ namespace ts {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BasicPacket::BasicPacket(size_t header_length, size_t data_length) {
|
BasicPacket::BasicPacket(size_t header_length, size_t data_length) {
|
||||||
this->_header_length = header_length;
|
this->_header_length = (uint8_t) header_length;
|
||||||
this->_buffer = pipes::buffer(MAC_SIZE + this->_header_length + data_length);
|
this->_buffer = pipes::buffer(MAC_SIZE + this->_header_length + data_length);
|
||||||
memset(this->_buffer.data_ptr(), 0, this->_buffer.length());
|
memset(this->_buffer.data_ptr(), 0, this->_buffer.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
BasicPacket::BasicPacket(size_t header_length, const pipes::buffer &buffer) {
|
BasicPacket::BasicPacket(size_t header_length, const pipes::buffer &buffer) {
|
||||||
this->_header_length = header_length;
|
this->_header_length = (uint8_t) header_length;
|
||||||
this->_buffer = buffer;
|
this->_buffer = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,6 @@ namespace ts {
|
|||||||
inline bool fragmentable() { return *this == PacketTypeInfo::Command || *this == PacketTypeInfo::CommandLow; }
|
inline bool fragmentable() { return *this == PacketTypeInfo::Command || *this == PacketTypeInfo::CommandLow; }
|
||||||
inline bool compressable() { return *this == PacketTypeInfo::Command || *this == PacketTypeInfo::CommandLow; }
|
inline bool compressable() { return *this == PacketTypeInfo::Command || *this == PacketTypeInfo::CommandLow; }
|
||||||
|
|
||||||
PacketTypeInfo(PacketTypeInfo&);
|
|
||||||
PacketTypeInfo(const PacketTypeInfo&);
|
PacketTypeInfo(const PacketTypeInfo&);
|
||||||
PacketTypeInfo(PacketTypeInfo&& remote) : data(remote.data) {}
|
PacketTypeInfo(PacketTypeInfo&& remote) : data(remote.data) {}
|
||||||
|
|
||||||
@ -88,7 +87,7 @@ namespace ts {
|
|||||||
PacketIdManager() : data(new PacketIdManagerData){}
|
PacketIdManager() : data(new PacketIdManagerData){}
|
||||||
~PacketIdManager() = default;
|
~PacketIdManager() = default;
|
||||||
PacketIdManager(const PacketIdManager& ref) : data(ref.data) {}
|
PacketIdManager(const PacketIdManager& ref) : data(ref.data) {}
|
||||||
PacketIdManager(PacketIdManager& ref) : data(ref.data) {}
|
PacketIdManager(PacketIdManager&& ref) : data(std::move(ref.data)) {}
|
||||||
|
|
||||||
uint16_t nextPacketId(const PacketTypeInfo &type){
|
uint16_t nextPacketId(const PacketTypeInfo &type){
|
||||||
return static_cast<uint16_t>(data->packetCounter[type.type()]++ & 0xFFFF);
|
return static_cast<uint16_t>(data->packetCounter[type.type()]++ & 0xFFFF);
|
||||||
|
@ -5,7 +5,9 @@ using namespace ts;
|
|||||||
using namespace ts::protocol;
|
using namespace ts::protocol;
|
||||||
using namespace ts::buffer;
|
using namespace ts::buffer;
|
||||||
|
|
||||||
#pragma GCC optimize ("O3")
|
#ifndef WIN32
|
||||||
|
#pragma GCC optimize ("O3")
|
||||||
|
#endif
|
||||||
|
|
||||||
meminfo buffer::buffer_memory() {
|
meminfo buffer::buffer_memory() {
|
||||||
size_t bytes_buffer = 0;
|
size_t bytes_buffer = 0;
|
||||||
|
@ -5,7 +5,9 @@ using namespace ts;
|
|||||||
using namespace ts::protocol;
|
using namespace ts::protocol;
|
||||||
using namespace ts::buffer;
|
using namespace ts::buffer;
|
||||||
|
|
||||||
#pragma GCC optimize ("O3")
|
#ifndef WIN32
|
||||||
|
#pragma GCC optimize ("O3")
|
||||||
|
#endif
|
||||||
|
|
||||||
buffer_t buffer::allocate_buffer(size::value size) {
|
buffer_t buffer::allocate_buffer(size::value size) {
|
||||||
return pipes::buffer{buffer::size::byte_length(size)};
|
return pipes::buffer{buffer::size::byte_length(size)};
|
||||||
|
@ -111,7 +111,9 @@ namespace ts {
|
|||||||
key = data.substr(current_index, index_assign - current_index);
|
key = data.substr(current_index, index_assign - current_index);
|
||||||
try {
|
try {
|
||||||
value = query::unescape(string(data.substr(index_assign + 1, end_index - index_assign - 1)), true);
|
value = query::unescape(string(data.substr(index_assign + 1, end_index - index_assign - 1)), true);
|
||||||
} catch(std::invalid_argument& ex) {
|
} catch(const std::invalid_argument& ex) {
|
||||||
|
(void) ex;
|
||||||
|
|
||||||
/* invalid character at index X */
|
/* invalid character at index X */
|
||||||
if(!drop_non_utf8)
|
if(!drop_non_utf8)
|
||||||
throw;
|
throw;
|
||||||
|
@ -179,12 +179,12 @@ operator type(){ \
|
|||||||
Json::Value buildJson() const;
|
Json::Value buildJson() const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const ParameterBulk& operator[](int index) const {
|
const ParameterBulk& operator[](size_t index) const {
|
||||||
if(bulks.size() <= index) throw std::invalid_argument("got out of length");
|
if(bulks.size() <= index) throw std::invalid_argument("got out of length");
|
||||||
return bulks[index];
|
return bulks[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
ParameterBulk& operator[](int index){
|
ParameterBulk& operator[](size_t index){
|
||||||
while(bulks.size() <= index) bulks.push_back(ParameterBulk{});
|
while(bulks.size() <= index) bulks.push_back(ParameterBulk{});
|
||||||
return bulks[index];
|
return bulks[index];
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,9 @@ command command::parse(const std::string_view &data, bool expect_type, bool drop
|
|||||||
key = data.substr(current_index, index_assign - current_index);
|
key = data.substr(current_index, index_assign - current_index);
|
||||||
try {
|
try {
|
||||||
value = query::unescape(string(data.substr(index_assign + 1, end_index - index_assign - 1)), true);
|
value = query::unescape(string(data.substr(index_assign + 1, end_index - index_assign - 1)), true);
|
||||||
} catch(std::invalid_argument& ex) {
|
} catch(const std::invalid_argument& ex) {
|
||||||
|
(void) ex;
|
||||||
|
|
||||||
/* invalid character at index X */
|
/* invalid character at index X */
|
||||||
if(!drop_non_utf8)
|
if(!drop_non_utf8)
|
||||||
throw;
|
throw;
|
||||||
|
Loading…
Reference in New Issue
Block a user