http2 0.0.28 → 0.0.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +27 -6
- data/VERSION +1 -1
- data/http2.gemspec +4 -3
- data/include/errors.rb +2 -2
- data/include/post_data_generator.rb +1 -1
- data/include/response.rb +6 -6
- data/include/response_reader.rb +2 -2
- data/include/utils.rb +7 -7
- data/lib/http2.rb +27 -11
- data/shippable.yml +3 -1
- data/spec/http2/response_spec.rb +17 -0
- data/spec/http2_spec.rb +3 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73d24887d39ea86831b94629d6dc98eed99333eb
|
4
|
+
data.tar.gz: 364f8d08601a1279bfdf2a214d02d545473a806a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a856ec3dd70d2db8640a53b109592acfd17af7ff66a3130a2200f4cf5b38317dc9e51cf2996a871a5d959f957de78361f63b069d88dc84d69fb19e8deeba9771
|
7
|
+
data.tar.gz: fd6d03348ab61b6b5b18cca4c0f27369d23bdf756d9f8fc9d5ee40a92e16fd90b054265f171b5ff8599f2141656873980011dfb0273096dc3cc0b690ed042d46
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Example of usage:
|
|
10
10
|
require "rubygems"
|
11
11
|
require "http2"
|
12
12
|
|
13
|
-
Http2.new(:
|
13
|
+
Http2.new(host: "www.google.dk") do |http|
|
14
14
|
#Get-request.
|
15
15
|
res = http.get("path/to/something")
|
16
16
|
puts res.body
|
@@ -18,17 +18,17 @@ Http2.new(:host => "www.google.dk") do |http|
|
|
18
18
|
puts "Specific header: #{res.header("HeaderName")}"
|
19
19
|
|
20
20
|
#Post-request.
|
21
|
-
res = http.post(:
|
21
|
+
res = http.post(url: "path/to/something", post: {
|
22
22
|
"some_post_val" => "some_value"
|
23
23
|
})
|
24
24
|
|
25
25
|
res.content_type #=> "text/html"
|
26
26
|
|
27
27
|
#Post-multipart (upload).
|
28
|
-
res = http.post_multipart(:
|
28
|
+
res = http.post_multipart(url: "path/to/something", post: {
|
29
29
|
"test_file1" => {
|
30
|
-
:
|
31
|
-
:
|
30
|
+
fpath: fpath,
|
31
|
+
filename: "specfile"
|
32
32
|
}
|
33
33
|
})
|
34
34
|
|
@@ -36,6 +36,28 @@ Http2.new(:host => "www.google.dk") do |http|
|
|
36
36
|
end
|
37
37
|
```
|
38
38
|
|
39
|
+
## Get parameters.
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
http.host => example.com
|
43
|
+
http.port => 80
|
44
|
+
```
|
45
|
+
|
46
|
+
## Response details.
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
resp = http.get("path/to/something")
|
50
|
+
resp.content_type #=> "text/html"
|
51
|
+
resp.content_length #=> 136
|
52
|
+
resp.header("content-length") #=> "136"
|
53
|
+
resp.headers #=> {"content-type" => ["text/html"], "content-length" => ["136"]}
|
54
|
+
resp.code #=> "200"
|
55
|
+
resp.charset #=> "utf-8"
|
56
|
+
resp.http_version #=> "1.1"
|
57
|
+
resp.body #=> "<html><body>..."
|
58
|
+
resp.requested_url #=> "http://example.com/maybe/redirected/path/to/something"
|
59
|
+
```
|
60
|
+
|
39
61
|
|
40
62
|
## Reconnect
|
41
63
|
|
@@ -59,4 +81,3 @@ http.reconnect
|
|
59
81
|
|
60
82
|
Copyright (c) 2012 Kasper Johansen. See LICENSE.txt for
|
61
83
|
further details.
|
62
|
-
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.29
|
data/http2.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: http2 0.0.
|
5
|
+
# stub: http2 0.0.29 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "http2"
|
9
|
-
s.version = "0.0.
|
9
|
+
s.version = "0.0.29"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Kasper Johansen"]
|
14
|
-
s.date = "2014-12-
|
14
|
+
s.date = "2014-12-04"
|
15
15
|
s.description = "A lightweight framework for doing http-connections in Ruby. Supports cookies, keep-alive, compressing and much more."
|
16
16
|
s.email = "k@spernj.org"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
"lib/http2.rb",
|
42
42
|
"shippable.yml",
|
43
43
|
"spec/http2/post_data_generator_spec.rb",
|
44
|
+
"spec/http2/response_spec.rb",
|
44
45
|
"spec/http2/url_builder_spec.rb",
|
45
46
|
"spec/http2_spec.rb",
|
46
47
|
"spec/spec_helper.rb"
|
data/include/errors.rb
CHANGED
@@ -53,7 +53,7 @@ private
|
|
53
53
|
|
54
54
|
def generate_key_value(key, value)
|
55
55
|
if value.is_a?(Hash) || value.is_a?(Array)
|
56
|
-
return ::Http2::PostDataGenerator.new(value, :
|
56
|
+
return ::Http2::PostDataGenerator.new(value, orig_key: key).generate
|
57
57
|
else
|
58
58
|
data = ::Http2::PostDataGenerator.new(value).generate
|
59
59
|
return "#{Http2::Utils.urlenc(key)}=#{Http2::Utils.urlenc(data)}"
|
data/include/response.rb
CHANGED
@@ -7,7 +7,7 @@ class Http2::Response
|
|
7
7
|
#This method should not be called manually.
|
8
8
|
def initialize(args = {})
|
9
9
|
@args = args
|
10
|
-
@args[:headers] = {}
|
10
|
+
@args[:headers] = {} unless @args.key?(:headers)
|
11
11
|
@body = args[:body] || ""
|
12
12
|
@debug = @args[:debug]
|
13
13
|
end
|
@@ -31,7 +31,7 @@ class Http2::Response
|
|
31
31
|
#===Examples
|
32
32
|
# print "No content-type was given." if !http.header?("content-type")
|
33
33
|
def header?(key)
|
34
|
-
return true if @args[:headers].key?(key)
|
34
|
+
return true if @args[:headers].key?(key) && @args[:headers][key].first.to_s.length > 0
|
35
35
|
return false
|
36
36
|
end
|
37
37
|
|
@@ -43,7 +43,7 @@ class Http2::Response
|
|
43
43
|
#===Examples
|
44
44
|
# res.requested_url #=> "?show=status&action=getstatus"
|
45
45
|
def requested_url
|
46
|
-
raise "URL could not be detected."
|
46
|
+
raise "URL could not be detected." unless @args[:request_args][:url]
|
47
47
|
return @args[:request_args][:url]
|
48
48
|
end
|
49
49
|
|
@@ -53,7 +53,7 @@ class Http2::Response
|
|
53
53
|
validate_body_versus_content_length!
|
54
54
|
end
|
55
55
|
|
56
|
-
|
56
|
+
private
|
57
57
|
|
58
58
|
# Checks that the length of the body is the same as the given content-length if given.
|
59
59
|
def validate_body_versus_content_length!
|
@@ -62,7 +62,7 @@ class Http2::Response
|
|
62
62
|
return nil
|
63
63
|
end
|
64
64
|
|
65
|
-
content_length =
|
65
|
+
content_length = header("content-length").to_i
|
66
66
|
body_length = @body.bytesize
|
67
67
|
|
68
68
|
puts "Http2: Body length: #{body_length}" if @debug
|
@@ -70,4 +70,4 @@ class Http2::Response
|
|
70
70
|
|
71
71
|
raise "Body does not match the given content-length: '#{body_length}', '#{content_length}'." if body_length != content_length
|
72
72
|
end
|
73
|
-
end
|
73
|
+
end
|
data/include/response_reader.rb
CHANGED
@@ -4,7 +4,7 @@ class Http2::ResponseReader
|
|
4
4
|
def initialize(args)
|
5
5
|
@mode = "headers"
|
6
6
|
@transfer_encoding = nil
|
7
|
-
@response = Http2::Response.new(:
|
7
|
+
@response = Http2::Response.new(request_args: args, debug: @debug)
|
8
8
|
@rec_count = 0
|
9
9
|
@args, @debug, @http2, @sock = args[:args], args[:http2].debug, args[:http2], args[:sock]
|
10
10
|
@nl = @http2.nl
|
@@ -169,7 +169,7 @@ private
|
|
169
169
|
content_type_line.gsub!(match_charset[0], "")
|
170
170
|
end
|
171
171
|
|
172
|
-
@response.content_type =
|
172
|
+
@response.content_type = content_type_line
|
173
173
|
end
|
174
174
|
|
175
175
|
#Parse a header-line and saves it on the object.
|
data/include/utils.rb
CHANGED
@@ -7,7 +7,7 @@ class Http2::Utils
|
|
7
7
|
'%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
|
8
8
|
end.tr(' ', '+')
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
#URL-decodes a string.
|
12
12
|
def self.urldec(string)
|
13
13
|
#Thanks to CGI framework
|
@@ -15,26 +15,26 @@ class Http2::Utils
|
|
15
15
|
[$1.delete('%')].pack('H*')
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
#Parses a cookies-string and returns them in an array.
|
20
20
|
def self.parse_set_cookies(str)
|
21
21
|
str = String.new(str.to_s)
|
22
22
|
return [] if str.length <= 0
|
23
23
|
args = {}
|
24
24
|
cookie_start_regex = /^(.+?)=(.*?)(;\s*|$)/
|
25
|
-
|
25
|
+
|
26
26
|
match = str.match(cookie_start_regex)
|
27
27
|
raise "Could not match cookie: '#{str}'." if !match
|
28
28
|
str.gsub!(cookie_start_regex, "")
|
29
|
-
|
29
|
+
|
30
30
|
args["name"] = self.urldec(match[1].to_s)
|
31
31
|
args["value"] = self.urldec(match[2].to_s)
|
32
|
-
|
32
|
+
|
33
33
|
while match = str.match(/(.+?)=(.*?)(;\s*|$)/)
|
34
34
|
str = str.gsub(match[0], "")
|
35
35
|
args[match[1].to_s.downcase] = match[2].to_s
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
return [args]
|
39
39
|
end
|
40
|
-
end
|
40
|
+
end
|
data/lib/http2.rb
CHANGED
@@ -5,7 +5,7 @@ require "string-cases"
|
|
5
5
|
|
6
6
|
#This class tries to emulate a browser in Ruby without any visual stuff. Remember cookies, keep sessions alive, reset connections according to keep-alive rules and more.
|
7
7
|
#===Examples
|
8
|
-
# Http2.new(:
|
8
|
+
# Http2.new(host: "www.somedomain.com", port: 80, ssl: false, debug: false) do |http|
|
9
9
|
# res = http.get("index.rhtml?show=some_page")
|
10
10
|
# html = res.body
|
11
11
|
# print html
|
@@ -23,7 +23,7 @@ class Http2
|
|
23
23
|
|
24
24
|
#Converts a URL to "is.gd"-short-URL.
|
25
25
|
def self.isgdlink(url)
|
26
|
-
Http2.new(:
|
26
|
+
Http2.new(host: "is.gd") do |http|
|
27
27
|
resp = http.get("/api.php?longurl=#{url}")
|
28
28
|
return resp.body
|
29
29
|
end
|
@@ -50,14 +50,22 @@ class Http2
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
def host
|
54
|
+
@args[:host]
|
55
|
+
end
|
56
|
+
|
57
|
+
def port
|
58
|
+
@args[:port]
|
59
|
+
end
|
60
|
+
|
53
61
|
def reconnect
|
54
62
|
@connection.reconnect
|
55
63
|
end
|
56
64
|
|
57
65
|
def new_url
|
58
66
|
builder = Http2::UrlBuilder.new
|
59
|
-
builder.host =
|
60
|
-
builder.port =
|
67
|
+
builder.host = host
|
68
|
+
builder.port = port
|
61
69
|
builder.protocol = @args[:protocol]
|
62
70
|
|
63
71
|
return builder
|
@@ -89,7 +97,7 @@ class Http2
|
|
89
97
|
#Forces various stuff into arguments-hash like URL from original arguments and enables single-string-shortcuts and more.
|
90
98
|
def parse_args(*args)
|
91
99
|
if args.length == 1 && args.first.is_a?(String)
|
92
|
-
args = {:
|
100
|
+
args = {url: args.first}
|
93
101
|
elsif args.length >= 2
|
94
102
|
raise "Couldnt parse arguments."
|
95
103
|
elsif args.is_a?(Array) && args.length == 1
|
@@ -116,9 +124,9 @@ class Http2
|
|
116
124
|
# Proxies the request to another method but forces the method to be "DELETE".
|
117
125
|
def delete(args)
|
118
126
|
if args[:json]
|
119
|
-
return post(args.merge(:
|
127
|
+
return post(args.merge(method: :delete))
|
120
128
|
else
|
121
|
-
return get(args.merge(:
|
129
|
+
return get(args.merge(method: :delete))
|
122
130
|
end
|
123
131
|
end
|
124
132
|
|
@@ -135,8 +143,8 @@ class Http2
|
|
135
143
|
}
|
136
144
|
|
137
145
|
#Possible to give custom host-argument.
|
138
|
-
host = args[:host] ||
|
139
|
-
port = args[:port] ||
|
146
|
+
host = args[:host] || self.host
|
147
|
+
port = args[:port] || self.port
|
140
148
|
|
141
149
|
headers["Host"] = host
|
142
150
|
headers["Host"] << ":#{port}" if port && ![80, 443].include?(port.to_i) && !@args[:skip_port_in_host_header]
|
@@ -212,6 +220,14 @@ class Http2
|
|
212
220
|
::Http2::ResponseReader.new(http2: self, sock: @sock, args: args).response
|
213
221
|
end
|
214
222
|
|
223
|
+
def to_s
|
224
|
+
"<Http2 host: #{host}:#{port}>"
|
225
|
+
end
|
226
|
+
|
227
|
+
def inspect
|
228
|
+
to_s
|
229
|
+
end
|
230
|
+
|
215
231
|
private
|
216
232
|
|
217
233
|
#Registers the states from a result.
|
@@ -237,7 +253,7 @@ private
|
|
237
253
|
end
|
238
254
|
|
239
255
|
def parse_init_args(args)
|
240
|
-
args = {:
|
256
|
+
args = {host: args} if args.is_a?(String)
|
241
257
|
raise "Arguments wasnt a hash." unless args.is_a?(Hash)
|
242
258
|
|
243
259
|
args.each do |key, val|
|
@@ -273,4 +289,4 @@ private
|
|
273
289
|
@raise_errors = false
|
274
290
|
end
|
275
291
|
end
|
276
|
-
end
|
292
|
+
end
|
data/shippable.yml
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Http2::Response do
|
4
|
+
it "should register content type" do
|
5
|
+
Http2.new(host: "http2test.kaspernj.org") do |http|
|
6
|
+
res = http.get("content_type_test.php")
|
7
|
+
res.content_type.should eq "text/html"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should register content length" do
|
12
|
+
Http2.new(host: "http2test.kaspernj.org") do |http|
|
13
|
+
res = http.get("content_type_test.php")
|
14
|
+
res.content_length.should > 50
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/spec/http2_spec.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
|
+
require "json"
|
2
3
|
|
3
4
|
describe "Http2" do
|
4
5
|
it "should be able to do normal post-requests." do
|
5
|
-
require "json"
|
6
|
-
|
7
6
|
#Test posting keep-alive and advanced post-data.
|
8
7
|
Http2.new(host: "www.partyworm.dk", debug: false) do |http|
|
9
8
|
0.upto(5) do
|
@@ -154,4 +153,4 @@ describe "Http2" do
|
|
154
153
|
resp.code.should eq "200"
|
155
154
|
end
|
156
155
|
end
|
157
|
-
end
|
156
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.29
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kasper Johansen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: string-cases
|
@@ -111,6 +111,7 @@ files:
|
|
111
111
|
- lib/http2.rb
|
112
112
|
- shippable.yml
|
113
113
|
- spec/http2/post_data_generator_spec.rb
|
114
|
+
- spec/http2/response_spec.rb
|
114
115
|
- spec/http2/url_builder_spec.rb
|
115
116
|
- spec/http2_spec.rb
|
116
117
|
- spec/spec_helper.rb
|