1 /*
2  * httppoll.h - HTTP polling proxy
3  * Copyright (C) 2003  Justin Karneges
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * either version 2
9    of the License, or (at your option) any later version.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21 
22 #ifndef CS_HTTPPOLL_H
23 #define CS_HTTPPOLL_H
24 
25 #include "bytestream.h"
26 
27 // CS_NAMESPACE_BEGIN
28 
29 class HttpPoll : public ByteStream
30 {
31 	Q_OBJECT
32 public:
33 	enum Error { ErrConnectionRefused = ErrCustom, ErrHostNotFound, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth };
34 	HttpPoll(QObject *parent=0);
35 	~HttpPoll() override;
36 
37 	void setAuth(const QString &user, const QString &pass="");
38 	void connectToUrl(const QString &url);
39 	void connectToHost(const QString &proxyHost, int proxyPort, const QString &url);
40 
41 	int pollInterval() const;
42 	void setPollInterval(int seconds);
43 
44 	// from ByteStream
45 	bool isOpen() const override;
46 	void close() override;
47 
48 signals:
49 	void connected();
50 	void syncStarted();
51 	void syncFinished();
52 
53 protected:
54 	int tryWrite() override;
55 
56 private slots:
57 	void http_result();
58 	void http_error(int);
59 	void do_sync();
60 
61 private:
62 	class Private;
63 	Private *d;
64 
65 	void reset(bool clear=false);
66 	QByteArray makePacket(const QString &ident, const QString &key, const QString &newkey, const QByteArray &block);
67 	void resetKey();
68 	const QString & getKey(bool *);
69 };
70 
71 class HttpProxyPost : public QObject
72 {
73 	Q_OBJECT
74 public:
75 	enum Error { ErrConnectionRefused, ErrHostNotFound, ErrSocket, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth };
76 	HttpProxyPost(QObject *parent=0);
77 	~HttpProxyPost() override;
78 
79 	void setAuth(const QString &user, const QString &pass="");
80 	bool isActive() const;
81 	void post(const QString &proxyHost, int proxyPort, const QString &url, const QByteArray &data, bool asProxy=true);
82 	void stop();
83 	QByteArray body() const;
84 	QString getHeader(const QString &) const;
85 
86 signals:
87 	void result();
88 	void error(int);
89 
90 private slots:
91 	void sock_connected();
92 	void sock_connectionClosed();
93 	void sock_readyRead();
94 	void sock_error(int);
95 
96 private:
97 	class Private;
98 	Private *d;
99 
100 	void reset(bool clear=false);
101 };
102 
103 class HttpProxyGetStream : public QObject
104 {
105 	Q_OBJECT
106 public:
107 	enum Error { ErrConnectionRefused, ErrHostNotFound, ErrSocket, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth };
108 	HttpProxyGetStream(QObject *parent=0);
109 	~HttpProxyGetStream() override;
110 
111 	void setAuth(const QString &user, const QString &pass="");
112 	bool isActive() const;
113 	void get(const QString &proxyHost, int proxyPort, const QString &url, bool ssl=false, bool asProxy=false);
114 	void stop();
115 	QString getHeader(const QString &) const;
116 	int length() const; // -1 for unknown
117 
118 signals:
119 	void handshaken();
120 	void dataReady(const QByteArray &buf);
121 	void finished();
122 	void error(int);
123 
124 private slots:
125 	void sock_connected();
126 	void sock_connectionClosed();
127 	void sock_readyRead();
128 	void sock_error(int);
129 
130 	void tls_readyRead();
131 	void tls_readyReadOutgoing();
132 	void tls_error();
133 
134 private:
135 	class Private;
136 	Private *d;
137 
138 	void reset(bool clear=false);
139 	void processData(const QByteArray &block);
140 };
141 
142 // CS_NAMESPACE_END
143 
144 #endif
145