mirror of
https://github.com/gitlabhq/gitlabhq.git
synced 2025-08-03 16:37:48 +00:00
41 lines
1.0 KiB
Ruby
41 lines
1.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Octokit
|
|
class ResponseValidation < ::Faraday::Middleware
|
|
ResponseSizeTooLarge = Class.new(StandardError)
|
|
|
|
def on_complete(env)
|
|
return if env.url.host == "api.github.com"
|
|
|
|
body = env.response.body
|
|
|
|
return if body.empty?
|
|
|
|
if (max_allowed_bytes != 0 && body.bytesize > max_allowed_bytes) ||
|
|
(max_allowed_values != 0 && total_value_count_estimate(body) > max_allowed_values)
|
|
raise ResponseSizeTooLarge
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
# : => Number of key-value pairs
|
|
# , => Number of elements in arrays (off by one since [1, 2, 3] has just 2 commas)
|
|
# [ => Number of arrays
|
|
# { => Number of objects
|
|
def total_value_count_estimate(body)
|
|
body.count("{[,:")
|
|
end
|
|
|
|
def max_allowed_bytes
|
|
Gitlab::CurrentSettings.max_github_response_size_limit.megabytes
|
|
end
|
|
|
|
def max_allowed_values
|
|
Gitlab::CurrentSettings.max_github_response_json_value_count
|
|
end
|
|
end
|
|
end
|
|
end
|