1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QHTTPSERVERRESPONDER_H
6#define QHTTPSERVERRESPONDER_H
7
8#include <QtHttpServer/qthttpserverglobal.h>
9#include <QtNetwork/qhttpheaders.h>
10
11#include <QtCore/qstringfwd.h>
12#include <QtCore/qmetatype.h>
13
14#include <memory>
15#include <utility>
16#include <initializer_list>
17
18QT_BEGIN_NAMESPACE
19
20class QHttpServerStream;
21class QHttpServerRequest;
22class QHttpServerResponse;
23
24class QHttpServerResponderPrivate;
25class QHttpServerResponder final
26{
27 Q_GADGET_EXPORT(Q_HTTPSERVER_EXPORT)
28 Q_DECLARE_PRIVATE(QHttpServerResponder)
29
30 friend class QHttpServerHttp1ProtocolHandler;
31 friend class QHttpServerHttp2ProtocolHandler;
32
33public:
34 enum class StatusCode {
35 // 1xx: Informational
36 Continue = 100,
37 SwitchingProtocols,
38 Processing,
39
40 // 2xx: Success
41 Ok = 200,
42 Created,
43 Accepted,
44 NonAuthoritativeInformation,
45 NoContent,
46 ResetContent,
47 PartialContent,
48 MultiStatus,
49 AlreadyReported,
50 IMUsed = 226,
51
52 // 3xx: Redirection
53 MultipleChoices = 300,
54 MovedPermanently,
55 Found,
56 SeeOther,
57 NotModified,
58 UseProxy,
59 // 306: not used, was proposed as "Switch Proxy" but never standardized
60 TemporaryRedirect = 307,
61 PermanentRedirect,
62
63 // 4xx: Client Error
64 BadRequest = 400,
65 Unauthorized,
66 PaymentRequired,
67 Forbidden,
68 NotFound,
69 MethodNotAllowed,
70 NotAcceptable,
71 ProxyAuthenticationRequired,
72 RequestTimeout,
73 Conflict,
74 Gone,
75 LengthRequired,
76 PreconditionFailed,
77 PayloadTooLarge,
78 UriTooLong,
79 UnsupportedMediaType,
80 RequestRangeNotSatisfiable,
81 ExpectationFailed,
82 ImATeapot,
83 MisdirectedRequest = 421,
84 UnprocessableEntity,
85 Locked,
86 FailedDependency,
87 UpgradeRequired = 426,
88 PreconditionRequired = 428,
89 TooManyRequests,
90 RequestHeaderFieldsTooLarge = 431,
91 UnavailableForLegalReasons = 451,
92
93 // 5xx: Server Error
94 InternalServerError = 500,
95 NotImplemented,
96 BadGateway,
97 ServiceUnavailable,
98 GatewayTimeout,
99 HttpVersionNotSupported,
100 VariantAlsoNegotiates,
101 InsufficientStorage,
102 LoopDetected,
103 NotExtended = 510,
104 NetworkAuthenticationRequired,
105 NetworkConnectTimeoutError = 599,
106 };
107 Q_ENUM(StatusCode)
108
109 QHttpServerResponder(QHttpServerResponder &&other) noexcept
110 : d_ptr(std::exchange(obj&: other.d_ptr, new_val: nullptr))
111 {
112 }
113 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QHttpServerResponder)
114
115 Q_HTTPSERVER_EXPORT ~QHttpServerResponder();
116
117 void swap(QHttpServerResponder &other) noexcept { qt_ptr_swap(lhs&: d_ptr, rhs&: other.d_ptr); }
118
119 Q_HTTPSERVER_EXPORT void write(QIODevice *data, const QHttpHeaders &headers,
120 StatusCode status = StatusCode::Ok);
121
122 Q_HTTPSERVER_EXPORT void write(QIODevice *data, const QByteArray &mimeType,
123 StatusCode status = StatusCode::Ok);
124
125 Q_HTTPSERVER_EXPORT void write(const QJsonDocument &document, const QHttpHeaders &headers,
126 StatusCode status = StatusCode::Ok);
127
128 Q_HTTPSERVER_EXPORT void write(const QJsonDocument &document,
129 StatusCode status = StatusCode::Ok);
130
131 Q_HTTPSERVER_EXPORT void write(const QByteArray &data, const QHttpHeaders &headers,
132 StatusCode status = StatusCode::Ok);
133
134 Q_HTTPSERVER_EXPORT void write(const QByteArray &data, const QByteArray &mimeType,
135 StatusCode status = StatusCode::Ok);
136
137 Q_HTTPSERVER_EXPORT void write(const QHttpHeaders &headers, StatusCode status = StatusCode::Ok);
138
139 Q_HTTPSERVER_EXPORT void write(StatusCode status = StatusCode::Ok);
140
141 Q_HTTPSERVER_EXPORT void sendResponse(const QHttpServerResponse &response);
142
143 Q_HTTPSERVER_EXPORT void writeBeginChunked(const QHttpHeaders &headers,
144 StatusCode status = StatusCode::Ok);
145
146 Q_HTTPSERVER_EXPORT void writeBeginChunked(const QByteArray &mimeType,
147 StatusCode status = StatusCode::Ok);
148
149 Q_HTTPSERVER_EXPORT void writeBeginChunked(const QHttpHeaders &headers,
150 QList<QHttpHeaders::WellKnownHeader> trailerNames,
151 StatusCode status = StatusCode::Ok);
152
153 Q_HTTPSERVER_EXPORT void writeChunk(const QByteArray &data);
154
155 Q_HTTPSERVER_EXPORT void writeEndChunked(const QByteArray &data, const QHttpHeaders &trailers);
156
157 Q_HTTPSERVER_EXPORT void writeEndChunked(const QByteArray &data);
158
159private:
160 Q_HTTPSERVER_EXPORT QHttpServerResponder(QHttpServerStream *stream);
161 Q_DISABLE_COPY(QHttpServerResponder)
162
163 QHttpServerResponderPrivate *d_ptr;
164};
165
166QT_END_NAMESPACE
167
168#endif // QHTTPSERVERRESPONDER_H
169

source code of qthttpserver/src/httpserver/qhttpserverresponder.h