BlindSignAuth should return corresponding absl::Status errors when receiving HTTP status codes from Phosphor PiperOrigin-RevId: 543540285
diff --git a/quiche/blind_sign_auth/blind_sign_auth.cc b/quiche/blind_sign_auth/blind_sign_auth.cc index dd2935e..c76ab2d 100644 --- a/quiche/blind_sign_auth/blind_sign_auth.cc +++ b/quiche/blind_sign_auth/blind_sign_auth.cc
@@ -68,11 +68,12 @@ callback(response.status()); return; } - int status_code = response.value().status_code(); - if (response.value().status_code() != 200) { - QUICHE_LOG(WARNING) << "GetInitialDataRequest failed with code: " - << status_code; - callback(response.status()); + absl::StatusCode code = HttpCodeToStatusCode(response.value().status_code()); + if (code != absl::StatusCode::kOk) { + std::string message = + absl::StrCat("GetInitialDataRequest failed with code: ", code); + QUICHE_LOG(WARNING) << message; + callback(absl::Status(code, message)); return; } // Parse GetInitialDataResponse. @@ -188,10 +189,11 @@ callback(response.status()); return; } - int status_code = response.value().status_code(); - if (response.value().status_code() != 200) { - QUICHE_LOG(WARNING) << "AuthAndSign failed with code: " << status_code; - callback(response.status()); + absl::StatusCode code = HttpCodeToStatusCode(response.value().status_code()); + if (code != absl::StatusCode::kOk) { + std::string message = absl::StrCat("AuthAndSign failed with code: ", code); + QUICHE_LOG(WARNING) << message; + callback(absl::Status(code, message)); return; } @@ -315,4 +317,42 @@ return absl::OkStatus(); } +absl::StatusCode BlindSignAuth::HttpCodeToStatusCode(int http_code) { + // copybara:strip_begin(golink) + // This mapping is from go/http-canonical-mapping + // copybara:strip_end + if (http_code >= 200 && http_code < 300) { + return absl::StatusCode::kOk; + } else if (http_code >= 300 && http_code < 400) { + return absl::StatusCode::kUnknown; + } else if (http_code == 400) { + return absl::StatusCode::kInvalidArgument; + } else if (http_code == 401) { + return absl::StatusCode::kUnauthenticated; + } else if (http_code == 403) { + return absl::StatusCode::kPermissionDenied; + } else if (http_code == 404) { + return absl::StatusCode::kNotFound; + } else if (http_code == 409) { + return absl::StatusCode::kAborted; + } else if (http_code == 416) { + return absl::StatusCode::kOutOfRange; + } else if (http_code == 429) { + return absl::StatusCode::kResourceExhausted; + } else if (http_code == 499) { + return absl::StatusCode::kCancelled; + } else if (http_code >= 400 && http_code < 500) { + return absl::StatusCode::kFailedPrecondition; + } else if (http_code == 501) { + return absl::StatusCode::kUnimplemented; + } else if (http_code == 503) { + return absl::StatusCode::kUnavailable; + } else if (http_code == 504) { + return absl::StatusCode::kDeadlineExceeded; + } else if (http_code >= 500 && http_code < 600) { + return absl::StatusCode::kInternal; + } + return absl::StatusCode::kUnknown; +} + } // namespace quiche
diff --git a/quiche/blind_sign_auth/blind_sign_auth.h b/quiche/blind_sign_auth/blind_sign_auth.h index 710659f..0c29136 100644 --- a/quiche/blind_sign_auth/blind_sign_auth.h +++ b/quiche/blind_sign_auth/blind_sign_auth.h
@@ -12,6 +12,7 @@ #include <vector> #include "quiche/blind_sign_auth/proto/public_metadata.pb.h" +#include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "absl/time/time.h" @@ -58,6 +59,7 @@ std::function<void(absl::StatusOr<absl::Span<BlindSignToken>>)> callback); absl::Status FingerprintPublicMetadata( const privacy::ppn::PublicMetadata& metadata, uint64_t* fingerprint); + absl::StatusCode HttpCodeToStatusCode(int http_code); BlindSignHttpInterface* http_fetcher_ = nullptr; };