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
100
  void setMessageType(MessageType type) { message_type_ = type; }
23
59
  MessageType messageType() const { return message_type_; }
24

            
25
55
  void setResponseStatus(ResponseStatus status) { response_status_ = status; }
26
16
  bool hasResponseStatus() const { return response_status_.has_value(); }
27
41
  ResponseStatus responseStatus() const {
28
41
    ASSERT(hasResponseStatus());
29
41
    return response_status_.value();
30
41
  }
31

            
32
  // Body size of dubbo request or dubbo response. Only make sense for
33
  // decoding.
34
36
  void setBodySize(size_t size) { body_size_ = size; }
35
44
  size_t bodySize() const { return body_size_; }
36

            
37
72
  void setRequestId(int64_t id) { request_id_ = id; }
38
86
  int64_t requestId() const { return request_id_; }
39

            
40
14
  bool isTwoWay() const { return message_type_ == MessageType::Request; }
41

            
42
39
  bool heartbeat() const {
43
39
    return message_type_ == MessageType::HeartbeatRequest ||
44
39
           message_type_ == MessageType::HeartbeatResponse;
45
39
  }
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
75
  void setContext(ContextPtr context) { message_context_ = std::move(context); }
61
42
  bool hasContext() const { return message_context_ != nullptr; }
62
81
  const Context& context() const { return *message_context_; }
63
22
  Context& mutableContext() { return *message_context_; }
64

            
65
  // Helper methods to access attributes of common context.
66
14
  MessageType messageType() const {
67
14
    ASSERT(hasContext());
68
14
    return message_context_->messageType();
69
14
  }
70
3
  bool hasResponseStatus() const {
71
3
    ASSERT(hasContext());
72
3
    return message_context_->hasResponseStatus();
73
3
  }
74
13
  ResponseStatus responseStatus() const {
75
13
    ASSERT(hasContext());
76
13
    return message_context_->responseStatus();
77
13
  }
78
1
  bool heartbeat() const {
79
1
    ASSERT(hasContext());
80
1
    return message_context_->heartbeat();
81
1
  }
82
47
  int64_t requestId() const {
83
47
    ASSERT(hasContext());
84
47
    return message_context_->requestId();
85
47
  }
86

            
87
  // Request info.
88
17
  void setRequest(RpcRequestPtr request) { rpc_request_ = std::move(request); }
89
4
  bool hasRequest() const { return rpc_request_ != nullptr; }
90
30
  const RpcRequest& request() const { return *rpc_request_; }
91
1
  RpcRequest& mutableRequest() { return *rpc_request_; }
92

            
93
  // Response info.
94
31
  void setResponse(RpcResponsePtr response) { rpc_response_ = std::move(response); }
95
4
  bool hasResponse() const { return rpc_response_ != nullptr; }
96
31
  const RpcResponse& response() const { return *rpc_response_; }
97
13
  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