okay 1.0.0 → 2.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ceda0f08f007df66075a65e62027f501453550d
4
- data.tar.gz: f9e49212259bdf78ebfb1a034de5f840c379bced
3
+ metadata.gz: 821cdf5fa5035a799e732e2988fee9ec3666155a
4
+ data.tar.gz: dd1f9595882d529f39e18e6bb7205637b555c05d
5
5
  SHA512:
6
- metadata.gz: 79ce047f2afccc37bdaef98c5a353dd66c5c665f9746ef7f9713dfb31b17f57832f72726a66258e4e5b8bc444ad2007123dd2fe870435a277fcaea2221b65c21
7
- data.tar.gz: 922a324c08fdc04e1113472511f64698950bbe206ade914a63584011f70e66fd8e1765d9ac9a7b09ea62f36ad5a9a1771f5acebb3d2d029f3fee93c27c02391c
6
+ metadata.gz: df138d22cd54965b5c7e788a99a5c09d4b8952dc13026e0f6d3190529e503f50e34798e4c37f21b2976384dc6977b31bdb519d6d987ac2d910180cda102c0bfb
7
+ data.tar.gz: f5bde4d3e7b9863580717bdd3c5c892c88e518eae484a5892ae3fd61e778d06bd7fcb6d4bd50655a630e93fd97f83ce851aedfef672eab6bb18d0e9e2917d8ca
data/README.md CHANGED
@@ -59,7 +59,17 @@ require 'okay/http'
59
59
 
60
60
  Okay::HTTP.get("https://smallest.dog") #=> #<Net::HTTPOK 200 OK readbody=true>
61
61
  Okay::HTTP.get("https://smallest.dog").body # => returns the page contents.
62
- # TODO: document Okay::HTTP.post().
62
+
63
+ # Generates a query string based on +parameters+, ultimately requesting
64
+ # https://httpbin.org/get?foo=bar
65
+ Okay::HTTP.get("https://httpbin.org/get", parameters: { "foo" => "bar" })
66
+
67
+ # Encodes +form_data+ as though it were a form, and sets the result of
68
+ # that as the request body.
69
+ Okay::HTTP.post("https://httpbin.org/post", form_data: { "foo" => "bar" })
70
+
71
+ # Uses +data+ as the request body.
72
+ Okay::HTTP.post("https://httpbin.org/post", data: "hello, world!")
63
73
  ```
64
74
 
65
75
  ## Development
data/lib/okay/http.rb CHANGED
@@ -3,48 +3,80 @@ require 'net/https'
3
3
 
4
4
  class Okay
5
5
  module HTTP
6
- MethodError = Class.new(ArgumentError)
7
6
  RedirectLimitError = Class.new(StandardError)
8
7
 
9
8
  DEFAULT_REDIRECT_LIMIT = 10
10
9
 
11
- # A mapping of HTTP request methods to Net::HTTP methods.
12
- # (Yay overlapping terminology.)
10
+ # Make an HTTP GET request.
13
11
  #
14
- # Also, what are consistent APIs even?
15
- METHODS = {
16
- get: 'get_response',
17
- post: 'post_form',
18
- }
19
-
20
- def self.get(url, parameters = {})
21
- send_request(METHODS[:get], url, parameters)
12
+ # @param url [String] The URL to request.
13
+ # @param parameters [Hash] A hash representing a query string.
14
+ def self.get(url, parameters: {})
15
+ send_request(:Get, url, parameters, nil)
22
16
  end
23
17
 
24
- def self.post(url, parameters = {})
25
- send_request(METHODS[:post], url, parameters)
26
- end
18
+ # Make an HTTP POST request.
19
+ #
20
+ # @param url [String] The URL to request.
21
+ # @param data [String] Raw data to for the body of the POST request.
22
+ # @param form_data [Hash] Form data, treated as though.
23
+ def self.post(url, data: nil, form_data: nil)
24
+ if !data.nil? && !form_data.nil?
25
+ raise ArgumentError, "cannot specify data and form_data arguments simultaneously."
26
+ end
27
27
 
28
- private
28
+ if form_data.nil?
29
+ body = data
30
+ else
31
+ body = URI.encode_www_form(form_data)
32
+ end
29
33
 
30
- def self.send_request(http_method, url, parameters, limit = DEFAULT_REDIRECT_LIMIT)
34
+ send_request(:Post, url, nil, body)
35
+ end
36
+
37
+ def self.send_request(http_method, url, parameters, body, limit = DEFAULT_REDIRECT_LIMIT)
31
38
  if limit <= 0
32
39
  raise RedirectLimitError, "request exceeded redirect limit"
33
40
  end
34
41
 
42
+ # Convert the URL (a String) into a URI object.
35
43
  uri = URI.parse(url)
36
- uri.query = URI.encode_www_form(parameters)
37
44
 
38
- options = { use_ssl: (uri.scheme == 'https') }
45
+ # Set the query string for the request.
46
+ uri.query = URI.encode_www_form(parameters) unless parameters.nil?
47
+
48
+ options = {
49
+ # If the URI starts with "https://", enable SSL/TLS.
50
+ use_ssl: (uri.scheme == 'https')
51
+ }
39
52
 
53
+ # Net::HTTP.start() keeps a connection to the host alive
54
+ # for all requests that occur inside the block.
40
55
  Net::HTTP.start(uri.host, uri.port, options) do |http|
41
- response = Net::HTTP.send(http_method, uri)
56
+ # Get a reference to the class for the specified request type.
57
+ # E.g., if it's a post request, this returns Net::HTTP::Post.
58
+ request_class = Net::HTTP.const_get(http_method)
59
+
60
+ # Create the request object, but don't send it yet.
61
+ request = request_class.new(uri)
62
+ # Set the request body, if there is one.
63
+ request.body = body unless body.nil?
64
+
65
+ # Send the request, storing the result in +response+.
66
+ response = http.request(request)
42
67
 
68
+ # Handle responses.
43
69
  case response
44
70
  when Net::HTTPSuccess
71
+ # Request succeeded; return the result.
45
72
  response
46
73
  when Net::HTTPRedirection
47
- send_request(METHODS[:get], response['location'], parameters, limit - 1)
74
+ # Follow a redirect.
75
+ # Decrements +limit+ while doing so, to avoid redirect loops.
76
+ #
77
+ # NOTE: This does not handle HTTP 307 correctly, as it always
78
+ # changes to a GET request. https://httpstatuses.com/307
79
+ send_request(:Get, response['location'], parameters, body, limit - 1)
48
80
  else
49
81
  # This seemingly-innocent method raises an exception if the request
50
82
  # isn't successful.
@@ -52,5 +84,6 @@ class Okay
52
84
  end
53
85
  end
54
86
  end
87
+ private_class_method :send_request
55
88
  end
56
89
  end
data/lib/okay/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Okay
2
- VERSION = "1.0.0"
2
+ VERSION = "2.0.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: okay
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ellen Marie Dash