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
|