From 1ef8f4c84445b40c408f4b93882caa04668ba5a2 Mon Sep 17 00:00:00 2001 From: Dan Ivovich Date: Tue, 17 Apr 2012 12:06:12 -0400 Subject: [PATCH] Store response messages as QByteArray This prevents conversion of QByteArray to QString from truncating content at a null byte in the QByteArray. This truncation can be a problem if the response body is a binary object (e.g. PDF) Fixes #322 --- src/Connection.cpp | 2 +- src/CurrentUrl.cpp | 3 +-- src/Execute.cpp | 2 +- src/Find.cpp | 2 +- src/FrameFocus.cpp | 4 ++-- src/RequestedUrl.cpp | 3 +-- src/Response.cpp | 7 ++++++- src/Response.h | 6 ++++-- src/Url.cpp | 3 +-- 9 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/Connection.cpp b/src/Connection.cpp index 752cae0..af2d466 100644 --- a/src/Connection.cpp +++ b/src/Connection.cpp @@ -62,7 +62,7 @@ void Connection::writeResponse(Response *response) { else m_socket->write("failure\n"); - QByteArray messageUtf8 = response->message().toUtf8(); + QByteArray messageUtf8 = response->message(); QString messageLength = QString::number(messageUtf8.size()) + "\n"; m_socket->write(messageLength.toAscii()); m_socket->write(messageUtf8); diff --git a/src/CurrentUrl.cpp b/src/CurrentUrl.cpp index 9508aa1..fbe883e 100644 --- a/src/CurrentUrl.cpp +++ b/src/CurrentUrl.cpp @@ -55,8 +55,7 @@ void CurrentUrl::start() { QUrl humanUrl = wasRedirectedAndNotModifiedByJavascript() ? page()->currentFrame()->url() : page()->currentFrame()->requestedUrl(); QByteArray encodedBytes = humanUrl.toEncoded(); - QString urlString = QString(encodedBytes); - emit finished(new Response(true, urlString)); + emit finished(new Response(true, encodedBytes)); } bool CurrentUrl::wasRegularLoad() { diff --git a/src/Execute.cpp b/src/Execute.cpp index 2a2b5bb..07fa26a 100644 --- a/src/Execute.cpp +++ b/src/Execute.cpp @@ -10,7 +10,7 @@ void Execute::start() { if (result.isValid()) { emit finished(new Response(true)); } else { - emit finished(new Response(false, "Javascript failed to execute")); + emit finished(new Response(false, QString("Javascript failed to execute"))); } } diff --git a/src/Find.cpp b/src/Find.cpp index 3ccd186..ce8be12 100644 --- a/src/Find.cpp +++ b/src/Find.cpp @@ -13,7 +13,7 @@ void Find::start() { message = result.toString(); emit finished(new Response(true, message)); } else { - emit finished(new Response(false, "Invalid XPath expression")); + emit finished(new Response(false, QString("Invalid XPath expression"))); } } diff --git a/src/FrameFocus.cpp b/src/FrameFocus.cpp index 4e7b364..774dd51 100644 --- a/src/FrameFocus.cpp +++ b/src/FrameFocus.cpp @@ -50,7 +50,7 @@ void FrameFocus::focusId(QString name) { void FrameFocus::focusParent() { if (page()->currentFrame()->parentFrame() == 0) { - emit finished(new Response(false, "Already at parent frame.")); + emit finished(new Response(false, QString("Already at parent frame."))); } else { page()->currentFrame()->parentFrame()->setFocus(); success(); @@ -58,7 +58,7 @@ void FrameFocus::focusParent() { } void FrameFocus::frameNotFound() { - emit finished(new Response(false, "Unable to locate frame. ")); + emit finished(new Response(false, QString("Unable to locate frame. "))); } void FrameFocus::success() { diff --git a/src/RequestedUrl.cpp b/src/RequestedUrl.cpp index ad64d18..3eedcba 100644 --- a/src/RequestedUrl.cpp +++ b/src/RequestedUrl.cpp @@ -7,7 +7,6 @@ RequestedUrl::RequestedUrl(WebPage *page, QStringList &arguments, QObject *paren void RequestedUrl::start() { QUrl humanUrl = page()->currentFrame()->requestedUrl(); QByteArray encodedBytes = humanUrl.toEncoded(); - QString urlString = QString(encodedBytes); - emit finished(new Response(true, urlString)); + emit finished(new Response(true, encodedBytes)); } diff --git a/src/Response.cpp b/src/Response.cpp index 2abbba2..7967ed5 100644 --- a/src/Response.cpp +++ b/src/Response.cpp @@ -2,6 +2,11 @@ #include Response::Response(bool success, QString message) { + m_success = success; + m_message = message.toUtf8(); +} + +Response::Response(bool success, QByteArray message) { m_success = success; m_message = message; } @@ -14,6 +19,6 @@ bool Response::isSuccess() const { return m_success; } -QString Response::message() const { +QByteArray Response::message() const { return m_message; } diff --git a/src/Response.h b/src/Response.h index 0b636c7..1cd5649 100644 --- a/src/Response.h +++ b/src/Response.h @@ -1,13 +1,15 @@ #include +#include class Response { public: Response(bool success, QString message); + Response(bool success, QByteArray message); Response(bool success); bool isSuccess() const; - QString message() const; + QByteArray message() const; private: bool m_success; - QString m_message; + QByteArray m_message; }; diff --git a/src/Url.cpp b/src/Url.cpp index fd6fc0d..42f2489 100644 --- a/src/Url.cpp +++ b/src/Url.cpp @@ -7,7 +7,6 @@ Url::Url(WebPage *page, QStringList &arguments, QObject *parent) : Command(page, void Url::start() { QUrl humanUrl = page()->currentFrame()->url(); QByteArray encodedBytes = humanUrl.toEncoded(); - QString urlString = QString(encodedBytes); - emit finished(new Response(true, urlString)); + emit finished(new Response(true, encodedBytes)); }