I found within the Web a good example to implement an Http Proxy.
It works great, but the problem is that it is single threaded.
I tried to change it to a multithread version, but for some odd reason the code fires a segfault.
The original single thread version follows:
Qt Code:
  1. /*
  2.  
  3. */
  4.  
  5. #include "webproxy.h"
  6. #include <QtNetwork>
  7. #include <QMessageBox>
  8. #include <QtGui>
  9. #include <QHash>
  10.  
  11.  
  12. WebProxy::WebProxy(QObject *parent,int port): QObject(parent)
  13.  
  14. {
  15.  
  16. QTcpServer *proxyServer = new QTcpServer(this);
  17. if (!proxyServer->listen(QHostAddress::Any, port)) {
  18. emit error(1);
  19.  
  20. return;
  21. }
  22.  
  23. connect(proxyServer, SIGNAL(newConnection()), this, SLOT(manageQuery()));
  24. qDebug() << "Proxy server running at port" << proxyServer->serverPort();
  25.  
  26.  
  27. }
  28.  
  29. void WebProxy::setAddress(const QHostAddress &a, int port)
  30. {
  31. proxyAddress = a;
  32. proxyPort = port;
  33. port = port < 0 ? 8081 : port;
  34.  
  35.  
  36. }
  37.  
  38. void WebProxy::manageQuery() {
  39. QTcpServer *proxyServer = qobject_cast<QTcpServer*>(sender());
  40. QTcpSocket *socket = proxyServer->nextPendingConnection();
  41. connect(socket, SIGNAL(readyRead()), this, SLOT(processQuery()));
  42. connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
  43. qDebug()<<"New connection started..."<<socket->peerAddress();
  44. }
  45. QUrl WebProxy::getUrl(QList<QByteArray > &entries)
  46. {
  47.  
  48. QByteArray method = entries.value(0);
  49. QByteArray address = entries.value(1);
  50. QByteArray version = entries.value(2);
  51.  
  52.  
  53. QUrl url = QUrl::fromEncoded(address);
  54. if (!url.isValid()) {
  55.  
  56. qWarning() << "Invalid URL:" << url;
  57. return QString();
  58. }
  59. return url;
  60. }
  61.  
  62. void WebProxy::processQuery() {
  63.  
  64. QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
  65. QByteArray requestData = socket->readAll();
  66.  
  67. int pos = requestData.indexOf("\r\n");
  68.  
  69. QByteArray requestLine = requestData.left(pos);
  70. requestData.remove(0, pos + 2);
  71.  
  72. QList<QByteArray> entries = requestLine.split(' ');
  73. QByteArray method = entries.value(0);
  74. QByteArray address = entries.value(1);
  75. QByteArray version = entries.value(2);
  76.  
  77. QByteArray auth;
  78. QByteArray authMethod;
  79.  
  80. QUrl url = QUrl::fromEncoded(address);
  81. if (!url.isValid()) {
  82. qWarning() << "Invalid URL:" << url;
  83. socket->disconnectFromHost();
  84. return;
  85. }
  86.  
  87. QString host = url.host();
  88.  
  89. int port = (url.port() <= 0) ? 80 : url.port();
  90. QByteArray req = url.encodedPath();
  91. if (url.hasQuery())
  92. req.append('?').append(url.encodedQuery());
  93.  
  94. requestLine = method + " " + req + " " + version + "\r\n";
  95.  
  96.  
  97. QString key = host + ':' + QString::number(port);
  98. QTcpSocket *proxySocket = socket->findChild<QTcpSocket*>(key);
  99. if (proxySocket) {
  100. proxySocket->setObjectName(key);
  101. proxySocket->setProperty("url", url);
  102. proxySocket->setProperty("requestData", requestData);
  103. proxySocket->write(requestData);
  104. } else {
  105. proxySocket = new QTcpSocket(socket);
  106. proxySocket->setObjectName(key);
  107. proxySocket->setProperty("url", url);
  108. proxySocket->setProperty("requestData", requestData);
  109. connect(proxySocket, SIGNAL(connected()), this, SLOT(sendRequest()));
  110. connect(proxySocket, SIGNAL(readyRead()), this, SLOT(transferData()));
  111. connect(proxySocket, SIGNAL(disconnected()), this, SLOT(closeConnection()));
  112. connect(proxySocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(closeConnection()));
  113. proxySocket->connectToHost(host, port);
  114. }
  115. }
  116.  
  117. void WebProxy::sendRequest() {
  118. QTcpSocket *proxySocket = qobject_cast<QTcpSocket*>(sender());
  119. QByteArray requestData = proxySocket->property("requestData").toByteArray();
  120. proxySocket->write(requestData);
  121. }
  122.  
  123. void WebProxy::transferData() {
  124.  
  125.  
  126. QTcpSocket *proxySocket = qobject_cast<QTcpSocket*>(sender());
  127. QByteArray data = proxySocket->readAll();
  128. QString host = proxySocket->peerAddress().toString();
  129.  
  130. QTcpSocket *socket = qobject_cast<QTcpSocket*>(proxySocket->parent());
  131. socket->write(data);
  132.  
  133. }
  134.  
  135. void WebProxy::closeConnection() {
  136. QTcpSocket *proxySocket = qobject_cast<QTcpSocket*>(sender());
  137. if (proxySocket) {
  138. QTcpSocket *socket = qobject_cast<QTcpSocket*>(proxySocket->parent());
  139. if (socket)
  140. socket->disconnectFromHost();
  141. if (proxySocket->error() != QTcpSocket::RemoteHostClosedError)
  142. qWarning() << "Error for:" << proxySocket->property("url").toUrl()
  143. << proxySocket->errorString();
  144. proxySocket->deleteLater();;
  145. }
  146. }
To copy to clipboard, switch view to plain text mode 

I call "new WebProxy " in the main.
In the multithreaded version, I put all functions from manageQuery() inside a new threaded Class. But when a connection start, I got a segfault.
Any help appreciated.
Does anybody know