okay 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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