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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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-статус кода
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user