Class: Async::HTTP::Body::Slowloris
- Defined in:
- lib/async/http/body/slowloris.rb
Overview
A dynamic body which you can write to and read from.
Defined Under Namespace
Classes: ThroughputError
Instance Attribute Summary collapse
-
#minimum_throughput ⇒ Object
readonly
Returns the value of attribute minimum_throughput.
Instance Method Summary collapse
-
#initialize(*arguments, minimum_throughput: 1024, **options) ⇒ Slowloris
constructor
In order for this implementation to work correctly, you need to use a LimitedQueue.
-
#write(chunk) ⇒ Object
If #read is called regularly to maintain throughput, that is good.
Methods inherited from Writable
#close, #closed?, #empty?, #inspect, #length, #read, #ready?
Constructor Details
#initialize(*arguments, minimum_throughput: 1024, **options) ⇒ Slowloris
In order for this implementation to work correctly, you need to use a LimitedQueue.
23 24 25 26 27 28 29 30 |
# File 'lib/async/http/body/slowloris.rb', line 23 def initialize(*arguments, minimum_throughput: 1024, **) super(*arguments, **) @minimum_throughput = minimum_throughput @last_write_at = nil @last_chunk_size = nil end |
Instance Attribute Details
#minimum_throughput ⇒ Object (readonly)
Returns the value of attribute minimum_throughput.
32 33 34 |
# File 'lib/async/http/body/slowloris.rb', line 32 def minimum_throughput @minimum_throughput end |
Instance Method Details
#write(chunk) ⇒ Object
If #read is called regularly to maintain throughput, that is good. If #read is not called, that is a problem. Throughput is dependent on data being available, from #write, so it doesn’t seem particularly problimatic to do this check in #write.
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/async/http/body/slowloris.rb', line 35 def write(chunk) if @last_chunk_size time_since_last_write = Async::Clock.now - @last_write_at throughput = @last_chunk_size / time_since_last_write if throughput < @minimum_throughput error = ThroughputError.new(throughput, @minimum_throughput, time_since_last_write) self.close(error) end end super.tap do @last_write_at = Async::Clock.now @last_chunk_size = chunk&.bytesize end end |