http_objects 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +56 -0
  5. data/Rakefile +12 -0
  6. data/http_objects.gemspec +20 -0
  7. data/lib/http_objects/hash.rb +51 -0
  8. data/lib/http_objects/headers/attributes.rb +38 -0
  9. data/lib/http_objects/headers/directives/cache.rb +80 -0
  10. data/lib/http_objects/headers/entity.rb +43 -0
  11. data/lib/http_objects/headers/general.rb +42 -0
  12. data/lib/http_objects/headers/request.rb +116 -0
  13. data/lib/http_objects/headers/response.rb +55 -0
  14. data/lib/http_objects/headers/tools.rb +29 -0
  15. data/lib/http_objects/headers.rb +27 -0
  16. data/lib/http_objects/headers_hash.rb +25 -0
  17. data/lib/http_objects/parameters/basic_rules.rb +62 -0
  18. data/lib/http_objects/parameters/date_time.rb +19 -0
  19. data/lib/http_objects/parameters/entity_tags.rb +27 -0
  20. data/lib/http_objects/parameters/language_tags.rb +16 -0
  21. data/lib/http_objects/parameters/media_type.rb +29 -0
  22. data/lib/http_objects/parameters/uri.rb +21 -0
  23. data/lib/http_objects/parameters.rb +15 -0
  24. data/lib/http_objects/version.rb +3 -0
  25. data/lib/http_objects.rb +5 -0
  26. data/test/http_objects/hash_test.rb +74 -0
  27. data/test/http_objects/headers/attributes_test.rb +26 -0
  28. data/test/http_objects/headers/directives/cache_test.rb +72 -0
  29. data/test/http_objects/headers/entity/allow_test.rb +13 -0
  30. data/test/http_objects/headers/entity/content_encoding_test.rb +13 -0
  31. data/test/http_objects/headers/entity/content_language_test.rb +13 -0
  32. data/test/http_objects/headers/entity/content_lenght_test.rb +13 -0
  33. data/test/http_objects/headers/entity/content_location_test.rb +13 -0
  34. data/test/http_objects/headers/entity/content_md5_test.rb +13 -0
  35. data/test/http_objects/headers/entity/content_type_test.rb +12 -0
  36. data/test/http_objects/headers/entity/expires_test.rb +12 -0
  37. data/test/http_objects/headers/entity/last_modified_test.rb +12 -0
  38. data/test/http_objects/headers/general_test.rb +59 -0
  39. data/test/http_objects/headers/request/host_test.rb +13 -0
  40. data/test/http_objects/headers/request/if_match_test.rb +21 -0
  41. data/test/http_objects/headers/request/if_modified_since_test.rb +13 -0
  42. data/test/http_objects/headers/request/if_none_match_test.rb +21 -0
  43. data/test/http_objects/headers/request/if_range_test.rb +21 -0
  44. data/test/http_objects/headers/request/if_unmodified_since_test.rb +13 -0
  45. data/test/http_objects/headers/request/max_forwards_test.rb +13 -0
  46. data/test/http_objects/headers/request/referer_test.rb +13 -0
  47. data/test/http_objects/headers/response/age_test.rb +13 -0
  48. data/test/http_objects/headers/response/etag_test.rb +13 -0
  49. data/test/http_objects/headers/response/location_test.rb +13 -0
  50. data/test/http_objects/headers/response/retry_after_test.rb +21 -0
  51. data/test/http_objects/headers/tools_test.rb +28 -0
  52. data/test/http_objects/headers_hash_test.rb +18 -0
  53. data/test/http_objects/http_objects_test.rb +4 -0
  54. data/test/http_objects/parameters/basic_rules_test.rb +73 -0
  55. data/test/http_objects/parameters/date_time_test.rb +43 -0
  56. data/test/http_objects/parameters/entity_tags_test.rb +43 -0
  57. data/test/http_objects/parameters/language_tags_test.rb +36 -0
  58. data/test/http_objects/parameters/media_type_test.rb +22 -0
  59. data/test/http_objects/parameters/uri_test.rb +36 -0
  60. data/test/test_helper.rb +7 -0
  61. metadata +202 -0
@@ -0,0 +1,62 @@
1
+ module HttpObjects::Parameters
2
+
3
+ # 2.2 Basic Rules
4
+ # This module implement some basic parsing constructs, from RFC 2616.
5
+ module BasicRules
6
+
7
+ # Public: Base interface for HTTP Header.
8
+ # HTTP Header should have:
9
+ #
10
+ # # parse method that returns self instance.
11
+ # Base.parse("value") # => <# Base instance >
12
+ #
13
+ # # constructor with raw and value.
14
+ # header = Base.new("raw", "value")
15
+ class Base
16
+ attr_reader :raw, :value
17
+
18
+ def self.parse(value)
19
+ raise "Not implemented. You should override this method and return an instance of yourself. See HttpObjects::Parameters::BasicRules source for examples."
20
+ end
21
+
22
+ def initialize(raw, value)
23
+ @raw, @value = raw, value
24
+ end
25
+ end
26
+
27
+ # Public: Mapped to String.
28
+ # token = 1*<any CHAR except CTLs or separators>
29
+ class Token < Base
30
+ def self.parse(value)
31
+ self.new(value, value)
32
+ end
33
+ end
34
+
35
+ # Public: Mapped to Integer.
36
+ # DIGIT = <any US-ASCII digit "0".."9">
37
+ class Digit < Base
38
+ def self.parse(value)
39
+ self.new(value, value.to_i)
40
+ end
41
+ end
42
+
43
+ # Public: Mapped to String#upcase.
44
+ # UPALPHA = <any US-ASCII uppercase letter "A".."Z">
45
+ class UpAlpha < Base
46
+ def self.parse(value)
47
+ self.new(value, value.to_s.upcase)
48
+ end
49
+ end
50
+
51
+ # Public: Mapped to String#downcase.
52
+ # LOALPHA = <any US-ASCII lowercase letter "a".."z">
53
+ class LoAlpha < Base
54
+ def self.parse(value)
55
+ self.new(value, value.to_s.downcase)
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
@@ -0,0 +1,19 @@
1
+ require "time"
2
+
3
+ module HttpObjects::Parameters
4
+
5
+ # 3.3. Date/Time Formats
6
+ # Examples
7
+ # Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
8
+ # Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
9
+ class DateTime < HttpObjects::Parameters::BasicRules::Base
10
+
11
+ def self.parse(value)
12
+ raw = value
13
+ value = Time.parse(value, true) rescue nil
14
+ self.new(raw, value)
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,27 @@
1
+ module HttpObjects::Parameters
2
+
3
+ # 3.11 Entity Tags
4
+ #
5
+ # Examples
6
+ # "123456789" -- A strong ETag validator
7
+ # W/"123456789" -- A weak ETag validator
8
+ class EntityTags < HttpObjects::Parameters::BasicRules::Base
9
+
10
+ def self.parse(value)
11
+ raw = value
12
+ if (match = value.match(/("\w*")/))
13
+ value = match[1]
14
+ else
15
+ value = ""
16
+ end
17
+ self.new(raw, value.to_s)
18
+ end
19
+
20
+ # Returns true if raw start with 'W/'
21
+ def weak?
22
+ @raw.start_with?("W/")
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,16 @@
1
+ module HttpObjects::Parameters
2
+
3
+ # 3.10 Language Tags
4
+ # Examples
5
+ # en, en-US, en-cockney, i-cherokee, x-pig-latin
6
+ class LanguageTags < HttpObjects::Parameters::BasicRules::Base
7
+
8
+ def self.parse(value)
9
+ raw = value
10
+ value = value.to_s.gsub(/(\s+)/, "").split(",")
11
+ self.new(raw, value)
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,29 @@
1
+ module HttpObjects::Parameters
2
+
3
+ # 3.7. Media Types
4
+ # Examples
5
+ # text/html; charset=ISO-8859-4
6
+ class MediaType
7
+
8
+ attr_reader :raw, :value, :parameters
9
+
10
+ def self.parse(value)
11
+ raw = value
12
+ value, params = value.split(";", 2)
13
+
14
+ parameters = {}
15
+ params.split(/\s*;\s*/).each do |param|
16
+ name, param_value = param.split(/=/)
17
+ name = name.gsub(/\s*/, "")
18
+ parameters[name.downcase] = param_value
19
+ end
20
+ self.new(raw, value, parameters)
21
+ end
22
+
23
+ def initialize(raw, value, parameters)
24
+ @raw, @value, @parameters = raw, value, parameters
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,21 @@
1
+ require "uri"
2
+
3
+ module HttpObjects::Parameters
4
+
5
+ # 3.2 Uniform Resource Identifiers
6
+ # Examples
7
+ # http://abc.com:80/~smith/home.html
8
+ # /~smith/home.html
9
+ class Uri < HttpObjects::Parameters::BasicRules::Base
10
+
11
+ def self.parse(value)
12
+ raw = value
13
+ if !(value.nil? || value == "")
14
+ value = URI.parse(value.to_s)
15
+ end
16
+ self.new(raw, value)
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,15 @@
1
+ require "http_objects/parameters/basic_rules"
2
+ require "http_objects/parameters/uri"
3
+ require "http_objects/parameters/date_time"
4
+ require "http_objects/parameters/media_type"
5
+ require "http_objects/parameters/language_tags"
6
+ require "http_objects/parameters/entity_tags"
7
+
8
+ module HttpObjects
9
+
10
+ # 3 Protocol Parameters
11
+ # This module have implementatios for Protocol Parameters from RFC 2616.
12
+ module Parameters
13
+ end
14
+
15
+ end
@@ -0,0 +1,3 @@
1
+ module HttpObjects
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,5 @@
1
+ require "http_objects/version"
2
+
3
+ require "http_objects/parameters"
4
+ require "http_objects/headers"
5
+ require "http_objects/headers_hash"
@@ -0,0 +1,74 @@
1
+ require "test_helper"
2
+
3
+ describe HttpObjects::Hash do
4
+
5
+ MyObject = Class.new do
6
+ attr_reader :value, :raw
7
+ def self.header_name
8
+ "MyObject"
9
+ end
10
+ def self.parse(value)
11
+ self.new(value)
12
+ end
13
+ def initialize(value)
14
+ @raw, @value = value
15
+ end
16
+ end
17
+
18
+ class TestHash < HttpObjects::Hash
19
+ add_attribute(MyObject)
20
+ end
21
+
22
+ subject { TestHash.new }
23
+
24
+ describe "#initialize" do
25
+ subject { TestHash }
26
+ it "without value" do
27
+ subject.new.must_be_kind_of(HttpObjects::Hash)
28
+ end
29
+ it "with values" do
30
+ hash = subject.new("MyObject" => "value")
31
+ hash["MyObject"].must_be_instance_of(MyObject)
32
+ end
33
+ it "should reuse same object" do
34
+ hash_headers = subject.new("MyObject" => "value")
35
+ hash = subject.new(hash_headers)
36
+ hash.must_be_same_as(hash_headers)
37
+ end
38
+ end
39
+
40
+ describe "#[]=" do
41
+ it "simple value" do
42
+ subject["chave"] = "valor"
43
+ subject["chave"].must_equal("valor")
44
+ end
45
+ it "HTTP Header value" do
46
+ subject["MyObject"] = "value"
47
+ subject["MyObject"].must_be_instance_of(MyObject)
48
+ end
49
+ it "without value" do
50
+ subject["MyObject"].must_be_nil
51
+ end
52
+ end
53
+
54
+ describe "#store as alias of []=" do
55
+ it "simple value" do
56
+ subject.store("chave", "valor")
57
+ subject["chave"].must_equal("valor")
58
+ end
59
+ it "HTTP Header value" do
60
+ subject.store("MyObject", "value")
61
+ subject["MyObject"].must_be_instance_of(MyObject)
62
+ end
63
+ end
64
+
65
+ it "header as instance method" do
66
+ subject.store("MyObject", "value")
67
+ subject["MyObject"].must_be_instance_of(MyObject)
68
+
69
+ subject.myobject.must_be_instance_of(MyObject)
70
+ subject.myobject?.must_equal(true)
71
+ subject.myobject!.must_equal("value")
72
+ end
73
+
74
+ end
@@ -0,0 +1,26 @@
1
+ require "test_helper"
2
+
3
+ class TestSubject
4
+ extend HttpObjects::Headers::Attributes
5
+ end
6
+
7
+ describe HttpObjects::Headers::Attributes do
8
+
9
+ MyAttribute = Class.new
10
+
11
+ it "#register_attribute - register header on .attributes" do
12
+ TestSubject.register_attribute("MyAttribute", MyAttribute)
13
+ TestSubject.attributes.must_equal({"MyAttribute" => MyAttribute})
14
+ end
15
+
16
+ it "#register_attribute - should yield block if given" do
17
+ flag = "out block"
18
+ TestSubject.register_attribute("MyAttribute", MyAttribute) do |name, h|
19
+ name.must_equal("MyAttribute")
20
+ h.must_be_same_as(MyAttribute)
21
+ flag = "inner block"
22
+ end
23
+ flag.must_equal("inner block")
24
+ end
25
+
26
+ end
@@ -0,0 +1,72 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Directives
4
+
5
+ describe Cache do
6
+
7
+ describe "should accept empty declarations" do
8
+ subject { Cache.parse("") }
9
+ it "#raw" do
10
+ subject.raw.must_be_empty
11
+ end
12
+ it "#value" do
13
+ subject.value.must_be_empty
14
+ end
15
+ it "directives be false or zero" do
16
+ subject.no_cache?.must_equal(false)
17
+ subject.no_store?.must_equal(false)
18
+ subject.max_age?.must_equal(false)
19
+ subject.max_stale?.must_equal(false)
20
+ subject.min_fresh?.must_equal(false)
21
+ subject.no_transform?.must_equal(false)
22
+ subject.only_if_cached?.must_equal(false)
23
+ subject.public?.must_equal(false)
24
+ subject.private?.must_equal(false)
25
+ subject.must_revalidate?.must_equal(false)
26
+ subject.proxy_revalidate?.must_equal(false)
27
+ subject.s_maxage?.must_equal(false)
28
+ end
29
+ end
30
+
31
+ describe "should accept one-directive declaration" do
32
+ subject { Cache.parse("no-cache") }
33
+ it "#no_cache? be true" do
34
+ subject.no_cache?.must_equal(true)
35
+ end
36
+ end
37
+
38
+ describe "should accept standalone directives" do
39
+ subject { Cache.parse("no-cache, public") }
40
+
41
+ it "#public?" do
42
+ subject.public?.must_equal(true)
43
+ end
44
+ end
45
+
46
+ describe "should accept multi-directive declaration" do
47
+ subject { Cache.parse("no-cache, max-age=600, private = \"Accept\"") }
48
+
49
+ it "#no_cache? be true" do
50
+ subject.no_cache?.must_equal(true)
51
+ end
52
+ it "#max_age be 600" do
53
+ subject.max_age?.must_equal(true)
54
+ subject.max_age.value.must_equal(600)
55
+ end
56
+ it "#private be Accept" do
57
+ subject.private!.must_equal("Accept")
58
+ end
59
+ end
60
+
61
+ describe "should accept extension directives" do
62
+ subject { Cache.parse("private, community=\"UCI\", stand-alone-extension") }
63
+
64
+ it "should access extension directive with value" do
65
+ subject["community"].must_equal("UCI")
66
+ end
67
+ it "should access extension directive without value" do
68
+ subject.key?("stand-alone-extension").must_equal(true)
69
+ end
70
+ end
71
+
72
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Entity
4
+
5
+ describe Allow do
6
+
7
+ subject { Allow.parse("GET, HEAD, PUT") }
8
+
9
+ it "should be BasicRules::UpAlpha object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::UpAlpha)
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Entity
4
+
5
+ describe ContentEncoding do
6
+
7
+ subject { ContentEncoding.parse("Gzip") }
8
+
9
+ it "should be BasicRules::LoAlpha object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::LoAlpha)
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Entity
4
+
5
+ describe ContentLanguage do
6
+
7
+ subject { ContentLanguage.parse("text/html; charset=ISO-8859-4") }
8
+
9
+ it "should be Language Tags object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::LanguageTags)
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Entity
4
+
5
+ describe ContentLength do
6
+
7
+ subject { ContentLength.parse("3495") }
8
+
9
+ it "should be BasicRules::Digit object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::Digit)
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Entity
4
+
5
+ describe ContentLocation do
6
+
7
+ subject { ContentLocation.parse("/relative_path") }
8
+
9
+ it "should be Uri object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::Uri)
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Entity
4
+
5
+ describe ContentMD5 do
6
+
7
+ subject { ContentMD5.parse("aad883420fe64e865ba1725e5617222c") }
8
+
9
+ it "should be Token object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::Token)
11
+ end
12
+
13
+ end
@@ -0,0 +1,12 @@
1
+ require "test_helper"
2
+
3
+ describe HttpObjects::Headers::Entity::ContentType do
4
+
5
+ let(:subject_class) { HttpObjects::Headers::Entity::ContentType }
6
+ subject { subject_class.parse("text/html; charset=ISO-8859-4") }
7
+
8
+ it "should be Media Type object" do
9
+ subject.must_be_kind_of(HttpObjects::Parameters::MediaType)
10
+ end
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+ require "test_helper"
2
+
3
+ describe HttpObjects::Headers::Entity::Expires do
4
+
5
+ let(:subject_class) { HttpObjects::Headers::Entity::Expires }
6
+ subject { subject_class.parse("Sun, 06 Nov 1994 08:49:37 GMT") }
7
+
8
+ it "should be Date Time object" do
9
+ subject.must_be_kind_of(HttpObjects::Parameters::DateTime)
10
+ end
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+ require "test_helper"
2
+
3
+ describe HttpObjects::Headers::Entity::LastModified do
4
+
5
+ let(:subject_class) { HttpObjects::Headers::Entity::LastModified }
6
+ subject { subject_class.parse("Sun, 06 Nov 1994 08:49:37 GMT") }
7
+
8
+ it "should be Date Time object" do
9
+ subject.must_be_kind_of(HttpObjects::Parameters::DateTime)
10
+ end
11
+
12
+ end
@@ -0,0 +1,59 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::General
4
+
5
+ describe CacheControl do
6
+ subject { CacheControl.parse("no-cache, public") }
7
+ it "should be Cache directive object" do
8
+ subject.must_be_kind_of(HttpObjects::Headers::Directives::Cache)
9
+ end
10
+ end
11
+
12
+ describe Connection do
13
+ subject { Connection.parse("close") }
14
+ it "should be Token object" do
15
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::Token)
16
+ end
17
+ end
18
+
19
+ describe HttpObjects::Headers::General::Date do
20
+ subject { HttpObjects::Headers::General::Date.parse("Tue, 15 Nov 1994 08:12:31 GMT") }
21
+ it "should be DateTime object" do
22
+ subject.must_be_kind_of(HttpObjects::Parameters::DateTime)
23
+ end
24
+ end
25
+
26
+ describe Pragma do
27
+ subject { Pragma.parse("") }
28
+ it "should be Token object" do
29
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::Token)
30
+ end
31
+ end
32
+
33
+ describe Trailer do
34
+ subject { Trailer.parse("") }
35
+ it "should be Token object" do
36
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::Token)
37
+ end
38
+ end
39
+
40
+ describe Upgrade do
41
+ subject { Upgrade.parse("HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11") }
42
+ it "should be Token object" do
43
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::Token)
44
+ end
45
+ end
46
+
47
+ describe Via do
48
+ subject { Via.parse("1.0 fred, 1.1 nowhere.com (Apache/1.1)") }
49
+ it "should be Token object" do
50
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::Token)
51
+ end
52
+ end
53
+
54
+ describe Warning do
55
+ subject { Warning.parse("") }
56
+ it "should be Token object" do
57
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::Token)
58
+ end
59
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Request
4
+
5
+ describe Host do
6
+
7
+ subject { Host.parse("www.w3.org") }
8
+
9
+ it "should be Uri object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::Uri)
11
+ end
12
+
13
+ end
@@ -0,0 +1,21 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Request
4
+
5
+ describe IfMatch do
6
+
7
+ describe "*" do
8
+ subject { IfMatch.parse("*") }
9
+ it "should be Token object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::Token)
11
+ end
12
+ end
13
+
14
+ describe '"xyzzy"' do
15
+ subject { IfMatch.parse('"xyzzy"') }
16
+ it "should be EntityTags object" do
17
+ subject.must_be_kind_of(HttpObjects::Parameters::EntityTags)
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Request
4
+
5
+ describe IfModifiedSince do
6
+
7
+ subject { IfModifiedSince.parse("Sat, 29 Oct 1994 19:43:31 GMT") }
8
+
9
+ it "should be Date Time object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::DateTime)
11
+ end
12
+
13
+ end
@@ -0,0 +1,21 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Request
4
+
5
+ describe IfNoneMatch do
6
+
7
+ describe "*" do
8
+ subject { IfNoneMatch.parse("*") }
9
+ it "should be Token object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::BasicRules::Token)
11
+ end
12
+ end
13
+
14
+ describe '"xyzzy"' do
15
+ subject { IfNoneMatch.parse('"xyzzy"') }
16
+ it "should be EntityTags object" do
17
+ subject.must_be_kind_of(HttpObjects::Parameters::EntityTags)
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Request
4
+
5
+ describe IfRange do
6
+
7
+ describe "entity-tag" do
8
+ subject { IfRange.parse('W/"xyzzy"') }
9
+ it "should be EntityTags object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::EntityTags)
11
+ end
12
+ end
13
+
14
+ describe "HTTP-date" do
15
+ subject { IfRange.parse("Sat, 29 Oct 1994 19:43:31 GMT") }
16
+ it "should be Date Time object" do
17
+ subject.must_be_kind_of(HttpObjects::Parameters::DateTime)
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ include HttpObjects::Headers::Request
4
+
5
+ describe IfUnmodifiedSince do
6
+
7
+ subject { IfUnmodifiedSince.parse("Sat, 29 Oct 1994 19:43:31 GMT") }
8
+
9
+ it "should be Date Time object" do
10
+ subject.must_be_kind_of(HttpObjects::Parameters::DateTime)
11
+ end
12
+
13
+ end