15 #ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_STORAGE_WELL_KNOWN_HEADERS_H
16 #define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_STORAGE_WELL_KNOWN_HEADERS_H
18 #include "google/cloud/storage/version.h"
19 #include "google/cloud/internal/random.h"
20 #include "google/cloud/optional.h"
21 #include "absl/types/optional.h"
40 template <
typename H,
typename T>
41 class WellKnownHeader {
43 WellKnownHeader() =
default;
44 explicit WellKnownHeader(T value) : value_(std::move(value)) {}
46 char const* header_name()
const {
return H::header_name(); }
47 bool has_value()
const {
return value_.has_value(); }
48 T
const& value()
const {
return value_.value(); }
50 T value_or(U&& default_val) {
51 return value_.value_or(std::forward<U>(default_val));
55 absl::optional<T> value_;
58 template <
typename H,
typename T>
59 std::ostream& operator<<(std::ostream& os, WellKnownHeader<H, T>
const& rhs) {
60 if (rhs.has_value()) {
61 return os << rhs.header_name() <<
": " << rhs.value();
63 return os << rhs.header_name() <<
": <not set>";
74 :
public internal::WellKnownHeader<
ContentType, std::string> {
75 using WellKnownHeader<
ContentType, std::string>::WellKnownHeader;
87 :
public internal::WellKnownHeader<
CustomHeader, std::string> {
91 : WellKnownHeader(std::move(value)), name_(std::move(name)) {}
99 std::ostream& operator<<(std::ostream& os,
CustomHeader const& rhs);
110 :
public internal::WellKnownHeader<
IfMatchEtag, std::string> {
111 using WellKnownHeader<
IfMatchEtag, std::string>::WellKnownHeader;
200 static char const*
prefix() {
return "x-goog-encryption-"; }
246 static char const*
prefix() {
return "x-goog-copy-source-encryption-"; }
268 template <
typename Generator>
270 auto constexpr kKeySize = 256 / std::numeric_limits<
unsigned char>::digits;
271 auto constexpr kMinChar = (std::numeric_limits<
char>::min)();
272 auto constexpr kMaxChar = (std::numeric_limits<
char>::max)();
273 std::uniform_int_distribution<
int> uni(kMinChar, kMaxChar);
274 std::string key(
static_cast<std::size_t>(kKeySize),
' ');
275 std::generate_n(key.begin(), key.size(),
276 [&uni, &gen] {
return static_cast<
char>(uni(gen)); });
303 using WellKnownHeader<
AcceptEncoding, std::string>::WellKnownHeader;