File indexing completed on 2024-06-23 04:03:32

0001 /*
0002  * httppoll.h - HTTP polling proxy
0003  * Copyright (C) 2003  Justin Karneges
0004  *
0005  * This library is free software; you can redistribute it and/or
0006  * modify it under the terms of the GNU Lesser General Public
0007  * License as published by the Free Software Foundation; either
0008  * either version 2
0009    of the License, or (at your option) any later version.1 of the License, or (at your option) any later version.
0010  *
0011  * This library is distributed in the hope that it will be useful,
0012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0014  * Lesser General Public License for more details.
0015  *
0016  * You should have received a copy of the GNU Lesser General Public
0017  * License along with this library; if not, write to the Free Software
0018  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
0019  *
0020  */
0021 
0022 #ifndef CS_HTTPPOLL_H
0023 #define CS_HTTPPOLL_H
0024 
0025 #include "bytestream.h"
0026 
0027 // CS_NAMESPACE_BEGIN
0028 
0029 class HttpPoll : public ByteStream
0030 {
0031     Q_OBJECT
0032 public:
0033     enum Error { ErrConnectionRefused = ErrCustom, ErrHostNotFound, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth };
0034     HttpPoll(QObject *parent=0);
0035     ~HttpPoll() override;
0036 
0037     void setAuth(const QString &user, const QString &pass="");
0038     void connectToUrl(const QString &url);
0039     void connectToHost(const QString &proxyHost, int proxyPort, const QString &url);
0040 
0041     int pollInterval() const;
0042     void setPollInterval(int seconds);
0043 
0044     // from ByteStream
0045     bool isOpen() const override;
0046     void close() override;
0047 
0048 signals:
0049     void connected();
0050     void syncStarted();
0051     void syncFinished();
0052 
0053 protected:
0054     int tryWrite() override;
0055 
0056 private slots:
0057     void http_result();
0058     void http_error(int);
0059     void do_sync();
0060 
0061 private:
0062     class Private;
0063     Private *d;
0064 
0065     void reset(bool clear=false);
0066     QByteArray makePacket(const QString &ident, const QString &key, const QString &newkey, const QByteArray &block);
0067     void resetKey();
0068     const QString & getKey(bool *);
0069 };
0070 
0071 class HttpProxyPost : public QObject
0072 {
0073     Q_OBJECT
0074 public:
0075     enum Error { ErrConnectionRefused, ErrHostNotFound, ErrSocket, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth };
0076     HttpProxyPost(QObject *parent=0);
0077     ~HttpProxyPost() override;
0078 
0079     void setAuth(const QString &user, const QString &pass="");
0080     bool isActive() const;
0081     void post(const QString &proxyHost, int proxyPort, const QString &url, const QByteArray &data, bool asProxy=true);
0082     void stop();
0083     QByteArray body() const;
0084     QString getHeader(const QString &) const;
0085 
0086 signals:
0087     void result();
0088     void error(int);
0089 
0090 private slots:
0091     void sock_connected();
0092     void sock_connectionClosed();
0093     void sock_readyRead();
0094     void sock_error(int);
0095 
0096 private:
0097     class Private;
0098     Private *d;
0099 
0100     void reset(bool clear=false);
0101 };
0102 
0103 class HttpProxyGetStream : public QObject
0104 {
0105     Q_OBJECT
0106 public:
0107     enum Error { ErrConnectionRefused, ErrHostNotFound, ErrSocket, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth };
0108     HttpProxyGetStream(QObject *parent=0);
0109     ~HttpProxyGetStream() override;
0110 
0111     void setAuth(const QString &user, const QString &pass="");
0112     bool isActive() const;
0113     void get(const QString &proxyHost, int proxyPort, const QString &url, bool ssl=false, bool asProxy=false);
0114     void stop();
0115     QString getHeader(const QString &) const;
0116     int length() const; // -1 for unknown
0117 
0118 signals:
0119     void handshaken();
0120     void dataReady(const QByteArray &buf);
0121     void finished();
0122     void error(int);
0123 
0124 private slots:
0125     void sock_connected();
0126     void sock_connectionClosed();
0127     void sock_readyRead();
0128     void sock_error(int);
0129 
0130     void tls_readyRead();
0131     void tls_readyReadOutgoing();
0132     void tls_error();
0133 
0134 private:
0135     class Private;
0136     Private *d;
0137 
0138     void reset(bool clear=false);
0139     void processData(const QByteArray &block);
0140 };
0141 
0142 // CS_NAMESPACE_END
0143 
0144 #endif