summaryrefslogtreecommitdiff
path: root/agents/webproxytrans.cc
diff options
context:
space:
mode:
Diffstat (limited to 'agents/webproxytrans.cc')
-rw-r--r--agents/webproxytrans.cc74
1 files changed, 74 insertions, 0 deletions
diff --git a/agents/webproxytrans.cc b/agents/webproxytrans.cc
new file mode 100644
index 0000000..23b41b7
--- /dev/null
+++ b/agents/webproxytrans.cc
@@ -0,0 +1,74 @@
+#include <QtCore/QDebug>
+#include <QtCore/QUrl>
+
+#include "webproxyconn.h"
+#include "webproxytrans.h"
+
+static const QByteArray connectResponse("HTTP/1.1 200 Connection established\r\n\r\n");
+
+WebProxyTrans::WebProxyTrans(int transactionId, bool tunnel, const QString &host, int port, WebProxyConn *conn)
+ : QObject(conn), _transactionId(transactionId), _tunnel(tunnel), _socket(new QTcpSocket(this))
+{
+ connect(_socket, SIGNAL(connected()), this, SLOT(handleSocketConnected()));
+ connect(_socket, SIGNAL(bytesWritten(qint64)), this, SLOT(handleSocketDataWritten(qint64)));
+ connect(_socket, SIGNAL(readyRead()), this, SLOT(handleSocketDataReady()));
+ connect(_socket, SIGNAL(disconnected()), this, SLOT(handleSocketDisconnected()));
+
+ _socket->connectToHost(host, port);
+}
+
+int WebProxyTrans::transactionId() const
+{
+ return _transactionId;
+}
+
+void WebProxyTrans::write(const QByteArray &data)
+{
+ if (!_outBuf.isEmpty() || !_socket->isValid()) {
+ _outBuf.append(data);
+ } else if (_socket->isValid()) {
+ // Write directly to socket
+ _socket->write(data);
+ }
+}
+
+void WebProxyTrans::handleSocketConnected()
+{
+ qDebug() << "Transaction" << _transactionId << "Connected";
+ if (_tunnel) {
+ emit dataReceived(connectResponse);
+ }
+ writeFromBuffer();
+}
+
+void WebProxyTrans::handleSocketDataWritten(qint64 written)
+{
+ Q_UNUSED(written);
+ writeFromBuffer();
+}
+
+void WebProxyTrans::handleSocketDataReady()
+{
+ emit dataReceived(_socket->readAll());
+}
+
+void WebProxyTrans::handleSocketDisconnected()
+{
+ qDebug() << "Transaction" << _transactionId << "Disconnected";
+ emit disconnected();
+}
+
+WebProxyConn* WebProxyTrans::conn()
+{
+ return static_cast<WebProxyConn*>(parent());
+}
+
+void WebProxyTrans::writeFromBuffer()
+{
+ if (!_outBuf.isEmpty()) {
+ qint64 written = _socket->write(_outBuf);
+ if (written > 0) {
+ _outBuf.remove(0, written);
+ }
+ }
+}