1
#include "source/extensions/common/dubbo/hessian2_utils.h"
2

            
3
namespace Envoy {
4
namespace Extensions {
5
namespace Common {
6
namespace Dubbo {
7

            
8
// Check
9
// https://github.com/apache/dubbo/blob/master/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ReflectUtils.java
10
// for details of parameters type.
11
13
uint32_t Hessian2Utils::getParametersNumber(const std::string& parameters_type) {
12
13
  if (parameters_type.empty()) {
13
2
    return 0;
14
2
  }
15

            
16
11
  uint32_t count = 0;
17
11
  bool next = false;
18

            
19
255
  for (auto ch : parameters_type) {
20
255
    if (ch == '[') {
21
      // Is array.
22
17
      continue;
23
17
    }
24

            
25
238
    if (next && ch != ';') {
26
      // Is Object.
27
163
      continue;
28
163
    }
29

            
30
75
    switch (ch) {
31
2
    case 'V':
32
10
    case 'Z':
33
18
    case 'B':
34
23
    case 'C':
35
29
    case 'D':
36
33
    case 'F':
37
37
    case 'I':
38
44
    case 'J':
39
46
    case 'S':
40
46
      count++;
41
46
      break;
42
11
    case 'L':
43
      // Start of Object.
44
11
      count++;
45
11
      next = true;
46
11
      break;
47
11
    case ';':
48
      // End of Object.
49
11
      next = false;
50
11
      break;
51
7
    default:
52
7
      break;
53
75
    }
54
75
  }
55
11
  return count;
56
11
}
57

            
58
136
void BufferWriter::rawWrite(const void* data, uint64_t size) { buffer_.add(data, size); }
59

            
60
90
void BufferWriter::rawWrite(absl::string_view data) { buffer_.add(data); }
61

            
62
273
void BufferReader::rawReadNBytes(void* data, size_t len, size_t peek_offset) {
63
273
  ASSERT(byteAvailable() - peek_offset >= len);
64
273
  buffer_.copyOut(offset() + peek_offset, len, data);
65
273
}
66

            
67
} // namespace Dubbo
68
} // namespace Common
69
} // namespace Extensions
70
} // namespace Envoy