Class: Arachni::Plugins::RateLimiter

Inherits:
Arachni::Plugin::Base show all
Defined in:
components/plugins/rate_limiter.rb

Overview

Rate limiter for HTTP requests

Author:

Constant Summary collapse

@@times_slept =
0
@@total_time_slept =
0.0

Constants included from Arachni

BANNER, Cookie, Form, Header, JSON, Link, LinkTemplate, NestedCookie, Severity, UIForm, UIInput, VERSION, WEBSITE, WIKI, XML

Instance Attribute Summary

Attributes inherited from Arachni::Plugin::Base

#framework, #options

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Arachni::Plugin::Base

#browser_cluster, #clean_up, distributable, distributable?, #framework_abort, #framework_pause, #framework_resume, gems, #http, #info, #initialize, is_distributable, merge, #register_results, #restore, #run, #session, #suspend, #wait_while_framework_running, #with_browser

Methods inherited from Component::Base

author, description, fullname, #shortname, shortname, shortname=, version

Methods included from Component::Output

#depersonalize_output, #depersonalize_output?, #intercept_print_message

Methods included from UI::Output

#caller_location, #debug?, #debug_level, #debug_level_1?, #debug_level_2?, #debug_level_3?, #debug_level_4?, #debug_off, #debug_on, #disable_only_positives, #error_buffer, #error_log_fd, #error_logfile, #has_error_log?, #included, #log_error, #mute, #muted?, #only_positives, #only_positives?, #print_bad, #print_debug, #print_debug_backtrace, #print_debug_exception, #print_debug_level_1, #print_debug_level_2, #print_debug_level_3, #print_debug_level_4, #print_error, #print_error_backtrace, #print_exception, #print_info, #print_line, #print_ok, #print_status, #print_verbose, #reroute_to_file, #reroute_to_file?, reset_output_options, #set_error_logfile, #unmute, #verbose?, #verbose_off, #verbose_on

Methods included from Component::Utilities

#read_file

Methods included from Utilities

#available_port, available_port_mutex, #bytes_to_kilobytes, #bytes_to_megabytes, #caller_name, #caller_path, #cookie_decode, #cookie_encode, #cookies_from_file, #cookies_from_parser, #cookies_from_response, #exception_jail, #exclude_path?, #follow_protocol?, #form_decode, #form_encode, #forms_from_parser, #forms_from_response, #full_and_absolute_url?, #generate_token, #get_path, #hms_to_seconds, #html_decode, #html_encode, #include_path?, #links_from_parser, #links_from_response, #normalize_url, #page_from_response, #page_from_url, #parse_set_cookie, #path_in_domain?, #path_too_deep?, #port_available?, #rand_port, #random_seed, #redundant_path?, #regexp_array_match, #remove_constants, #request_parse_body, #seconds_to_hms, #skip_page?, #skip_path?, #skip_resource?, #skip_response?, #to_absolute, #uri_decode, #uri_encode, #uri_parse, #uri_parse_query, #uri_parser, #uri_rewrite

Methods included from Arachni

URI, collect_young_objects, #get_long_win32_filename, jruby?, null_device, profile?, windows?

Constructor Details

This class inherits a constructor from Arachni::Plugin::Base

Class Method Details

.infoObject


55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'components/plugins/rate_limiter.rb', line 55

def self.info
    {
        name:        'RateLimiter',
        description: %q{
Rate limits HTTP requests
},
        author:      'Bert Hekman <[email protected]>',
        tags:        %w(http rate limit),
        version:     '0.1',
        options: [
            Options::Int.new( :requests_per_second,
                 description: 'Requests per second.',
                 default: 20
            )
        ]
    }
end

.times_sleptObject


73
74
75
# File 'components/plugins/rate_limiter.rb', line 73

def self.times_slept
    @@times_slept
end

.total_time_sleptObject


77
78
79
# File 'components/plugins/rate_limiter.rb', line 77

def self.total_time_slept
    @@total_time_slept
end

Instance Method Details

#prepareObject


19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'components/plugins/rate_limiter.rb', line 19

def prepare
    http = framework.http

    last_count             = 0
    last_response_time_sum = 0.0

    http.on_queue do
        last_count             = 0
        last_response_time_sum = 0.0
    end

    http.on_complete do
        # Sleep once per burst.
        next if http.burst_response_count == 0 ||
            http.burst_response_count % http.max_concurrency != 0

        burst_response_count = http.burst_response_count - last_count
        burst_response_time  = http.burst_response_time_sum - last_response_time_sum

        last_count             = http.burst_response_count
        last_response_time_sum = http.burst_response_time_sum

        sleep_time = (
            1.0 / options[:requests_per_second] * burst_response_count
        ) - burst_response_time

        next if sleep_time <= 0

        print_info "Sleeping for #{sleep_time.round( 3 )} seconds"
        sleep sleep_time

        @@times_slept      += 1
        @@total_time_slept += sleep_time
    end
end