13 #ifndef HTTPREQUEST_H_
14 #define HTTPREQUEST_H_
22 #include <QRegularExpression>
24 #include <QTextStream>
33 #define SOAP_ENVELOPE_BEGIN "<s:Envelope xmlns:s=\"htstp://schemas.xmlsoap.org/soap/envelope/\" " \
34 "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" \
36 #define SOAP_ENVELOPE_END "</s:Body>\r\n</s:Envelope>";
114 QRegularExpression m_procReqLineExp {
"\\s+"};
115 QRegularExpression m_parseRangeExp {
"(\\d|\\-)"};
140 bool m_bProtected {
false};
141 bool m_bEncrypted {
false};
143 bool m_bSOAPRequest {
false};
151 long m_nResponseStatus {200};
165 bool m_bKeepAlive {
true};
166 std::chrono::seconds m_nKeepAliveTimeout {0s};
171 void SetRequestProtocol (
const QString &sLine );
174 void ProcessRequestLine (
const QString &sLine );
175 bool ProcessSOAPPayload (
const QString &sSOAPAction );
176 void ExtractMethodFromURL( );
178 QString GetResponseStatus (
void )
const;
179 QString GetResponseType (
void )
const;
180 QString GetResponseHeaders (
void );
182 bool ParseRange ( QString sRange,
187 bool ParseKeepAlive (
void );
189 void ParseCookies (
void );
191 QString BuildResponseHeader (
long long nSize );
193 qint64 SendData ( QIODevice *pDevice, qint64 llStart, qint64 llBytes );
194 qint64 SendFile ( QFile &
file, qint64 llStart, qint64 llBytes );
198 bool Authenticated ();
200 QString GetAuthenticationHeader (
bool isStale =
false);
201 QString CalculateDigestNonce (
const QString &timeStamp)
const;
203 bool BasicAuthentication ();
204 bool DigestAuthentication ();
205 void AddCORSHeaders (
const QString &sOrigin );
212 bool ParseRequest ();
214 void FormatErrorResponse (
bool bServerError,
215 const QString &sFaultString,
216 const QString &sDetails );
219 void FormatActionResponse(
const NameValues &pArgs );
220 void FormatFileResponse (
const QString &sFileName );
221 void FormatRawResponse (
const QString &sXML );
223 qint64 SendResponse (
void );
224 qint64 SendResponseFile(
const QString& sFileName );
226 void SetResponseHeader (
const QString &sKey,
227 const QString &sValue,
228 bool replace =
false );
230 void SetCookie (
const QString &sKey,
const QString &sValue,
231 const QDateTime &expiryDate,
234 QString GetRequestHeader (
const QString &sKey,
const QString &sDefault );
240 QByteArray GetResponsePage (
void );
242 QString GetRequestProtocol ()
const;
243 static QString GetResponseProtocol () ;
245 QString GetRequestType ()
const;
246 QString GetLastHeader(
const QString &sType )
const;
248 static QString GetMimeType (
const QString &sFileExtension );
249 static QStringList GetSupportedMimeTypes ();
250 static QString TestMimeType (
const QString &sFileName );
251 static long GetParameters ( QString sParams,
QStringMap &mapParams );
252 static QString Encode (
const QString &sIn );
253 static QString Decode (
const QString &sIn );
254 static QString GetETagHash (
const QByteArray &data );
258 static bool IsUrlProtected (
const QString &sBaseUrl );
262 virtual QString ReadLine ( std::chrono::milliseconds msecs ) = 0;
263 virtual qint64 ReadBlock (
char *pData, qint64 nMaxLen, std::chrono::milliseconds msecs = 0ms ) = 0;
264 virtual qint64 WriteBlock (
const char *pData,
266 virtual QString GetHostName ();
267 virtual QString GetHostAddress () = 0;
268 virtual quint16 GetHostPort () = 0;
269 virtual QString GetPeerAddress () = 0;
270 virtual int getSocketHandle () = 0;
289 QString
ReadLine ( std::chrono::milliseconds msecs )
override;
290 qint64
ReadBlock (
char *pData, qint64 nMaxLen, std::chrono::milliseconds msecs = 0ms )
override;
291 qint64
WriteBlock (
const char *pData, qint64 nLen )
override;
296 {
return(
m_pSocket->socketDescriptor() ); }
311 : m_code( nCode ), m_msg (
std::move( sMsg ))
327 const QString &sMsg =
"" )