00001 #ifndef HTTPCOMMS_H_
00002 #define HTTPCOMMS_H_
00003
00004 #include <QByteArray>
00005 #include <QString>
00006 #include <QObject>
00007 #include <QHttp>
00008 #include <QUrl>
00009
00010 #include "mythbaseexp.h"
00011
00012 class QTimer;
00013 class MBASE_PUBLIC HttpComms : public QObject
00014 {
00015 Q_OBJECT
00016 public:
00017 HttpComms();
00018 HttpComms(QUrl &url, int timeoutms = -1);
00019 HttpComms(QUrl &url, QHttpRequestHeader &header, int timeoutms = -1);
00020 virtual ~HttpComms();
00021
00022 bool isDone(void) const { return m_done; }
00023 int getProgress(void) const { return m_progress; }
00024 int getTotal(void) const { return m_total; }
00025
00026 int getStatusCode(void) const { return m_statusCode; }
00027 QString getResponseReason(void) const { return m_responseReason; }
00028
00029 QString getData(void) const { return QString(m_data); }
00030 QByteArray getRawData(void) const { return m_data; }
00031
00032 QString getRedirectedURL(void) const { return m_redirectedURL; }
00033
00034 void stop();
00035
00036 bool isTimedout(void) const { return m_timeout; }
00037
00038 class Credentials
00039 {
00040 public:
00041 explicit Credentials(const QString &_user = "",
00042 const QString &_pass = "")
00043 : user(_user), pass(_pass) { }
00044
00045 QString user;
00046 QString pass;
00047 };
00048
00049 enum CredentialTypes { CRED_WEB, CRED_PROXY };
00050
00051 void setCredentials(const Credentials& cred, int credType)
00052 {
00053 if (credType == CRED_PROXY)
00054 m_proxyCredentials = cred;
00055 else
00056 m_webCredentials = cred;
00057 }
00058
00059
00060 static QString getHttp(QString& url, int timeoutMS = 10000,
00061 int maxRetries = 3, int maxRedirects = 3,
00062 bool allowGzip = false,
00063 Credentials* webCred = NULL,
00064 bool isInQtEventThread = true);
00065
00066 static bool getHttpFile(const QString& file, QString& url, int timeoutMS = 10000,
00067 int maxRetries = 3, int maxRedirects = 3,
00068 bool allowGzip = false, Credentials* webCred = NULL);
00069
00070 static QString postHttp(
00071 QUrl &url,
00072 QHttpRequestHeader *pAddlHdr = NULL,
00073 QIODevice *pData = NULL,
00074 int timeoutMS = 10000,
00075 int maxRetries = 3,
00076 int maxRedirects = 3,
00077 bool allowGzip = false,
00078 Credentials *webCred = NULL,
00079 bool isInQtEventThread = true,
00080 QString userAgent = "<default>");
00081
00082 void request(QUrl &url, int timeoutms = -1, bool allowGzip = false);
00083 void request(QUrl &url, QHttpRequestHeader &header, int timeoutms = -1, QIODevice *pData = NULL );
00084
00085 void setCookie( const QString& cookie ) { m_cookie = cookie; }
00086 const QString& getCookie() const { return m_cookie; }
00087
00088 protected:
00089 struct DigestAuthInfo
00090 {
00091 QByteArray nc;
00092 QByteArray qop;
00093 QByteArray realm;
00094 QByteArray nonce;
00095 QByteArray method;
00096 QByteArray cnonce;
00097 QByteArray username;
00098 QByteArray password;
00099 QStringList digestURI;
00100 QByteArray algorithm;
00101 QByteArray entityBody;
00102 };
00103
00104 void init();
00105
00106 void calculateDigestResponse( DigestAuthInfo& info, QByteArray& Response );
00107 bool createDigestAuth( bool isForProxy, const QString& authStr, QHttpRequestHeader* request );
00108
00109 private slots:
00110 void timeout();
00111 void done(bool error);
00112 void stateChanged(int state);
00113 void dataReadProgress(int done, int total);
00114 void headerReceived(const QHttpResponseHeader &resp);
00115
00116 private:
00117 int m_statusCode;
00118 QString m_redirectedURL;
00119 QString m_responseReason;
00120 Credentials m_webCredentials;
00121 Credentials m_proxyCredentials;
00122 QHttp *http;
00123 bool m_done;
00124 QByteArray m_data;
00125 QUrl m_url;
00126 QTimer* m_timer;
00127 bool m_timeout;
00128 bool m_authNeeded;
00129 int m_timeoutInterval;
00130 QString m_cookie;
00131 int m_progress;
00132 int m_total;
00133
00134 QHttpRequestHeader m_curRequest;
00135 };
00136
00137 #endif
00138