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;
 };