version 5.1.0

PIHTTPServer now can handle path with partially *, ** and {} path arguments
PIHTTP::MessageConst add queryArguments() and pathArguments(). arguments() now union of these args
This commit is contained in:
2025-08-28 19:48:19 +03:00
parent 27f37c9cc1
commit ef8b785ac6
8 changed files with 327 additions and 120 deletions

View File

@@ -59,14 +59,26 @@ PIHTTP::MessageMutable & PIHTTP::MessageMutable::removeHeader(const PIString & h
}
PIHTTP::MessageMutable & PIHTTP::MessageMutable::addArgument(const PIString & arg, const PIString & value) {
m_arguments[arg] = value;
PIHTTP::MessageMutable & PIHTTP::MessageMutable::addQueryArgument(const PIString & arg, const PIString & value) {
m_query_arguments[arg] = value;
return *this;
}
PIHTTP::MessageMutable & PIHTTP::MessageMutable::removeArgument(const PIString & arg) {
m_arguments.remove(arg);
PIHTTP::MessageMutable & PIHTTP::MessageMutable::removeQueryArgument(const PIString & arg) {
m_query_arguments.remove(arg);
return *this;
}
PIHTTP::MessageMutable & PIHTTP::MessageMutable::addPathArgument(const PIString & arg, const PIString & value) {
m_path_arguments[arg] = value;
return *this;
}
PIHTTP::MessageMutable & PIHTTP::MessageMutable::removePathArgument(const PIString & arg) {
m_path_arguments.remove(arg);
return *this;
}

View File

@@ -61,8 +61,16 @@ public:
//! ~russian Возвращает все заголовки сообщения
const PIMap<PIString, PIString> & headers() const { return m_headers; }
//! ~english Gets all message arguments
//! ~russian Возвращает все аргументы сообщения
//! ~english Gets URL query arguments
//! ~russian Возвращает URL query аргументы
const PIMap<PIString, PIString> & queryArguments() const { return m_query_arguments; }
//! ~english Gets URL path arguments
//! ~russian Возвращает URL path аргументы
const PIMap<PIString, PIString> & pathArguments() const { return m_path_arguments; }
//! ~english Gets all message arguments (query + path)
//! ~russian Возвращает все аргументы сообщения (query + path)
const PIMap<PIString, PIString> & arguments() const { return m_arguments; }
protected:
@@ -71,7 +79,7 @@ protected:
PIString m_path;
PIByteArray m_body;
PIMap<PIString, PIString> m_headers;
PIMap<PIString, PIString> m_arguments;
PIMap<PIString, PIString> m_query_arguments, m_path_arguments, m_arguments;
};
@@ -96,7 +104,11 @@ public:
MessageMutable & setBody(PIByteArray b);
const PIMap<PIString, PIString> & headers() const { return m_headers; }
PIMap<PIString, PIString> & arguments() { return m_arguments; }
const PIMap<PIString, PIString> & arguments() const { return m_arguments; }
const PIMap<PIString, PIString> & queryArguments() const { return m_query_arguments; }
const PIMap<PIString, PIString> & pathArguments() const { return m_path_arguments; }
PIMap<PIString, PIString> & headers() { return m_headers; }
//! ~english Adds a header to the message
@@ -107,15 +119,29 @@ public:
//! ~russian Удаляет заголовок из сообщения
MessageMutable & removeHeader(const PIString & header);
PIMap<PIString, PIString> & arguments() { return m_arguments; }
//! ~english Gets reference to URL query arguments
//! ~russian Возвращает ссылку на URL query аргументы
PIMap<PIString, PIString> & queryArguments() { return m_query_arguments; }
//! ~english Adds an argument to the message
//! ~russian Добавляет аргумент к сообщению
MessageMutable & addArgument(const PIString & arg, const PIString & value);
//! ~english Adds an URL query argument to the message
//! ~russian Добавляет URL query аргумент к сообщению
MessageMutable & addQueryArgument(const PIString & arg, const PIString & value);
//! ~english Removes an argument from the message
//! ~russian Удаляет аргумент из сообщения
MessageMutable & removeArgument(const PIString & arg);
//! ~english Removes an URL query argument from the message
//! ~russian Удаляет URL query аргумент из сообщения
MessageMutable & removeQueryArgument(const PIString & arg);
//! ~english Gets reference to URL path arguments
//! ~russian Возвращает ссылку на URL path аргументы
PIMap<PIString, PIString> & pathArguments() { return m_path_arguments; }
//! ~english Adds an URL path argument to the message
//! ~russian Добавляет URL path аргумент к сообщению
MessageMutable & addPathArgument(const PIString & arg, const PIString & value);
//! ~english Removes an URL path argument from the message
//! ~russian Удаляет URL query path из сообщения
MessageMutable & removePathArgument(const PIString & arg);
//! ~english Creates message from HTTP status code
//! ~russian Создает сообщение из HTTP-статус кода

View File

@@ -17,23 +17,23 @@ public:
//! ~english Registers handler for specific path and HTTP method
//! ~russian Регистрирует обработчик для указанного пути и HTTP метода
void registerPath(const PIString & path, PIHTTP::Method method, RequestFunction functor);
bool registerPath(const PIString & path, PIHTTP::Method method, RequestFunction functor);
//! ~english Registers handler for specific path and HTTP method
//! ~russian Регистрирует обработчик для указанного пути и HTTP метода
template<typename T>
void
bool
registerPath(const PIString & path, PIHTTP::Method method, T * o, PIHTTP::MessageMutable (T::*function)(const PIHTTP::MessageConst &)) {
registerPath(path, method, [o, function](const PIHTTP::MessageConst & m) { return (o->*function)(m); });
return registerPath(path, method, [o, function](const PIHTTP::MessageConst & m) { return (o->*function)(m); });
}
//! ~english Registers handler for unhandled requests
//! ~russian Регистрирует обработчик для необработанных запросов
//! ~english Registers handler for unregistered pathes
//! ~russian Регистрирует обработчик для незарегистрированных путей
void registerUnhandled(RequestFunction functor);
//! ~english Registers handler for unhandled requests
//! ~russian Регистрирует обработчик для необработанных запросов
//! ~english Registers handler for unregistered pathes
//! ~russian Регистрирует обработчик для незарегистрированных путей
template<typename T>
void registerUnhandled(T * o, PIHTTP::MessageMutable (T::*function)(const PIHTTP::MessageConst &)) {
registerUnhandled([o, function](const PIHTTP::MessageConst & m) { return (o->*function)(m); });
@@ -61,14 +61,43 @@ public:
void clearReplyHeaders() { reply_headers.clear(); }
private:
struct PathElement {
enum class Type {
Invalid = 0x01,
Fixed = 0x02,
Arguments = 0x04,
AnyOne = 0x08,
AnyPart = 0x10,
AnyMany = 0x20
};
Type type = Type::Fixed;
PIString source;
PIStringList parts;
PIMap<int, PIString> arguments;
PathElement(const PIString & reg = {});
bool match(const PIString & in, PIMap<PIString, PIString> & ext_args) const;
uint priority() const;
};
struct Endpoint {
bool match(const PIStringList & in_path) const;
PIStringList path;
PIHTTP::Method method = PIHTTP::Method::Unknown;
RequestFunction function;
PIFlags<PathElement::Type> path_types;
PIVector<PathElement> prepared_path;
uint priority = 0;
bool create(const PIString & p);
bool match(const PIStringList & in_path, PIMap<PIString, PIString> & ext_args) const;
};
static PIStringList splitPath(const PIString & path);
PIMap<PIString, PIString> reply_headers;
PIMap<PIString, Endpoint> functions;
PIMap<uint, PIVector<Endpoint>> endpoints;
RequestFunction unhandled;
};

View File

@@ -60,7 +60,7 @@ public:
//! \~english Constructor with flags = Enum "e"
//! \~russian Создает флаги со значением = Enum "e"
PIFlags(Enum e): flags(e) { ; }
PIFlags(Enum e): flags((int)e) { ; }
//! \~english Constructor with flags = int "i"
//! \~russian Создает флаги со значением = int "i"
@@ -80,9 +80,9 @@ public:
//! \~russian Устанавливает флаг "e" в "on"
PIFlags & setFlag(const Enum & e, bool on = true) {
if (on)
flags |= e;
flags |= (int)e;
else
flags &= ~e;
flags &= ~(int)e;
return *this;
}
@@ -98,7 +98,7 @@ public:
//! \~english Assign operator
//! \~russian Оператор присваивания
void operator=(const Enum & e) { flags = e; }
void operator=(const Enum & e) { flags = (int)e; }
//! \~english Assign operator
//! \~russian Оператор присваивания
@@ -110,7 +110,7 @@ public:
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator==(const Enum & e) { return flags == e; }
bool operator==(const Enum & e) { return flags == (int)e; }
//! \~english Compare operator
//! \~russian Оператор сравнения
@@ -122,7 +122,7 @@ public:
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator!=(const Enum & e) { return flags != e; }
bool operator!=(const Enum & e) { return flags != (int)e; }
//! \~english Compare operator
//! \~russian Оператор сравнения
@@ -134,7 +134,7 @@ public:
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator>(const Enum & e) { return flags > e; }
bool operator>(const Enum & e) { return flags > (int)e; }
//! \~english Compare operator
//! \~russian Оператор сравнения
@@ -146,7 +146,7 @@ public:
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator<(const Enum & e) { return flags < e; }
bool operator<(const Enum & e) { return flags < (int)e; }
//! \~english Compare operator
//! \~russian Оператор сравнения
@@ -158,7 +158,7 @@ public:
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator>=(const Enum & e) { return flags >= e; }
bool operator>=(const Enum & e) { return flags >= (int)e; }
//! \~english Compare operator
//! \~russian Оператор сравнения
@@ -170,7 +170,7 @@ public:
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator<=(const Enum & e) { return flags <= e; }
bool operator<=(const Enum & e) { return flags <= (int)e; }
//! \~english Compare operator
//! \~russian Оператор сравнения
@@ -182,7 +182,7 @@ public:
//! \~english Bit-wise AND operator
//! \~russian Оператор побитового И
void operator&=(const Enum & e) { flags &= e; }
void operator&=(const Enum & e) { flags &= (int)e; }
//! \~english Bit-wise AND operator
//! \~russian Оператор побитового И
@@ -194,7 +194,7 @@ public:
//! \~english Bit-wise OR operator
//! \~russian Оператор побитового ИЛИ
void operator|=(const Enum & e) { flags |= e; }
void operator|=(const Enum & e) { flags |= (int)e; }
//! \~english Bit-wise OR operator
//! \~russian Оператор побитового ИЛИ
@@ -206,7 +206,7 @@ public:
//! \~english Bit-wise XOR operator
//! \~russian Оператор побитового исключающего ИЛИ
void operator^=(const Enum & e) { flags ^= e; }
void operator^=(const Enum & e) { flags ^= (int)e; }
//! \~english Bit-wise XOR operator
//! \~russian Оператор побитового исключающего ИЛИ
@@ -222,7 +222,7 @@ public:
//! \~english Bit-wise AND operator
//! \~russian Оператор побитового И
PIFlags operator&(Enum e) const {
PIFlags tf(flags & e);
PIFlags tf(flags & (int)e);
return tf;
}
@@ -243,7 +243,7 @@ public:
//! \~english Bit-wise OR operator
//! \~russian Оператор побитового ИЛИ
PIFlags operator|(Enum e) const {
PIFlags tf(flags | e);
PIFlags tf(flags | (int)e);
return tf;
}
@@ -264,7 +264,7 @@ public:
//! \~english Bit-wise XOR operator
//! \~russian Оператор побитового исключающего ИЛИ
PIFlags operator^(Enum e) const {
PIFlags tf(flags ^ e);
PIFlags tf(flags ^ (int)e);
return tf;
}
@@ -277,7 +277,7 @@ public:
//! \~english Test flag operator
//! \~russian Оператор проверки флага
bool operator[](Enum e) const { return (flags & e) == e; }
bool operator[](Enum e) const { return (flags & (int)e) == (int)e; }
//! \~english Implicity conversion to \c int
//! \~russian Оператор неявного преобразования в \c int