kaiwren-wrest 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. data/README.rdoc +83 -31
  2. data/Rakefile +29 -13
  3. data/VERSION.yml +1 -1
  4. data/examples/delicious.rb +58 -0
  5. data/examples/wow_realm_status.rb +57 -0
  6. data/lib/wrest.rb +11 -2
  7. data/lib/wrest/components.rb +1 -2
  8. data/lib/wrest/components/attributes_container.rb +34 -74
  9. data/lib/wrest/components/attributes_container/typecaster.rb +121 -0
  10. data/lib/wrest/components/mutators.rb +18 -1
  11. data/lib/wrest/components/mutators/base.rb +52 -39
  12. data/lib/wrest/components/mutators/camel_to_snake_case.rb +7 -5
  13. data/lib/wrest/components/mutators/xml_mini_type_caster.rb +43 -0
  14. data/lib/wrest/components/mutators/xml_simple_type_caster.rb +22 -20
  15. data/lib/wrest/components/translators.rb +20 -17
  16. data/lib/wrest/components/translators/content_types.rb +2 -2
  17. data/lib/wrest/components/translators/json.rb +11 -8
  18. data/lib/wrest/components/translators/xml.rb +9 -12
  19. data/lib/wrest/core_ext/hash/conversions.rb +1 -1
  20. data/lib/wrest/core_ext/string/conversions.rb +2 -2
  21. data/lib/wrest/http.rb +24 -0
  22. data/lib/wrest/http/delete.rb +23 -0
  23. data/lib/wrest/http/get.rb +23 -0
  24. data/lib/wrest/http/options.rb +23 -0
  25. data/lib/wrest/http/post.rb +23 -0
  26. data/lib/wrest/http/put.rb +23 -0
  27. data/lib/wrest/http/request.rb +48 -0
  28. data/lib/wrest/http/response.rb +44 -0
  29. data/lib/wrest/resource/base.rb +52 -25
  30. data/lib/wrest/resource/state.rb +6 -0
  31. data/lib/wrest/uri.rb +85 -29
  32. data/lib/wrest/uri_template.rb +18 -1
  33. data/lib/wrest/version.rb +1 -1
  34. data/spec/spec.opts +1 -1
  35. data/spec/spec_helper.rb +8 -1
  36. data/spec/wrest/components/attributes_container/typecaster_spec.rb +63 -0
  37. data/spec/wrest/components/attributes_container_spec.rb +17 -61
  38. data/spec/wrest/components/mutators/base_spec.rb +5 -1
  39. data/spec/wrest/components/mutators/xml_mini_type_caster_spec.rb +75 -0
  40. data/spec/wrest/components/mutators_spec.rb +21 -0
  41. data/spec/wrest/components/translators/xml_spec.rb +1 -1
  42. data/spec/wrest/components/translators_spec.rb +9 -0
  43. data/spec/wrest/core_ext/string/conversions_spec.rb +9 -0
  44. data/spec/wrest/http/request_spec.rb +22 -0
  45. data/spec/wrest/{response_spec.rb → http/response_spec.rb} +4 -4
  46. data/spec/wrest/resource/base_spec.rb +126 -11
  47. data/spec/wrest/uri_spec.rb +124 -20
  48. data/spec/wrest/uri_template_spec.rb +11 -1
  49. metadata +33 -20
  50. data/lib/wrest/components/typecast_helpers.rb +0 -41
  51. data/lib/wrest/response.rb +0 -38
@@ -7,20 +7,17 @@
7
7
  # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
8
  # See the License for the specific language governing permissions and limitations under the License.
9
9
 
10
- require 'xmlsimple'
10
+ module Wrest
11
+ module Components::Translators
12
+ module Xml
13
+ extend self
11
14
 
12
- module Wrest::Components::Translators
13
- module Xml
14
- extend self
15
+ def deserialise(response)
16
+ ActiveSupport::XmlMini.parse(response.body)
17
+ end
15
18
 
16
- def deserialise(response)
17
- XmlSimple.xml_in(
18
- response.body,
19
- 'keeproot' => true
20
- )
21
- end
22
-
23
- def serialise(hash)
19
+ def serialise(hash)
20
+ end
24
21
  end
25
22
  end
26
23
  end
@@ -22,7 +22,7 @@ module Wrest
22
22
  # Yes, the name is misleading in that respect. However, one
23
23
  # hopes the absence of an exclamation mark will increase clarity.
24
24
  #
25
- # Uses include mutating the hash produced by xml-simple
25
+ # Uses include mutating the hash produced by deserialising xml
26
26
  # by using the meta data in the hash to type cast values.
27
27
  #
28
28
  # Example:
@@ -14,8 +14,8 @@ module Wrest
14
14
  module Conversions
15
15
 
16
16
  # A convenience method equivalent to Wrest::Uri.new(string)
17
- def to_uri
18
- Wrest::Uri.new(self)
17
+ def to_uri(options = {})
18
+ Wrest::Uri.new(self, options)
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,24 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest #:nodoc:
11
+
12
+ # Contains all HTTP protocol related classes such as
13
+ # Get, Post, Request, Response etc.
14
+ module Http
15
+ end
16
+ end
17
+
18
+ require "#{WREST_ROOT}/wrest/http/response"
19
+ require "#{WREST_ROOT}/wrest/http/request"
20
+ require "#{WREST_ROOT}/wrest/http/get"
21
+ require "#{WREST_ROOT}/wrest/http/put"
22
+ require "#{WREST_ROOT}/wrest/http/post"
23
+ require "#{WREST_ROOT}/wrest/http/delete"
24
+ require "#{WREST_ROOT}/wrest/http/options"
@@ -0,0 +1,23 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Delete < Request
12
+ def initialize(wrest_uri, parameters = {}, headers = {}, options = {})
13
+ super(
14
+ wrest_uri,
15
+ Net::HTTP::Delete,
16
+ parameters,
17
+ nil,
18
+ headers,
19
+ options
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Get < Request
12
+ def initialize(wrest_uri, parameters = {}, headers = {}, options = {})
13
+ super(
14
+ wrest_uri,
15
+ Net::HTTP::Get,
16
+ parameters,
17
+ nil,
18
+ headers,
19
+ options
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Options < Request
12
+ def initialize(wrest_uri, options = {})
13
+ super(
14
+ wrest_uri,
15
+ Net::HTTP::Options,
16
+ {},
17
+ nil,
18
+ {},
19
+ options
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Post < Request
12
+ def initialize(wrest_uri, body = '', headers = {}, parameters = {}, options = {})
13
+ super(
14
+ wrest_uri,
15
+ Net::HTTP::Post,
16
+ parameters,
17
+ body,
18
+ headers,
19
+ options
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Put < Request
12
+ def initialize(wrest_uri, body = '', headers = {}, parameters = {}, options = {})
13
+ super(
14
+ wrest_uri,
15
+ Net::HTTP::Put,
16
+ parameters,
17
+ body,
18
+ headers,
19
+ options
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,48 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Request
12
+ attr_reader :http_request, :uri, :body, :headers, :username, :password
13
+ def initialize(wrest_uri, http_request_klass, parameters = {}, body = nil, headers = {}, options = {})
14
+ @uri = wrest_uri
15
+ @headers = headers.stringify_keys
16
+ @http_request = http_request_klass.new(parameters.empty? ? wrest_uri.full_path : "#{wrest_uri.full_path}?#{parameters.to_query}", @headers)
17
+ @body = body
18
+ @options = options
19
+ @username = options[:username]
20
+ @password = options[:password]
21
+ end
22
+
23
+ # Makes a request and returns a Wrest::Http::Response.
24
+ # Data about the request is and logged to Wrest.logger
25
+ def invoke
26
+ response = nil
27
+
28
+ prefix = "#{http_request.method} #{http_request.hash}"
29
+ http_request.basic_auth username, password
30
+
31
+ Wrest.logger.debug "--> (#{prefix}) #{@uri.protocol}://#{@uri.host}:#{@uri.port}#{@http_request.path}"
32
+ time = Benchmark.realtime { response = Wrest::Http::Response.new( http.request(@http_request, @body) ) }
33
+ Wrest.logger.debug "<-- (#{prefix}) %d %s (%d bytes %.2fs)" % [response.code, response.message, response.body ? response.body.length : 0, time]
34
+
35
+ response
36
+ end
37
+
38
+ private
39
+ def http
40
+ http = Net::HTTP.new(@uri.host, @uri.port)
41
+ if @uri.https?
42
+ http.use_ssl = true
43
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
44
+ end
45
+ http
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at Http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest #:nodoc:
11
+ module Http #:nodoc:
12
+ # Decorates a response providing support for deserialisation.
13
+ #
14
+ # The following methods are also available (unlisted by rdoc because they're forwarded):
15
+ #
16
+ # <tt>:@Http_response, :code, :message, :body, :Http_version,
17
+ # :[], :content_length, :content_type, :each_header, :each_name, :each_value, :fetch,
18
+ # :get_fields, :key?, :type_params</tt>
19
+ #
20
+ # They behave exactly like their Net::HttpResponse equivalents.
21
+ class Response
22
+ extend Forwardable
23
+ def_delegators :@http_response, :code, :message, :body, :Http_version,
24
+ :[], :content_length, :content_type, :each_header, :each_name, :each_value, :fetch,
25
+ :get_fields, :key?, :type_params
26
+
27
+ def initialize(http_response)
28
+ @http_response = http_response
29
+ end
30
+
31
+ def deserialise
32
+ deserialise_using(Wrest::Components::Translators.lookup(@http_response.content_type))
33
+ end
34
+
35
+ def deserialise_using(translator)
36
+ translator.deserialise(@http_response)
37
+ end
38
+
39
+ def headers
40
+ @http_response.to_hash
41
+ end
42
+ end
43
+ end
44
+ end
@@ -12,61 +12,88 @@ module Wrest::Resource #:nodoc:
12
12
  # It is a REST client targetted at Rails REST apps.
13
13
  class Base
14
14
  include Wrest::Components::AttributesContainer
15
+ include Wrest::Components::AttributesContainer::Typecaster
15
16
 
16
- has_attributes :id
17
+ always_has :id
17
18
  typecast :id => as_integer
18
19
  attr_reader :attributes
19
-
20
+
21
+ def ==(other)
22
+ return true if self.equal?(other)
23
+ return false unless other.class == self.class
24
+ return self.attributes == other.attributes
25
+ end
26
+
27
+ def hash
28
+ id.hash
29
+ end
30
+
31
+ def to_xml(options={})
32
+ attributes.to_xml({:root => self.class.resource_name.gsub('_', '-')}.merge(options))
33
+ end
34
+
20
35
  class << self
21
36
  def inherited(klass)
22
37
  klass.set_resource_name klass.name
23
38
  end
24
-
39
+
25
40
  # Allows the resource name to be configured and creates
26
- # a getter method for it.
41
+ # a getter method for it.
27
42
  # This is a useful feature when using anonymous classes like
28
43
  # we often do while writing tests.
29
44
  # By default, the resource name is set to the name of the class.
30
45
  def set_resource_name(resource_name)
31
- self.class_eval "def self.resource_name; '#{resource_name}';end"
46
+ self.class_eval "def self.resource_name; '#{resource_name.underscore}';end"
32
47
  end
33
-
48
+
34
49
  # Allows the host url at which the resource is found to be configured
35
- # and creates a getter method for it.
50
+ # and creates a getter method for it.
36
51
  # For example in the url
37
52
  # http://localhost:3000/users/1/settings
38
- # you would set
53
+ # you would set
39
54
  # http://localhost:3000
40
55
  # as the host url.
41
56
  def set_host(host)
42
57
  self.class_eval "def self.host; '#{host}';end"
43
58
  end
44
-
45
- def set_redirect_handler(method_object)
59
+
60
+ def set_default_format(format)
61
+ self.class_eval "def self.default_format; '#{format.to_s}';end"
46
62
  end
47
-
48
- def resource_path
49
- @resource_path ||= "/#{resource_name.underscore.pluralize}"
63
+
64
+ def set_redirect_handler(method_object)
50
65
  end
51
66
 
52
- def resource_url
53
- "#{host}#{resource_path}"
67
+ def resource_collection_name
68
+ @resource_collection_name ||= "#{resource_name.underscore.pluralize}"
54
69
  end
55
-
56
- def find_all
70
+
71
+ def find_one_uri_template
72
+ @find_one_template ||= Wrest::UriTemplate.new(':host/:resource_collection_name/:id.:format')
57
73
  end
58
74
 
59
75
  def find(id)
60
- response_hash = "#{resource_url}/#{id}".to_uri.get.deserialise
61
- resource_type = response_hash.keys.first
62
- if(resource_type.underscore.camelize == self.name)
63
- self.new(response_hash[resource_type].first)
64
- else
65
- response_hash
66
- end
76
+ response = find_one_uri_template.to_uri(
77
+ :host => host,
78
+ :resource_collection_name => resource_collection_name,
79
+ :id => id,
80
+ :format => default_format
81
+ ).get
82
+ self.new(response.deserialise.mutate_using(
83
+ Wrest::Components::Mutators.chain(:xml_mini_type_caster, :camel_to_snake_case)
84
+ ).shift.last)
67
85
  end
68
86
 
69
- def objectify(hash)
87
+ def create(attributes = {})
88
+ response = Wrest::UriTemplate.new(':host/:resource_collection_name.:format').to_uri(
89
+ :host => host,
90
+ :resource_collection_name => resource_collection_name,
91
+ :format => default_format
92
+ ).post(self.new(attributes).to_xml, 'Content-Type' => "application/#{default_format}")
93
+
94
+ self.new(response.deserialise.mutate_using(
95
+ Wrest::Components::Mutators.chain(:xml_mini_type_caster, :camel_to_snake_case)
96
+ ).shift.last)
70
97
  end
71
98
  end
72
99
  end
@@ -0,0 +1,6 @@
1
+ module Wrest
2
+ module Resource
3
+ class State
4
+ end
5
+ end
6
+ end
@@ -11,10 +11,44 @@ module Wrest #:nodoc:
11
11
  # Wrest::Uri provides a simple api for
12
12
  # REST calls. String#to_uri is a convenience
13
13
  # method to build a Wrest::Uri from a string url.
14
+ # Note that a Wrest::Uri is immutable.
15
+ #
16
+ # Basic HTTP Authentication is supported.
17
+ # Example:
18
+ # "http://kaiwren:fupuppies@coathangers.com/portal/1".to_uri
19
+ # "http://coathangers.com/portal/1".to_uri(:username => 'kaiwren', :password => 'fupuppies')
20
+ #
21
+ # The second form is preferred as it can handle passwords with special characters like ^ and @
22
+ #
23
+ # You can find examples that use real APIs (like delicious) under the wrest/examples directory.
14
24
  class Uri
15
- attr_reader :uri
16
- def initialize(uri_string)
25
+ attr_reader :uri, :username, :password
26
+ def initialize(uri_string, options = {})
27
+ @options = options
28
+ @uri_string = uri_string.clone
17
29
  @uri = URI.parse(uri_string)
30
+ @options = options
31
+ @username = (@options[:username] ||= @uri.user)
32
+ @password = (@options[:password] ||= @uri.password)
33
+ end
34
+
35
+ # Build a new Wrest::Uri by appending _path_ to
36
+ # the current uri. If the original Wrest::Uri
37
+ # has a username and password, that will be
38
+ # copied to the new Wrest::Uri as well.
39
+ #
40
+ # Example:
41
+ # uri = "https://localhost:3000/v1".to_uri
42
+ # uri['/oogas/1'].get
43
+ #
44
+ # To change the username and password on the new
45
+ # instance, simply pass them as an options map.
46
+ #
47
+ # Example:
48
+ # uri = "https://localhost:3000/v1".to_uri(:username => 'foo', :password => 'bar')
49
+ # uri['/oogas/1', {:username => 'meh', :password => 'baz'}].get
50
+ def [](path, options = nil)
51
+ Uri.new(@uri_string+path, options || @options)
18
52
  end
19
53
 
20
54
  def eql?(other)
@@ -23,52 +57,74 @@ module Wrest #:nodoc:
23
57
 
24
58
  def ==(other)
25
59
  return false if other.class != self.class
26
- return other.uri == self.uri
60
+ return other.uri == self.uri && self.username == other.username && self.password == other.password
27
61
  end
28
62
 
29
63
  def hash
30
- self.uri.hash + 20090423
64
+ @uri.hash + @username.hash + @password.hash + 20090423
31
65
  end
32
66
 
33
- # Make a HTTP get request to this URI.
34
- # Remember to escape the parameter strings using URI.escape
67
+ # Make a GET request to this URI. This is a convenience API
68
+ # that creates a Wrest::Http::Get, executes it and returns a Wrest::Http::Response.
69
+ #
70
+ # Remember to escape all parameter strings if necessary, using URI.escape
35
71
  def get(parameters = {}, headers = {})
36
- do_request 'get', parameters.empty? ? @uri.request_uri : "#{@uri.request_uri}?#{parameters.to_query}", headers.stringify_keys
72
+ Http::Get.new(self, parameters, headers, @options).invoke
37
73
  end
38
74
 
39
- def put(body = '', headers = {})
40
- do_request 'put', @uri.request_uri, body.to_s, headers.stringify_keys
75
+ # Make a PUT request to this URI. This is a convenience API
76
+ # that creates a Wrest::Http::Put, executes it and returns a Wrest::Http::Response.
77
+ #
78
+ # Remember to escape all parameter strings if necessary, using URI.escape
79
+ def put(body = '', headers = {}, parameters = {})
80
+ Http::Put.new(self, body.to_s, headers, parameters, @options).invoke
41
81
  end
42
82
 
43
- def post(body = '', headers = {})
44
- do_request 'post', @uri.request_uri, body.to_s, headers.stringify_keys
83
+ # Makes a POST request to this URI. This is a convenience API
84
+ # that creates a Wrest::Http::Post, executes it and returns a Wrest::Http::Response.
85
+ #
86
+ # Remember to escape all parameter strings if necessary, using URI.escape
87
+ def post(body = '', headers = {}, parameters = {})
88
+ Http::Post.new(self, body.to_s, headers, parameters, @options).invoke
45
89
  end
46
90
 
91
+ # Makes a DELETE request to this URI. This is a convenience API
92
+ # that creates a Wrest::Http::Delete, executes it and returns a Wrest::Http::Response.
93
+ #
94
+ # Remember to escape all parameter strings if necessary, using URI.escape
47
95
  def delete(parameters = {}, headers = {})
48
- do_request 'delete', parameters.empty? ? @uri.request_uri : "#{@uri.request_uri}?#{parameters.to_query}", headers.stringify_keys
96
+ Http::Delete.new(self, parameters, headers, @options).invoke
49
97
  end
50
-
51
- def do_request(method, url, *args)
52
- response = nil
53
-
54
- Wrest.logger.info "#{method} -> #{url}"
55
- time = Benchmark.realtime { response = Wrest::Response.new(http.send(method, url, *args)) }
56
- Wrest.logger.info "--> %d %s (%d %.2fs)" % [response.code, response.message, response.body ? response.body.length : 0, time]
57
98
 
58
- response
99
+ # Makes an OPTIONS request to this URI. This is a convenience API
100
+ # that creates a Wrest::Http::Options, executes it and returns the Wrest::Http::Response.
101
+ def options
102
+ Http::Options.new(self, @options).invoke
59
103
  end
60
-
104
+
61
105
  def https?
62
106
  @uri.is_a?(URI::HTTPS)
63
107
  end
64
-
65
- def http
66
- http = Net::HTTP.new(@uri.host, @uri.port)
67
- if https?
68
- http.use_ssl = true
69
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
70
- end
71
- http
108
+
109
+ # Provides the full path of a request.
110
+ # For example, for
111
+ # http://localhost:3000/demons/1/chi?sort=true
112
+ # this would return
113
+ # /demons/1/chi?sort=true
114
+ def full_path
115
+ uri.request_uri
116
+ end
117
+
118
+ def protocol
119
+ uri.scheme
120
+ end
121
+
122
+ def host
123
+ uri.host
124
+ end
125
+
126
+ def port
127
+ uri.port
72
128
  end
73
129
  end
74
130
  end