diff --git a/lib/capybara/webkit/browser.rb b/lib/capybara/webkit/browser.rb index dd87476..edeca48 100644 --- a/lib/capybara/webkit/browser.rb +++ b/lib/capybara/webkit/browser.rb @@ -71,7 +71,7 @@ module Capybara::Webkit end def response_headers - Hash[command("Headers").split("\n").map { |header| header.split(": ") }] + JSON.parse(command("Headers")) end def current_url diff --git a/spec/driver_spec.rb b/spec/driver_spec.rb index a726bb6..f18c7c3 100644 --- a/spec/driver_spec.rb +++ b/spec/driver_spec.rb @@ -2974,6 +2974,24 @@ CACHE MANIFEST end end + context "response header contains colon" do + let(:driver) do + driver_for_app do + get "/" do + headers "Content-Disposition" => 'filename="File: name.txt"' + end + end + end + + it "sets the response header" do + visit("/") + + expect( + driver.response_headers["Content-Disposition"] + ).to eq 'filename="File: name.txt"' + end + end + def driver_url(driver, path) URI.parse(driver.current_url).merge(path).to_s end diff --git a/src/Headers.cpp b/src/Headers.cpp index 48d388e..42894a8 100644 --- a/src/Headers.cpp +++ b/src/Headers.cpp @@ -1,11 +1,14 @@ #include "Headers.h" #include "WebPage.h" #include "WebPageManager.h" +#include "JsonSerializer.h" Headers::Headers(WebPageManager *manager, QStringList &arguments, QObject *parent) : SocketCommand(manager, arguments, parent) { } void Headers::start() { - finish(true, page()->pageHeaders().join("\n")); + JsonSerializer serializer; + QByteArray json = serializer.serialize(page()->pageHeaders()); + finish(true, json); } diff --git a/src/WebPage.cpp b/src/WebPage.cpp index 1eb8b22..ec5c6e5 100644 --- a/src/WebPage.cpp +++ b/src/WebPage.cpp @@ -83,9 +83,9 @@ void WebPage::setFrameProperties(QWebFrame *frame, QUrl &requestedUrl, NetworkRe if (frame->requestedUrl() == requestedUrl) { int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); frame->setProperty("statusCode", statusCode); - QStringList headers; + QVariantMap headers; foreach(QNetworkReply::RawHeaderPair header, reply->rawHeaderPairs()) - headers << header.first+": "+header.second; + headers[header.first] = QString(header.second); frame->setProperty("headers", headers); frame->setProperty("body", reply->data()); QVariant contentMimeType = reply->header(QNetworkRequest::ContentTypeHeader); @@ -359,8 +359,8 @@ int WebPage::getLastStatus() { return currentFrame()->property("statusCode").toInt(); } -QStringList WebPage::pageHeaders() { - return currentFrame()->property("headers").toStringList(); +QVariantMap WebPage::pageHeaders() { + return currentFrame()->property("headers").toMap(); } QByteArray WebPage::body() { diff --git a/src/WebPage.h b/src/WebPage.h index 65900f8..91ff646 100644 --- a/src/WebPage.h +++ b/src/WebPage.h @@ -47,7 +47,7 @@ class WebPage : public QWebPage { bool matchesWindowSelector(QString); void setFocus(); void unsupportedContentFinishedReply(QNetworkReply *reply); - QStringList pageHeaders(); + QVariantMap pageHeaders(); QByteArray body(); QString contentType(); void mouseEvent(QEvent::Type type, const QPoint &position, Qt::MouseButton button);