1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QNETWORKREPLY_H
5#define QNETWORKREPLY_H
6
7#include <QtNetwork/qtnetworkglobal.h>
8#include <QtCore/QIODevice>
9#include <QtCore/QString>
10#include <QtCore/QVariant>
11
12#include <QtNetwork/QNetworkRequest>
13#include <QtNetwork/QNetworkAccessManager>
14
15QT_BEGIN_NAMESPACE
16
17
18class QUrl;
19class QVariant;
20class QAuthenticator;
21class QSslConfiguration;
22class QSslError;
23class QSslPreSharedKeyAuthenticator;
24
25class QNetworkReplyPrivate;
26class Q_NETWORK_EXPORT QNetworkReply: public QIODevice
27{
28 Q_OBJECT
29public:
30 enum NetworkError {
31 NoError = 0,
32
33 // network layer errors [relating to the destination server] (1-99):
34 ConnectionRefusedError = 1,
35 RemoteHostClosedError,
36 HostNotFoundError,
37 TimeoutError,
38 OperationCanceledError,
39 SslHandshakeFailedError,
40 TemporaryNetworkFailureError,
41 NetworkSessionFailedError,
42 BackgroundRequestNotAllowedError,
43 TooManyRedirectsError,
44 InsecureRedirectError,
45 UnknownNetworkError = 99,
46
47 // proxy errors (101-199):
48 ProxyConnectionRefusedError = 101,
49 ProxyConnectionClosedError,
50 ProxyNotFoundError,
51 ProxyTimeoutError,
52 ProxyAuthenticationRequiredError,
53 UnknownProxyError = 199,
54
55 // content errors (201-299):
56 ContentAccessDenied = 201,
57 ContentOperationNotPermittedError,
58 ContentNotFoundError,
59 AuthenticationRequiredError,
60 ContentReSendError,
61 ContentConflictError,
62 ContentGoneError,
63 UnknownContentError = 299,
64
65 // protocol errors
66 ProtocolUnknownError = 301,
67 ProtocolInvalidOperationError,
68 ProtocolFailure = 399,
69
70 // Server side errors (401-499)
71 InternalServerError = 401,
72 OperationNotImplementedError,
73 ServiceUnavailableError,
74 UnknownServerError = 499
75 };
76 Q_ENUM(NetworkError)
77
78 ~QNetworkReply();
79
80 // reimplemented from QIODevice
81 virtual void close() override;
82 virtual bool isSequential() const override;
83
84 // like QAbstractSocket:
85 qint64 readBufferSize() const;
86 virtual void setReadBufferSize(qint64 size);
87
88 QNetworkAccessManager *manager() const;
89 QNetworkAccessManager::Operation operation() const;
90 QNetworkRequest request() const;
91 NetworkError error() const;
92 bool isFinished() const;
93 bool isRunning() const;
94 QUrl url() const;
95
96 // "cooked" headers
97 QVariant header(QNetworkRequest::KnownHeaders header) const;
98
99 // raw headers:
100#if QT_NETWORK_REMOVED_SINCE(6, 7)
101 bool hasRawHeader(const QByteArray &headerName) const;
102#endif
103 bool hasRawHeader(QAnyStringView headerName) const;
104 QList<QByteArray> rawHeaderList() const;
105#if QT_NETWORK_REMOVED_SINCE(6, 7)
106 QByteArray rawHeader(const QByteArray &headerName) const;
107#endif
108 QByteArray rawHeader(QAnyStringView headerName) const;
109
110 typedef QPair<QByteArray, QByteArray> RawHeaderPair;
111 const QList<RawHeaderPair>& rawHeaderPairs() const;
112
113 // attributes
114 QVariant attribute(QNetworkRequest::Attribute code) const;
115
116#if QT_CONFIG(ssl)
117 QSslConfiguration sslConfiguration() const;
118 void setSslConfiguration(const QSslConfiguration &configuration);
119 void ignoreSslErrors(const QList<QSslError> &errors);
120#endif
121
122public Q_SLOTS:
123 virtual void abort() = 0;
124 virtual void ignoreSslErrors();
125
126Q_SIGNALS:
127 void socketStartedConnecting();
128 void requestSent();
129 void metaDataChanged();
130 void finished();
131 void errorOccurred(QNetworkReply::NetworkError);
132#if QT_CONFIG(ssl)
133 void encrypted();
134 void sslErrors(const QList<QSslError> &errors);
135 void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator);
136#endif
137 void redirected(const QUrl &url);
138 void redirectAllowed();
139
140 void uploadProgress(qint64 bytesSent, qint64 bytesTotal);
141 void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
142
143protected:
144 explicit QNetworkReply(QObject *parent = nullptr);
145 QNetworkReply(QNetworkReplyPrivate &dd, QObject *parent);
146 virtual qint64 writeData(const char *data, qint64 len) override;
147
148 void setOperation(QNetworkAccessManager::Operation operation);
149 void setRequest(const QNetworkRequest &request);
150 void setError(NetworkError errorCode, const QString &errorString);
151 void setFinished(bool);
152 void setUrl(const QUrl &url);
153 void setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value);
154 void setRawHeader(const QByteArray &headerName, const QByteArray &value);
155 void setAttribute(QNetworkRequest::Attribute code, const QVariant &value);
156
157#if QT_CONFIG(ssl)
158 virtual void sslConfigurationImplementation(QSslConfiguration &) const;
159 virtual void setSslConfigurationImplementation(const QSslConfiguration &);
160 virtual void ignoreSslErrorsImplementation(const QList<QSslError> &);
161#endif
162
163private:
164 Q_DECLARE_PRIVATE(QNetworkReply)
165};
166
167QT_END_NAMESPACE
168
169QT_DECL_METATYPE_EXTERN_TAGGED(QNetworkReply::NetworkError,
170 QNetworkReply__NetworkError, Q_NETWORK_EXPORT)
171
172#endif
173