async-http 0.14.0 → 0.15.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: b07a59ffce216d83fd5e3f811a083fb0525b61d6678fc4607b9a2092c257ae4e
4
- data.tar.gz: b619d0fabeca58dbbecd30d40731c6d5299d4021776442c8f58b3fd8ed0f7cda
3
+ metadata.gz: 87ea5fdd1668b7c17d499ee05a4d32a295560594c4d6a503c21efd9a3ea82a10
4
+ data.tar.gz: a1ad20020eecb10d1d295ba881c02c3cbefe82cb3a2e1d6453ce1cc082823535
5
5
  SHA512:
6
- metadata.gz: 1df280a96aef2b8920d99fe8a60a4a4d7cbdd5067e9b89bec26575ef9959cdcd16ce7782a89f4b2f338726e6777da2c789e0e7337acfe6f58bc751d4ab55cb7b
7
- data.tar.gz: cb7c45c8fc13828c789d110c41b2814298d98724802b5f63c2bf18053f10abd6ee7a96bf114cf4fe664e2506270cb44e71ee201dcc54082f108afa1df8754853
6
+ metadata.gz: 20966b6b196f4429295f9c765734ac52aa90709960fba46955e3769bcb360d820082f6d2555e1d5aa8b821f2f49630e47c592576c80fbc66faccf286915faef9
7
+ data.tar.gz: 2ed5fee97702faaf317adfca97c2bc5af6c2e1d21b17856fd8e66109cb7e831ba7f960ea809496038eacff1474b5d2694f7da579b87633dc5260f3d4dca3376e
@@ -26,24 +26,34 @@ module Async
26
26
  def initialize
27
27
  super
28
28
 
29
- @closed = false
29
+ @finished = false
30
30
  end
31
31
 
32
- def closed?
33
- @closed
32
+ def finished?
33
+ @finished
34
34
  end
35
35
 
36
36
  def each
37
- return if @closed
37
+ return if @finished
38
38
 
39
39
  while chunk = self.dequeue
40
40
  yield chunk
41
41
  end
42
42
 
43
- @closed = true
43
+ @finished = true
44
44
  end
45
45
 
46
46
  def read
47
+ return if @finished
48
+
49
+ unless chunk = self.dequeue
50
+ @finished = true
51
+ end
52
+
53
+ return chunk
54
+ end
55
+
56
+ def join
47
57
  buffer = Async::IO::BinaryString.new
48
58
 
49
59
  self.each do |chunk|
@@ -59,7 +69,7 @@ module Async
59
69
  self.enqueue(chunk)
60
70
  end
61
71
 
62
- def close
72
+ def finish
63
73
  self.enqueue(nil)
64
74
  end
65
75
  end
@@ -67,6 +77,7 @@ module Async
67
77
  class BufferedBody
68
78
  def initialize(body)
69
79
  @chunks = []
80
+ @index = 0
70
81
 
71
82
  body.each do |chunk|
72
83
  @chunks << chunk
@@ -74,26 +85,45 @@ module Async
74
85
  end
75
86
 
76
87
  def each(&block)
77
- @chunks.each(&block)
88
+ while @index < @chunks.count
89
+ yield @chunks[@index]
90
+ @index += 1
91
+ end
78
92
  end
79
93
 
80
94
  def read
81
- @buffer ||= @chunks.join
95
+ if chunk = @chunks[@index]
96
+ @index += 1
97
+ end
98
+
99
+ return chunk
82
100
  end
83
101
 
84
- alias join read
102
+ def join
103
+ buffer = Async::IO::BinaryString.new
104
+
105
+ self.each do |chunk|
106
+ buffer << chunk
107
+ end
108
+
109
+ return buffer
110
+ end
111
+
112
+ def rewind
113
+ @index = 0
114
+ end
85
115
 
86
- def closed?
116
+ def finished?
87
117
  true
88
118
  end
89
119
 
90
120
  module Reader
91
121
  def read
92
- self.body ? self.body.read : nil
122
+ self.body ? self.body.join : nil
93
123
  end
94
124
 
95
- def close
96
- return if self.body.nil? or self.body.closed?
125
+ def finish
126
+ return if self.body.nil? or self.body.finished?
97
127
 
98
128
  unless self.body.is_a? BufferedBody
99
129
  self.body = BufferedBody.new(self.body)
@@ -102,30 +132,84 @@ module Async
102
132
  end
103
133
  end
104
134
 
105
- class FixedBody
106
- CHUNK_LENGTH = 1024*1024
135
+ class ChunkedBody
136
+ def initialize(protocol)
137
+ @protocol = protocol
138
+ @finished = false
139
+ end
140
+
141
+ def finished?
142
+ @finished
143
+ end
107
144
 
145
+ def read
146
+ return nil if @finished
147
+
148
+ size = @protocol.read_line.to_i(16)
149
+
150
+ if size == 0
151
+ @protocol.read_line
152
+
153
+ @finished = true
154
+
155
+ return nil
156
+ end
157
+
158
+ chunk = @protocol.stream.read(size)
159
+ @protocol.read_line # Consume the trailing CRLF
160
+
161
+ return chunk
162
+ end
163
+
164
+ def each
165
+ while chunk = self.read
166
+ yield chunk
167
+ end
168
+ end
169
+
170
+ def join
171
+ buffer = Async::IO::BinaryString.new
172
+
173
+ self.each do |chunk|
174
+ buffer << chunk
175
+ end
176
+
177
+ return buffer
178
+ end
179
+
180
+ def finish
181
+ self.each {}
182
+ end
183
+ end
184
+
185
+ class FixedBody
108
186
  def initialize(length, stream)
109
187
  @length = length
110
188
  @remaining = length
111
189
  @stream = stream
112
190
  end
113
191
 
114
- def closed?
192
+ def finished?
115
193
  @remaining == 0
116
194
  end
117
195
 
118
196
  def each
119
- while @remaining > 0
120
- if chunk = @stream.read(CHUNK_LENGTH)
197
+ while chunk = self.read
198
+ yield chunk
199
+ end
200
+ end
201
+
202
+ def read
203
+ if @remaining > 0
204
+ if chunk = @stream.read(@remaining)
121
205
  @remaining -= chunk.bytesize
122
206
 
123
- yield chunk
207
+ return chunk
124
208
  end
125
209
  end
126
210
  end
127
211
 
128
- def read
212
+ def join
129
213
  buffer = @stream.read(@remaining)
130
214
 
131
215
  @remaining = 0
@@ -135,7 +219,7 @@ module Async
135
219
 
136
220
  alias join read
137
221
 
138
- def close
222
+ def finish
139
223
  read
140
224
  end
141
225
  end
@@ -70,7 +70,7 @@ module Async
70
70
  yield response if block_given?
71
71
  ensure
72
72
  # This forces the stream to complete reading.
73
- response.close
73
+ response.finish
74
74
  end
75
75
 
76
76
  return response
@@ -72,7 +72,7 @@ module Async
72
72
 
73
73
  write_response(request.version, status, headers, body)
74
74
 
75
- request.close
75
+ request.finish
76
76
 
77
77
  unless keep_alive?(request.headers) and keep_alive?(headers)
78
78
  @keep_alive = false
@@ -180,52 +180,6 @@ module Async
180
180
  end
181
181
  end
182
182
 
183
- class ChunkedBody
184
- def initialize(protocol)
185
- @protocol = protocol
186
- @closed = false
187
- end
188
-
189
- def closed?
190
- @closed
191
- end
192
-
193
- def each
194
- return if @closed
195
-
196
- while true
197
- size = @protocol.read_line.to_i(16)
198
-
199
- if size == 0
200
- @protocol.read_line
201
-
202
- @closed = true
203
-
204
- return
205
- end
206
-
207
- chunk = @protocol.stream.read(size)
208
- @protocol.read_line # Consume the trailing CRLF
209
-
210
- yield chunk
211
- end
212
- end
213
-
214
- def read
215
- buffer = Async::IO::BinaryString.new
216
-
217
- self.each do |chunk|
218
- buffer << chunk
219
- end
220
-
221
- return buffer
222
- end
223
-
224
- def close
225
- self.each {}
226
- end
227
- end
228
-
229
183
  def read_body(headers)
230
184
  if headers['transfer-encoding'] == 'chunked'
231
185
  return ChunkedBody.new(self)
@@ -127,7 +127,7 @@ module Async
127
127
  stream.on(:half_close) do
128
128
  response = yield request
129
129
 
130
- request.body.close
130
+ request.body.finish
131
131
 
132
132
  # send response
133
133
  headers = {STATUS => response[0].to_s}
@@ -202,8 +202,8 @@ module Async
202
202
 
203
203
  stream.on(:close) do
204
204
  Async.logger.debug(self) {"Stream closed, sending signal."}
205
- # TODO should we prefer response.close?
206
- response.body.close
205
+ # TODO should we prefer `response.finish`?
206
+ response.body.finish
207
207
  end
208
208
 
209
209
  @stream.flush
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Async
22
22
  module HTTP
23
- VERSION = "0.14.0"
23
+ VERSION = "0.15.0"
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.15.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: 2018-04-09 00:00:00.000000000 Z
11
+ date: 2018-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async