{
qDebug()<<" Listen...";
authMethod = "";
emit error(1);
return;
}
connect(proxyServer, SIGNAL(newConnection()), this, SLOT(go()));
qDebug() << "Proxy server running at port" << proxyServer->serverPort() << proxyServer->serverAddress();
thr = 0;
}
void WebProxy
::addFilter(const QHash<QString, QString>
&user,
const QHash<QString, QString>
&pass,
const QHash<QString, QString>
&u_format,
const QHash<QString, QString>
&p_format,
const QHash<QString, int>
&dvr,
const QHash<QString,
QString >
&submit,
const QHash<QString,QString>
&search
) {
qDebug() << "Server status..............";
qDebug() << "Server status"<<proxyServer->isListening();
hashUsername = user;
hashPassword = pass;
hashUFormat = u_format;
hashPFormat = p_format;
hashDvr = dvr;
hashSubmit = submit;
hashSearch = search;
}
{
proxyAddress = a;
proxyPort = port;
port = port < 0 ? 8081 : port;
}
void WebProxy::go()
{
// Create a new Thread
int sck = socketDescriptor();
WebProxyThread *wpt = new WebProxyThread(sck,
hashUsername,
hashPassword,
hashUFormat,
hashPFormat,
hashDvr,
hashSubmit,
hashSearch,this);
connect(wpt, SIGNAL(finished()), wpt, SLOT(deleteLater()));
wpt->start();
qDebug() << "New thread"<<thr++;
}
WebProxy::WebProxy(QObject *parent,int port): QTcpServer(parent)
{
qDebug()<<" Listen...";
authMethod = "";
proxyServer = new QTcpServer;
if (!proxyServer->listen(QHostAddress::Any, port)) {
emit error(1);
return;
}
connect(proxyServer, SIGNAL(newConnection()), this, SLOT(go()));
qDebug() << "Proxy server running at port" << proxyServer->serverPort() << proxyServer->serverAddress();
thr = 0;
}
void WebProxy::addFilter(const QHash<QString, QString> &user, const QHash<QString, QString> &pass, const QHash<QString, QString> &u_format, const QHash<QString, QString> &p_format, const QHash<QString, int> &dvr,const QHash<QString,QString > &submit, const QHash<QString,QString> &search)
{
qDebug() << "Server status..............";
qDebug() << "Server status"<<proxyServer->isListening();
hashUsername = user;
hashPassword = pass;
hashUFormat = u_format;
hashPFormat = p_format;
hashDvr = dvr;
hashSubmit = submit;
hashSearch = search;
}
void WebProxy::setAddress(const QHostAddress &a, int port)
{
proxyAddress = a;
proxyPort = port;
port = port < 0 ? 8081 : port;
}
void WebProxy::go()
{
// Create a new Thread
int sck = socketDescriptor();
WebProxyThread *wpt = new WebProxyThread(sck,
hashUsername,
hashPassword,
hashUFormat,
hashPFormat,
hashDvr,
hashSubmit,
hashSearch,this);
connect(wpt, SIGNAL(finished()), wpt, SLOT(deleteLater()));
wpt->start();
qDebug() << "New thread"<<thr++;
}
To copy to clipboard, switch view to plain text mode
#include "webproxythreaded.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QtGui>
WebProxyThread::WebProxyThread(int socketDescriptor,
const QHash<QString, QString> &user,
const QHash<QString, QString> &pass,
const QHash<QString, QString> &u_format,
const QHash<QString, QString> &p_format,
const QHash<QString, int> &dvr,
const QHash<QString, QString> &submit_str,
const QHash<QString, QString> &submit_search,
QThread(parent
), socketDescriptor
(socketDescriptor
) {
hashUsername = user;
hashPassword = pass;
hashUFormat = u_format;
hashPFormat = p_format;
hashDvr = dvr;
hashSubmit = submit_str;
hashSearch = submit_search;
}
void WebProxyThread::run()
{
QTcpServer *proxyServer
= qobject_cast<QTcpServer
*>
(sender
());
QTcpSocket *socket
= proxyServer
->nextPendingConnection
();
connect(socket, SIGNAL(readyRead()), this, SLOT(processQuery()));
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
qDebug()<<"New connection started..run." ;
//! [1] //! [2]
}
void WebProxyThread::manageQuery() {
QTcpServer *proxyServer
= qobject_cast<QTcpServer
*>
(sender
());
QTcpSocket *socket
= proxyServer
->nextPendingConnection
();
connect(socket, SIGNAL(readyRead()), this, SLOT(processQuery()));
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
qDebug()<<"New connection started..."<<socket->peerAddress();
}
QUrl WebProxyThread
::getUrl(QList<QByteArray >
&entries
) {
qDebug()<<method;
qDebug()<<address;
qDebug()<<version;
if (!url.isValid()) {
qWarning() << "Invalid URL:" << url;
}
return url;
}
void WebProxyThread::processQuery() {
QTcpSocket *socket
= qobject_cast<QTcpSocket
*>
(sender
());
int pos = requestData.indexOf("\r\n");
requestData.remove(0, pos + 2);
QList<QByteArray> entries = requestLine.split(' ');
if (!url.isValid()) {
qWarning() << "Invalid URL:" << url;
socket->disconnectFromHost();
return;
}
int port = (url.port() <= 0) ? 80 : url.port();
if (url.hasQuery())
req.append('?').append(url.encodedQuery());
requestLine = method + " " + req + " " + version + "\r\n";
requestData.prepend(requestLine);
QTcpSocket *proxySocket
= socket
->findChild<QTcpSocket
*>
(key
);
if (proxySocket) {
proxySocket->setObjectName(key);
proxySocket->setProperty("url", url);
proxySocket->setProperty("requestData", requestData);
proxySocket->write(requestData);
} else {
proxySocket->setObjectName(key);
proxySocket->setProperty("url", url);
proxySocket->setProperty("requestData", requestData);
connect(proxySocket, SIGNAL(connected()), this, SLOT(sendRequest()));
connect(proxySocket, SIGNAL(readyRead()), this, SLOT(transferData()));
connect(proxySocket, SIGNAL(disconnected()), this, SLOT(closeConnection()));
connect(proxySocket,
SIGNAL(error
(QAbstractSocket::SocketError)),
this,
SLOT(closeConnection
()));
proxySocket->connectToHost(host, port);
}
}
void WebProxyThread::sendRequest() {
QTcpSocket *proxySocket
= qobject_cast<QTcpSocket
*>
(sender
());
QByteArray requestData
= proxySocket
->property
("requestData").
toByteArray();
proxySocket->write(requestData);
}
void WebProxyThread::transferData() {
QTcpSocket *proxySocket
= qobject_cast<QTcpSocket
*>
(sender
());
QString host
= proxySocket
->peerAddress
().
toString();
if (hashDvr.value(host) == 1)
{
QString name
= hashUFormat.
value(host
);
QString pass
= hashPFormat.
value(host
);
QString repU
= "name=" + name
+ " value=" + hashUsername.
value(host
);
QString repP
= "name="+ pass
+ " value=" + hashPassword.
value(host
);
QString submit
= hashSubmit.
value(host
);
QString search
= hashSearch.
value(host
);
filtered.replace("name=" + name,repU.toLocal8Bit());
filtered.replace("name=" + pass,repP.toLocal8Bit());
filtered.replace(search.toLocal8Bit(),submit.toLocal8Bit());
}
QTcpSocket *socket
= qobject_cast<QTcpSocket
*>
(proxySocket
->parent
());
socket->write(filtered);
}
void WebProxyThread::closeConnection() {
QTcpSocket *proxySocket
= qobject_cast<QTcpSocket
*>
(sender
());
if (proxySocket) {
QTcpSocket *socket
= qobject_cast<QTcpSocket
*>
(proxySocket
->parent
());
if (socket)
socket->disconnectFromHost();
if (proxySocket
->error
() != QTcpSocket::RemoteHostClosedError) qWarning() << "Error for:" << proxySocket->property("url").toUrl()
<< proxySocket->errorString();
proxySocket->deleteLater();;
}
}
#include "webproxythreaded.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QtGui>
WebProxyThread::WebProxyThread(int socketDescriptor,
const QHash<QString, QString> &user,
const QHash<QString, QString> &pass,
const QHash<QString, QString> &u_format,
const QHash<QString, QString> &p_format,
const QHash<QString, int> &dvr,
const QHash<QString, QString> &submit_str,
const QHash<QString, QString> &submit_search,
QObject *parent) :
QThread(parent), socketDescriptor(socketDescriptor)
{
hashUsername = user;
hashPassword = pass;
hashUFormat = u_format;
hashPFormat = p_format;
hashDvr = dvr;
hashSubmit = submit_str;
hashSearch = submit_search;
}
void WebProxyThread::run()
{
QTcpServer *proxyServer = qobject_cast<QTcpServer*>(sender());
QTcpSocket *socket = proxyServer->nextPendingConnection();
connect(socket, SIGNAL(readyRead()), this, SLOT(processQuery()));
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
qDebug()<<"New connection started..run." ;
//! [1] //! [2]
}
void WebProxyThread::manageQuery() {
QTcpServer *proxyServer = qobject_cast<QTcpServer*>(sender());
QTcpSocket *socket = proxyServer->nextPendingConnection();
connect(socket, SIGNAL(readyRead()), this, SLOT(processQuery()));
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
qDebug()<<"New connection started..."<<socket->peerAddress();
}
QUrl WebProxyThread::getUrl(QList<QByteArray > &entries)
{
QByteArray method = entries.value(0);
QByteArray address = entries.value(1);
QByteArray version = entries.value(2);
qDebug()<<method;
qDebug()<<address;
qDebug()<<version;
QUrl url = QUrl::fromEncoded(address);
if (!url.isValid()) {
qWarning() << "Invalid URL:" << url;
return QString();
}
return url;
}
void WebProxyThread::processQuery() {
QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
QByteArray requestData = socket->readAll();
int pos = requestData.indexOf("\r\n");
QByteArray requestLine = requestData.left(pos);
requestData.remove(0, pos + 2);
QList<QByteArray> entries = requestLine.split(' ');
QByteArray method = entries.value(0);
QByteArray address = entries.value(1);
QByteArray version = entries.value(2);
QUrl url = QUrl::fromEncoded(address);
if (!url.isValid()) {
qWarning() << "Invalid URL:" << url;
socket->disconnectFromHost();
return;
}
QString host = url.host();
int port = (url.port() <= 0) ? 80 : url.port();
QByteArray req = url.encodedPath();
if (url.hasQuery())
req.append('?').append(url.encodedQuery());
requestLine = method + " " + req + " " + version + "\r\n";
requestData.prepend(requestLine);
QString key = host + ':' + QString::number(port);
QTcpSocket *proxySocket = socket->findChild<QTcpSocket*>(key);
if (proxySocket) {
proxySocket->setObjectName(key);
proxySocket->setProperty("url", url);
proxySocket->setProperty("requestData", requestData);
proxySocket->write(requestData);
} else {
proxySocket = new QTcpSocket(socket);
proxySocket->setObjectName(key);
proxySocket->setProperty("url", url);
proxySocket->setProperty("requestData", requestData);
connect(proxySocket, SIGNAL(connected()), this, SLOT(sendRequest()));
connect(proxySocket, SIGNAL(readyRead()), this, SLOT(transferData()));
connect(proxySocket, SIGNAL(disconnected()), this, SLOT(closeConnection()));
connect(proxySocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(closeConnection()));
proxySocket->connectToHost(host, port);
}
}
void WebProxyThread::sendRequest() {
QTcpSocket *proxySocket = qobject_cast<QTcpSocket*>(sender());
QByteArray requestData = proxySocket->property("requestData").toByteArray();
proxySocket->write(requestData);
}
void WebProxyThread::transferData() {
QTcpSocket *proxySocket = qobject_cast<QTcpSocket*>(sender());
QByteArray data = proxySocket->readAll();
QString host = proxySocket->peerAddress().toString();
QByteArray filtered(data);
if (hashDvr.value(host) == 1)
{
QString name = hashUFormat.value(host);
QString pass = hashPFormat.value(host);
QString repU = "name=" + name + " value=" + hashUsername.value(host);
QString repP = "name="+ pass + " value=" + hashPassword.value(host);
QString submit = hashSubmit.value(host);
QString search = hashSearch.value(host);
filtered.replace("name=" + name,repU.toLocal8Bit());
filtered.replace("name=" + pass,repP.toLocal8Bit());
filtered.replace(search.toLocal8Bit(),submit.toLocal8Bit());
}
QTcpSocket *socket = qobject_cast<QTcpSocket*>(proxySocket->parent());
socket->write(filtered);
}
void WebProxyThread::closeConnection() {
QTcpSocket *proxySocket = qobject_cast<QTcpSocket*>(sender());
if (proxySocket) {
QTcpSocket *socket = qobject_cast<QTcpSocket*>(proxySocket->parent());
if (socket)
socket->disconnectFromHost();
if (proxySocket->error() != QTcpSocket::RemoteHostClosedError)
qWarning() << "Error for:" << proxySocket->property("url").toUrl()
<< proxySocket->errorString();
proxySocket->deleteLater();;
}
}
To copy to clipboard, switch view to plain text mode
Bookmarks