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