LogDoctor/logdoctor/modules/craplog/modules/workers/lib.h

144 lines
3.4 KiB
C++

#ifndef LOGDOCTOR__CRAPLOG__WORKERS__LIB_H
#define LOGDOCTOR__CRAPLOG__WORKERS__LIB_H
#include <QMetaType>
enum LogsFormatField : uint32_t;
struct LogsFormat;
//! Signals which dialog to show
enum class WorkerDialog {
errGeneric,
errDirNotExists,
errFailedDefiningLogType,
errFailedParsingLogs,
errDatabaseFileNotFound,
errDatabaseFileNotFile,
errDatabaseFileNotReadable,
errDatabaseFileNotWritable,
errDatabaseFailedOpening,
errDatabaseFailedExecuting,
warnFileNotReadable,
warnEmptyFile,
};
Q_DECLARE_METATYPE(WorkerDialog)
//! FieldData
/*!
Holds the data of a single field from a log line
\see LogLineData
*/
struct FieldData final
{
FieldData() noexcept
: is_set{false} {}
explicit FieldData(std::string&& data) noexcept
: is_set{!data.empty()}, data{std::move(data)} {}
~FieldData() noexcept = default;
FieldData(FieldData&& other) noexcept = default;
FieldData& operator=(FieldData&& rhs) noexcept = default;
Q_DISABLE_COPY(FieldData)
//! Returns whether the field contains data
inline operator bool() const noexcept
{ return this->is_set; }
//! Returns a reference to the field's data
inline const std::string& operator *() const noexcept
{ return this->data; }
//! Returns the sum of the field's data size with another field's data size
inline size_t operator +(const FieldData& rhs) const noexcept
{ return this->data.size() + rhs.data.size(); }
//! Returns the sum of the field's data size with the given size
friend inline size_t operator +(const size_t lhs, const FieldData& rhs) noexcept;
private:
bool is_set;
std::string data;
};
inline size_t operator +(const size_t lhs, const FieldData& rhs) noexcept
{
return lhs + rhs.data.size();
}
//! LogLineData
/*!
Holds the data of a single log line
*/
struct LogLineData final
{
LogLineData(const std::string& line, const LogsFormat& logs_format);
~LogLineData() noexcept = default;
LogLineData(LogLineData&& other) noexcept = default;
LogLineData& operator=(LogLineData&& rhs) noexcept = delete;
Q_DISABLE_COPY(LogLineData)
//! Returns the total size of all the fields' data
size_t size() const noexcept;
// date and time
FieldData year;
FieldData month;
FieldData day;
FieldData hour;
FieldData minute;
FieldData second;
// request
FieldData protocol;
FieldData method;
FieldData uri;
FieldData query;
// server
FieldData response_code;
FieldData time_taken;
FieldData bytes_sent;
FieldData bytes_received;
// client
FieldData client;
FieldData cookie;
FieldData user_agent;
FieldData referrer;
private:
//! Returns a reference to the field data corresponding to the given field identifier
FieldData& data(const LogsFormatField id);
void storeUriQuery(std::string&& str) noexcept;
void storeMalformedRequestOneSpace(std::string&& str) noexcept;
void storeMalformedRequestMultiSpace(std::string&& str) noexcept;
inline static const std::vector<std::string> valid_methods{
"GET",
"POST",
"HEAD",
"PUT",
"DELETE",
"OPTIONS",
"CONNECT",
"TRACE",
"PATCH"
};
inline static const std::vector<std::string> valid_protocols{
"HTTP/0.9",
"HTTP/1.0",
"HTTP/1.1",
"HTTP/2",
"HTTP/3"
};
};
#endif // LOGDOCTOR__CRAPLOG__WORKERS__LIB_H