| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| */ | |
| #pragma once | |
| /// \file iceberg/catalog/rest/http_request.h | |
| /// \brief Define REST HTTP request types. | |
| #include <algorithm> | |
| #include <cctype> | |
| #include <cstddef> | |
| #include <cstdint> | |
| #include <map> | |
| #include <string> | |
| #include <string_view> | |
| #include "iceberg/catalog/rest/iceberg_rest_export.h" | |
| namespace iceberg::rest { | |
| /// \brief HTTP method enumeration. | |
| enum class HttpMethod : uint8_t { kGet, kPost, kPut, kDelete, kHead }; | |
| /// \brief Convert HttpMethod to string representation. | |
| constexpr std::string_view ToString(HttpMethod method) { | |
| switch (method) { | |
| case HttpMethod::kGet: | |
| return "GET"; | |
| case HttpMethod::kPost: | |
| return "POST"; | |
| case HttpMethod::kPut: | |
| return "PUT"; | |
| case HttpMethod::kDelete: | |
| return "DELETE"; | |
| case HttpMethod::kHead: | |
| return "HEAD"; | |
| } | |
| return "UNKNOWN"; | |
| } | |
| /// \brief Case-insensitive ordering for HTTP header names. | |
| /// | |
| /// HTTP header names are case-insensitive. This comparator also matches | |
| /// cpr::Header's single-value map model. | |
| struct CaseInsensitiveHeaderLess { | |
| using is_transparent = void; | |
| bool operator()(std::string_view lhs, std::string_view rhs) const noexcept { | |
| const auto min_size = lhs.size() < rhs.size() ? lhs.size() : rhs.size(); | |
| for (std::size_t i = 0; i < min_size; ++i) { | |
| auto left = static_cast<unsigned char>(lhs[i]); | |
| auto right = static_cast<unsigned char>(rhs[i]); | |
| const int lower_left = std::tolower(left); | |
| const int lower_right = std::tolower(right); | |
| if (lower_left < lower_right) return true; | |
| if (lower_left > lower_right) return false; | |
| } | |
| return lhs.size() < rhs.size(); | |
| } | |
| }; | |
| /// \brief Single-value HTTP headers with case-insensitive names. | |
| /// | |
| /// Repeated outgoing headers are intentionally not represented here. The | |
| /// SigV4 path signs headers through the AWS SDK request model, and the final | |
| /// transport uses cpr::Header; both are single-value, map-like containers that | |
| /// fold duplicate names. Keeping the REST request model single-value avoids | |
| /// exposing repeated-header behavior that cannot survive signing or transport. | |
| using HttpHeaders = std::map<std::string, std::string, CaseInsensitiveHeaderLess>; | |
| /// \brief An outgoing HTTP request. Mirrors Java's HttpRequest so signing | |
| /// implementations like SigV4 see method, url, headers, and body together. | |
| struct ICEBERG_REST_EXPORT HttpRequest { | |
| HttpMethod method = HttpMethod::kGet; | |
| std::string url; | |
| HttpHeaders headers; | |
| std::string body; | |
| }; | |
| } // namespace iceberg::rest |