1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtNetwork module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QNETWORKREQUEST_H
41 #define QNETWORKREQUEST_H
42 
43 #include <QtNetwork/qtnetworkglobal.h>
44 #include <QtCore/QSharedDataPointer>
45 #include <QtCore/QString>
46 #include <QtCore/QUrl>
47 #include <QtCore/QVariant>
48 
49 QT_BEGIN_NAMESPACE
50 
51 class QSslConfiguration;
52 class QHttp2Configuration;
53 
54 class QNetworkRequestPrivate;
55 class Q_NETWORK_EXPORT QNetworkRequest
56 {
57 public:
58     enum KnownHeaders {
59         ContentTypeHeader,
60         ContentLengthHeader,
61         LocationHeader,
62         LastModifiedHeader,
63         CookieHeader,
64         SetCookieHeader,
65         ContentDispositionHeader,  // added for QMultipartMessage
66         UserAgentHeader,
67         ServerHeader,
68         IfModifiedSinceHeader,
69         ETagHeader,
70         IfMatchHeader,
71         IfNoneMatchHeader
72     };
73     enum Attribute {
74         HttpStatusCodeAttribute,
75         HttpReasonPhraseAttribute,
76         RedirectionTargetAttribute,
77         ConnectionEncryptedAttribute,
78         CacheLoadControlAttribute,
79         CacheSaveControlAttribute,
80         SourceIsFromCacheAttribute,
81         DoNotBufferUploadDataAttribute,
82         HttpPipeliningAllowedAttribute,
83         HttpPipeliningWasUsedAttribute,
84         CustomVerbAttribute,
85         CookieLoadControlAttribute,
86         AuthenticationReuseAttribute,
87         CookieSaveControlAttribute,
88         MaximumDownloadBufferSizeAttribute, // internal
89         DownloadBufferAttribute, // internal
90         SynchronousRequestAttribute, // internal
91         BackgroundRequestAttribute,
92 #if QT_DEPRECATED_SINCE(5, 15)
93         SpdyAllowedAttribute,
94         SpdyWasUsedAttribute,
95 #endif // QT_DEPRECATED_SINCE(5, 15)
96         EmitAllUploadProgressSignalsAttribute = BackgroundRequestAttribute + 3,
97         FollowRedirectsAttribute Q_DECL_ENUMERATOR_DEPRECATED_X("Use RedirectPolicyAttribute"),
98         Http2AllowedAttribute,
99         Http2WasUsedAttribute,
100 #if QT_DEPRECATED_SINCE(5, 15)
101         HTTP2AllowedAttribute Q_DECL_ENUMERATOR_DEPRECATED_X("Use Http2AllowedAttribute") = Http2AllowedAttribute,
102         HTTP2WasUsedAttribute Q_DECL_ENUMERATOR_DEPRECATED_X("Use Http2WasUsedAttribute"),
103 #endif // QT_DEPRECATED_SINCE(5, 15)
104         OriginalContentLengthAttribute,
105         RedirectPolicyAttribute,
106         Http2DirectAttribute,
107         ResourceTypeAttribute, // internal
108         AutoDeleteReplyOnFinishAttribute,
109 
110         User = 1000,
111         UserMax = 32767
112     };
113     enum CacheLoadControl {
114         AlwaysNetwork,
115         PreferNetwork,
116         PreferCache,
117         AlwaysCache
118     };
119     enum LoadControl {
120         Automatic = 0,
121         Manual
122     };
123 
124     enum Priority {
125         HighPriority = 1,
126         NormalPriority = 3,
127         LowPriority = 5
128     };
129 
130     enum RedirectPolicy {
131         ManualRedirectPolicy,
132         NoLessSafeRedirectPolicy,
133         SameOriginRedirectPolicy,
134         UserVerifiedRedirectPolicy
135     };
136 
137     enum TransferTimeoutConstant {
138         DefaultTransferTimeoutConstant = 30000
139     };
140 
141     QNetworkRequest();
142     explicit QNetworkRequest(const QUrl &url);
143     QNetworkRequest(const QNetworkRequest &other);
144     ~QNetworkRequest();
145     QNetworkRequest &operator=(QNetworkRequest &&other) noexcept { swap(other); return *this; }
146     QNetworkRequest &operator=(const QNetworkRequest &other);
147 
swap(QNetworkRequest & other)148     void swap(QNetworkRequest &other) noexcept { qSwap(d, other.d); }
149 
150     bool operator==(const QNetworkRequest &other) const;
151     inline bool operator!=(const QNetworkRequest &other) const
152     { return !operator==(other); }
153 
154     QUrl url() const;
155     void setUrl(const QUrl &url);
156 
157     // "cooked" headers
158     QVariant header(KnownHeaders header) const;
159     void setHeader(KnownHeaders header, const QVariant &value);
160 
161     // raw headers:
162     bool hasRawHeader(const QByteArray &headerName) const;
163     QList<QByteArray> rawHeaderList() const;
164     QByteArray rawHeader(const QByteArray &headerName) const;
165     void setRawHeader(const QByteArray &headerName, const QByteArray &value);
166 
167     // attributes
168     QVariant attribute(Attribute code, const QVariant &defaultValue = QVariant()) const;
169     void setAttribute(Attribute code, const QVariant &value);
170 
171 #ifndef QT_NO_SSL
172     QSslConfiguration sslConfiguration() const;
173     void setSslConfiguration(const QSslConfiguration &configuration);
174 #endif
175 
176     void setOriginatingObject(QObject *object);
177     QObject *originatingObject() const;
178 
179     Priority priority() const;
180     void setPriority(Priority priority);
181 
182     // HTTP redirect related
183     int maximumRedirectsAllowed() const;
184     void setMaximumRedirectsAllowed(int maximumRedirectsAllowed);
185 
186     QString peerVerifyName() const;
187     void setPeerVerifyName(const QString &peerName);
188 #if QT_CONFIG(http) || defined(Q_CLANG_QDOC)
189     QHttp2Configuration http2Configuration() const;
190     void setHttp2Configuration(const QHttp2Configuration &configuration);
191 #endif // QT_CONFIG(http) || defined(Q_CLANG_QDOC)
192 #if QT_CONFIG(http) || defined(Q_CLANG_QDOC) || defined (Q_OS_WASM)
193     int transferTimeout() const;
194     void setTransferTimeout(int timeout = DefaultTransferTimeoutConstant);
195 #endif // QT_CONFIG(http) || defined(Q_CLANG_QDOC) || defined (Q_OS_WASM)
196 private:
197     QSharedDataPointer<QNetworkRequestPrivate> d;
198     friend class QNetworkRequestPrivate;
199 };
200 
201 Q_DECLARE_SHARED(QNetworkRequest)
202 
203 QT_END_NAMESPACE
204 
205 Q_DECLARE_METATYPE(QNetworkRequest)
206 Q_DECLARE_METATYPE(QNetworkRequest::RedirectPolicy)
207 
208 #endif
209