Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
7166095
add forward_original_sni to upstream TLS Context
vadimeisenbergibm Sep 4, 2018
8e298cc
reorder the fields in UpstreamTlsContext, put forward_original_sni last
vadimeisenbergibm Sep 5, 2018
fea6a13
remove TODO related to oneof and clarified the configuration
vadimeisenbergibm Sep 6, 2018
2f39451
add Network::ConnectionSocket::OptionsSharedPtr parameter to createTr…
vadimeisenbergibm Sep 6, 2018
3cc57db
fix format
vadimeisenbergibm Sep 9, 2018
f90f771
Add forward-original-sni to context_config
ronensc Sep 16, 2018
1d8578a
Revert "fix format"
vadimeisenbergibm Oct 10, 2018
5e7bed7
Revert "add Network::ConnectionSocket::OptionsSharedPtr parameter to …
vadimeisenbergibm Oct 10, 2018
f8b4f60
Revert "Add forward-original-sni to context_config"
vadimeisenbergibm Oct 10, 2018
26eb6fb
add forwardOriginalServerNameIndication() to ClusterInfo
vadimeisenbergibm Oct 10, 2018
7c37d51
add overrideServerNameIndication parameter to SslSocket and Context
vadimeisenbergibm Oct 10, 2018
ba9ff7d
add forwardOriginalServerNameIndication() to MockClusterInfo
vadimeisenbergibm Oct 11, 2018
35945a4
add overrideServerNameIndication to TransportSocketFactory::createTra…
vadimeisenbergibm Oct 11, 2018
3f927b1
update MockTransportSocketFactory::createTransportSocket()
vadimeisenbergibm Oct 11, 2018
cfcc5ee
fix TsiSocketFactory::createTransportSocket()
vadimeisenbergibm Oct 11, 2018
f0c1725
add overrideServerNameIndication to Host::createConnection()
vadimeisenbergibm Oct 11, 2018
baced96
remove unused parameter name
vadimeisenbergibm Oct 11, 2018
8f40ece
pass the SNI from the downstream connection to createConnection
vadimeisenbergibm Oct 11, 2018
aae6a12
add the SNI to the hash key
vadimeisenbergibm Oct 11, 2018
567552d
add the requested server name to the hash key in tcpConnPool instead …
vadimeisenbergibm Oct 13, 2018
09b8738
add a null pointer check
vadimeisenbergibm Oct 15, 2018
77de8e7
use absl::optional<std::string> instead of string with default
vadimeisenbergibm Oct 15, 2018
e7f5948
fix createConnection in test/mocks/upstream/host.h
vadimeisenbergibm Oct 16, 2018
f7249b2
fix MockTransportSocketFactory::createTransportSocket()
vadimeisenbergibm Oct 16, 2018
798a655
fix call to createTransportSocket in grpc_client_integration_test_har…
vadimeisenbergibm Oct 16, 2018
97057e9
a bug fix, inversing the result of optional::has_value()
vadimeisenbergibm Oct 16, 2018
9f9fbe8
pass optional instead of its value as a parameter
vadimeisenbergibm Oct 16, 2018
9a2a41e
more cases of passing optional instead of its value as a parameter
vadimeisenbergibm Oct 16, 2018
b44433d
another case of passing optional instead of its value as a parameter
vadimeisenbergibm Oct 16, 2018
1ed9359
add overrideServerName parameter to TCP ConnPool::ConnPool
vadimeisenbergibm Oct 16, 2018
c1d4228
fix TcpConnPoolImplDestructorTest
vadimeisenbergibm Oct 16, 2018
cb4ecb8
add overrideServerName parameter to allocateTcpConnPool()
vadimeisenbergibm Oct 17, 2018
7a0fb8b
fix MOCK_METHOD cardinality for allocateTcpConnPool
vadimeisenbergibm Oct 17, 2018
932d043
remove unnecessary initialization of an optional
vadimeisenbergibm Oct 17, 2018
320e435
add a check that requestedServerName is not empty
vadimeisenbergibm Oct 17, 2018
c7a32d0
assign to optional by operator=(), not by value()
vadimeisenbergibm Oct 18, 2018
e9fc3a1
Merge branch 'master' into forward_original_sni
vadimeisenbergibm Oct 21, 2018
3da1148
add OriginalRequestedServerName filter state object, and use it the f…
vadimeisenbergibm Oct 22, 2018
8d8b39c
add envoy.filters.network.original_sni
vadimeisenbergibm Oct 22, 2018
325855f
add a check that a parameter is not null
vadimeisenbergibm Oct 23, 2018
740bfd3
remove redundant check
vadimeisenbergibm Oct 23, 2018
45aed66
Merge branch 'master' into forward_original_sni
vadimeisenbergibm Oct 23, 2018
19a6e0d
overrideServerName -> override_server_name
vadimeisenbergibm Oct 23, 2018
7e18f1c
add override_server_name parameter to tcpConnForCluster and tcpConnPo…
vadimeisenbergibm Oct 24, 2018
233bc5f
fix mock method's cardinality
vadimeisenbergibm Oct 28, 2018
5e704fb
fix lambda parameters in test
vadimeisenbergibm Oct 28, 2018
af8e96f
Merge branch 'master' into forward_original_sni
vadimeisenbergibm Oct 28, 2018
460e84a
add missing include of absl::optional
vadimeisenbergibm Oct 29, 2018
5bccf5c
fix formatting
vadimeisenbergibm Oct 29, 2018
6d1ff22
fix a call to setData() method
vadimeisenbergibm Oct 29, 2018
365bf98
remove polling filterState for original sni
vadimeisenbergibm Oct 31, 2018
d2857ea
Revert "remove polling filterState for original sni"
vadimeisenbergibm Oct 31, 2018
4a11d1f
use using instead of typedef
vadimeisenbergibm Oct 31, 2018
1dbef57
add ON_CALL for const filterState() mock method
vadimeisenbergibm Oct 31, 2018
cbf26fa
add missing using for testing::Const
vadimeisenbergibm Oct 31, 2018
616c91b
fix syntax of using directives
vadimeisenbergibm Oct 31, 2018
5d9b559
Revert "add forwardOriginalServerNameIndication() to MockClusterInfo"
vadimeisenbergibm Oct 31, 2018
809c74f
Revert "add forwardOriginalServerNameIndication() to ClusterInfo"
vadimeisenbergibm Oct 31, 2018
f41f7c0
Revert "remove TODO related to oneof and clarified the configuration"
vadimeisenbergibm Oct 31, 2018
ac4278a
Revert "reorder the fields in UpstreamTlsContext, put forward_origina…
vadimeisenbergibm Oct 31, 2018
9217a85
Revert "add forward_original_sni to upstream TLS Context"
vadimeisenbergibm Oct 31, 2018
7150d92
original_requested_server_name -> forward_requested_server_name
vadimeisenbergibm Nov 1, 2018
74bdc7e
OriginalRequestedServerName -> ForwardRequestedServerName
vadimeisenbergibm Nov 1, 2018
d441cda
source/extensions/filters/network/original_sni -> source/extensions/f…
vadimeisenbergibm Nov 1, 2018
bfea2ff
OriginalSniNetworkFilter -> ForwardOriginalSniNetworkFilter
vadimeisenbergibm Nov 1, 2018
123f591
use auto variable qualifier
vadimeisenbergibm Nov 1, 2018
5ab3ad2
add test for forward_original_sni network filter
vadimeisenbergibm Nov 1, 2018
e4a44c6
fix a typo
vadimeisenbergibm Nov 1, 2018
e24ff66
add using declaration for ForwardRequestedServerName
vadimeisenbergibm Nov 1, 2018
4ea35c7
fix additional typo
vadimeisenbergibm Nov 1, 2018
2590146
add initial version of CreateTransportSocketWithOverrideServerName
vadimeisenbergibm Nov 1, 2018
50a5091
fix CreateTransportSocketWithOverrideServerName test
vadimeisenbergibm Nov 1, 2018
b53e88a
use get() to extract the pointer from uniq_ptr
vadimeisenbergibm Nov 2, 2018
b748e80
use connection to test ssl socket
vadimeisenbergibm Nov 2, 2018
60b04e0
remove checking client_session
vadimeisenbergibm Nov 2, 2018
4e7601a
remove transport_socket temprary variable
vadimeisenbergibm Nov 2, 2018
6fd2102
add check that client_connection is not nullptr
vadimeisenbergibm Nov 2, 2018
53ee9a5
Revert "add check that client_connection is not nullptr"
vadimeisenbergibm Nov 2, 2018
c890c3b
Revert "remove transport_socket temprary variable"
vadimeisenbergibm Nov 2, 2018
9e6966a
Revert "remove checking client_session"
vadimeisenbergibm Nov 2, 2018
2667505
Revert "use connection to test ssl socket"
vadimeisenbergibm Nov 2, 2018
13e8101
Revert "use get() to extract the pointer from uniq_ptr"
vadimeisenbergibm Nov 2, 2018
652c050
Revert "fix CreateTransportSocketWithOverrideServerName test"
vadimeisenbergibm Nov 2, 2018
b9fd493
Revert "add initial version of CreateTransportSocketWithOverrideServe…
vadimeisenbergibm Nov 2, 2018
ce243f4
add override_server_name_parameter to testUtilV2
vadimeisenbergibm Nov 2, 2018
0f7d564
fix erroneous parameters to testUtil
vadimeisenbergibm Nov 2, 2018
fa2df04
add OverrideRequestedServerName test
vadimeisenbergibm Nov 2, 2018
4a7c8e6
check the SNI in the client SSL
vadimeisenbergibm Nov 2, 2018
a96f40f
optional hasValue() -> has_value()
vadimeisenbergibm Nov 2, 2018
4fd8156
fix a variable name
vadimeisenbergibm Nov 2, 2018
68e15df
fix format
vadimeisenbergibm Nov 2, 2018
4e5648a
remove applying SSL_get_servername on the client
vadimeisenbergibm Nov 4, 2018
e560b74
rename ForwardRequestedServerName::Key
vadimeisenbergibm Nov 4, 2018
1613f42
update docs and CODEOWNERS
vadimeisenbergibm Nov 4, 2018
502f9d3
Merge branch 'master' into forward_original_sni
vadimeisenbergibm Nov 4, 2018
548c063
add missing parameter to createTransportSocket()
vadimeisenbergibm Nov 4, 2018
c9d3673
add tcp proxy ForwardRequestedServerName
vadimeisenbergibm Nov 4, 2018
45734c0
fix a comment
vadimeisenbergibm Nov 5, 2018
127bce3
set local address for the connection in ForwardRequestedServerName test
vadimeisenbergibm Nov 5, 2018
2e4a8da
use WillOnce(Invoke) to test the override_server_name
vadimeisenbergibm Nov 5, 2018
0c7a948
fix parameters of the lambda in Invoke of ForwardRequestServerName
vadimeisenbergibm Nov 5, 2018
f01b818
fix the key of ForwardRequestedServerName
vadimeisenbergibm Nov 5, 2018
e63a960
add extracting the requested server name from the server side SSL object
vadimeisenbergibm Nov 5, 2018
7b28148
add OverrideRequestedServerNameWithoutSniInUpstreamTlsContext test
vadimeisenbergibm Nov 5, 2018
0dc8998
fix format
vadimeisenbergibm Nov 5, 2018
46dd604
add passing nonempty value of override_server_name in UnknownCluster …
vadimeisenbergibm Nov 5, 2018
89ce5fc
add DynamicHostRemoveWithTls test
vadimeisenbergibm Nov 5, 2018
d44e6f2
tlsContext -> ssl_context according to the json schema
vadimeisenbergibm Nov 5, 2018
c2fada8
remove ssl_context from DynamicHostRemoveWithTls
vadimeisenbergibm Nov 5, 2018
25c1aa6
move setting hash key by the override_server_name field out of contai…
vadimeisenbergibm Nov 5, 2018
7bb1793
fix a counter value due to changes
vadimeisenbergibm Nov 5, 2018
ca99513
add drained cb for example.com and ibm.com connection pools
vadimeisenbergibm Nov 5, 2018
6b8ea04
fix the number of drained connection pools
vadimeisenbergibm Nov 6, 2018
08602ac
add vadimeisenbergibm to code owners of forward_original_sni extension
vadimeisenbergibm Nov 6, 2018
7ccaf1d
extract override_server_name functionality into a separate PR
vadimeisenbergibm Nov 6, 2018
0f13892
extract override_server_name functionality into a separate PR, leftovers
vadimeisenbergibm Nov 6, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#* @envoyproxy/maintainers

# dubbo_proxy extension
/*/extensions/filters/network/dubbo_proxy @zyfjeff @lizan
/*/extensions/filters/network/dubbo_proxy @zyfjeff @lizan
# thrift_proxy extension
/*/extensions/filters/network/thrift_proxy @zuercher @brian-pane
# jwt_authn http filter extension
Expand All @@ -14,3 +14,5 @@
/*/extensions/transport_sockets/alts @htuch @yangminzhu
# sni_cluster extension
/*/extensions/filters/network/sni_cluster @rshriram @lizan
# extension
/*/extensions/filters/network/forward_original_sni @lizan @vadimeisenbergibm
14 changes: 14 additions & 0 deletions docs/root/configuration/network_filters/forward_original_sni.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
.. _config_network_filters_forward_original_sni:

Forward Original SNI
=========================

The `forward_original_sni` is a network filter that instructs other filters,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

given this explanation, I think this should be called use_downstream_sni .
The explanation also needs to be tweaked to state that when an inbound connection is using TLS, and the upstream cluster is using mTLS, this option will allow user to automatically set the SNI of upstream cluster to be the same as the downstream SNI.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rshriram Agreed, used_downstream_sni is more clear.

Regarding:

The explanation also needs to be tweaked to state that when an inbound connection is using TLS, and the upstream cluster is using mTLS, this option will allow user to automatically set the SNI of upstream cluster to be the same as the downstream SNI.

So why does the explanation not cover the case you are describing? If we can consider mTLS being a kind of TLS: a network filter that instructs other filters, such as tcp_proxy, to forward the SNI value from the downstream connection to the upstream connection

such as `tcp_proxy`, to forward the SNI value from the downstream connection
to the upstream connection. The filter will do nothing for non-TLS connections or
for TLS connections without SNI.

This filter has no configuration. It must be installed before the
:ref:`tcp_proxy <config_network_filters_tcp_proxy>` filter.

* :ref:`v2 API reference <envoy_api_field_listener.Filter.name>`
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ filters.
tcp_proxy_filter
thrift_proxy_filter
sni_cluster_filter
forward_original_sni
8 changes: 8 additions & 0 deletions docs/root/configuration/network_filters/tcp_proxy_filter.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@ implementation for the details.

.. _config_network_filters_tcp_proxy_stats:

Setting SNI
-----------

If `forward_original_sni` filter is installed, the TCP proxy filter will
override the value in the `sni` field of
:ref:`UpstreamTlsContext <envoy_api_msg_auth.UpstreamTlsContext>` of the
upstream cluster by the SNI value from the downstream TLS connection.

Statistics
----------

Expand Down
2 changes: 1 addition & 1 deletion docs/root/intro/arch_overview/ssl.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ requirements (TLS1.2, SNI, etc.). Envoy supports the following TLS features:
(CRL) if one is :ref:`provided <envoy_api_field_auth.CertificateValidationContext.crl>`.
* **ALPN**: TLS listeners support ALPN. The HTTP connection manager uses this information (in
addition to protocol inference) to determine whether a client is speaking HTTP/1.1 or HTTP/2.
* **SNI**: SNI is supported for both server (listener) and client (upstream) connections.
* **SNI**: SNI is supported for both server (listener) and client (upstream) connections, including forwarding the SNI value from the downstream connection to the upstream one.
* **Session resumption**: Server connections support resuming previous sessions via TLS session
tickets (see `RFC 5077 <https://www.ietf.org/rfc/rfc5077.txt>`_). Resumption can be performed
across hot restarts and between parallel Envoy instances (typically useful in a front proxy
Expand Down
2 changes: 2 additions & 0 deletions docs/root/intro/version_history.rst
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ Version history
* tracing: added support to the Zipkin tracer for the :ref:`b3 <config_http_conn_man_headers_b3>` single header format.
* upstream: changed how load calculation for :ref:`priority levels<arch_overview_load_balancing_priority_levels>` and :ref:`panic thresholds<arch_overview_load_balancing_panic_threshold>` interact. As long as normalized total health is 100% panic thresholds are disregarded.
* upstream: changed the default hash for :ref:`ring hash <envoy_api_msg_Cluster.RingHashLbConfig>` from std::hash to `xxHash <https://github.com/Cyan4973/xxHash>`_.
* network: introduced :ref:`forward_original_sni <config_network_filters_forward_original_sni>` network filter that instructs `tcp_proxy` to forward the SNI value from the downstream TLS connection to the upstream TLS connection. If `forward_original_sni` is installed, `tcp_proxy` will override the value in the `sni` field of :ref:`UpstreamTlsContext <envoy_api_msg_auth.UpstreamTlsContext>` of
the upstream cluster by the SNI value from the downstream connection.

1.8.0 (Oct 4, 2018)
===================
Expand Down
2 changes: 2 additions & 0 deletions source/extensions/extensions_build_config.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ EXTENSIONS = {
"envoy.filters.network.ext_authz": "//source/extensions/filters/network/ext_authz:config",
"envoy.filters.network.http_connection_manager": "//source/extensions/filters/network/http_connection_manager:config",
"envoy.filters.network.mongo_proxy": "//source/extensions/filters/network/mongo_proxy:config",
"envoy.filters.network.forward_original_sni": "//source/extensions/filters/network/forward_original_sni:config",
"envoy.filters.network.ratelimit": "//source/extensions/filters/network/ratelimit:config",
"envoy.filters.network.rbac": "//source/extensions/filters/network/rbac:config",
"envoy.filters.network.redis_proxy": "//source/extensions/filters/network/redis_proxy:config",
Expand Down Expand Up @@ -182,6 +183,7 @@ WINDOWS_EXTENSIONS = {
#"envoy.filters.network.ext_authz": "//source/extensions/filters/network/ext_authz:config",
#"envoy.filters.network.http_connection_manager": "//source/extensions/filters/network/http_connection_manager:config",
#"envoy.filters.network.mongo_proxy": "//source/extensions/filters/network/mongo_proxy:config",
#"envoy.filters.network.original_sni": "//source/extensions/filters/network/original_sni:config",
#"envoy.filters.network.redis_proxy": "//source/extensions/filters/network/redis_proxy:config",
#"envoy.filters.network.ratelimit": "//source/extensions/filters/network/ratelimit:config",
"envoy.filters.network.tcp_proxy": "//source/extensions/filters/network/tcp_proxy:config",
Expand Down
32 changes: 32 additions & 0 deletions source/extensions/filters/network/forward_original_sni/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
licenses(["notice"]) # Apache 2

load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_library",
"envoy_package",
)

envoy_package()

envoy_cc_library(
name = "forward_original_sni",
srcs = ["forward_original_sni.cc"],
hdrs = ["forward_original_sni.h"],
deps = [
"//include/envoy/network:connection_interface",
"//include/envoy/network:filter_interface",
"//source/common/stream_info:forward_requested_server_name_lib",
],
)

envoy_cc_library(
name = "config",
srcs = ["config.cc"],
hdrs = ["config.h"],
deps = [
":forward_original_sni",
"//include/envoy/registry",
"//include/envoy/server:filter_config_interface",
"//source/extensions/filters/network:well_known_names",
],
)
40 changes: 40 additions & 0 deletions source/extensions/filters/network/forward_original_sni/config.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#include "extensions/filters/network/forward_original_sni/config.h"

#include "envoy/registry/registry.h"
#include "envoy/server/filter_config.h"

#include "extensions/filters/network/forward_original_sni/forward_original_sni.h"

namespace Envoy {
namespace Extensions {
namespace NetworkFilters {
namespace ForwardOriginalSni {

Network::FilterFactoryCb ForwardOriginalSniNetworkFilterConfigFactory::createFilterFactory(
const Json::Object&, Server::Configuration::FactoryContext&) {
// Only used in v1 filters.
NOT_IMPLEMENTED_GCOVR_EXCL_LINE;
}

Network::FilterFactoryCb ForwardOriginalSniNetworkFilterConfigFactory::createFilterFactoryFromProto(
const Protobuf::Message&, Server::Configuration::FactoryContext&) {
return [](Network::FilterManager& filter_manager) -> void {
filter_manager.addReadFilter(std::make_shared<ForwardOriginalSniFilter>());
};
}

ProtobufTypes::MessagePtr ForwardOriginalSniNetworkFilterConfigFactory::createEmptyConfigProto() {
return std::make_unique<ProtobufWkt::Empty>();
}

/**
* Static registration for the forward_original_sni filter. @see RegisterFactory.
*/
static Registry::RegisterFactory<ForwardOriginalSniNetworkFilterConfigFactory,
Server::Configuration::NamedNetworkFilterConfigFactory>
registered_;

} // namespace ForwardOriginalSni
} // namespace NetworkFilters
} // namespace Extensions
} // namespace Envoy
31 changes: 31 additions & 0 deletions source/extensions/filters/network/forward_original_sni/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#pragma once

#include "envoy/server/filter_config.h"

#include "extensions/filters/network/well_known_names.h"

namespace Envoy {
namespace Extensions {
namespace NetworkFilters {
namespace ForwardOriginalSni {

/**
* Config registration for the original_sni filter. @see NamedNetworkFilterConfigFactory.
*/
class ForwardOriginalSniNetworkFilterConfigFactory
: public Server::Configuration::NamedNetworkFilterConfigFactory {
public:
// NamedNetworkFilterConfigFactory
Network::FilterFactoryCb createFilterFactory(const Json::Object&,
Server::Configuration::FactoryContext&) override;
Network::FilterFactoryCb
createFilterFactoryFromProto(const Protobuf::Message&,
Server::Configuration::FactoryContext&) override;
ProtobufTypes::MessagePtr createEmptyConfigProto() override;
std::string name() override { return NetworkFilterNames::get().ForwardOriginalSni; }
};

} // namespace ForwardOriginalSni
} // namespace NetworkFilters
} // namespace Extensions
} // namespace Envoy
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#include "extensions/filters/network/forward_original_sni/forward_original_sni.h"

#include "envoy/network/connection.h"

#include "common/stream_info/forward_requested_server_name.h"

namespace Envoy {
namespace Extensions {
namespace NetworkFilters {
namespace ForwardOriginalSni {

using ::Envoy::StreamInfo::ForwardRequestedServerName;

Network::FilterStatus ForwardOriginalSniFilter::onNewConnection() {
absl::string_view sni = read_callbacks_->connection().requestedServerName();

if (!sni.empty()) {
read_callbacks_->connection().streamInfo().filterState().setData(
ForwardRequestedServerName::Key, std::make_unique<ForwardRequestedServerName>(sni),
StreamInfo::FilterState::StateType::ReadOnly);
}

return Network::FilterStatus::Continue;
}

} // namespace ForwardOriginalSni
} // namespace NetworkFilters
} // namespace Extensions
} // namespace Envoy
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#pragma once

#include "envoy/network/filter.h"

namespace Envoy {
namespace Extensions {
namespace NetworkFilters {
namespace ForwardOriginalSni {

/**
* Implementation of the original_sni filter that sets the original requested server name from
* the SNI field in the TLS connection.
*/
class ForwardOriginalSniFilter : public Network::ReadFilter {
public:
// Network::ReadFilter
Network::FilterStatus onData(Buffer::Instance&, bool) override {
return Network::FilterStatus::Continue;
}
Network::FilterStatus onNewConnection() override;
void initializeReadFilterCallbacks(Network::ReadFilterCallbacks& callbacks) override {
read_callbacks_ = &callbacks;
}

private:
Network::ReadFilterCallbacks* read_callbacks_{};
};

} // namespace ForwardOriginalSni
} // namespace NetworkFilters
} // namespace Extensions
} // namespace Envoy
26 changes: 26 additions & 0 deletions test/extensions/filters/network/forward_original_sni/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
licenses(["notice"]) # Apache 2

load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_test",
"envoy_package",
)
load(
"//test/extensions:extensions_build_system.bzl",
"envoy_extension_cc_test",
)

envoy_package()

envoy_extension_cc_test(
name = "forward_original_sni_test",
srcs = ["forward_original_sni_test.cc"],
extension_name = "envoy.filters.network.forward_original_sni",
deps = [
"//source/extensions/filters/network/forward_original_sni",
"//source/extensions/filters/network/forward_original_sni:config",
"//test/mocks/network:network_mocks",
"//test/mocks/server:server_mocks",
"//test/mocks/stream_info:stream_info_mocks",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#include "common/stream_info/forward_requested_server_name.h"

#include "extensions/filters/network/forward_original_sni/config.h"
#include "extensions/filters/network/forward_original_sni/forward_original_sni.h"

#include "test/mocks/network/mocks.h"
#include "test/mocks/server/mocks.h"
#include "test/mocks/stream_info/mocks.h"

#include "gmock/gmock.h"
#include "gtest/gtest.h"

using testing::_;
using testing::Matcher;
using testing::NiceMock;
using testing::Return;
using testing::ReturnRef;

namespace Envoy {
namespace Extensions {
namespace NetworkFilters {
namespace ForwardOriginalSni {

using ::Envoy::StreamInfo::ForwardRequestedServerName;

// Test that a ForwardOriginalSni filter config works.
TEST(ForwardOriginalSni, ConfigTest) {
NiceMock<Server::Configuration::MockFactoryContext> context;
ForwardOriginalSniNetworkFilterConfigFactory factory;

Network::FilterFactoryCb cb =
factory.createFilterFactoryFromProto(*factory.createEmptyConfigProto(), context);
Network::MockConnection connection;
EXPECT_CALL(connection, addReadFilter(_));
cb(connection);
}

// Test that forward requested server name is set if SNI is available
TEST(ForwardOriginalSni, SetForwardRequestedServerNameOnlyIfSniIsPresent) {
NiceMock<Network::MockReadFilterCallbacks> filter_callbacks;

NiceMock<StreamInfo::MockStreamInfo> stream_info;
ON_CALL(filter_callbacks.connection_, streamInfo()).WillByDefault(ReturnRef(stream_info));
ON_CALL(Const(filter_callbacks.connection_), streamInfo()).WillByDefault(ReturnRef(stream_info));

ForwardOriginalSniFilter filter;
filter.initializeReadFilterCallbacks(filter_callbacks);

// no sni
{
ON_CALL(filter_callbacks.connection_, requestedServerName())
.WillByDefault(Return(EMPTY_STRING));
filter.onNewConnection();

EXPECT_FALSE(stream_info.filterState().hasData<ForwardRequestedServerName>(
ForwardRequestedServerName::Key));
}

// with sni
{
ON_CALL(filter_callbacks.connection_, requestedServerName())
.WillByDefault(Return("www.example.com"));
filter.onNewConnection();

EXPECT_TRUE(stream_info.filterState().hasData<ForwardRequestedServerName>(
ForwardRequestedServerName::Key));

auto forward_requested_server_name =
stream_info.filterState().getDataReadOnly<ForwardRequestedServerName>(
ForwardRequestedServerName::Key);
EXPECT_EQ(forward_requested_server_name.value(), "www.example.com");
}
}

} // namespace ForwardOriginalSni
} // namespace NetworkFilters
} // namespace Extensions
} // namespace Envoy