Daily Code Reading #22 – RestClient::Resource#get

From yesterday’s code reading, I found that the restclient command uses RestClient::Resource for most of the work. So I’m going to start with it’s methods, starting with it’s HTTP verbs, #get.

The Code

1
2
3
4
5
6
7
8
9
10
11
module RestClient
  class Resource
    def get(additional_headers={}, &block)
      headers = (options[:headers] || {}).merge(additional_headers)
      Request.execute(options.merge(
              :method => :get,
              :url => url,
              :headers => headers), &(block || @block))
    end
  end
end

Review

The #get method takes a hash of HTTP headers and a block. Since a Resource object is created with the url already, it’s doesn’t need to be passed into this method.

The first thing #get does is to merge the HTTP headers from it’s initialization (options[:headers]) and the additional headers from the method call. This way you can create one Resource object with common headers and then override them in each request as needed. Next, #get passes all of the data onto RestClient::Request#execute which I’m assuming would build and sent the actual HTTP request.

One interesting technique that is in #get is how it passes either the method’s block or initializer’s block into Request#execute. By checking for a nil object and using the & outside the parenthesis, this is a simple one liner.

1
&(block || @block)