/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 |