protocol-http 0.17.0 → 0.18.0

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
  SHA256:
3
- metadata.gz: c02d05f1a36b888ef0420bcc999a1c84d81361f85ca1cf6a08d1f17a25dd9050
4
- data.tar.gz: e65e3f34864adbea7577c8bcd06df99834af884db393a4d625c567266398a1a2
3
+ metadata.gz: d8d2f576f6e7e6ce261d80fbdc0e38e2775b2f22ac156958b1e1b91472fdfec3
4
+ data.tar.gz: b450d401f5791db371761fd52a6c1adb32807a13659570a1ad0ef0d5ef3dd8d5
5
5
  SHA512:
6
- metadata.gz: d5fb517f1f766d093cc54cb8503d215b74606e501f6f0f873b129ad8299900ea8cdae619f2b94a1d9f1c936e37235384f0d505d8773716e7ce6b4af74c53423e
7
- data.tar.gz: 0e032fc0d601764a39404ddc5e28a98956295e049ca7c0a455977f2226f418db6beea4c65584ee549e8f5b798a4c284dfca71f17e82ccc37a704cf2f04f4c786
6
+ metadata.gz: 0be25839110052bd336f729800768eb8d8ef51bf15c2852b9bc526e20a6998177dadfc4e71b889681b16ba263f25dc14ea42e0835ce4f87de7d343936ff91ea8
7
+ data.tar.gz: bf48aa19e331906fcf518eed7c6c94243656856f034d6c44a90ecf41c0bd1807c1a540d836fc61d63d6cd3acc2a769b37f1898b608296578edc45866747659a6
@@ -35,16 +35,31 @@ module Protocol
35
35
  class Headers
36
36
  Split = Header::Split
37
37
  Multiple = Header::Multiple
38
+
38
39
  TRAILERS = 'trailers'
39
40
 
40
- # Construct an instance from a headers Array or Hash. No-op if already an instance of `Headers`.
41
+ # Construct an instance from a headers Array or Hash. No-op if already an instance of `Headers`. If the underlying array is frozen, it will be duped.
41
42
  # @return [Headers] an instance of headers.
42
43
  def self.[] headers
44
+ if headers.nil?
45
+ return self.new
46
+ end
47
+
43
48
  if headers.is_a?(self)
44
- headers
45
- else
46
- self.new(headers.to_a)
49
+ if headers.frozen?
50
+ return headers.dup
51
+ else
52
+ return headers
53
+ end
54
+ end
55
+
56
+ fields = headers.to_a
57
+
58
+ if fields.frozen?
59
+ fields = fields.dup
47
60
  end
61
+
62
+ return self.new(fields)
48
63
  end
49
64
 
50
65
  def initialize(fields = [], indexed = nil)
@@ -60,7 +75,6 @@ module Protocol
60
75
 
61
76
  @fields = @fields.dup
62
77
  @indexed = @indexed.dup
63
- @tail = nil
64
78
  end
65
79
 
66
80
  def clear
@@ -69,25 +83,43 @@ module Protocol
69
83
  @tail = nil
70
84
  end
71
85
 
72
- # An array of `[key, value]` pairs.
73
- attr :fields
86
+ # Flatten trailers into the headers.
87
+ def flatten!
88
+ if @tail
89
+ self.delete(TRAILERS)
90
+ @tail = nil
91
+ end
92
+
93
+ return self
94
+ end
74
95
 
75
- # Mark the subsequent headers as trailers.
76
- def trailers!
77
- @tail ||= @fields.size
96
+ def flatten
97
+ self.dup.flatten!
78
98
  end
79
99
 
100
+ # An array of `[key, value]` pairs.
101
+ attr :fields
102
+
80
103
  # @return the trailers if there are any.
81
104
  def trailers?
82
105
  @tail != nil
83
106
  end
84
107
 
85
- # Enumerate all trailers, including evaluating all deferred headers.
86
- def trailers(&block)
108
+ # Record the current headers, and prepare to receive trailers.
109
+ def trailers!(&block)
87
110
  return nil unless self.include?(TRAILERS)
88
111
 
89
- trailers!
112
+ @tail ||= @fields.size
90
113
 
114
+ return to_enum(:trailers!) unless block_given?
115
+
116
+ if @tail
117
+ @fields.drop(@tail).each(&block)
118
+ end
119
+ end
120
+
121
+ # Enumerate all trailers, if there are any.
122
+ def trailers(&block)
91
123
  return to_enum(:trailers) unless block_given?
92
124
 
93
125
  if @tail
@@ -51,7 +51,7 @@ module Protocol
51
51
 
52
52
  # Use Methods.constants to get all constants.
53
53
  self.each do |name, value|
54
- define_method(name.downcase) do |location, headers = [], body = nil|
54
+ define_method(name.downcase) do |location, headers = nil, body = nil|
55
55
  self.call(
56
56
  Request[value, location.to_str, Headers[headers], body]
57
57
  )
@@ -28,7 +28,7 @@ module Protocol
28
28
  class Request
29
29
  prepend Body::Reader
30
30
 
31
- def initialize(scheme = nil, authority = nil, method = nil, path = nil, version = nil, headers = [], body = nil, protocol = nil)
31
+ def initialize(scheme = nil, authority = nil, method = nil, path = nil, version = nil, headers = Headers.new, body = nil, protocol = nil)
32
32
  @scheme = scheme
33
33
  @authority = authority
34
34
  @method = method
@@ -48,12 +48,6 @@ module Protocol
48
48
  attr_accessor :body
49
49
  attr_accessor :protocol
50
50
 
51
- def trailers
52
- if @headers.respond_to?(:trailers)
53
- @headers.trailers
54
- end
55
- end
56
-
57
51
  # Send the request to the given connection.
58
52
  def call(connection)
59
53
  connection.call(self)
@@ -28,7 +28,7 @@ module Protocol
28
28
  class Response
29
29
  prepend Body::Reader
30
30
 
31
- def initialize(version = nil, status = 200, headers = [], body = nil, protocol = nil)
31
+ def initialize(version = nil, status = 200, headers = Headers.new, body = nil, protocol = nil)
32
32
  @version = version
33
33
  @status = status
34
34
  @headers = headers
@@ -42,12 +42,6 @@ module Protocol
42
42
  attr_accessor :body
43
43
  attr_accessor :protocol
44
44
 
45
- def trailers
46
- if @headers.respond_to?(:trailers)
47
- @headers.trailers
48
- end
49
- end
50
-
51
45
  def hijack?
52
46
  false
53
47
  end
@@ -88,7 +82,7 @@ module Protocol
88
82
  @status == 500
89
83
  end
90
84
 
91
- def self.[](status, headers = [], body = nil, protocol = nil)
85
+ def self.[](status, headers = nil, body = nil, protocol = nil)
92
86
  body = Body::Buffered.wrap(body)
93
87
  headers = ::Protocol::HTTP::Headers[headers]
94
88
 
@@ -22,6 +22,6 @@
22
22
 
23
23
  module Protocol
24
24
  module HTTP
25
- VERSION = "0.17.0"
25
+ VERSION = "0.18.0"
26
26
  end
27
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protocol-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-07 00:00:00.000000000 Z
11
+ date: 2020-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: covered