« Back to Index

Super basic concurrency based HTTP requester

View original Gist on GitHub

1. requester.rb

require "faraday"
require "json"

raw_json = <<-eos
{
  "components": [
    {
      "id": "header",
      "url": "https://gist.githubusercontent.com/revett/445ba84972156834a5df/raw/cb407f8c5348fb59d0448bd2b5573464e466cbc8/header.json"
    },
    {
      "id": "title",
      "url": "https://gist.githubusercontent.com/revett/445ba84972156834a5df/raw/cb407f8c5348fb59d0448bd2b5573464e466cbc8/title.json"
    },
    {
      "id": "sidebar",
      "url": "https://gist.githubusercontent.com/revett/445ba84972156834a5df/raw/cb407f8c5348fb59d0448bd2b5573464e466cbc8/sidebar.json"
    },
    {
      "id": "footer",
      "url": "https://gist.githubusercontent.com/revett/445ba84972156834a5df/raw/cb407f8c5348fb59d0448bd2b5573464e466cbc8/footer.json"
    },
    {
      "id": "image",
      "url": "https://gist.githubusercontent.com/revett/445ba84972156834a5df/raw/cb407f8c5348fb59d0448bd2b5573464e466cbc8/image.json"
    }
  ]
}
eos

overall_status   = "success"
component_status = "success"
threads          = []
json             = JSON.parse(raw_json)
components       = json["components"]

components.size.times do |i|
  threads << Thread.new do
    time_start = Time.now

    url            = components[i-1]["url"]
    response       = Faraday.get url

    time_end = Time.now

    overall_status = component_status = "failure" if response.status != 200 || (time_end-time_start) > 2

    {
      :id     => components[i-1]["id"],
      :status => component_status,
      :body   => JSON.parse(response.body)["content"]
    }
  end
end

threads.each { |t| t.join }

result = {
  :status     => overall_status,
  :components => threads.map { |t| t.value }
}

p JSON.generate(result)

2. Convert JSON response into a Ruby object.rb

{"status"=>"success",
 "components"=>
  [{"id"=>"image",
    "status"=>"success",
    "body"=>
     "<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>"},
   {"id"=>"header",
    "status"=>"success",
    "body"=>
     "<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>"},
   {"id"=>"title",
    "status"=>"success",
    "body"=>
     "<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>"},
   {"id"=>"sidebar",
    "status"=>"success",
    "body"=>
     "<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>"},
   {"id"=>"footer",
    "status"=>"success",
    "body"=>
     "<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>"}]}