Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

[Solved] QHttpMultiPart genera SIGSEGV



  • Salve a tutti,
    ho un problema nell'inviare una richiesta http con dati multipart.
    Ho usato l'esempio nella documentazione di QHttpMultiPart come punto di partenza, ma continuo a ricevere un segnale SIGSEGV ogni volta che viene avviata la richiesta web.
    Uso Qt 5.2.0 con Mingw 4.8 su Win Vista 32 bit.

    Qualcuno sa come posso risolvere il problema o indicarmi dove sto sbagliando ?
    Grazie

    Max

    Questo il codice:

    SendHistory.h
    @class SendHistory : public QObject
    {
    Q_OBJECT
    public:
    explicit SendHistory(THistoryRequest p_item, QString p_bzippedFileName, QObject *parent = 0);

    QString getContent() { return data; }
    

    protected:
    THistoryRequest item;
    QString bzippedFileName;
    QNetworkAccessManager http;
    QNetworkReply *reply;
    QHttpMultiPart *multiPart;
    QHttpPart isin, tf, future, filePart;
    QFile *file;
    QString data;
    bool httpRequestAborted;

    private slots:
    void httpFinished();

    signals:
    void done(SendHistory* sender, THistoryRequest item);

    public slots:

    };@

    SendHsitory.cpp
    @SendHistory::SendHistory(THistoryRequest p_item, QString p_bzippedFileName, QObject *parent) :
    QObject(parent)
    {
    if(!QFile::exists(p_bzippedFileName))
    return;
    item = p_item;
    bzippedFileName = p_bzippedFileName;
    data = "";
    httpRequestAborted = false;

    multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    isin.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"isin\""));
    isin.setBody(item.isin.toLatin1());
    tf.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"tf\""));
    tf.setBody(item.tf.toLatin1());
    future.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"isFuture\""));
    future.setBody(item.future ? "1" : "0");
    QFileInfo fi(bzippedFileName);
    filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/x-bzip2"));
    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"" + fi.fileName() + "\""));
    file = new QFile(bzippedFileName);
    file->open(QIODevice::ReadOnly);
    filePart.setBodyDevice(file);
    file->setParent(multiPart);
    
    multiPart->append(isin);
    multiPart->append(tf);
    multiPart->append(future);
    multiPart->append(filePart);
    
    QString url = Config->scriptURL + "?task=UploadHistoricalData";
    QUrl address(url);
    QNetworkRequest request(address);
    reply = http.post(request, multiPart);
    multiPart->setParent(reply); // delete the multiPart with the reply
    
    QObject::connect(reply, SIGNAL(finished()), this, SLOT(httpFinished()));
    

    }

    void SendHistory::httpFinished()
    {
    if(reply==NULL)
    return;
    if(httpRequestAborted)
    data = "";
    else
    {
    QByteArray b = reply->readAll();
    reply->close();
    data = QString(b.constData());
    }
    reply->deleteLater(); // cancella anche multiPart e poi file
    if(QFile::exists(bzippedFileName))
    QFile::remove(bzippedFileName);
    emit done(this, item);
    }
    @



  • Ciao,

    potresti postare il risultato del trace sul core?
    Magari potresti iniziare a inserire delle stampe di debug per capire in quale punto viene generato il SIGSEV.

    Ciao



  • Ciao,
    ho risolto il problema.
    Semplicemente veniva rilasciata la memoria prima che la richiesta http fosse completata.
    Grazie dell'aiuto.

    Ciao


Log in to reply