1
#pragma once
2

            
3
#include <memory>
4
#include <tuple>
5

            
6
#include "envoy/extensions/http/stateful_session/envelope/v3/envelope.pb.h"
7
#include "envoy/http/stateful_session.h"
8

            
9
#include "source/common/common/base64.h"
10
#include "source/common/http/headers.h"
11
#include "source/common/http/utility.h"
12

            
13
namespace Envoy {
14
namespace Extensions {
15
namespace Http {
16
namespace StatefulSession {
17
namespace Envelope {
18

            
19
using EnvelopeSessionStateProto =
20
    envoy::extensions::http::stateful_session::envelope::v3::EnvelopeSessionState;
21

            
22
class EnvelopeSessionStateFactory : public Envoy::Http::SessionStateFactory,
23
                                    public Logger::Loggable<Logger::Id::http> {
24
public:
25
  class SessionStateImpl : public Envoy::Http::SessionState {
26
  public:
27
    SessionStateImpl(absl::optional<std::string> address,
28
                     const EnvelopeSessionStateFactory& factory)
29
9
        : upstream_address_(std::move(address)), factory_(factory) {}
30

            
31
9
    absl::optional<absl::string_view> upstreamAddress() const override { return upstream_address_; }
32
    bool onUpdate(absl::string_view host_address, Envoy::Http::ResponseHeaderMap& headers) override;
33

            
34
  private:
35
    absl::optional<std::string> upstream_address_;
36
    const EnvelopeSessionStateFactory& factory_;
37
  };
38

            
39
  EnvelopeSessionStateFactory(const EnvelopeSessionStateProto& config);
40

            
41
9
  Envoy::Http::SessionStatePtr create(Envoy::Http::RequestHeaderMap& headers) const override {
42
9
    return std::make_unique<SessionStateImpl>(parseAddress(headers), *this);
43
9
  }
44

            
45
private:
46
  absl::optional<std::string> parseAddress(Envoy::Http::RequestHeaderMap& headers) const;
47
  const Envoy::Http::LowerCaseString name_;
48
};
49

            
50
} // namespace Envelope
51
} // namespace StatefulSession
52
} // namespace Http
53
} // namespace Extensions
54
} // namespace Envoy