diff options
Diffstat (limited to 'chromium/net/quiche')
9 files changed, 359 insertions, 0 deletions
diff --git a/chromium/net/quiche/common/platform/impl/quiche_arraysize_impl.h b/chromium/net/quiche/common/platform/impl/quiche_arraysize_impl.h new file mode 100644 index 00000000000..fe15b81cf0a --- /dev/null +++ b/chromium/net/quiche/common/platform/impl/quiche_arraysize_impl.h @@ -0,0 +1,12 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_ARRAYSIZE_IMPL_H_ +#define NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_ARRAYSIZE_IMPL_H_ + +#include "base/stl_util.h" + +#define QUICHE_ARRAYSIZE_IMPL(x) base::size(x) + +#endif // NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_ARRAYSIZE_IMPL_H_ diff --git a/chromium/net/quiche/common/platform/impl/quiche_logging_impl.h b/chromium/net/quiche/common/platform/impl/quiche_logging_impl.h index 5362e69f0dd..d3261b023f3 100644 --- a/chromium/net/quiche/common/platform/impl/quiche_logging_impl.h +++ b/chromium/net/quiche/common/platform/impl/quiche_logging_impl.h @@ -6,5 +6,87 @@ #define NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_LOGGING_IMPL_H_ #include "base/logging.h" +#include "build/build_config.h" +#include "net/base/net_export.h" + +#define QUICHE_LOG_IMPL(severity) QUICHE_CHROMIUM_LOG_##severity +#define QUICHE_VLOG_IMPL(verbose_level) VLOG(verbose_level) +#define QUICHE_LOG_EVERY_N_SEC_IMPL(severity, seconds) QUICHE_LOG_IMPL(severity) +#define QUICHE_LOG_FIRST_N_IMPL(severity, n) QUICHE_LOG_IMPL(severity) +#define QUICHE_DLOG_IMPL(severity) QUICHE_CHROMIUM_DLOG_##severity +#define QUICHE_DLOG_IF_IMPL(severity, condition) \ + QUICHE_CHROMIUM_DLOG_IF_##severity(condition) +#define QUICHE_LOG_IF_IMPL(severity, condition) \ + QUICHE_CHROMIUM_LOG_IF_##severity(condition) + +#define QUICHE_CHROMIUM_LOG_INFO VLOG(1) +#define QUICHE_CHROMIUM_LOG_WARNING DLOG(WARNING) +#define QUICHE_CHROMIUM_LOG_ERROR DLOG(ERROR) +#define QUICHE_CHROMIUM_LOG_FATAL LOG(FATAL) +#define QUICHE_CHROMIUM_LOG_DFATAL LOG(DFATAL) + +#define QUICHE_CHROMIUM_DLOG_INFO DVLOG(1) +#define QUICHE_CHROMIUM_DLOG_WARNING DLOG(WARNING) +#define QUICHE_CHROMIUM_DLOG_ERROR DLOG(ERROR) +#define QUICHE_CHROMIUM_DLOG_FATAL DLOG(FATAL) +#define QUICHE_CHROMIUM_DLOG_DFATAL DLOG(DFATAL) + +#define QUICHE_CHROMIUM_LOG_IF_INFO(condition) VLOG_IF(1, condition) +#define QUICHE_CHROMIUM_LOG_IF_WARNING(condition) DLOG_IF(WARNING, condition) +#define QUICHE_CHROMIUM_LOG_IF_ERROR(condition) DLOG_IF(ERROR, condition) +#define QUICHE_CHROMIUM_LOG_IF_FATAL(condition) LOG_IF(FATAL, condition) +#define QUICHE_CHROMIUM_LOG_IF_DFATAL(condition) LOG_IF(DFATAL, condition) + +#define QUICHE_CHROMIUM_DLOG_IF_INFO(condition) DVLOG_IF(1, condition) +#define QUICHE_CHROMIUM_DLOG_IF_WARNING(condition) DLOG_IF(WARNING, condition) +#define QUICHE_CHROMIUM_DLOG_IF_ERROR(condition) DLOG_IF(ERROR, condition) +#define QUICHE_CHROMIUM_DLOG_IF_FATAL(condition) DLOG_IF(FATAL, condition) +#define QUICHE_CHROMIUM_DLOG_IF_DFATAL(condition) DLOG_IF(DFATAL, condition) + +#define QUICHE_DVLOG_IMPL(verbose_level) DVLOG(verbose_level) +#define QUICHE_DVLOG_IF_IMPL(verbose_level, condition) \ + DVLOG_IF(verbose_level, condition) + +#define QUICHE_LOG_INFO_IS_ON_IMPL() 0 +#ifdef NDEBUG +#define QUICHE_LOG_WARNING_IS_ON_IMPL() 0 +#define QUICHE_LOG_ERROR_IS_ON_IMPL() 0 +#else +#define QUICHE_LOG_WARNING_IS_ON_IMPL() 1 +#define QUICHE_LOG_ERROR_IS_ON_IMPL() 1 +#endif +#define QUICHE_DLOG_INFO_IS_ON_IMPL() 0 + +#if defined(OS_WIN) +// wingdi.h defines ERROR to be 0. When we call QUICHE_DLOG(ERROR), it gets +// substituted with 0, and it expands to QUICHE_CHROMIUM_DLOG_0. To allow us to +// keep using this syntax, we define this macro to do the same thing as +// QUICHE_CHROMIUM_DLOG_ERROR. +#define QUICHE_CHROMIUM_LOG_0 QUICHE_CHROMIUM_LOG_ERROR +#define QUICHE_CHROMIUM_DLOG_0 QUICHE_CHROMIUM_DLOG_ERROR +#define QUICHE_CHROMIUM_LOG_IF_0 QUICHE_CHROMIUM_LOG_IF_ERROR +#define QUICHE_CHROMIUM_DLOG_IF_0 QUICHE_CHROMIUM_DLOG_IF_ERROR +#endif + +#define QUICHE_PREDICT_FALSE_IMPL(x) x +#define QUICHE_PREDICT_TRUE_IMPL(x) x + +#define QUICHE_NOTREACHED_IMPL() NOTREACHED() + +#define QUICHE_PLOG_IMPL(severity) DVLOG(1) + +namespace quic { +template <typename T> +NET_EXPORT_PRIVATE inline std::ostream& operator<<(std::ostream& out, + const std::vector<T>& v) { + out << "["; + const char* sep = ""; + for (size_t i = 0; i < v.size(); ++i) { + out << sep << v[i]; + sep = ", "; + } + return out << "]"; +} +} // namespace quic #endif // NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_LOGGING_IMPL_H_ diff --git a/chromium/net/quiche/common/platform/impl/quiche_map_util_impl.h b/chromium/net/quiche/common/platform/impl/quiche_map_util_impl.h new file mode 100644 index 00000000000..29029d465df --- /dev/null +++ b/chromium/net/quiche/common/platform/impl/quiche_map_util_impl.h @@ -0,0 +1,19 @@ +// Copyright (c) 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_MAP_UTIL_IMPL_H_ +#define NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_MAP_UTIL_IMPL_H_ + +#include "base/stl_util.h" + +namespace quiche { + +template <class Collection, class Key> +bool QuicheContainsKeyImpl(const Collection& collection, const Key& key) { + return base::Contains(collection, key); +} + +} // namespace quiche + +#endif // NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_MAP_UTIL_IMPL_H_ diff --git a/chromium/net/quiche/common/platform/impl/quiche_optional_impl.h b/chromium/net/quiche/common/platform/impl/quiche_optional_impl.h new file mode 100644 index 00000000000..bbdb0a80308 --- /dev/null +++ b/chromium/net/quiche/common/platform/impl/quiche_optional_impl.h @@ -0,0 +1,19 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_OPTIONAL_IMPL_H_ +#define NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_OPTIONAL_IMPL_H_ + +#include "base/optional.h" + +namespace quiche { + +template <typename T> +using QuicheOptionalImpl = base::Optional<T>; + +#define QuicheNullOptImpl base::nullopt + +} // namespace quiche + +#endif // NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_OPTIONAL_IMPL_H_ diff --git a/chromium/net/quiche/common/platform/impl/quiche_ptr_util_impl.h b/chromium/net/quiche/common/platform/impl/quiche_ptr_util_impl.h new file mode 100644 index 00000000000..4a7b319885b --- /dev/null +++ b/chromium/net/quiche/common/platform/impl/quiche_ptr_util_impl.h @@ -0,0 +1,22 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_PTR_UTIL_IMPL_H_ +#define NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_PTR_UTIL_IMPL_H_ + +#include <memory> +#include <utility> + +#include "base/memory/ptr_util.h" + +namespace quiche { + +template <typename T> +std::unique_ptr<T> QuicheWrapUniqueImpl(T* ptr) { + return base::WrapUnique<T>(ptr); +} + +} // namespace quiche + +#endif // NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_PTR_UTIL_IMPL_H_ diff --git a/chromium/net/quiche/common/platform/impl/quiche_str_cat_impl.h b/chromium/net/quiche/common/platform/impl/quiche_str_cat_impl.h new file mode 100644 index 00000000000..64268de0ade --- /dev/null +++ b/chromium/net/quiche/common/platform/impl/quiche_str_cat_impl.h @@ -0,0 +1,31 @@ +// Copyright (c) 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_STR_CAT_IMPL_H_ +#define NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_STR_CAT_IMPL_H_ + +#include <sstream> +#include <string> +#include <utility> + +#include "base/strings/stringprintf.h" + +namespace quiche { + +template <typename... Args> +inline std::string QuicheStrCatImpl(const Args&... args) { + std::ostringstream oss; + int dummy[] = {1, (oss << args, 0)...}; + static_cast<void>(dummy); + return oss.str(); +} + +template <typename... Args> +inline std::string QuicheStringPrintfImpl(const Args&... args) { + return base::StringPrintf(std::forward<const Args&>(args)...); +} + +} // namespace quiche + +#endif // NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_STR_CAT_IMPL_H_ diff --git a/chromium/net/quiche/common/platform/impl/quiche_string_piece_impl.h b/chromium/net/quiche/common/platform/impl/quiche_string_piece_impl.h new file mode 100644 index 00000000000..9488b87d489 --- /dev/null +++ b/chromium/net/quiche/common/platform/impl/quiche_string_piece_impl.h @@ -0,0 +1,23 @@ +// Copyright (c) 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_STRING_PIECE_IMPL_H_ +#define NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_STRING_PIECE_IMPL_H_ + +#include "base/strings/string_piece.h" + +namespace quiche { + +using QuicheStringPieceImpl = base::StringPiece; + +using QuicheStringPieceHashImpl = base::StringPieceHash; + +inline size_t QuicheHashStringPairImpl(QuicheStringPieceImpl a, + QuicheStringPieceImpl b) { + return base::StringPieceHash()(a) ^ base::StringPieceHash()(b); +} + +} // namespace quiche + +#endif // NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_STRING_PIECE_IMPL_H_ diff --git a/chromium/net/quiche/common/platform/impl/quiche_test_impl.h b/chromium/net/quiche/common/platform/impl/quiche_test_impl.h index 705a250f3e4..a505bccfe8e 100644 --- a/chromium/net/quiche/common/platform/impl/quiche_test_impl.h +++ b/chromium/net/quiche/common/platform/impl/quiche_test_impl.h @@ -11,6 +11,9 @@ namespace quiche { namespace test { class QuicheTest : public ::testing::Test {}; + +template <class T> +class QuicheTestWithParamImpl : public ::testing::TestWithParam<T> {}; } // namespace test } // namespace quiche diff --git a/chromium/net/quiche/common/platform/impl/quiche_text_utils_impl.h b/chromium/net/quiche/common/platform/impl/quiche_text_utils_impl.h new file mode 100644 index 00000000000..037d5827a08 --- /dev/null +++ b/chromium/net/quiche/common/platform/impl/quiche_text_utils_impl.h @@ -0,0 +1,148 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_TEXT_UTILS_IMPL_H_ +#define NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_TEXT_UTILS_IMPL_H_ + +#include <algorithm> +#include <cstdint> +#include <string> +#include <vector> + +#include "base/base64.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" +#include "net/base/hex_utils.h" +#include "net/base/parse_number.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" + +namespace quiche { + +// Chromium implementation of quiche::QuicheTextUtils. +class QuicheTextUtilsImpl { + public: + // Returns true of |data| starts with |prefix|, case sensitively. + static bool StartsWith(QuicheStringPiece data, QuicheStringPiece prefix) { + return base::StartsWith(data, prefix, base::CompareCase::SENSITIVE); + } + + // Returns true of |data| ends with |suffix|, case insensitively. + static bool EndsWithIgnoreCase(QuicheStringPiece data, + QuicheStringPiece suffix) { + return base::EndsWith(data, suffix, base::CompareCase::INSENSITIVE_ASCII); + } + + // Returns a new std::string in which |data| has been converted to lower case. + static std::string ToLower(QuicheStringPiece data) { + return base::ToLowerASCII(data); + } + + // Remove leading and trailing whitespace from |data|. + static void RemoveLeadingAndTrailingWhitespace(QuicheStringPiece* data) { + *data = base::TrimWhitespaceASCII(*data, base::TRIM_ALL); + } + + // Returns true if |in| represents a valid uint64, and stores that value in + // |out|. + static bool StringToUint64(QuicheStringPiece in, uint64_t* out) { + return base::StringToUint64(in, out); + } + + // Returns true if |in| represents a valid int, and stores that value in + // |out|. + static bool StringToInt(QuicheStringPiece in, int* out) { + return base::StringToInt(in, out); + } + + // Returns true if |in| represents a valid uint32, and stores that value in + // |out|. + static bool StringToUint32(QuicheStringPiece in, uint32_t* out) { + return net::ParseUint32(in, out, nullptr); + } + + // Returns true if |in| represents a valid size_t, and stores that value in + // |out|. + static bool StringToSizeT(QuicheStringPiece in, size_t* out) { + return base::StringToSizeT(in, out); + } + + // Returns a new std::string representing |in|. + static std::string Uint64ToString(uint64_t in) { + return base::NumberToString(in); + } + + // This converts |length| bytes of binary to a 2*|length|-character + // hexadecimal representation. + // Return value: 2*|length| characters of ASCII std::string. + static std::string HexEncode(QuicheStringPiece data) { + return base::ToLowerASCII(::base::HexEncode(data.data(), data.size())); + } + + static std::string Hex(uint32_t v) { + std::stringstream ss; + ss << std::hex << v; + return ss.str(); + } + + // Converts |data| from a hexadecimal ASCII string to a binary string + // that is |data.length()/2| bytes long. On failure returns empty string. + static std::string HexDecode(QuicheStringPiece data) { + std::string result; + if (!base::HexStringToString(data, &result)) + result.clear(); + return result; + } + + // Base64 encodes with no padding |data_len| bytes of |data| into |output|. + static void Base64Encode(const uint8_t* data, + size_t data_len, + std::string* output) { + base::Base64Encode( + std::string(reinterpret_cast<const char*>(data), data_len), output); + // Remove padding. + size_t len = output->size(); + if (len >= 2) { + if ((*output)[len - 1] == '=') { + len--; + if ((*output)[len - 1] == '=') { + len--; + } + output->resize(len); + } + } + } + + // Returns a std::string containing hex and ASCII representations of |binary|, + // side-by-side in the style of hexdump. Non-printable characters will be + // printed as '.' in the ASCII output. + // For example, given the input "Hello, QUIC!\01\02\03\04", returns: + // "0x0000: 4865 6c6c 6f2c 2051 5549 4321 0102 0304 Hello,.QUIC!...." + static std::string HexDump(QuicheStringPiece binary_input) { + return net::HexDump(binary_input); + } + + // Returns true if |data| contains any uppercase characters. + static bool ContainsUpperCase(QuicheStringPiece data) { + return std::any_of(data.begin(), data.end(), base::IsAsciiUpper<char>); + } + + // Returns true if |data| contains only decimal digits. + static bool IsAllDigits(QuicheStringPiece data) { + return std::all_of(data.begin(), data.end(), + base::IsAsciiDigit<QuicheStringPiece::value_type>); + } + + // Splits |data| into a vector of pieces delimited by |delim|. + static std::vector<QuicheStringPiece> Split(QuicheStringPiece data, + char delim) { + return base::SplitStringPiece(data, QuicheStringPiece(&delim, 1), + base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + } +}; + +} // namespace quiche + +#endif // NET_QUICHE_COMMON_PLATFORM_IMPL_QUICHE_TEXT_UTILS_IMPL_H_ |