1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/glic/glic_user_status_request.h"
#include "base/json/json_reader.h"
#include "base/logging.h"
#include "base/strings/string_util.h"
#include "google_apis/common/api_error_codes.h"
namespace {
constexpr char kIsGlicEnabled[] = "isGlicEnabled";
constexpr char kIsAccessDeniedByAdmin[] = "isAccessDeniedByAdmin";
} // namespace
namespace glic {
GlicUserStatusRequest::GlicUserStatusRequest(
google_apis::RequestSender* sender,
GURL url,
base::OnceCallback<void(UserStatusCode result_code)>
process_response_callback)
: UrlFetchRequestBase(sender,
google_apis::ProgressCallback(),
google_apis::ProgressCallback()),
url_(url),
process_response_callback_(std::move(process_response_callback)) {}
GlicUserStatusRequest::~GlicUserStatusRequest() = default;
GURL GlicUserStatusRequest::GetURL() const {
return url_;
}
google_apis::ApiErrorCode GlicUserStatusRequest::MapReasonToError(
google_apis::ApiErrorCode code,
const std::string& reason) {
// This method is to map error reason parsed from response body to
// ApiErrorCode. we assume for now that result is to be sent as ApiErrorCode.
return code;
}
bool GlicUserStatusRequest::IsSuccessfulErrorCode(
google_apis::ApiErrorCode error) {
return error == google_apis::HTTP_SUCCESS;
}
void GlicUserStatusRequest::ProcessURLFetchResults(
const network::mojom::URLResponseHead* response_head,
base::FilePath response_file,
std::string response_body) {
std::move(process_response_callback_)
.Run(MapApiErrorCodeAndResponseBodyToUserStatus(GetErrorCode(),
response_body));
OnProcessURLFetchResultsComplete();
}
// called when request is canceled or auth is failed.
void GlicUserStatusRequest::RunCallbackOnPrematureFailure(
google_apis::ApiErrorCode error) {
std::move(process_response_callback_)
.Run(MapApiErrorCodeAndResponseBodyToUserStatus(error, ""));
}
UserStatusCode
GlicUserStatusRequest::MapApiErrorCodeAndResponseBodyToUserStatus(
google_apis::ApiErrorCode api_error_code,
std::string_view response_body) {
if (api_error_code != google_apis::HTTP_SUCCESS) {
return UserStatusCode::SERVER_UNAVAILABLE;
}
// Parse response body to JSON in the form of
// {
// is_glic_enabled: true/false
// is_access_denied_by_admin: true/false
// }
std::optional<base::Value::Dict> parsed =
base::JSONReader::ReadDict(response_body);
if (!parsed.has_value()) {
DVLOG(1) << "Failed reading response body: " << response_body;
return UserStatusCode::SERVER_UNAVAILABLE;
}
// The feature is enabled (if the response fails to mention it, we assume it
// is).
if (parsed->FindBool(kIsGlicEnabled).value_or(true)) {
return UserStatusCode::ENABLED;
}
// The feature is disabled (find the reason, if given).
return parsed->FindBool(kIsAccessDeniedByAdmin).value_or(false)
? UserStatusCode::DISABLED_BY_ADMIN
: UserStatusCode::DISABLED_OTHER;
}
} // namespace glic
|