Class: HTTPrb::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/httprb/request.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uri, options = {}) ⇒ Request

create an HTTPrb::Request object

the uri can be formatted however is most convenient to you- if the scheme (http://) is provided, it will be respected. if not provided, the default is http.

if https:// is given as the scheme and the necesary openssl library is installed (meaning “require ‘net/http’” doesn’t fail) then ssl will be used.

note that the ‘options’ parameter is only truly useful (or good) when not passing a block to the DSL. when a block is provided, using the accessor methods for each option (headers, parameters, etc.) is vastly preferred.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/httprb/request.rb', line 35

def initialize(uri, options = {})
  if uri.is_a? URI
    @uri = uri
  elsif uri.is_a? String
    @uri = URI.parse(uri)
    if !@uri.scheme
      @uri = URI.parse("http://" + uri)
    end
  else
    raise Exception, "Invalid URL"
  end
  @uri.path = "/" if @uri.path.empty?
  @ssl = true if @uri.scheme == "https"
  
  @options = options
  @options[:type] = 'GET' unless @options[:type]
  @debug = options[:debug] ? true : false
  
  @parameters = {}
  if @uri.query
    CGI.parse(@uri.query).each do |k,v|
      if v.length == 1
        @parameters[k] = v.first
      else
        @parameters[k] = v
      end
    end
  end
  @headers = {}
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method) ⇒ Object

yep, you got it. we’re messing with your mind here. nothing to see here, move along…



150
151
152
153
154
155
156
157
# File 'lib/httprb/request.rb', line 150

def method_missing(method)
  if method == :"ssl?"
    return @ssl
  elsif @options.keys.include?(method)
    return @options[method]
  end
  super
end

Instance Attribute Details

#debugObject

Returns the value of attribute debug.



14
15
16
# File 'lib/httprb/request.rb', line 14

def debug
  @debug
end

#headersObject

Returns the value of attribute headers.



14
15
16
# File 'lib/httprb/request.rb', line 14

def headers
  @headers
end

#optionsObject (readonly)

Returns the value of attribute options.



15
16
17
# File 'lib/httprb/request.rb', line 15

def options
  @options
end

#parametersObject

Returns the value of attribute parameters.



14
15
16
# File 'lib/httprb/request.rb', line 14

def parameters
  @parameters
end

#sslObject

Returns the value of attribute ssl.



14
15
16
# File 'lib/httprb/request.rb', line 14

def ssl
  @ssl
end

#uriObject

Returns the value of attribute uri.



14
15
16
# File 'lib/httprb/request.rb', line 14

def uri
  @uri
end

Instance Method Details

#basic_auth(user, pass) ⇒ Object

sets up HTTP basic auth- identical to Net::HTTP request objects.



68
69
70
71
72
# File 'lib/httprb/request.rb', line 68

def basic_auth(user, pass)
  @options[:basic_auth] = true
  @options[:user] = user
  @options[:pass] = pass
end

#header(key, value) ⇒ Object

set a header key/value pair



82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/httprb/request.rb', line 82

def header(key, value)
  if @headers[key]
    if @headers[key].is_a? Array
      @headers[key] << value
    else
      cur = @headers[key]
      @headers[key] = [cur, value]
    end
  else
    @headers[key] = value
  end
end

#http_requestObject

generates a Net::HTTP request object. for use when the request is passed to Net::HTTP.



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/httprb/request.rb', line 117

def http_request
  path = "#{@uri.path}?#{query_string}"
  http_req = case @options[:type].upcase
  when 'GET'
    Net::HTTP::Get.new(path)
  when 'POST'
    Net::HTTP::Post.new(path)
  when 'PUT'
    Net::HTTP::Put.new(path)
  when 'HEAD'
    Net::HTTP::Head.new(path)
  when 'DELETE'
    Net::HTTP::Delete.new(path)
  else
    Net::HTTP::Get.new(path)
  end
  if @options[:basic_auth] && @options[:user] && @options[:pass]
    http_req.basic_auth(@options[:user], @options[:pass])
  end
  
  @headers.each do |key, value|
    if value.is_a? Array
      value.each {|v| http_req.add_field(key, v)}
    else
      http_req.add_field(key, value)
    end
  end
  
  return http_req
end

#parameter(key, value = nil) ⇒ Object

set or add to a query parameter key/value pair if you wish to set multiple values for a key, provide an array of values as the second argument.



77
78
79
# File 'lib/httprb/request.rb', line 77

def parameter(key, value = nil)
  @parameters[key] = value
end

#query_stringObject

generates the query string based on the provided parameter dictionary



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/httprb/request.rb', line 97

def query_string
  if !@parameters.empty?
    # this is crabby because query strings can have more than
    # one value per key- the key, in that case, is simply
    # repeated with the additional value.
    queries = []
    @parameters.each do |k,v|
      if v.is_a?(Array)
        v.each {|val| queries << "#{k}=#{CGI.escape(val.to_s)}"}
      else
        queries << "#{k}=#{CGI.escape(v.to_s)}"
      end
    end
    return queries.join('&')
  end
  return ""
end