kill some unnecessary &block usage
[rainbows.git] / lib / rainbows / max_body / wrapper.rb
blob56ee9fdf63652418784b439850c4f4af42e61777
1 # -*- encoding: binary -*-
2 # :enddoc:
4 # This is only used for chunked request bodies, which are rare
5 class Rainbows::MaxBody::Wrapper
6   def initialize(rack_input, limit)
7     @input, @limit, @rbuf = rack_input, limit, ''
8   end
10   def each
11     while line = gets
12       yield line
13     end
14   end
16   # chunked encoding means this method behaves more like readpartial,
17   # since Rack does not support a method named "readpartial"
18   def read(length = nil, rv = '')
19     if length
20       if length <= @rbuf.size
21         length < 0 and raise ArgumentError, "negative length #{length} given"
22         rv.replace(@rbuf.slice!(0, length))
23       elsif @rbuf.empty?
24         checked_read(length, rv) or return
25       else
26         rv.replace(@rbuf.slice!(0, @rbuf.size))
27       end
28       rv.empty? && length != 0 ? nil : rv
29     else
30       rv.replace(read_all)
31     end
32   end
34   def gets
35     sep = $/
36     if sep.nil?
37       rv = read_all
38       return rv.empty? ? nil : rv
39     end
40     re = /\A(.*?#{Regexp.escape(sep)})/
42     begin
43       @rbuf.sub!(re, '') and return $1
45       if tmp = checked_read(16384)
46         @rbuf << tmp
47       elsif @rbuf.empty? # EOF
48         return nil
49       else # EOF, return whatever is left
50         return @rbuf.slice!(0, @rbuf.size)
51       end
52     end while true
53   end
55   def checked_read(length = 16384, buf = '')
56     if @input.read(length, buf)
57       throw :rainbows_EFBIG if ((@limit -= buf.size) < 0)
58       return buf
59     end
60   end
62   def read_all
63     rv = @rbuf.slice!(0, @rbuf.size)
64     tmp = ''
65     while checked_read(16384, tmp)
66       rv << tmp
67     end
68     rv
69   end
70 end