From 88b70e37a3ec0bd08caea53aa8a51f2b48e679b5 Mon Sep 17 00:00:00 2001 From: shogo-ohta Date: Tue, 23 Aug 2011 15:58:20 +0900 Subject: [PATCH 1/6] add spec for status code with image --- spec/integration/session_spec.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/spec/integration/session_spec.rb b/spec/integration/session_spec.rb index 57b1ff1..35e414f 100644 --- a/spec/integration/session_spec.rb +++ b/spec/integration/session_spec.rb @@ -79,6 +79,31 @@ describe Capybara::Session do subject.click_button('ボタン') end end + context "status code" do + before(:all) do + @app = lambda do |env| + params = ::Rack::Utils.parse_query(env['QUERY_STRING']) + if params["img"] == "true" + return [404, { 'Content-Type' => 'image/gif', 'Content-Length' => '0' }, ['not found']] + end + body = <<-HTML + + + + + + HTML + [200, + { 'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s }, + [body]] + end + end + + it "should get status code" do + subject.visit '/' + subject.status_code.should == 200 + end + end end describe Capybara::Session, "with TestApp" do From 41c842edf7584cad66af342a2329199bc24778d1 Mon Sep 17 00:00:00 2001 From: shogo-ohta Date: Tue, 23 Aug 2011 16:02:37 +0900 Subject: [PATCH 2/6] capturing status code restrict to page request --- src/WebPage.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/WebPage.cpp b/src/WebPage.cpp index 9dfb15e..0a7c9a4 100644 --- a/src/WebPage.cpp +++ b/src/WebPage.cpp @@ -168,16 +168,18 @@ QString WebPage::getLastAttachedFileName() { } void WebPage::replyFinished(QNetworkReply *reply) { - QStringList headers; - lastStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - QList list = reply->rawHeaderList(); + if (reply->url() == this->mainFrame()->url()) { + QStringList headers; + lastStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + QList list = reply->rawHeaderList(); - int length = list.size(); - for(int i = 0; i < length; i++) { - headers << list.at(i)+": "+reply->rawHeader(list.at(i)); + int length = list.size(); + for(int i = 0; i < length; i++) { + headers << list.at(i)+": "+reply->rawHeader(list.at(i)); + } + + m_pageHeaders = headers.join("\n"); } - - m_pageHeaders = headers.join("\n"); } int WebPage::getLastStatus() { From 5ce60584ad667785bdb81c5a208202a43ed0c91d Mon Sep 17 00:00:00 2001 From: os0x Date: Wed, 24 Aug 2011 00:18:08 +0900 Subject: [PATCH 3/6] reset status code --- spec/integration/session_spec.rb | 4 +++- src/Reset.cpp | 3 ++- src/WebPage.cpp | 17 ++++++++++++----- src/WebPage.h | 2 ++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/spec/integration/session_spec.rb b/spec/integration/session_spec.rb index 35e414f..cd856c6 100644 --- a/spec/integration/session_spec.rb +++ b/spec/integration/session_spec.rb @@ -79,12 +79,14 @@ describe Capybara::Session do subject.click_button('ボタン') end end + context "status code" do before(:all) do @app = lambda do |env| params = ::Rack::Utils.parse_query(env['QUERY_STRING']) if params["img"] == "true" - return [404, { 'Content-Type' => 'image/gif', 'Content-Length' => '0' }, ['not found']] + body = 'not found' + return [404, { 'Content-Type' => 'image/gif', 'Content-Length' => body.length.to_s }, [body]] end body = <<-HTML diff --git a/src/Reset.cpp b/src/Reset.cpp index b7a92e9..b46adc0 100644 --- a/src/Reset.cpp +++ b/src/Reset.cpp @@ -11,8 +11,9 @@ void Reset::start(QStringList &arguments) { page()->triggerAction(QWebPage::Stop); page()->currentFrame()->setHtml(""); page()->networkAccessManager()->setCookieJar(new QNetworkCookieJar()); - page()->setNetworkAccessManager(new NetworkAccessManager()); + page()->setCustomNetworkAccessManager(); page()->setUserAgent(NULL); + page()->resetLastStatus(); emit finished(new Response(true)); } diff --git a/src/WebPage.cpp b/src/WebPage.cpp index 0a7c9a4..c49c8b6 100644 --- a/src/WebPage.cpp +++ b/src/WebPage.cpp @@ -9,10 +9,7 @@ WebPage::WebPage(QObject *parent) : QWebPage(parent) { setUserStylesheet(); m_loading = false; - - NetworkAccessManager *manager = new NetworkAccessManager(); - this->setNetworkAccessManager(manager); - connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *))); + this->setCustomNetworkAccessManager(); connect(this, SIGNAL(loadStarted()), this, SLOT(loadStarted())); connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool))); @@ -20,6 +17,12 @@ WebPage::WebPage(QObject *parent) : QWebPage(parent) { this, SLOT(frameCreated(QWebFrame *))); } +void WebPage::setCustomNetworkAccessManager() { + NetworkAccessManager *manager = new NetworkAccessManager(); + this->setNetworkAccessManager(manager); + connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *))); +} + void WebPage::loadJavascript() { QResource javascript(":/capybara.js"); if (javascript.isCompressed()) { @@ -168,7 +171,7 @@ QString WebPage::getLastAttachedFileName() { } void WebPage::replyFinished(QNetworkReply *reply) { - if (reply->url() == this->mainFrame()->url()) { + if (reply->url() == this->currentFrame()->url()) { QStringList headers; lastStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); QList list = reply->rawHeaderList(); @@ -186,6 +189,10 @@ int WebPage::getLastStatus() { return lastStatus; } +void WebPage::resetLastStatus() { + lastStatus = 0; +} + QString WebPage::pageHeaders() { return m_pageHeaders; } diff --git a/src/WebPage.h b/src/WebPage.h index 231bcf3..52db100 100644 --- a/src/WebPage.h +++ b/src/WebPage.h @@ -11,6 +11,8 @@ class WebPage : public QWebPage { QString userAgentForUrl(const QUrl &url ) const; void setUserAgent(QString userAgent); int getLastStatus(); + void resetLastStatus(); + void setCustomNetworkAccessManager(); bool render(const QString &fileName); virtual bool extension (Extension extension, const ExtensionOption *option=0, ExtensionReturn *output=0); From c28e9a177c45b04392354f72066bf2c6af9236bb Mon Sep 17 00:00:00 2001 From: shogo-ohta Date: Fri, 26 Aug 2011 22:58:31 +0900 Subject: [PATCH 4/6] added spec for reset status code --- spec/integration/session_spec.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spec/integration/session_spec.rb b/spec/integration/session_spec.rb index cd856c6..57a8084 100644 --- a/spec/integration/session_spec.rb +++ b/spec/integration/session_spec.rb @@ -105,6 +105,13 @@ describe Capybara::Session do subject.visit '/' subject.status_code.should == 200 end + + it "should reset status code" do + subject.visit '/' + subject.status_code.should == 200 + subject.reset! + subject.status_code.should == 0 + end end end From 9c195af89c7e3103306913ed8c61a7af6a8c4ff6 Mon Sep 17 00:00:00 2001 From: shogo-ohta Date: Fri, 26 Aug 2011 23:10:20 +0900 Subject: [PATCH 5/6] added spec for response header --- spec/integration/session_spec.rb | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/spec/integration/session_spec.rb b/spec/integration/session_spec.rb index 57a8084..3258b4b 100644 --- a/spec/integration/session_spec.rb +++ b/spec/integration/session_spec.rb @@ -80,7 +80,7 @@ describe Capybara::Session do end end - context "status code" do + context "response headers with status code" do before(:all) do @app = lambda do |env| params = ::Rack::Utils.parse_query(env['QUERY_STRING']) @@ -96,7 +96,7 @@ describe Capybara::Session do HTML [200, - { 'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s }, + { 'Content-Type' => 'text/html', 'Content-Length' => body.length.to_s, 'X-Capybara' => 'WebKit'}, [body]] end end @@ -112,6 +112,18 @@ describe Capybara::Session do subject.reset! subject.status_code.should == 0 end + + it "should get response headers" do + subject.visit '/' + subject.response_headers['X-Capybara'].should == 'WebKit' + end + + it "should reset response headers" do + subject.visit '/' + subject.response_headers['X-Capybara'].should == 'WebKit' + subject.reset! + subject.response_headers['X-Capybara'].should == nil + end end end From 482717484e1a3e67773f68a7c4ffea19099b3fb6 Mon Sep 17 00:00:00 2001 From: shogo-ohta Date: Fri, 26 Aug 2011 23:15:41 +0900 Subject: [PATCH 6/6] Response headers should be reset --- src/Reset.cpp | 2 +- src/WebPage.cpp | 9 +++++---- src/WebPage.h | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Reset.cpp b/src/Reset.cpp index b46adc0..e5663ea 100644 --- a/src/Reset.cpp +++ b/src/Reset.cpp @@ -13,7 +13,7 @@ void Reset::start(QStringList &arguments) { page()->networkAccessManager()->setCookieJar(new QNetworkCookieJar()); page()->setCustomNetworkAccessManager(); page()->setUserAgent(NULL); - page()->resetLastStatus(); + page()->resetResponseHeaders(); emit finished(new Response(true)); } diff --git a/src/WebPage.cpp b/src/WebPage.cpp index c49c8b6..18cfcad 100644 --- a/src/WebPage.cpp +++ b/src/WebPage.cpp @@ -173,7 +173,7 @@ QString WebPage::getLastAttachedFileName() { void WebPage::replyFinished(QNetworkReply *reply) { if (reply->url() == this->currentFrame()->url()) { QStringList headers; - lastStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + m_lastStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); QList list = reply->rawHeaderList(); int length = list.size(); @@ -186,11 +186,12 @@ void WebPage::replyFinished(QNetworkReply *reply) { } int WebPage::getLastStatus() { - return lastStatus; + return m_lastStatus; } -void WebPage::resetLastStatus() { - lastStatus = 0; +void WebPage::resetResponseHeaders() { + m_lastStatus = 0; + m_pageHeaders = QString(); } QString WebPage::pageHeaders() { diff --git a/src/WebPage.h b/src/WebPage.h index 52db100..32f73f2 100644 --- a/src/WebPage.h +++ b/src/WebPage.h @@ -11,7 +11,7 @@ class WebPage : public QWebPage { QString userAgentForUrl(const QUrl &url ) const; void setUserAgent(QString userAgent); int getLastStatus(); - void resetLastStatus(); + void resetResponseHeaders(); void setCustomNetworkAccessManager(); bool render(const QString &fileName); virtual bool extension (Extension extension, const ExtensionOption *option=0, ExtensionReturn *output=0); @@ -40,7 +40,7 @@ class WebPage : public QWebPage { QString getLastAttachedFileName(); void loadJavascript(); void setUserStylesheet(); - int lastStatus; + int m_lastStatus; QString m_pageHeaders; };