http-client 0.1.0 → 0.1.1

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: 53ce70d44f5b7cf0dbc85317ce3d6f6606b9c8e1
4
- data.tar.gz: 4eaa5aee72f9e60d288b6c9b52ba883ef88798a4
3
+ metadata.gz: 8833622cfb8dd5390e0daae8a669265432903ba5
4
+ data.tar.gz: 76efa57c394ef3b0ea0073426161c8cb9e7f04db
5
5
  SHA512:
6
- metadata.gz: fae9eb821a1e374769f9dd8c2134f00817f62de88d77fcfaf3f02db284c45fc0e3c2faaef9bb88bec627c9dd055e3ac20a69af2f522133e955f1c667f081cb71
7
- data.tar.gz: 8fb4cbc0035594e46e4f2d66b76e59cd639dc95d41906c6757c77e2162ab5576a2db4f5f507cdd3e2908adcd331bebe1280ea76d9c12eaf2bd0720c000883520
6
+ metadata.gz: 28020a9dd60ca5f2415e4dcb3b44005550147afea1cf39232c962c22c06210b924ba3366b32b2f88137696499817b7abda4c5f1adff55ebaad07f6178df0687c
7
+ data.tar.gz: 6c2cc5c1e1e9e92e994e4e7164b98771d1eed5f3ceb019a01fc6ece374e7e26c8c759e3e7d72214550ea7985e07528dfd57a99a8b7940aacebd453db6adf112a
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ == 0.1.1 (2016-06-08)
2
+
3
+ * Less restrictive dependency versions.
4
+ * Fix body assignment in requests.
5
+ * Tests
6
+
1
7
  == 0.1.0 (2016-06-08)
2
8
 
3
9
  * Initial version.
data/README.md CHANGED
@@ -16,7 +16,11 @@ res = HTTP::Client::Request.new(:get, "http://www.example.org", max_redirects: 2
16
16
 
17
17
  # save a few keystrokes.
18
18
  res = HTTP::Client.get("http://www.example.org/", max_redirects: 2)
19
- res = HTTP::Client.post("http://www.example.org/", files: {pic: "kittens.jpg"}, query: {title: "the usual suspects"})
19
+ res = HTTP::Client.post(
20
+ "http://www.example.org/",
21
+ files: {pic: "kittens.jpg"},
22
+ query: {title: "the usual suspects"}
23
+ )
20
24
  ```
21
25
 
22
26
  ## API
@@ -36,20 +40,20 @@ HTTP::Client::Response
36
40
 
37
41
  ### Request parameters
38
42
 
39
- Required:
43
+ #### Required
40
44
 
41
45
  | Name | Type | Description |
42
46
  |------|------|-------------|
43
47
  | verb | Symbol | HTTP verb, one of :get, :head, :put, :post, :delete, :options, :trace. |
44
- | uri | String | Remote URI |
48
+ | uri | String or URI | Remote URI |
45
49
 
46
- Optional arguments hash:
50
+ #### Optional arguments hash
47
51
 
48
52
  | Name | Type | Description |
49
53
  |------|------|-------------|
50
54
  | headers | Hash | Net::HTTP headers, in key-value pairs. |
51
55
  | query | Hash | Net::HTTP query-string in key-value pairs. |
52
- | files | Hash | Multi-part file uploads, in key-value pairs of {name => path_to_file} or {name => File} |
56
+ | files | Hash | Multi-part file uploads, in key-value pairs of {name => path_to_file} or {name => [File]} |
53
57
  | body | String | Request body. |
54
58
  | auth | Hash | Basic-Auth hash. {username: "...", password: "..."} |
55
59
  | timeout | Integer | Fixed timeout for connection, read and ssl handshake in seconds. |
@@ -60,6 +64,10 @@ Optional arguments hash:
60
64
  | ssl_verify | Integer | OpenSSL verification, HTTP::Client::SSL_VERIFY_PEER or HTTP::Client::SSL_VERIFY_NONE, defaults to SSL_VERIFY_PEER. |
61
65
  | jar | HTTP::CookieJar | Optional cookie jar to use. Relies on HTTP::CookieJar from http-cookie gem. |
62
66
 
67
+ ## TODO
68
+
69
+ Extensive testing :/
70
+
63
71
  ## License
64
72
 
65
73
  MIT
data/lib/http-client.rb CHANGED
@@ -1,3 +1,3 @@
1
- require 'http/simple'
1
+ require_relative 'http/client'
2
2
 
3
3
 
data/lib/http/client.rb CHANGED
@@ -7,7 +7,7 @@ require 'http-cookie'
7
7
 
8
8
  module HTTP
9
9
  module Client
10
- VERSION = '0.1.0'
10
+ VERSION = '0.1.1'
11
11
 
12
12
  GET = Net::HTTP::Get
13
13
  HEAD = Net::HTTP::Head
@@ -32,7 +32,7 @@ module HTTP
32
32
  # Create a new HTTP Client Request.
33
33
  #
34
34
  # @param verb [Symbol] HTTP verb, one of :get, :head, :put, :post, :delete, :options, :trace.
35
- # @param uri [String] Remote URI
35
+ # @param uri [String] or [URI] Remote URI.
36
36
  # @param headers [Hash] Net::HTTP headers, in key-value pairs.
37
37
  # @param query [Hash] Net::HTTP query-string in key-value pairs.
38
38
  # @param files [Hash] Multi-part file uploads, in key-value pairs of {name => path_to_file} or {name => File}
@@ -57,7 +57,7 @@ module HTTP
57
57
  setup_request_delegate! verb, args
58
58
 
59
59
  if body = args[:body]
60
- raise ArgumentError, "#{verb} cannot have body" unless klass.const_get(:REQUEST_HAS_BODY)
60
+ raise ArgumentError, "#{verb} cannot have body" unless @delegate.class.const_get(:REQUEST_HAS_BODY)
61
61
  @delegate.body = body
62
62
  end
63
63
 
@@ -115,7 +115,7 @@ module HTTP
115
115
 
116
116
  private
117
117
  def parse_uri! uri
118
- @uri = URI.parse(uri)
118
+ @uri = uri.kind_of?(URI) ? uri : URI.parse(uri)
119
119
  case @uri
120
120
  when URI::HTTP, URI::HTTPS
121
121
  # ok
@@ -209,7 +209,7 @@ module HTTP
209
209
  end
210
210
 
211
211
  def headers
212
- @headers ||= @response.each_header.entries
212
+ @headers ||= Hash[@response.each_header.entries]
213
213
  end
214
214
 
215
215
  def body
data/test/helper.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  require 'bundler/setup'
2
-
3
- require 'http/client'
4
2
  require 'minitest/spec'
5
3
  require 'minitest/autorun'
6
4
  require 'minitest/reporters'
5
+ require 'server'
6
+ require 'http-client'
7
7
 
8
8
  Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
9
9
 
data/test/server.rb ADDED
@@ -0,0 +1,54 @@
1
+ require 'webrick'
2
+ require 'stringio'
3
+ require 'socket'
4
+ require 'uri'
5
+
6
+ class TestServer
7
+ attr_reader :port
8
+
9
+ def initialize app
10
+ @app = app
11
+ @port = find_port
12
+ end
13
+
14
+ def run path = '/'
15
+ logfile = StringIO.new
16
+ logger = WEBrick::Log.new logfile
17
+ accesslog = [[logfile, WEBrick::AccessLog::COMBINED_LOG_FORMAT]]
18
+
19
+ @server = WEBrick::HTTPServer.new Port: @port, Logger: logger, AccessLog: accesslog
20
+ @server.mount_proc(path) do |req, res|
21
+ code, headers, body = @app.call(req)
22
+ res.status = code
23
+ headers.each do |k, v|
24
+ res[k] = v
25
+ end
26
+ res.body = [body].flatten.join
27
+ end
28
+
29
+ Thread.abort_on_exception = true
30
+ @thread = Thread.new {@server.start}
31
+ end
32
+
33
+ def stop
34
+ @thread && @thread.kill
35
+ end
36
+
37
+ def root
38
+ URI.parse("http://127.0.0.1:#{port}/")
39
+ end
40
+
41
+ private
42
+ def find_port
43
+ @tcp = nil
44
+ for port in 32768..65535
45
+ @tcp = TCPServer.new('127.0.0.1', port) rescue nil
46
+ break if @tcp
47
+ end
48
+
49
+ @tcp or raise RuntimeError 'Unable to find a local TCP port to bind.'
50
+ port = @tcp.addr[1]
51
+ @tcp.close
52
+ port
53
+ end
54
+ end
data/test/test_request.rb CHANGED
@@ -19,16 +19,89 @@ describe 'HTTP Client Request' do
19
19
  files: {test1: __FILE__, test2: __FILE__},
20
20
  max_redirects: 2,
21
21
  timeout: 10,
22
- ssl_verify: HTTP::Client::SSL_VERIFY_NONE
22
+ ssl_verify: HTTP::Client::SSL_VERIFY_NONE,
23
+ body: 'Hello world!'
23
24
  )
24
25
  end
25
26
 
26
- # TODO: mock http endpoint
27
27
  it 'executes a request and returns reponse' do
28
- assert HTTP::Client.get("http://www.google.com")
28
+ app = proc {|req| [200, {}, "Hello World!"]}
29
+ server = TestServer.new(app)
30
+ server.run
31
+
32
+ response = HTTP::Client.get(server.root)
33
+ server.stop
34
+ assert response
35
+ assert_kind_of Hash, response.headers
29
36
  end
30
37
 
31
38
  it 'raises timeout errors' do
32
- assert_raises(Net::OpenTimeout) {HTTP::Client.get("http://dingus.in:1000/", timeout: 0.2)}
39
+ app = proc {|req| sleep }
40
+ server = TestServer.new(app)
41
+ server.run
42
+ assert_raises(Net::ReadTimeout) {HTTP::Client.get(server.root, timeout: 0.2)}
43
+ end
44
+
45
+ it 'handles redirects' do
46
+ app = proc do |req|
47
+ case req.path
48
+ when '/redirect2'
49
+ [200, {}, "Hello World!"]
50
+ when '/redirect1'
51
+ [302, {'Location' => '/redirect2'}, "Moved!"]
52
+ when '/'
53
+ [302, {'Location' => '/redirect1'}, "Moved!"]
54
+ end
55
+ end
56
+ server = TestServer.new(app)
57
+ server.run
58
+
59
+ response = HTTP::Client.get(server.root)
60
+ assert_equal 302, response.code
61
+ assert_equal %Q{#{server.root + "/redirect1"}}, response.headers['location']
62
+
63
+ response = HTTP::Client.get(server.root, max_redirects: 1)
64
+ assert_equal 302, response.code
65
+ assert_equal %Q{#{server.root + "/redirect1"}}, response.last_effective_uri.to_s
66
+ assert_equal %Q{#{server.root + "/redirect2"}}, response.headers['location']
67
+
68
+ response = HTTP::Client.get(server.root, max_redirects: 2)
69
+ assert_equal 200, response.code
70
+ assert_equal %Q{#{server.root + "/redirect2"}}, response.last_effective_uri.to_s
71
+ end
72
+
73
+ it 'posts url encoded form' do
74
+ qs = {}
75
+ app = proc do |req|
76
+ qs = req.query
77
+ [200, {}, "OK!"]
78
+ end
79
+ server = TestServer.new(app)
80
+ server.run
81
+
82
+ response = HTTP::Client.post(server.root, query: {test1: "test2"})
83
+ server.stop
84
+ assert_equal 200, response.code
85
+ assert_equal "test2", qs["test1"]
86
+ end
87
+
88
+ it 'posts multi-part encoded data' do
89
+ qs = {}
90
+ app = proc do |req|
91
+ qs = req.query
92
+ [200, {}, "OK!"]
93
+ end
94
+ server = TestServer.new(app)
95
+ server.run
96
+
97
+ response = HTTP::Client.post(server.root, files: {this: __FILE__}, query: {test1: "test2"})
98
+ server.stop
99
+
100
+ assert_equal 200, response.code
101
+ assert_equal "test2", qs["test1"]
102
+
103
+ data = IO.read(__FILE__)
104
+ assert_equal data, qs["this"]
105
+ assert_equal File.basename(__FILE__), qs["this"].filename # people should stop overloading / extending String!
33
106
  end
34
107
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bharanee Rathna
@@ -16,14 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.1'
19
+ version: '3.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: '3.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
- version: '3.1'
29
+ version: '3.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '3.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: http-cookie
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -31,6 +37,9 @@ dependencies:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
39
  version: '1.0'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '1.0'
34
43
  type: :runtime
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,34 +47,49 @@ dependencies:
38
47
  - - "~>"
39
48
  - !ruby/object:Gem::Version
40
49
  version: '1.0'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '1.0'
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: rake
43
55
  requirement: !ruby/object:Gem::Requirement
44
56
  requirements:
45
57
  - - "~>"
46
58
  - !ruby/object:Gem::Version
47
- version: '11.1'
59
+ version: '11.0'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '11.0'
48
63
  type: :development
49
64
  prerelease: false
50
65
  version_requirements: !ruby/object:Gem::Requirement
51
66
  requirements:
52
67
  - - "~>"
53
68
  - !ruby/object:Gem::Version
54
- version: '11.1'
69
+ version: '11.0'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '11.0'
55
73
  - !ruby/object:Gem::Dependency
56
74
  name: minitest-reporters
57
75
  requirement: !ruby/object:Gem::Requirement
58
76
  requirements:
59
77
  - - "~>"
60
78
  - !ruby/object:Gem::Version
61
- version: '1.1'
79
+ version: '1.0'
80
+ - - ">"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
62
83
  type: :development
63
84
  prerelease: false
64
85
  version_requirements: !ruby/object:Gem::Requirement
65
86
  requirements:
66
87
  - - "~>"
67
88
  - !ruby/object:Gem::Version
68
- version: '1.1'
89
+ version: '1.0'
90
+ - - ">"
91
+ - !ruby/object:Gem::Version
92
+ version: '1.0'
69
93
  description: Light weight wrapper around Net::HTTP
70
94
  email:
71
95
  - deepfryed@gmail.com
@@ -78,6 +102,7 @@ files:
78
102
  - lib/http-client.rb
79
103
  - lib/http/client.rb
80
104
  - test/helper.rb
105
+ - test/server.rb
81
106
  - test/test_request.rb
82
107
  homepage: http://github.com/deepfryed/http-client
83
108
  licenses: