Merge pull request #8 from Kanezoh/download_file

Basic Implementation of File Download
This commit is contained in:
Kanezoh 2021-08-24 11:30:35 +09:00 committed by GitHub
commit 715b4e4f26
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 5 deletions

View File

@ -56,4 +56,23 @@ describe "Mechanize Agent test" do
agent2.history.size.should eq 1 agent2.history.size.should eq 1
agent2.history.pop.uri.to_s.should eq "http://example.com/form" agent2.history.pop.uri.to_s.should eq "http://example.com/form"
end 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 end

View File

@ -17,7 +17,9 @@ class Mechanize
@agent.user_agent = AGENT["Mechanize"] @agent.user_agent = AGENT["Mechanize"]
end 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 method = :get
page = @agent.fetch uri, method, headers, params page = @agent.fetch uri, method, headers, params
add_to_history(page) add_to_history(page)
@ -25,7 +27,9 @@ class Mechanize
page page
end 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 = Node.new
node["method"] = "POST" node["method"] = "POST"
node["enctype"] = "application/x-www-form-urlencoded" node["enctype"] = "application/x-www-form-urlencoded"
@ -119,4 +123,31 @@ class Mechanize
href = link.href href = link.href
get href get href
end 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 end

View File

@ -4,11 +4,11 @@ class MechanizeCr::History
property max_size : Int32 property max_size : Int32
property array : Array(MechanizeCr::Page) 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 @max_size = max_size
@array = Array(MechanizeCr::Page).new @array = array
end end
def push(page, uri = nil) def push(page, uri = nil)