Пишу проксю. Если выводить в дебаг, то видно, что данные на inSocket идут, но браузер ничего не отображает, пока не закрыть программу. Для работы указаваю прокси 127.0.0.1:8080
proxy.proQT += core network
QT -= gui
TARGET = proxy
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
proxy.cpp
HEADERS += \
proxy.h
main.cpp#include <QCoreApplication>
#include "proxy.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Proxy proxy;
return a.exec();
}
proxy.h#pragma once
#include <QObject>
class QTcpSocket;
class QTcpServer;
class Proxy : public QObject
{
Q_OBJECT
public:
explicit Proxy(QObject *parent = 0);
private:
QTcpServer *srv;
QTcpSocket *outSocket;
QTcpSocket *inSocket;
QByteArray inData;
QByteArray outData;
QString host;
QString getHost(const QByteArray &data);
private slots:
void slotSrvNewConnection();
void slotInSocketRead();
void slotOutSocketRead();
void slotOutSocketConnected();
};
proxy.cpp#include <QDebug>
#include <QTcpSocket>
#include <QTcpServer>
#include <QRegExp>
#include "proxy.h"
Proxy::Proxy(QObject *parent)
{
srv = new QTcpServer;
outSocket = new QTcpSocket;
connect(srv, SIGNAL(newConnection()), SLOT(slotSrvNewConnection()));
connect(outSocket, SIGNAL(readyRead()), SLOT(slotOutSocketRead()));
connect(outSocket, SIGNAL(connected()), SLOT(slotOutSocketConnected()));
srv->listen(QHostAddress::LocalHost, 8080);
}
QString Proxy::getHost(const QByteArray &data)
{
QString str = data.data();
QRegExp rx("host: ([A-Za-z0-9\\.\\-]+)");
if (rx.indexIn(str.toLower()) != 1)
host = rx.cap(1);
return host;
}
void Proxy::slotSrvNewConnection()
{
qDebug() << "-------------------------------";
qDebug() << Q_FUNC_INFO;
inSocket = srv->nextPendingConnection();
connect(inSocket, SIGNAL(readyRead()), SLOT(slotInSocketRead()));
}
void Proxy::slotOutSocketConnected()
{
qDebug() << "-------------------------------";
qDebug() << host << Q_FUNC_INFO;
outSocket->write(outData);
}
void Proxy::slotOutSocketRead()
{
qDebug() << "-------------------------------";
qDebug() << host << Q_FUNC_INFO;
inData = outSocket->readAll();
inSocket->write(inData);
}
void Proxy::slotInSocketRead()
{
qDebug() << "-------------------------------";
qDebug() << Q_FUNC_INFO;
outData = inSocket->readAll();
if (outSocket->state() != QAbstractSocket::UnconnectedState){
outSocket->disconnectFromHost();
}
outSocket->connectToHost(getHost(outData), 80);
}