@@ -59,7 +59,7 @@ impl<R: Read> ChunkedDecoder<R> {
59
59
60
60
fn decode_init ( buffer : Block < ' static > , pos : & Position ) -> io:: Result < DecodeResult > {
61
61
dbg ! ( pos) ;
62
- dbg ! ( std:: str :: from_utf8( & buffer[ pos. start..pos. end] ) . unwrap ( ) ) ;
62
+ dbg ! ( std:: str :: from_utf8( & buffer[ pos. start..pos. end] ) ) ;
63
63
64
64
use httparse:: Status ;
65
65
match httparse:: parse_chunk_size ( & buffer[ pos. start ..pos. end ] ) {
@@ -91,7 +91,7 @@ fn decode_init(buffer: Block<'static>, pos: &Position) -> io::Result<DecodeResul
91
91
92
92
fn decode_chunk_end ( buffer : Block < ' static > , pos : & Position ) -> io:: Result < DecodeResult > {
93
93
dbg ! ( pos) ;
94
- dbg ! ( std:: str :: from_utf8( & buffer[ pos. start..pos. end] ) . unwrap ( ) ) ;
94
+ dbg ! ( std:: str :: from_utf8( & buffer[ pos. start..pos. end] ) ) ;
95
95
96
96
if pos. len ( ) < 2 {
97
97
return Ok ( DecodeResult :: None ( buffer) ) ;
@@ -120,7 +120,7 @@ fn decode_trailer(buffer: Block<'static>, pos: &Position) -> io::Result<DecodeRe
120
120
// read headers
121
121
let mut headers = [ httparse:: EMPTY_HEADER ; 16 ] ;
122
122
dbg ! ( pos) ;
123
- dbg ! ( std:: str :: from_utf8( & buffer[ pos. start..pos. end] ) . unwrap ( ) ) ;
123
+ dbg ! ( std:: str :: from_utf8( & buffer[ pos. start..pos. end] ) ) ;
124
124
125
125
match httparse:: parse_headers ( & buffer[ pos. start ..pos. end ] , & mut headers) {
126
126
Ok ( Status :: Complete ( ( used, headers) ) ) => {
@@ -162,61 +162,100 @@ impl<R: Read + Unpin> ChunkedDecoder<R> {
162
162
current : u64 ,
163
163
len : u64 ,
164
164
) -> io:: Result < DecodeResult > {
165
+ dbg ! ( "poll_read_chunk" ) ;
165
166
dbg ! ( pos) ;
166
- dbg ! ( std:: str :: from_utf8( & buffer[ pos. start..pos. end] ) . unwrap( ) ) ;
167
+ dbg ! ( std:: str :: from_utf8( & buffer[ pos. start..pos. end] ) ) ;
168
+ dbg ! ( len) ;
169
+ dbg ! ( current) ;
167
170
168
171
let mut new_pos = pos. clone ( ) ;
172
+ let remaining = ( len - current) as usize ;
173
+ let mut to_read = std:: cmp:: min ( remaining, buf. len ( ) ) ;
174
+
175
+ let mut new_current = current;
176
+ let mut start = 0 ;
177
+
178
+ // first drain the buffer
179
+ if new_pos. len ( ) > 0 {
180
+ let to_read_buf = std:: cmp:: min ( to_read, pos. len ( ) ) ;
181
+ dbg ! ( to_read_buf) ;
182
+ dbg ! ( to_read) ;
183
+ dbg ! ( new_pos) ;
184
+ dbg ! ( std:: str :: from_utf8(
185
+ & buffer[ new_pos. start..new_pos. start + to_read_buf]
186
+ ) ) ;
187
+ buf[ ..to_read_buf] . copy_from_slice ( & buffer[ new_pos. start ..new_pos. start + to_read_buf] ) ;
188
+
189
+ // to_read -= to_read_buf;
190
+ new_pos. start += to_read_buf;
191
+ new_current += to_read_buf as u64 ;
192
+ // start += to_read_buf;
193
+
194
+ let read = new_current as usize - current as usize ;
195
+ let new_state = if new_current == len {
196
+ State :: ChunkEnd
197
+ } else {
198
+ State :: Chunk ( new_current, len)
199
+ } ;
169
200
170
- loop {
171
- let remaining = ( len - current) as usize ;
172
- let mut to_read = std:: cmp:: min ( remaining, buf. len ( ) ) ;
173
- let mut new_current = current;
174
- let mut start = 0 ;
175
-
176
- // first drain the buffer
177
- if pos. len ( ) > 0 {
178
- let to_read_buf = std:: cmp:: min ( to_read, pos. len ( ) ) ;
179
- dbg ! ( std:: str :: from_utf8( & buffer[ pos. start..pos. start + to_read_buf] ) . unwrap( ) ) ;
180
- buf[ ..to_read_buf] . copy_from_slice ( & buffer[ pos. start ..pos. start + to_read_buf] ) ;
181
- to_read -= to_read_buf;
182
- new_pos. start += to_read_buf;
183
- new_current += to_read_buf as u64 ;
184
- start += to_read_buf;
185
- }
186
-
187
- if to_read > 0 {
188
- dbg ! ( "reading" ) ;
189
- dbg ! ( to_read) ;
190
- dbg ! ( start) ;
191
- let n = match Pin :: new ( & mut self . inner )
192
- . poll_read ( cx, & mut buf[ start..start + to_read] )
193
- {
194
- Poll :: Ready ( val) => val?,
195
- Poll :: Pending => {
196
- return Ok ( DecodeResult :: Some {
197
- read : 0 ,
198
- new_state : self . state . clone ( ) ,
199
- new_pos,
200
- buffer,
201
- pending : true ,
202
- } )
203
- }
204
- } ;
201
+ return Ok ( DecodeResult :: Some {
202
+ read,
203
+ new_state,
204
+ new_pos,
205
+ buffer,
206
+ pending : false ,
207
+ } ) ;
208
+ }
205
209
206
- new_current += n as u64 ;
207
- }
210
+ while to_read > 0 {
211
+ dbg ! ( "poll_read_chunk_loop" ) ;
212
+
213
+ dbg ! ( to_read) ;
214
+ dbg ! ( start) ;
215
+ dbg ! ( new_pos) ;
216
+ dbg ! ( new_current) ;
217
+
218
+ dbg ! ( "reading" ) ;
219
+ let n = match Pin :: new ( & mut self . inner ) . poll_read ( cx, & mut buf[ start..start + to_read] )
220
+ {
221
+ Poll :: Ready ( val) => val?,
222
+ Poll :: Pending => {
223
+ dbg ! ( "pending" ) ;
224
+ return Ok ( DecodeResult :: Some {
225
+ read : 0 ,
226
+ new_state : State :: Chunk ( new_current, len) ,
227
+ new_pos,
228
+ buffer,
229
+ pending : true ,
230
+ } ) ;
231
+ }
232
+ } ;
208
233
209
- if new_current == len {
210
- return Ok ( DecodeResult :: Some {
211
- read : new_current as usize - current as usize ,
212
- new_state : State :: ChunkEnd ,
213
- new_pos,
214
- buffer,
215
- pending : false ,
216
- } ) ;
217
- }
218
- self . state = State :: Chunk ( new_current, len) ;
234
+ dbg ! ( n) ;
235
+ to_read -= n;
236
+ new_current += n as u64 ;
237
+ start += n;
219
238
}
239
+
240
+ let read = new_current as usize - current as usize ;
241
+ let new_state = if new_current == len {
242
+ State :: ChunkEnd
243
+ } else {
244
+ State :: Chunk ( new_current, len)
245
+ } ;
246
+ dbg ! ( read) ;
247
+ dbg ! ( & new_state) ;
248
+ dbg ! ( new_current) ;
249
+ dbg ! ( len) ;
250
+ dbg ! ( current) ;
251
+
252
+ Ok ( DecodeResult :: Some {
253
+ read,
254
+ new_state,
255
+ new_pos,
256
+ buffer,
257
+ pending : false ,
258
+ } )
220
259
}
221
260
222
261
fn poll_read_inner (
@@ -226,6 +265,8 @@ impl<R: Read + Unpin> ChunkedDecoder<R> {
226
265
pos : & Position ,
227
266
buf : & mut [ u8 ] ,
228
267
) -> io:: Result < DecodeResult > {
268
+ dbg ! ( & self . state) ;
269
+
229
270
match self . state {
230
271
State :: Init => {
231
272
// Initial read
@@ -289,8 +330,13 @@ impl<R: Read + Unpin> Read for ChunkedDecoder<R> {
289
330
290
331
let mut n = std:: mem:: replace ( & mut this. current , Position :: default ( ) ) ;
291
332
let buffer = std:: mem:: replace ( & mut this. buffer , POOL . alloc ( INITIAL_CAPACITY ) ) ;
292
- let mut needs_read = true ;
333
+ let mut needs_read = if let State :: Chunk ( _, _) = this. state {
334
+ false // Do not attempt to fill the buffer when we are reading a chunk
335
+ } else {
336
+ true
337
+ } ;
293
338
339
+ dbg ! ( n) ;
294
340
let mut buffer = if n. len ( ) > 0 && this. initial_decode {
295
341
match this. poll_read_inner ( cx, buffer, & n, buf) ? {
296
342
DecodeResult :: Some {
@@ -329,6 +375,7 @@ impl<R: Read + Unpin> Read for ChunkedDecoder<R> {
329
375
dbg ! ( "loop" ) ;
330
376
if n. len ( ) >= buffer. capacity ( ) {
331
377
if buffer. capacity ( ) + 1024 <= MAX_CAPACITY {
378
+ dbg ! ( "resizing buffer" ) ;
332
379
buffer. realloc ( buffer. capacity ( ) + 1024 ) ;
333
380
} else {
334
381
std:: mem:: replace ( & mut this. buffer , buffer) ;
@@ -341,6 +388,7 @@ impl<R: Read + Unpin> Read for ChunkedDecoder<R> {
341
388
}
342
389
343
390
if needs_read {
391
+ dbg ! ( "reading" ) ;
344
392
let bytes_read = match Pin :: new ( & mut this. inner ) . poll_read ( cx, & mut buffer[ n. end ..] )
345
393
{
346
394
Poll :: Ready ( result) => result?,
@@ -354,6 +402,7 @@ impl<R: Read + Unpin> Read for ChunkedDecoder<R> {
354
402
return Poll :: Pending ;
355
403
}
356
404
} ;
405
+ dbg ! ( bytes_read) ;
357
406
n. end += bytes_read;
358
407
}
359
408
match this. poll_read_inner ( cx, buffer, & n, buf) ? {
@@ -364,6 +413,7 @@ impl<R: Read + Unpin> Read for ChunkedDecoder<R> {
364
413
new_state,
365
414
pending,
366
415
} => {
416
+ dbg ! ( "some" ) ;
367
417
// current buffer might now contain more data inside, so we need to attempt
368
418
// to decode it next time
369
419
this. initial_decode = true ;
@@ -386,6 +436,8 @@ impl<R: Read + Unpin> Read for ChunkedDecoder<R> {
386
436
continue ;
387
437
}
388
438
DecodeResult :: None ( buf) => {
439
+ dbg ! ( "none" ) ;
440
+
389
441
buffer = buf;
390
442
391
443
if this. buffer . is_empty ( ) || n. is_zero ( ) {
@@ -394,17 +446,10 @@ impl<R: Read + Unpin> Read for ChunkedDecoder<R> {
394
446
395
447
std:: mem:: replace ( & mut this. buffer , buffer) ;
396
448
this. current = n;
397
- return Poll :: Ready ( Ok ( 0 ) ) ;
398
- } else if n. len ( ) == 0 {
399
- // "logical buffer" is empty, there is nothing to decode on the next step
400
- this. initial_decode = false ;
401
449
402
- std:: mem:: replace ( & mut this. buffer , buffer) ;
403
- this. current = n;
404
- return Poll :: Ready ( Err ( io:: Error :: new (
405
- io:: ErrorKind :: UnexpectedEof ,
406
- "bytes remaining in stream" ,
407
- ) ) ) ;
450
+ return Poll :: Ready ( Ok ( 0 ) ) ;
451
+ } else {
452
+ needs_read = true ;
408
453
}
409
454
}
410
455
}
0 commit comments