2020#include < vector>
2121
2222#include " absl/strings/string_view.h"
23+ #include " opencensus/common/internal/varint.h"
2324#include " opencensus/tags/tag_key.h"
2425#include " opencensus/tags/tag_map.h"
2526
27+ using opencensus::common::AppendVarint32;
28+ using opencensus::common::ParseVarint32;
29+
2630namespace opencensus {
2731namespace tags {
2832namespace propagation {
29-
3033namespace {
3134
3235constexpr char kVersionId = ' \0 ' ;
3336constexpr char kTagFieldId = ' \0 ' ;
3437constexpr int kMaxLen = 8192 ;
3538
36- // Appends a variable-length encoded integer to the destination string.
37- void AppendVarint (unsigned int i, std::string* out) {
38- do {
39- // Encode 7 bits.
40- uint8_t c = i & 0x7F ;
41- i = i >> 7 ;
42- if (i != 0 ) {
43- c |= 0x80 ;
44- }
45- out->push_back (c);
46- } while (i != 0 );
47- }
48-
49- // Parses a variable-length encoded integer from the input. Returns false on
50- // failure. Returns true and consumes the bytes from the input, on success.
51- bool ParseVarint (absl::string_view* input, int * out) {
52- absl::string_view s = *input;
53- int i = 0 ;
54- uint8_t c;
55- do {
56- if (s.empty ()) {
57- return false ; // Too short.
58- }
59- c = s[0 ];
60- s = s.substr (1 );
61- i = (i << 7 ) | (c & 0x7F );
62- } while (c & 0x80 );
63- *input = s;
64- *out = i;
65- return true ;
66- }
67-
6839} // namespace
6940
7041bool FromGrpcTagsBinHeader (absl::string_view header, TagMap* out) {
@@ -89,8 +60,8 @@ bool FromGrpcTagsBinHeader(absl::string_view header, TagMap* out) {
8960 // Parse key.
9061 absl::string_view key;
9162 {
92- int key_len;
93- if (!ParseVarint (&header, &key_len)) {
63+ uint32_t key_len;
64+ if (!ParseVarint32 (&header, &key_len)) {
9465 return false ; // Invalid key_len.
9566 }
9667 if (key_len > header.length ()) {
@@ -103,8 +74,8 @@ bool FromGrpcTagsBinHeader(absl::string_view header, TagMap* out) {
10374 // Parse val.
10475 absl::string_view val;
10576 {
106- int val_len;
107- if (!ParseVarint (&header, &val_len)) {
77+ uint32_t val_len;
78+ if (!ParseVarint32 (&header, &val_len)) {
10879 return false ; // Invalid val_len.
10980 }
11081 if (val_len > header.length ()) {
@@ -138,9 +109,9 @@ std::string ToGrpcTagsBinHeader(const TagMap& tags) {
138109 const auto & key = key_val.first ;
139110 const auto & val = key_val.second ;
140111 out.push_back (kTagFieldId );
141- AppendVarint (key.name ().length (), &out);
112+ AppendVarint32 (key.name ().length (), &out);
142113 out.append (key.name ());
143- AppendVarint (val.length (), &out);
114+ AppendVarint32 (val.length (), &out);
144115 // Encoded value must be UTF-8.
145116 out.append (val);
146117 if (out.size () > kMaxLen ) {
0 commit comments