1
#pragma once
2

            
3
#include <cstdint>
4
#include <map>
5
#include <memory>
6
#include <string>
7

            
8
#include "envoy/common/time.h"
9
#include "envoy/http/header_map.h"
10
#include "envoy/network/address.h"
11
#include "envoy/stream_info/filter_state.h"
12
#include "envoy/stream_info/stream_info.h"
13

            
14
#include "source/common/common/thread.h"
15
#include "source/common/protobuf/protobuf.h" // IWYU pragma: keep
16

            
17
#include "absl/base/thread_annotations.h"
18
#include "absl/strings/string_view.h"
19
#include "cilium/api/accesslog.pb.h"
20
#include "cilium/uds_client.h"
21

            
22
namespace Envoy {
23
namespace Cilium {
24

            
25
constexpr absl::string_view AccessLogKey = "cilium.accesslog.entry";
26

            
27
class AccessLog : public UDSClient {
28
public:
29
  static std::shared_ptr<AccessLog> open(const std::string& path, TimeSource& time_source);
30
  ~AccessLog();
31

            
32
  // wrapper for protobuf
33
  class Entry : public StreamInfo::FilterState::Object {
34
  public:
35
    void initFromRequest(const std::string& policy_name, uint32_t proxy_id, bool ingress,
36
                         uint32_t source_identity,
37
                         const Network::Address::InstanceConstSharedPtr& source_address,
38
                         uint32_t destination_identity,
39
                         const Network::Address::InstanceConstSharedPtr& destination_address,
40
                         const StreamInfo::StreamInfo&, const Http::RequestHeaderMap&);
41
    void updateFromRequest(uint32_t destination_identity,
42
                           const Network::Address::InstanceConstSharedPtr& destination_address,
43
                           const Http::RequestHeaderMap&);
44
    void updateFromResponse(const Http::ResponseHeaderMap&, TimeSource&);
45

            
46
    void initFromConnection(const std::string& policy_name, uint32_t proxy_id, bool ingress,
47
                            uint32_t source_identity,
48
                            const Network::Address::InstanceConstSharedPtr& source_address,
49
                            uint32_t destination_identity,
50
                            const Network::Address::InstanceConstSharedPtr& destination_address,
51
                            TimeSource* time_source);
52
    bool updateFromMetadata(const std::string& l7proto, const ProtobufWkt::Struct& metadata);
53
    void addRejected(absl::string_view key, absl::string_view value);
54
    void addMissing(absl::string_view key, absl::string_view value);
55

            
56
    ::cilium::LogEntry entry_{};
57
    bool request_logged_ = false;
58
  };
59

            
60
  void log(Entry& entry, ::cilium::EntryType);
61

            
62
private:
63
  explicit AccessLog(const std::string& path, TimeSource& time_source)
64
84
      : UDSClient(path, time_source), path_(path) {}
65

            
66
  static Thread::MutexBasicLockable logs_mutex;
67
  static std::map<std::string, std::weak_ptr<AccessLog>> logs ABSL_GUARDED_BY(logs_mutex);
68

            
69
  const std::string path_;
70
};
71
using AccessLogSharedPtr = std::shared_ptr<AccessLog>;
72

            
73
} // namespace Cilium
74
} // namespace Envoy