summaryrefslogtreecommitdiffstats
path: root/src/webclientserver.h
blob: ad9a0cfe769549594e6cade16c85df96e80098fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#ifndef CONTENTSERVER_H
#define CONTENTSERVER_H

#include <QtCore>
#include <QtNetwork>

class HttpRequest
{
public:
    HttpRequest();
    HttpRequest(const QList<QByteArray> &text);
    HttpRequest(QTcpSocket *socket);
    QByteArray path();
    QByteArray cookies();
    QList<QNetworkCookie> parsedCookies();
    QByteArray hostName();
//    QHash<QByteArray, QByteArray> cookieValues();
//private:
    void readText();
    void parseText();
    QByteArray m_path;
    QByteArray m_cookies;
    QList<QNetworkCookie> m_parsedCookies;
    QByteArray m_hostName;
    QList<QByteArray> m_text;
    QTcpSocket *m_socket;
    QByteArray m_ifNoneMatch;
};

class HttpResponse
{
public:
    HttpResponse();
    void setBody(const QByteArray &body);
    void setCookie(const QByteArray &name, const QByteArray &value);
    void setContentType(const QByteArray &contentType);
    void seteTag(const QByteArray &eTag);
    void set304Response();

    bool isHandled() const;
    QByteArray toText();

    QByteArray body;
    QByteArray cookie;
    QByteArray contentType;
    QByteArray eTag;
    bool response304;
};

class Server;
class Session : public QObject
{
Q_OBJECT
public:
    Session(Server *server, int sessionId);
    int sessionId();
    void setIdleSocket(QTcpSocket *socket);
    QTcpSocket * idleSocket();
    void emitRequestContent(HttpRequest *request, HttpResponse *response);
signals:
    void sessionEnd();
    void requestContent(HttpRequest *request, HttpResponse *response);
public slots:
    void contentAvailable();
    void idleSocketDisconnect();
public:
    int m_sessionId;
    QHostAddress address;
    QTcpSocket *m_idleSocket;
    HttpRequest m_idleRequest;
    HttpResponse m_idleResponse;
    Server *m_server;
};

class FileServer : public QObject
{
Q_OBJECT
public:
    FileServer();
public slots:
    virtual void handleRequest(HttpRequest *request, HttpResponse *response);
private:
    QSet<QString> allowedFileNames;
    QHash<QString, QByteArray> eTags;
};

class Server : public QTcpServer
{
Q_OBJECT
public:
    Server(quint16 port = 1818);
    ~Server();
signals:
//    void authenticate(Session *session);
    void sessionBegin(Session *session);
    void sessionEnd(int sessionId);
public slots:
//    void authenticated(Session *session);
    void contentAvailable(Session *session);
private slots:
    void connectionAvailable();
    void dataOnSocket();
private:
    void printRequest(const QList<QByteArray> &request);
    QHash<int, Session *> activeSessions;
    int nextCookieId;
    quint16 port;
    FileServer fileServer;

    // statistics
    int bytesRead;
    int dynamicBytesWritten;
    int staticBytesWritten;
    int totalSessions;
    QDateTime serverStart;
    QByteArray createStatiticsPage();
};

#endif