@@ -62,36 +62,68 @@ def start_scan
62
62
def wait_for_scan
63
63
last_request_count = 0
64
64
last_request_count_change = Time . new
65
+ timed_out_request_count = 0
65
66
66
67
loop do
68
+ response = nil
69
+
67
70
begin
68
71
request = RestClient ::Request . execute (
69
72
method : :get ,
70
- url : "#{ @scanner_url } /#{ @scan_id } " ,
71
- timeout : 2
73
+ url : "#{ @scanner_url } /#{ @scan_id } /summary " ,
74
+ timeout : 5
72
75
)
73
76
$logger. debug "Status endpoint returned #{ request . code } "
74
77
response = JSON . parse ( request )
75
78
$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
76
88
rescue => err
77
89
$logger. warn err
78
90
end
79
91
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
88
119
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' ]
92
125
end
93
126
94
- break unless response [ 'busy' ]
95
127
sleep 2
96
128
end
97
129
end
@@ -101,7 +133,7 @@ def get_scan_report(timed_out: false)
101
133
report = RestClient ::Request . execute (
102
134
method : :get ,
103
135
url : "#{ @scanner_url } /#{ @scan_id } /report.json" ,
104
- timeout : 2
136
+ timeout : 60
105
137
)
106
138
@raw_results = JSON . parse ( report )
107
139
@results = @transformer . transform ( @raw_results , timed_out : timed_out )
0 commit comments