diff --git a/spec/agent_spec.cr b/spec/agent_spec.cr index e6b9dbe..86b7300 100644 --- a/spec/agent_spec.cr +++ b/spec/agent_spec.cr @@ -56,4 +56,23 @@ describe "Mechanize Agent test" do agent2.history.size.should eq 1 agent2.history.pop.uri.to_s.should eq "http://example.com/form" end + + it "doesn't add page to history within transact block" do + agent = Mechanize.new + agent.get("http://example.com/") + agent.history.size.should eq 1 + agent.transact do + agent.get("http://example.com/") + end + agent.history.size.should eq 1 + end + + it "can download page" do + agent = Mechanize.new + agent.history.size.should eq 0 + agent.download("http://example.com", "mechanizecr_example.html") + agent.history.size.should eq 0 + File.exists?("mechanizecr_example.html").should eq true + File.delete("mechanizecr_example.html") + end end diff --git a/src/mechanize.cr b/src/mechanize.cr index 5cd6dbc..6fcf332 100644 --- a/src/mechanize.cr +++ b/src/mechanize.cr @@ -17,7 +17,9 @@ class Mechanize @agent.user_agent = AGENT["Mechanize"] end - def get(uri : String | URI, headers = HTTP::Headers.new, params : Hash(String, String | Array(String)) = Hash(String, String).new) + def get(uri : String | URI, + headers = HTTP::Headers.new, + params : Hash(String, String | Array(String)) = Hash(String, String).new) method = :get page = @agent.fetch uri, method, headers, params add_to_history(page) @@ -25,7 +27,9 @@ class Mechanize page end - def post(uri : String | URI, headers = HTTP::Headers.new, query : Hash(String, String | Array(String)) = Hash(String, String).new) + def post(uri : String | URI, + headers = HTTP::Headers.new, + query : Hash(String, String | Array(String)) = Hash(String, String).new) node = Node.new node["method"] = "POST" node["enctype"] = "application/x-www-form-urlencoded" @@ -119,4 +123,31 @@ class Mechanize href = link.href get href end + + # download page body from given uri. + # TODO: except this request from history. + def download(uri, + filename, + headers = HTTP::Headers.new, + params : Hash(String, String | Array(String)) = Hash(String, String).new) + transact do + page = get(uri, headers, params) + case page + when MechanizeCr::File + File.write(filename, page.body) + end + end + end + + # Runs given block, then resets the page history as it was before. + def transact + # save the previous history status. + history_backup = MechanizeCr::History.new(@agent.history.max_size, @agent.history.array.dup) + begin + yield self + ensure + # restore the previous history. + @agent.history = history_backup + end + end end diff --git a/src/mechanize/history.cr b/src/mechanize/history.cr index 183a90b..6e1600b 100644 --- a/src/mechanize/history.cr +++ b/src/mechanize/history.cr @@ -4,11 +4,11 @@ class MechanizeCr::History property max_size : Int32 property array : Array(MechanizeCr::Page) - forward_missing_to @array + delegate :size, :empty?, :last, to: array - def initialize(max_size = 100) + def initialize(max_size = 100, array = Array(MechanizeCr::Page).new) @max_size = max_size - @array = Array(MechanizeCr::Page).new + @array = array end def push(page, uri = nil)