Skip to content
This repository was archived by the owner on Feb 26, 2021. It is now read-only.

Commit cacd061

Browse files
authored
Merge pull request #14 from secureCodeBox/handle-polling-timeouts
Improve arachni result polling mechanics
2 parents b61c04a + 118b2e1 commit cacd061

File tree

1 file changed

+47
-15
lines changed

1 file changed

+47
-15
lines changed

src/arachni_scan.rb

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,36 +62,68 @@ def start_scan
6262
def wait_for_scan
6363
last_request_count = 0
6464
last_request_count_change =Time.new
65+
timed_out_request_count = 0
6566

6667
loop do
68+
response = nil
69+
6770
begin
6871
request = RestClient::Request.execute(
6972
method: :get,
70-
url: "#{@scanner_url}/#{@scan_id}",
71-
timeout: 2
73+
url: "#{@scanner_url}/#{@scan_id}/summary",
74+
timeout: 5
7275
)
7376
$logger.debug "Status endpoint returned #{request.code}"
7477
response = JSON.parse(request)
7578
$logger.debug "Checking status of scan '#{@scan_id}': currently busy: #{response['busy']}"
79+
rescue RestClient::Exceptions::ReadTimeout
80+
timed_out_request_count += 1
81+
82+
$logger.warn "Request to poll for current results timed out."
83+
84+
if timed_out_request_count > 10
85+
$logger.warn "Polling for results timed out repeatably."
86+
raise ScanTimeOutError.new
87+
end
7688
rescue => err
7789
$logger.warn err
7890
end
7991

80-
findingCount = response["issues"].length
81-
currentRequestCount = response['statistics']['http']['request_count']
82-
$logger.info "Currently at #{findingCount} findings with #{currentRequestCount} requests made"
83-
84-
if currentRequestCount == last_request_count
85-
if Time.now > last_request_count_change + (5 * 60)
86-
$logger.warn("Arachni request count hasn't updated in 5 min. It probably stuck...")
87-
raise ScanTimeOutError.new
92+
unless response.nil?
93+
current_request_count = response['statistics']['http']['request_count']
94+
found_pages = response['statistics']['found_pages']
95+
audited_pages = response['statistics']['audited_pages']
96+
current_page = response['statistics']['current_page']
97+
98+
burst_average_response_time = response['statistics']['http']['burst_average_response_time']
99+
total_average_response_time = response['statistics']['http']['total_average_response_time']
100+
101+
burst_responses_per_second = response['statistics']['http']['burst_responses_per_second']
102+
total_responses_per_second = response['statistics']['http']['total_responses_per_second']
103+
104+
$logger.info "Request made: #{current_request_count}"
105+
$logger.info "Pages found: #{found_pages}"
106+
$logger.info "Pages audited: #{audited_pages}"
107+
$logger.info "Current Page: #{current_page}"
108+
$logger.info "Burst Avg. Response Time: #{burst_average_response_time}s, Total Avg. Response Time: #{total_average_response_time}s"
109+
$logger.info "Burst Requests: #{burst_responses_per_second}/s, Total Requests per Second: #{total_responses_per_second}/s"
110+
111+
if current_request_count == last_request_count
112+
if Time.now > last_request_count_change + (5 * 60)
113+
$logger.warn("Arachni request count hasn't updated in 5 min. It's probably stuck...")
114+
raise ScanTimeOutError.new
115+
end
116+
else
117+
last_request_count = current_request_count
118+
last_request_count_change = Time.new
88119
end
89-
else
90-
last_request_count = currentRequestCount
91-
last_request_count_change = Time.new
120+
121+
# Resetting timed out count as the current request succeed
122+
timed_out_request_count = 0
123+
124+
break unless response['busy']
92125
end
93126

94-
break unless response['busy']
95127
sleep 2
96128
end
97129
end
@@ -101,7 +133,7 @@ def get_scan_report(timed_out: false)
101133
report = RestClient::Request.execute(
102134
method: :get,
103135
url: "#{@scanner_url}/#{@scan_id}/report.json",
104-
timeout: 2
136+
timeout: 60
105137
)
106138
@raw_results = JSON.parse(report)
107139
@results = @transformer.transform(@raw_results, timed_out: timed_out)

0 commit comments

Comments
 (0)