--- /dev/null
+
+# ifndef _HTTP_H
+# define _HTTP_H
+
+#include <stdlib.h>
+
+#include <QSharedData>
+#include <QSharedDataPointer>
+#include <QVariant>
+#include <QUrl>
+#include <QString>
+#include <QByteArray>
+#include <QMap>
+#include <QRegExp>
+
+#include <fcgi_config.h>
+#include <fcgi_stdio.h>
+
+#include "utils.h"
+
+class UploadedFile : public QVariant {
+ private:
+ struct Data : public QSharedData {
+ bool null;
+ QString file_name;
+ QString content_type;
+ int file_size;
+ QByteArray content;
+ Data(): null(true), file_name(""), content_type(""), file_size(0), content("") {};
+ };
+ QSharedDataPointer<Data> d;
+
+ class DUMMY_TYPE {};
+
+ static const UploadedFile& sharedNull();
+
+ UploadedFile(DUMMY_TYPE) { d = new Data; };
+
+ public:
+ UploadedFile();
+
+ UploadedFile(QString _file_name, QString _content_type, int _file_size, const QByteArray &_content);
+
+ QString fileName() const { return d->file_name; }
+
+ QString contentType() const { return d->content_type; }
+
+ int size() const { return d->file_size; }
+
+ const QByteArray &contentRef() const { return d->content; }
+
+ bool isNull() { return d->null; }
+};
+Q_DECLARE_METATYPE(UploadedFile)
+
+
+typedef QMap<QString, QString> QueryDict;
+typedef QMap<QString, UploadedFile> FilesDict;
+
+class HttpRedirect {
+ private:
+ QString url;
+
+ public:
+ HttpRedirect(QString _url): url(_url) {}
+
+ QString getUrl() const {
+ return url;
+ }
+};
+
+class HttpRequest {
+ private:
+ QString _path;
+ QString _method;
+ QueryDict post_data;
+ QueryDict get_data;
+ FilesDict files_data;
+
+ void parsePostData();
+
+ void parseMultipartData(int content_length, QString content_type);
+
+ void parseContentPart(QByteArray &content_part);
+
+ void parseFileContent(QString field_name, QString file_name, QByteArray &content_part, int start_pos);
+
+ void parseFieldContent(QString field_name, QByteArray &content_part, int start_pos);
+
+ public:
+ HttpRequest();
+
+ QString path() const {
+ return this->_path;
+ }
+
+ QString method() const {
+ return this->_method;
+ }
+
+ const QueryDict &GET() const {
+ return this->get_data;
+ }
+
+ const QueryDict &POST() const {
+ return this->post_data;
+ }
+
+ const FilesDict &FILES() const {
+ return this->files_data;
+ }
+};
+
+// class HttpResponse() {
+//
+// };
+
+# endif