@@ -105,8 +105,8 @@ bool IRCAPI::VerifyTableExistence(ClientContext &context, IRCatalog &catalog, co
105105 return false ;
106106}
107107
108- static string GetTableMetadata (ClientContext &context, IRCatalog &catalog, const IRCSchemaEntry &schema ,
109- const string &table) {
108+ static unique_ptr<HTTPResponse> GetTableMetadata (ClientContext &context, IRCatalog &catalog,
109+ const IRCSchemaEntry &schema, const string &table) {
110110 auto schema_name = IRCAPI::GetEncodedSchemaName (schema.namespace_items );
111111
112112 auto url_builder = catalog.GetBaseUrl ();
@@ -117,20 +117,28 @@ static string GetTableMetadata(ClientContext &context, IRCatalog &catalog, const
117117 url_builder.AddPathComponent (table);
118118
119119 auto url = url_builder.GetURL ();
120- auto response = catalog.auth_handler ->GetRequest (context, url_builder);
121- if (!response->Success ()) {
122- ThrowException (url, *response, " GET" );
123- }
124-
125- return response->body ;
120+ return catalog.auth_handler ->GetRequest (context, url_builder);
126121}
127122
128- rest_api_objects::LoadTableResult IRCAPI::GetTable (ClientContext &context, IRCatalog &catalog,
129- const IRCSchemaEntry &schema, const string &table_name) {
123+ APIResult<rest_api_objects::LoadTableResult> IRCAPI::GetTable (ClientContext &context, IRCatalog &catalog,
124+ const IRCSchemaEntry &schema, const string &table_name) {
125+ auto ret = APIResult<rest_api_objects::LoadTableResult>();
130126 auto result = GetTableMetadata (context, catalog, schema, table_name);
131- std::unique_ptr<yyjson_doc, YyjsonDocDeleter> doc (ICUtils::api_result_to_doc (result));
127+ if (result->status != HTTPStatusCode::OK_200) {
128+ yyjson_val *error_obj = ICUtils::get_error_message (result->body );
129+ if (error_obj == nullptr ) {
130+ throw InvalidConfigurationException (result->body );
131+ }
132+ ret.has_error = true ;
133+ ret.status_ = result->status ;
134+ ret.error_ = rest_api_objects::IcebergErrorResponse::FromJSON (error_obj);
135+ return ret;
136+ }
137+ ret.has_error = false ;
138+ std::unique_ptr<yyjson_doc, YyjsonDocDeleter> doc (ICUtils::api_result_to_doc (result->body ));
132139 auto *metadata_root = yyjson_doc_get_root (doc.get ());
133- return rest_api_objects::LoadTableResult::FromJSON (metadata_root);
140+ ret.result_ = rest_api_objects::LoadTableResult::FromJSON (metadata_root);
141+ return ret;
134142}
135143
136144vector<rest_api_objects::TableIdentifier> IRCAPI::GetTables (ClientContext &context, IRCatalog &catalog,
@@ -150,6 +158,12 @@ vector<rest_api_objects::TableIdentifier> IRCAPI::GetTables(ClientContext &conte
150158 }
151159 auto response = catalog.auth_handler ->GetRequest (context, url_builder);
152160 if (!response->Success ()) {
161+ if (response->status == HTTPStatusCode::Forbidden_403 ||
162+ response->status == HTTPStatusCode::Unauthorized_401) {
163+ // return empty result if user cannot list tables for a schema.
164+ vector<rest_api_objects::TableIdentifier> ret;
165+ return ret;
166+ }
153167 auto url = url_builder.GetURL ();
154168 ThrowException (url, *response, " GET" );
155169 }
@@ -191,6 +205,11 @@ vector<IRCAPISchema> IRCAPI::GetSchemas(ClientContext &context, IRCatalog &catal
191205 }
192206 auto response = catalog.auth_handler ->GetRequest (context, endpoint_builder);
193207 if (!response->Success ()) {
208+ if (response->status == HTTPStatusCode::Forbidden_403 ||
209+ response->status == HTTPStatusCode::Unauthorized_401) {
210+ // return empty result if user cannot list schemas.
211+ return result;
212+ }
194213 auto url = endpoint_builder.GetURL ();
195214 ThrowException (url, *response, " GET" );
196215 }
0 commit comments