diff --git a/app/logical/danbooru/http.rb b/app/logical/danbooru/http.rb index b87f5e60c..d6bad229c 100644 --- a/app/logical/danbooru/http.rb +++ b/app/logical/danbooru/http.rb @@ -1,3 +1,6 @@ +require "danbooru/http/html_adapter" +require "danbooru/http/xml_adapter" + module Danbooru class Http class DownloadError < StandardError; end diff --git a/app/logical/danbooru/http/html_adapter.rb b/app/logical/danbooru/http/html_adapter.rb new file mode 100644 index 000000000..733208e17 --- /dev/null +++ b/app/logical/danbooru/http/html_adapter.rb @@ -0,0 +1,12 @@ +module Danbooru + class Http + class HtmlAdapter < HTTP::MimeType::Adapter + HTTP::MimeType.register_adapter "text/html", self + HTTP::MimeType.register_alias "text/html", :html + + def decode(str) + Nokogiri::HTML5(str) + end + end + end +end diff --git a/app/logical/danbooru/http/xml_adapter.rb b/app/logical/danbooru/http/xml_adapter.rb new file mode 100644 index 000000000..70c901c07 --- /dev/null +++ b/app/logical/danbooru/http/xml_adapter.rb @@ -0,0 +1,12 @@ +module Danbooru + class Http + class XmlAdapter < HTTP::MimeType::Adapter + HTTP::MimeType.register_adapter "application/xml", self + HTTP::MimeType.register_alias "application/xml", :xml + + def decode(str) + Hash.from_xml(str).with_indifferent_access + end + end + end +end diff --git a/test/unit/danbooru_http_test.rb b/test/unit/danbooru_http_test.rb index f7529491b..50fc67d32 100644 --- a/test/unit/danbooru_http_test.rb +++ b/test/unit/danbooru_http_test.rb @@ -38,6 +38,19 @@ class DanbooruHttpTest < ActiveSupport::TestCase assert_equal(true, response.parse["gzipped"]) end + should "automatically parse html responses" do + response = Danbooru::Http.get("https://httpbin.org/html") + assert_equal(200, response.status) + assert_instance_of(Nokogiri::HTML5::Document, response.parse) + assert_equal("Herman Melville - Moby-Dick", response.parse.css("h1").text) + end + + should "automatically parse xml responses" do + response = Danbooru::Http.get("https://httpbin.org/xml") + assert_equal(200, response.status) + assert_equal(true, response.parse[:slideshow].present?) + end + should "cache requests" do response1 = Danbooru::Http.cache(1.minute).get("https://httpbin.org/uuid") assert_equal(200, response1.status)