Coverage Report

Created: 2024-09-19 09:45

/proc/self/cwd/source/extensions/common/dubbo/metadata.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include <memory>
4
#include <string>
5
6
#include "source/common/common/assert.h"
7
#include "source/extensions/common/dubbo/message.h"
8
9
#include "absl/types/optional.h"
10
#include "hessian2/object.hpp"
11
12
namespace Envoy {
13
namespace Extensions {
14
namespace Common {
15
namespace Dubbo {
16
17
/**
18
 * Context of dubbo request/response.
19
 */
20
class Context {
21
public:
22
0
  void setMessageType(MessageType type) { message_type_ = type; }
23
0
  MessageType messageType() const { return message_type_; }
24
25
0
  void setResponseStatus(ResponseStatus status) { response_status_ = status; }
26
0
  bool hasResponseStatus() const { return response_status_.has_value(); }
27
0
  ResponseStatus responseStatus() const {
28
0
    ASSERT(hasResponseStatus());
29
0
    return response_status_.value();
30
0
  }
31
32
  // Body size of dubbo request or dubbo response. Only make sense for
33
  // decoding.
34
0
  void setBodySize(size_t size) { body_size_ = size; }
35
0
  size_t bodySize() const { return body_size_; }
36
37
0
  void setRequestId(int64_t id) { request_id_ = id; }
38
0
  int64_t requestId() const { return request_id_; }
39
40
0
  bool isTwoWay() const { return message_type_ == MessageType::Request; }
41
42
0
  bool heartbeat() const {
43
0
    return message_type_ == MessageType::HeartbeatRequest ||
44
0
           message_type_ == MessageType::HeartbeatResponse;
45
0
  }
46
47
private:
48
  MessageType message_type_{MessageType::Request};
49
  absl::optional<ResponseStatus> response_status_{};
50
51
  int64_t request_id_{};
52
  size_t body_size_{};
53
};
54
55
using ContextPtr = std::unique_ptr<Context>;
56
57
class MessageMetadata {
58
public:
59
  // Common message context.
60
0
  void setContext(ContextPtr context) { message_context_ = std::move(context); }
61
0
  bool hasContext() const { return message_context_ != nullptr; }
62
0
  const Context& context() const { return *message_context_; }
63
0
  Context& mutableContext() { return *message_context_; }
64
65
  // Helper methods to access attributes of common context.
66
0
  MessageType messageType() const {
67
0
    ASSERT(hasContext());
68
0
    return message_context_->messageType();
69
0
  }
70
0
  bool hasResponseStatus() const {
71
0
    ASSERT(hasContext());
72
0
    return message_context_->hasResponseStatus();
73
0
  }
74
0
  ResponseStatus responseStatus() const {
75
0
    ASSERT(hasContext());
76
0
    return message_context_->responseStatus();
77
0
  }
78
0
  bool heartbeat() const {
79
0
    ASSERT(hasContext());
80
0
    return message_context_->heartbeat();
81
0
  }
82
0
  int64_t requestId() const {
83
0
    ASSERT(hasContext());
84
0
    return message_context_->requestId();
85
0
  }
86
87
  // Request info.
88
0
  void setRequest(RpcRequestPtr request) { rpc_request_ = std::move(request); }
89
0
  bool hasRequest() const { return rpc_request_ != nullptr; }
90
0
  const RpcRequest& request() const { return *rpc_request_; }
91
0
  RpcRequest& mutableRequest() { return *rpc_request_; }
92
93
  // Response info.
94
0
  void setResponse(RpcResponsePtr response) { rpc_response_ = std::move(response); }
95
0
  bool hasResponse() const { return rpc_response_ != nullptr; }
96
0
  const RpcResponse& response() const { return *rpc_response_; }
97
0
  RpcResponse& mutableResponse() { return *rpc_response_; }
98
99
private:
100
  // Common message context for dubbo request and dubbo response.
101
  ContextPtr message_context_;
102
103
  RpcRequestPtr rpc_request_;
104
105
  RpcResponsePtr rpc_response_;
106
};
107
108
using MessageMetadataSharedPtr = std::shared_ptr<MessageMetadata>;
109
110
} // namespace Dubbo
111
} // namespace Common
112
} // namespace Extensions
113
} // namespace Envoy