http2 0.0.22 → 0.0.23
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.
- data/VERSION +1 -1
- data/http2.gemspec +2 -2
- data/include/errors.rb +5 -11
- data/lib/http2.rb +19 -12
- data/spec/http2_spec.rb +39 -7
- metadata +16 -16
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.23
|
data/http2.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "http2"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.23"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date = "2013-
|
12
|
+
s.date = "2013-11-15"
|
13
13
|
s.description = "A lightweight framework for doing http-connections in Ruby. Supports cookies, keep-alive, compressing and much more."
|
14
14
|
s.email = "k@spernj.org"
|
15
15
|
s.extra_rdoc_files = [
|
data/include/errors.rb
CHANGED
@@ -1,17 +1,11 @@
|
|
1
1
|
#This class holds various classes for error-handeling.
|
2
2
|
class Http2::Errors
|
3
|
-
|
4
|
-
class Noaccess < RuntimeError
|
3
|
+
class Http2error < RuntimeError
|
5
4
|
attr_accessor :response
|
6
5
|
end
|
7
6
|
|
8
|
-
|
9
|
-
class Internalserver <
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
#Raised when a page is not found.
|
14
|
-
class Notfound < RuntimeError
|
15
|
-
attr_accessor :response
|
16
|
-
end
|
7
|
+
class Noaccess < Http2error; end
|
8
|
+
class Internalserver < Http2error; end
|
9
|
+
class Notfound < Http2error; end
|
10
|
+
class Badrequest < Http2error; end
|
17
11
|
end
|
data/lib/http2.rb
CHANGED
@@ -286,8 +286,6 @@ class Http2
|
|
286
286
|
|
287
287
|
if !@args.key?(:encoding_gzip) or @args[:encoding_gzip]
|
288
288
|
headers["Accept-Encoding"] = "gzip"
|
289
|
-
else
|
290
|
-
#headers["Accept-Encoding"] = "none"
|
291
289
|
end
|
292
290
|
|
293
291
|
if @args[:basic_auth]
|
@@ -350,7 +348,7 @@ class Http2
|
|
350
348
|
return praw
|
351
349
|
end
|
352
350
|
|
353
|
-
VALID_ARGUMENTS_POST = [:post, :url, :default_headers, :headers, :json, :method, :cookies, :on_content]
|
351
|
+
VALID_ARGUMENTS_POST = [:post, :url, :default_headers, :headers, :json, :method, :cookies, :on_content, :content_type]
|
354
352
|
#Posts to a certain page.
|
355
353
|
#===Examples
|
356
354
|
# res = http.post("login.php", {"username" => "John Doe", "password" => 123)
|
@@ -360,7 +358,6 @@ class Http2
|
|
360
358
|
end
|
361
359
|
|
362
360
|
args = self.parse_args(args)
|
363
|
-
content_type = "application/x-www-form-urlencoded"
|
364
361
|
|
365
362
|
if args.key?(:method) && args[:method]
|
366
363
|
method = args[:method].to_s.upcase
|
@@ -370,7 +367,7 @@ class Http2
|
|
370
367
|
|
371
368
|
if args[:json]
|
372
369
|
require "json" unless ::Kernel.const_defined?(:JSON)
|
373
|
-
praw =
|
370
|
+
praw = args[:json].to_json
|
374
371
|
content_type = "application/json"
|
375
372
|
elsif args[:post].is_a?(String)
|
376
373
|
praw = args[:post]
|
@@ -379,15 +376,16 @@ class Http2
|
|
379
376
|
autostate_set_on_post_hash(phash) if @args[:autostate]
|
380
377
|
praw = Http2.post_convert_data(phash)
|
381
378
|
end
|
379
|
+
|
380
|
+
content_type = args[:content_type] || content_type || "application/x-www-form-urlencoded"
|
382
381
|
|
383
382
|
@mutex.synchronize do
|
384
|
-
puts "Doing post." if @debug
|
383
|
+
puts "Http2: Doing post." if @debug
|
385
384
|
|
386
385
|
header_str = "#{method} /#{args[:url]} HTTP/1.1#{@nl}"
|
387
386
|
header_str << self.header_str({"Content-Length" => praw.bytesize, "Content-Type" => content_type}.merge(self.default_headers(args)), args)
|
388
387
|
header_str << @nl
|
389
388
|
header_str << praw
|
390
|
-
header_str << @nl
|
391
389
|
|
392
390
|
puts "Http2: Header str: #{header_str}" if @debug
|
393
391
|
|
@@ -509,10 +507,15 @@ class Http2
|
|
509
507
|
first = false if first
|
510
508
|
|
511
509
|
if cookie_data.is_a?(Hash)
|
512
|
-
|
510
|
+
name = cookie_data["name"]
|
511
|
+
value = cookie_data["value"]
|
513
512
|
else
|
514
|
-
|
513
|
+
name = cookie_name
|
514
|
+
value = cookie_data
|
515
515
|
end
|
516
|
+
|
517
|
+
raise "Unexpected lines: #{value.lines.to_a.length}." if value.lines.to_a.length != 1
|
518
|
+
cstr << "#{Http2::Utils.urlenc(name)}=#{Http2::Utils.urlenc(value)}"
|
516
519
|
end
|
517
520
|
|
518
521
|
headers_hash["Cookie"] = cstr
|
@@ -568,7 +571,7 @@ class Http2
|
|
568
571
|
|
569
572
|
break if line.to_s == ""
|
570
573
|
|
571
|
-
if @mode == "headers" and line ==
|
574
|
+
if @mode == "headers" and (line == "\n" || line == "\r\n")
|
572
575
|
puts "Http2: Changing mode to body!" if @debug
|
573
576
|
raise "No headers was given at all? Possibly corrupt state after last request?" if @resp.headers.empty?
|
574
577
|
break if @length == 0
|
@@ -654,6 +657,10 @@ class Http2
|
|
654
657
|
err = Http2::Errors::Noaccess.new(resp.body)
|
655
658
|
err.response = resp
|
656
659
|
raise err
|
660
|
+
elsif @raise_errors && resp.args[:code].to_i == 400
|
661
|
+
err = Http2::Errors::Badrequest.new(resp.body)
|
662
|
+
err.response = resp
|
663
|
+
raise err
|
657
664
|
elsif @raise_errors && resp.args[:code].to_i == 404
|
658
665
|
err = Http2::Errors::Notfound.new(resp.body)
|
659
666
|
err.response = resp
|
@@ -734,14 +741,14 @@ class Http2
|
|
734
741
|
|
735
742
|
if len > 0
|
736
743
|
read = @sock.read(len)
|
737
|
-
return "break" if read == "" or read ==
|
744
|
+
return "break" if read == "" or (read == "\n" || read == "\r\n")
|
738
745
|
@resp.args[:body] << read
|
739
746
|
self.on_content_call(args, read)
|
740
747
|
end
|
741
748
|
|
742
749
|
nl = @sock.gets
|
743
750
|
if len == 0
|
744
|
-
if nl ==
|
751
|
+
if nl == "\n" || nl == "\r\n"
|
745
752
|
return "break"
|
746
753
|
else
|
747
754
|
raise "Dont know what to do :'-("
|
data/spec/http2_spec.rb
CHANGED
@@ -97,12 +97,13 @@ describe "Http2" do
|
|
97
97
|
]
|
98
98
|
urls = ["robots.txt"]
|
99
99
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
100
|
+
Http2.new(:host => "www.partyworm.dk", :debug => false) do |http|
|
101
|
+
0.upto(105) do |count|
|
102
|
+
url = urls[rand(urls.size)]
|
103
|
+
#print "Doing request #{count} of 200 (#{url}).\n"
|
104
|
+
res = http.get(url)
|
105
|
+
raise "Body was empty." if res.body.to_s.length <= 0
|
106
|
+
end
|
106
107
|
end
|
107
108
|
end
|
108
109
|
|
@@ -113,7 +114,38 @@ describe "Http2" do
|
|
113
114
|
|
114
115
|
it "should raise exception when something is not found" do
|
115
116
|
expect{
|
116
|
-
|
117
|
+
Http2.new(:host => "www.partyworm.dk") do |http|
|
118
|
+
http.get("something_that_does_not_exist.php")
|
119
|
+
end
|
117
120
|
}.to raise_error
|
118
121
|
end
|
122
|
+
|
123
|
+
it "should be able to post json" do
|
124
|
+
Http2.new(:host => "http2test.kaspernj.org") do |http|
|
125
|
+
res = http.post(
|
126
|
+
:url => "/jsontest.php",
|
127
|
+
:json => {:testkey => "testvalue"}
|
128
|
+
)
|
129
|
+
|
130
|
+
data = JSON.parse(res.body)
|
131
|
+
data["_SERVER"]["CONTENT_TYPE"].should eql("application/json")
|
132
|
+
data["PHP_JSON_INPUT"]["testkey"].should eql("testvalue")
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should be able to post custom content types" do
|
137
|
+
require "json"
|
138
|
+
|
139
|
+
Http2.new(:host => "http2test.kaspernj.org") do |http|
|
140
|
+
res = http.post(
|
141
|
+
:url => "/content_type_test.php",
|
142
|
+
:content_type => "plain/text",
|
143
|
+
:post => "test1_test2_test3"
|
144
|
+
)
|
145
|
+
|
146
|
+
data = JSON.parse(res.body)
|
147
|
+
data["_SERVER"]["CONTENT_TYPE"].should eql("plain/text")
|
148
|
+
data["PHP_INPUT"].should eql("test1_test2_test3")
|
149
|
+
end
|
150
|
+
end
|
119
151
|
end
|
metadata
CHANGED
@@ -1,75 +1,75 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.22
|
5
4
|
prerelease:
|
5
|
+
version: 0.0.23
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kasper Johansen
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
16
|
none: false
|
18
17
|
requirements:
|
19
18
|
- - ~>
|
20
19
|
- !ruby/object:Gem::Version
|
21
20
|
version: 2.8.0
|
21
|
+
name: rspec
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
|
24
|
+
requirement: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 2.8.0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
-
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
31
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
32
|
none: false
|
34
33
|
requirements:
|
35
34
|
- - ~>
|
36
35
|
- !ruby/object:Gem::Version
|
37
36
|
version: '3.12'
|
37
|
+
name: rdoc
|
38
38
|
type: :development
|
39
39
|
prerelease: false
|
40
|
-
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '3.12'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
|
-
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
47
|
+
version_requirements: !ruby/object:Gem::Requirement
|
49
48
|
none: false
|
50
49
|
requirements:
|
51
50
|
- - ! '>='
|
52
51
|
- !ruby/object:Gem::Version
|
53
52
|
version: 1.0.0
|
53
|
+
name: bundler
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
|
-
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 1.0.0
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
|
-
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
64
|
none: false
|
66
65
|
requirements:
|
67
66
|
- - ~>
|
68
67
|
- !ruby/object:Gem::Version
|
69
68
|
version: 1.8.4
|
69
|
+
name: jeweler
|
70
70
|
type: :development
|
71
71
|
prerelease: false
|
72
|
-
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
@@ -111,10 +111,10 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
111
|
requirements:
|
112
112
|
- - ! '>='
|
113
113
|
- !ruby/object:Gem::Version
|
114
|
-
version: '0'
|
115
114
|
segments:
|
116
115
|
- 0
|
117
|
-
hash: -
|
116
|
+
hash: -1592181993674694658
|
117
|
+
version: '0'
|
118
118
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
119
|
none: false
|
120
120
|
requirements:
|