Overte C++ Documentation
HTTPConnection.h
1 //
2 // HTTPConnection.h
3 // libraries/embedded-webserver/src
4 //
5 // Created by Stephen Birarda on 1/16/14.
6 // Copyright 2014 High Fidelity, Inc.
7 //
8 // Heavily based on Andrzej Kapolka's original HTTPConnection class
9 // found from another one of his projects.
10 // https://github.com/ey6es/witgap/tree/master/src/cpp/server/http
11 //
12 // Distributed under the Apache License, Version 2.0.
13 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
14 //
15 
16 #ifndef hifi_HTTPConnection_h
17 #define hifi_HTTPConnection_h
18 
19 #include <QHash>
20 #include <QIODevice>
21 #include <QList>
22 #include <QtNetwork/QHostAddress>
23 #include <QtNetwork/QNetworkAccessManager>
24 #include <QObject>
25 #include <QPair>
26 #include <QTemporaryFile>
27 #include <QUrl>
28 
29 #include <memory>
30 
31 class QTcpSocket;
32 class HTTPManager;
33 class MaskFilter;
34 class ServerApp;
35 
37 typedef QHash<QByteArray, QByteArray> Headers;
38 
40 typedef QPair<Headers, QByteArray> FormData;
41 
43 class HTTPConnection : public QObject {
44  Q_OBJECT
45 
46 public:
47  static const char* StatusCode200;
48  static const char* StatusCode204;
49  static const char* StatusCode301;
50  static const char* StatusCode302;
51  static const char* StatusCode400;
52  static const char* StatusCode401;
53  static const char* StatusCode403;
54  static const char* StatusCode404;
55  static const char* StatusCode500;
56  static const char* DefaultContentType;
57 
59  enum ReasonCode { NoReason = 0, NormalClosure = 1000, GoingAway = 1001 };
60 
61  class Storage {
62  public:
63  Storage() = default;
64  virtual ~Storage() = default;
65 
66  virtual const QByteArray& content() const = 0;
67 
68  virtual qint64 bytesLeftToWrite() const = 0;
69  virtual void write(const QByteArray& data) = 0;
70  };
71 
73  HTTPConnection(QTcpSocket* socket, HTTPManager* parentManager);
74 
76  virtual ~HTTPConnection();
77 
79  QTcpSocket* socket() const { return _socket; }
80 
82  const QHostAddress &peerAddress() const { return _address; }
83 
85  QNetworkAccessManager::Operation requestOperation() const { return _requestOperation; }
86 
88  const QUrl& requestUrl() const { return _requestUrl; }
89 
91  QByteArray requestHeader(const QString& key) const { return _requestHeaders.value(key.toLower().toLocal8Bit()); }
92 
94  const QByteArray& requestContent() const { return _requestContent->content(); }
95 
97  QList<FormData> parseFormData() const;
98 
101  QHash<QString, QString> parseUrlEncodedForm();
102 
104  void respond(const char* code, const QByteArray& content = QByteArray(),
105  const char* contentType = DefaultContentType,
106  const Headers& headers = Headers());
107  void respond(const char* code, std::unique_ptr<QIODevice> device,
108  const char* contentType = DefaultContentType,
109  const Headers& headers = Headers());
110 
111 protected slots:
112 
114  void readRequest();
115 
117  void readHeaders();
118 
120  void readContent();
121 
122 protected:
123  void respondWithStatusAndHeaders(const char* code, const char* contentType, const Headers& headers, qint64 size);
124 
127 
129  QTcpSocket* _socket;
130 
132  QHostAddress _address;
133 
135  QNetworkAccessManager::Operation _requestOperation;
136 
139 
142 
144  QByteArray _lastRequestHeader;
145 
147  std::unique_ptr<Storage> _requestContent;
148 
150  std::unique_ptr<QIODevice> _responseDevice;
151 };
152 
153 #endif // hifi_HTTPConnection_h
Handles a single HTTP connection.
Definition: HTTPConnection.h:43
QList< FormData > parseFormData() const
Parses the request content as form data, returning a list of header/content pairs.
Definition: HTTPConnection.cpp:161
ReasonCode
WebSocket close status codes.
Definition: HTTPConnection.h:59
QByteArray requestHeader(const QString &key) const
Returns a copy of the request header value. If it does not exist, it will return a default constructe...
Definition: HTTPConnection.h:91
QUrl _requestUrl
The requested URL.
Definition: HTTPConnection.h:138
QNetworkAccessManager::Operation _requestOperation
The requested operation.
Definition: HTTPConnection.h:135
std::unique_ptr< QIODevice > _responseDevice
Response content.
Definition: HTTPConnection.h:150
QNetworkAccessManager::Operation requestOperation() const
Returns the request operation.
Definition: HTTPConnection.h:85
std::unique_ptr< Storage > _requestContent
The content of the request.
Definition: HTTPConnection.h:147
void respond(const char *code, const QByteArray &content=QByteArray(), const char *contentType=DefaultContentType, const Headers &headers=Headers())
Sends a response and closes the connection.
Definition: HTTPConnection.cpp:221
void readRequest()
Reads the request line.
Definition: HTTPConnection.cpp:292
QTcpSocket * _socket
The underlying socket.
Definition: HTTPConnection.h:129
const QUrl & requestUrl() const
Returns a reference to the request URL.
Definition: HTTPConnection.h:88
QHash< QString, QString > parseUrlEncodedForm()
Definition: HTTPConnection.cpp:141
QByteArray _lastRequestHeader
The last request header processed (used for continuations).
Definition: HTTPConnection.h:144
HTTPConnection(QTcpSocket *socket, HTTPManager *parentManager)
Initializes the connection.
Definition: HTTPConnection.cpp:118
void readContent()
Reads the content.
Definition: HTTPConnection.cpp:391
void readHeaders()
Reads the headers.
Definition: HTTPConnection.cpp:333
const QByteArray & requestContent() const
Returns a reference to the request content.
Definition: HTTPConnection.h:94
Headers _requestHeaders
The request headers.
Definition: HTTPConnection.h:141
virtual ~HTTPConnection()
Destroys the connection.
Definition: HTTPConnection.cpp:133
QTcpSocket * socket() const
Returns a pointer to the underlying socket, to which WebSocket message bodies should be written.
Definition: HTTPConnection.h:79
HTTPManager * _parentManager
The parent HTTP manager.
Definition: HTTPConnection.h:126
const QHostAddress & peerAddress() const
Returns the IP address on the other side of the connection.
Definition: HTTPConnection.h:82
QHostAddress _address
The stored address.
Definition: HTTPConnection.h:132
Handles HTTP connections.
Definition: HTTPManager.h:32