Proxy mit Qt entwickeln



  • Tsunami schrieb:

    Moin,

    ich verstehe nicht, was du mit "viel zu umständlich" meinst. Zu der Frage hin, was ich nicht hinkriege: Das Programm kann keine POST-Requests verarbeiten. Ich habe bereits versucht das einzubauen, komme da aber leider nicht weiter.

    Es ist viel zu umständlich, deinen Code runterzuladen und sich anzuschauen. Warum sollte sich das jemand antun? Und "ich komme nicht weiter" ist keine Frage. Pech für dich. Lern programmieren. Sehe auch keinen Grund, warum jemand was für dich programmieren sollte oder dir alles vorkauen sollte. Wenn du eine konkrete Frage hast wie "hier sind die relevanten 20 Zeilen Code und leider wird nur der halbe Mime Type ausgelesen", dann kannst sie stellen. Sonst vergiss es.



  • Hört sich so an, als ob du den Sinn eines Forums nicht verstanden hättest. Wenn du nicht weißt warum "man sich das antun sollte", dann lass es einfach. Inhaltlose Kommentare bringen keinen weiter.



  • Ach, deswegen hast du schon so viele sinnvolle Antworten bekommen? Na dann, viel Spass 😉



  • @Tsunami:
    Keiner braucht deinen ganzen Code, poste doch hier einfach die wichtigen Teile und wo es Probleme gibt. Das erhöht die Wahrscheinlichkeit, dass dir einer hilft.



  • Ohne Code nix los! Oder was willst Du? Die 100 Zeilen Code die Dir nicht vorliegen?



  • Evtl. entsprechende RFC lesen, um seinen Hintergrundwissen aufzubauen.



  • Gut, da sich die meisten hier einen Teil des Codes wünschen, hier ist über die Hälfte des Teils was relevant ist. Um das Problem noch einmal zu nennen, GET-Requests werden einwandfrei ausgeführt allerdings funktionieren POST-Requests nicht. In diesem Falle ist die URL leer (Zeile 15), wenn man dieses Problem behebt im Source und das Programm versucht POST genauso wie GET abzusetzen, dann erhalte ich von dem Server, der die Daten bekommt, Fehlermeldungen wie "Bad Request". Alles was ich bisher versucht habe, produzierte bei der Gegenstelle einen Fehler.

    Daher die allgemeine Frage, weiß jemand wie man das beheben kann oder muss ich für POST auf QHttpMultiPart zurückgreifen?

    void 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 sendRequest() {
            QTcpSocket *proxySocket = qobject_cast<QTcpSocket*>(sender());
            QByteArray requestData = proxySocket->property("requestData").toByteArray();
            proxySocket->write(requestData);
        }
    
        void transferData() {
            QTcpSocket *proxySocket = qobject_cast<QTcpSocket*>(sender());
            QTcpSocket *socket = qobject_cast<QTcpSocket*>(proxySocket->parent());
            socket->write(proxySocket->readAll());
        }
    

    @-lowbyte- mir zu unterstellen ich würde keinen Source mitliefern, obwohl er oben komplett verlinkt ist, ist wohl irgendwie daneben, oder?requestData



  • Hallo 🙂

    Sowie Du den Fehler beschreibst, liegt es eher daran, was Du versendest ...
    Eben das passende RFC dazu lesen oder andere Beispiele im Netz anschauen wie ein POST-Req auszusehen hat. Dann mal mit dem Debugger/Debug-Logs schauen, was Du tatsächlich versendest und wie es vom POST-Req-Standard abweicht. So solltest evtl. eher an den Fehler kommen.

    ODER wenn Du viel Zeit hast einfach mal Wireshark installieren oder das Firebug Plugin im FireFox und dann mal schauen wie so ein POST Request aufgebaut ist.

    Learning by doing 🙂

    Grüße



  • Moin, moin. Ja, ich werde wohl nicht drumherum kommen und mir die verschickten Pakete genauer anzusehen, sobald ich wieder mehr Zeit habe. Jetzt heißt es aber erst einmal das schöne Wetter genießen. 😉

    Schönes Wochenende noch!



  • Tsunami schrieb:

    Schönes Wochenende noch!

    Was kann bei dem schönen Wetter mehr Spass machen, als in RFCs zu schmökern?


Anmelden zum Antworten