13 #ifndef HTTPREQUEST_H_
14 #define HTTPREQUEST_H_
22 #include <QRegularExpression>
24 #include <QTextStream>
34 {
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " \
35 "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" \
115 QRegularExpression m_procReqLineExp {
"\\s+"};
116 QRegularExpression m_parseRangeExp {
"(\\d|\\-)"};
141 bool m_bProtected {
false};
142 bool m_bEncrypted {
false};
144 bool m_bSOAPRequest {
false};
152 long m_nResponseStatus {200};
166 bool m_bKeepAlive {
true};
167 std::chrono::seconds m_nKeepAliveTimeout {0s};
172 void SetRequestProtocol (
const QString &sLine );
175 void ProcessRequestLine (
const QString &sLine );
176 bool ProcessSOAPPayload (
const QString &sSOAPAction );
177 void ExtractMethodFromURL( );
179 QString GetResponseStatus (
void )
const;
180 QString GetResponseType (
void )
const;
181 QString GetResponseHeaders (
void );
183 bool ParseRange ( QString sRange,
188 bool ParseKeepAlive (
void );
190 void ParseCookies (
void );
192 QString BuildResponseHeader (
long long nSize );
194 qint64 SendData ( QIODevice *pDevice, qint64 llStart, qint64 llBytes );
195 qint64 SendFile ( QFile &
file, qint64 llStart, qint64 llBytes );
199 bool Authenticated ();
201 QString GetAuthenticationHeader (
bool isStale =
false);
202 QString CalculateDigestNonce (
const QString &timeStamp)
const;
204 bool BasicAuthentication ();
205 bool DigestAuthentication ();
206 void AddCORSHeaders (
const QString &sOrigin );
213 bool ParseRequest ();
215 void FormatErrorResponse (
bool bServerError,
216 const QString &sFaultString,
217 const QString &sDetails );
220 void FormatActionResponse(
const NameValues &pArgs );
221 void FormatFileResponse (
const QString &sFileName );
222 void FormatRawResponse (
const QString &sXML );
224 qint64 SendResponse (
void );
225 qint64 SendResponseFile(
const QString& sFileName );
227 void SetResponseHeader (
const QString &sKey,
228 const QString &sValue,
229 bool replace =
false );
231 void SetCookie (
const QString &sKey,
const QString &sValue,
232 const QDateTime &expiryDate,
235 QString GetRequestHeader (
const QString &sKey,
const QString &sDefault );
241 QByteArray GetResponsePage (
void );
243 QString GetRequestProtocol ()
const;
244 static QString GetResponseProtocol () ;
246 QString GetRequestType ()
const;
247 QString GetLastHeader(
const QString &sType )
const;
249 static QString GetMimeType (
const QString &sFileExtension );
250 static QStringList GetSupportedMimeTypes ();
251 static QString TestMimeType (
const QString &sFileName );
252 static long GetParameters ( QString sParams,
QStringMap &mapParams );
253 static QString Encode (
const QString &sIn );
254 static QString Decode (
const QString &sIn );
255 static QString GetETagHash (
const QByteArray &data );
259 static bool IsUrlProtected (
const QString &sBaseUrl );
263 virtual QString ReadLine ( std::chrono::milliseconds msecs ) = 0;
264 virtual qint64 ReadBlock (
char *pData, qint64 nMaxLen, std::chrono::milliseconds msecs = 0ms ) = 0;
265 virtual qint64 WriteBlock (
const char *pData,
267 virtual QString GetHostName ();
268 virtual QString GetHostAddress () = 0;
269 virtual quint16 GetHostPort () = 0;
270 virtual QString GetPeerAddress () = 0;
271 virtual int getSocketHandle () = 0;
290 QString
ReadLine ( std::chrono::milliseconds msecs )
override;
291 qint64
ReadBlock (
char *pData, qint64 nMaxLen, std::chrono::milliseconds msecs = 0ms )
override;
292 qint64
WriteBlock (
const char *pData, qint64 nLen )
override;
297 {
return(
m_pSocket->socketDescriptor() ); }
312 : m_code( nCode ), m_msg (std::move( sMsg ))
328 const QString &sMsg =
"" )
329 :
HttpException( nCode, sMsg ), m_hostName(std::move( sHostName ))