From 019510c380b532ef15672ae120cb102cf02a2f28 Mon Sep 17 00:00:00 2001 From: Asra Ali Date: Wed, 4 Mar 2020 09:22:52 -0500 Subject: [PATCH 1/3] split filter fuzz class Signed-off-by: Asra Ali --- .../extensions/filters/http/common/fuzz/BUILD | 24 ++- .../http/common/fuzz/filter_fuzz_test.cc | 135 +--------------- .../filters/http/common/fuzz/uber_filter.h | 150 ++++++++++++++++++ 3 files changed, 167 insertions(+), 142 deletions(-) create mode 100644 test/extensions/filters/http/common/fuzz/uber_filter.h diff --git a/test/extensions/filters/http/common/fuzz/BUILD b/test/extensions/filters/http/common/fuzz/BUILD index 6cbcd8ca929a2..d9595ace594dc 100644 --- a/test/extensions/filters/http/common/fuzz/BUILD +++ b/test/extensions/filters/http/common/fuzz/BUILD @@ -3,6 +3,7 @@ licenses(["notice"]) # Apache 2 load( "//bazel:envoy_build_system.bzl", "envoy_cc_fuzz_test", + "envoy_cc_test_library", "envoy_package", "envoy_proto_library", ) @@ -22,6 +23,20 @@ envoy_proto_library( ], ) +envoy_cc_test_library( + name = "uber_filter_lib", + hdrs = ["uber_filter.h"], + deps = [ + ":filter_fuzz_proto_cc_proto", + "//source/common/config:utility_lib", + "//source/common/protobuf:utility_lib", + "//test/fuzz:utility_lib", + "//test/mocks/buffer:buffer_mocks", + "//test/mocks/http:http_mocks", + "//test/mocks/server:server_mocks", + ], +) + envoy_cc_fuzz_test( name = "filter_fuzz_test", srcs = ["filter_fuzz_test.cc"], @@ -29,16 +44,9 @@ envoy_cc_fuzz_test( # All Envoy extensions must be linked to the test in order for the fuzzer to pick # these up via the NamedHttpFilterConfigFactory. deps = [ - ":filter_fuzz_proto_cc_proto", + ":uber_filter_lib", "//source/common/config:utility_lib", - "//source/common/config:version_converter_lib", "//source/common/protobuf:utility_lib", "//test/config:utility_lib", - "//test/fuzz:utility_lib", - "//test/mocks/buffer:buffer_mocks", - "//test/mocks/http:http_mocks", - "//test/mocks/server:server_mocks", - "@envoy_api//envoy/service/auth/v3:pkg_cc_proto", - "@envoy_api//envoy/service/auth/v2alpha:pkg_cc_proto", ] + envoy_all_extensions(), ) diff --git a/test/extensions/filters/http/common/fuzz/filter_fuzz_test.cc b/test/extensions/filters/http/common/fuzz/filter_fuzz_test.cc index c24ecbae653c1..6a9293b9e90cd 100644 --- a/test/extensions/filters/http/common/fuzz/filter_fuzz_test.cc +++ b/test/extensions/filters/http/common/fuzz/filter_fuzz_test.cc @@ -1,153 +1,20 @@ #include #include -#include "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.h" - #include "common/config/utility.h" -#include "common/config/version_converter.h" #include "common/protobuf/utility.h" #include "extensions/filters/http/well_known_names.h" #include "test/config/utility.h" #include "test/extensions/filters/http/common/fuzz/filter_fuzz.pb.validate.h" +#include "test/extensions/filters/http/common/fuzz/uber_filter.h" #include "test/fuzz/fuzz_runner.h" -#include "test/fuzz/utility.h" -#include "test/mocks/buffer/mocks.h" -#include "test/mocks/http/mocks.h" -#include "test/mocks/server/mocks.h" namespace Envoy { namespace Extensions { namespace HttpFilters { -class UberFilterFuzzer { -public: - UberFilterFuzzer() { - // Need to set for both a decoder filter and an encoder/decoder filter. - ON_CALL(filter_callback_, addStreamDecoderFilter(_)) - .WillByDefault( - Invoke([&](std::shared_ptr filter) -> void { - filter_ = filter; - filter_->setDecoderFilterCallbacks(callbacks_); - })); - ON_CALL(filter_callback_, addStreamFilter(_)) - .WillByDefault( - Invoke([&](std::shared_ptr filter) -> void { - filter_ = filter; - filter_->setDecoderFilterCallbacks(callbacks_); - })); - // Ext-authz setup - prepareExtAuthz(); - prepareCache(); - prepareTap(); - } - - void prepareExtAuthz() { - // Preparing the expectations for the ext_authz filter. - addr_ = std::make_shared("1.2.3.4", 1111); - ON_CALL(connection_, remoteAddress()).WillByDefault(testing::ReturnRef(addr_)); - ON_CALL(connection_, localAddress()).WillByDefault(testing::ReturnRef(addr_)); - ON_CALL(callbacks_, connection()).WillByDefault(testing::Return(&connection_)); - ON_CALL(callbacks_, activeSpan()) - .WillByDefault(testing::ReturnRef(Tracing::NullSpan::instance())); - callbacks_.stream_info_.protocol_ = Envoy::Http::Protocol::Http2; - } - - void prepareCache() { - // Prepare expectations for dynamic forward proxy. - ON_CALL(factory_context_.dispatcher_, createDnsResolver(_, _)) - .WillByDefault(testing::Return(resolver_)); - } - - void prepareTap() { - ON_CALL(factory_context_.admin_, addHandler(_, _, _, _, _)) - .WillByDefault(testing::Return(true)); - ON_CALL(factory_context_.admin_, removeHandler(_)).WillByDefault(testing::Return(true)); - } - - // This executes the decode methods to be fuzzed. - void decode(Http::StreamDecoderFilter* filter, const test::fuzz::HttpData& data) { - bool end_stream = false; - - auto headers = Fuzz::fromHeaders(data.headers()); - if (headers.Path() == nullptr) { - headers.setPath("/foo"); - } - if (headers.Method() == nullptr) { - headers.setMethod("GET"); - } - if (headers.Host() == nullptr) { - headers.setHost("foo.com"); - } - - if (data.data().size() == 0 && !data.has_trailers()) { - end_stream = true; - } - ENVOY_LOG_MISC(debug, "Decoding headers: {} ", data.headers().DebugString()); - const auto& headersStatus = filter->decodeHeaders(headers, end_stream); - if (headersStatus != Http::FilterHeadersStatus::Continue || - headersStatus != Http::FilterHeadersStatus::StopIteration) { - return; - } - - for (int i = 0; i < data.data().size(); i++) { - if (i == data.data().size() - 1 && !data.has_trailers()) { - end_stream = true; - } - Buffer::OwnedImpl buffer(data.data().Get(i)); - ENVOY_LOG_MISC(debug, "Decoding data: {} ", buffer.toString()); - if (filter->decodeData(buffer, end_stream) != Http::FilterDataStatus::Continue) { - return; - } - } - - if (data.has_trailers()) { - ENVOY_LOG_MISC(debug, "Decoding trailers: {} ", data.trailers().DebugString()); - auto trailers = Fuzz::fromHeaders(data.trailers()); - filter->decodeTrailers(trailers); - } - } - - // This creates the filter config and runs decode. - void fuzz(const envoy::extensions::filters::network::http_connection_manager::v3::HttpFilter& - proto_config, - const test::fuzz::HttpData& data) { - try { - // Try to create the filter. Exit early if the config is invalid or violates PGV constraints. - ENVOY_LOG_MISC(info, "filter name {}", proto_config.name()); - auto& factory = Config::Utility::getAndCheckFactoryByName< - Server::Configuration::NamedHttpFilterConfigFactory>(proto_config.name()); - ProtobufTypes::MessagePtr message = Config::Utility::translateToFactoryConfig( - proto_config, factory_context_.messageValidationVisitor(), factory); - cb_ = factory.createFilterFactoryFromProto(*message, "stats", factory_context_); - cb_(filter_callback_); - } catch (const EnvoyException& e) { - ENVOY_LOG_MISC(debug, "Controlled exception {}", e.what()); - return; - } - - decode(filter_.get(), data); - reset(); - } - - void reset() { - if (filter_.get() != nullptr) { - filter_.get()->onDestroy(); - } - filter_.reset(); - } - - NiceMock factory_context_; - NiceMock callbacks_; - NiceMock filter_callback_; - std::shared_ptr resolver_{std::make_shared()}; - std::shared_ptr filter_; - Http::FilterFactoryCb cb_; - NiceMock connection_; - Network::Address::InstanceConstSharedPtr addr_; -}; - DEFINE_PROTO_FUZZER(const test::extensions::filters::http::FilterFuzzTestCase& input) { static PostProcessorRegistration reg = {[](test::extensions::filters::http::FilterFuzzTestCase* input, diff --git a/test/extensions/filters/http/common/fuzz/uber_filter.h b/test/extensions/filters/http/common/fuzz/uber_filter.h new file mode 100644 index 0000000000000..e22d16ece4b71 --- /dev/null +++ b/test/extensions/filters/http/common/fuzz/uber_filter.h @@ -0,0 +1,150 @@ +#include +#include + +#include "common/config/utility.h" +#include "common/config/version_converter.h" +#include "common/protobuf/utility.h" + +#include "test/fuzz/utility.h" +#include "test/mocks/buffer/mocks.h" +#include "test/mocks/http/mocks.h" +#include "test/mocks/server/mocks.h" + +namespace Envoy { +namespace Extensions { +namespace HttpFilters { + +class UberFilterFuzzer { +public: + UberFilterFuzzer() { + // Need to set for both a decoder filter and an encoder/decoder filter. + ON_CALL(filter_callback_, addStreamDecoderFilter(_)) + .WillByDefault( + Invoke([&](std::shared_ptr filter) -> void { + filter_ = filter; + filter_->setDecoderFilterCallbacks(callbacks_); + })); + ON_CALL(filter_callback_, addStreamFilter(_)) + .WillByDefault( + Invoke([&](std::shared_ptr filter) -> void { + filter_ = filter; + filter_->setDecoderFilterCallbacks(callbacks_); + })); + setExpectations(); + } + + void setExpectations() { + // Ext-authz setup + prepareExtAuthz(); + prepareCache(); + prepareTap(); + } + + void prepareExtAuthz() { + // Preparing the expectations for the ext_authz filter. + addr_ = std::make_shared("1.2.3.4", 1111); + ON_CALL(connection_, remoteAddress()).WillByDefault(testing::ReturnRef(addr_)); + ON_CALL(connection_, localAddress()).WillByDefault(testing::ReturnRef(addr_)); + ON_CALL(callbacks_, connection()).WillByDefault(testing::Return(&connection_)); + ON_CALL(callbacks_, activeSpan()) + .WillByDefault(testing::ReturnRef(Tracing::NullSpan::instance())); + callbacks_.stream_info_.protocol_ = Envoy::Http::Protocol::Http2; + } + + void prepareCache() { + // Prepare expectations for dynamic forward proxy. + ON_CALL(factory_context_.dispatcher_, createDnsResolver(_, _)) + .WillByDefault(testing::Return(resolver_)); + } + + void prepareTap() { + ON_CALL(factory_context_.admin_, addHandler(_, _, _, _, _)) + .WillByDefault(testing::Return(true)); + ON_CALL(factory_context_.admin_, removeHandler(_)).WillByDefault(testing::Return(true)); + } + + // This executes the decode methods to be fuzzed. + void decode(Http::StreamDecoderFilter* filter, const test::fuzz::HttpData& data) { + bool end_stream = false; + + auto headers = Fuzz::fromHeaders(data.headers()); + if (headers.Path() == nullptr) { + headers.setPath("/foo"); + } + if (headers.Method() == nullptr) { + headers.setMethod("GET"); + } + if (headers.Host() == nullptr) { + headers.setHost("foo.com"); + } + + if (data.data().size() == 0 && !data.has_trailers()) { + end_stream = true; + } + ENVOY_LOG_MISC(debug, "Decoding headers: {} ", data.headers().DebugString()); + const auto& headersStatus = filter->decodeHeaders(headers, end_stream); + if (headersStatus != Http::FilterHeadersStatus::Continue || + headersStatus != Http::FilterHeadersStatus::StopIteration) { + return; + } + + for (int i = 0; i < data.data().size(); i++) { + if (i == data.data().size() - 1 && !data.has_trailers()) { + end_stream = true; + } + Buffer::OwnedImpl buffer(data.data().Get(i)); + ENVOY_LOG_MISC(debug, "Decoding data: {} ", buffer.toString()); + if (filter->decodeData(buffer, end_stream) != Http::FilterDataStatus::Continue) { + return; + } + } + + if (data.has_trailers()) { + ENVOY_LOG_MISC(debug, "Decoding trailers: {} ", data.trailers().DebugString()); + auto trailers = Fuzz::fromHeaders(data.trailers()); + filter->decodeTrailers(trailers); + } + } + + // This creates the filter config and runs decode. + void fuzz(const envoy::extensions::filters::network::http_connection_manager::v3::HttpFilter& + proto_config, + const test::fuzz::HttpData& data) { + try { + // Try to create the filter. Exit early if the config is invalid or violates PGV constraints. + ENVOY_LOG_MISC(info, "filter name {}", proto_config.name()); + auto& factory = Config::Utility::getAndCheckFactoryByName< + Server::Configuration::NamedHttpFilterConfigFactory>(proto_config.name()); + ProtobufTypes::MessagePtr message = Config::Utility::translateToFactoryConfig( + proto_config, factory_context_.messageValidationVisitor(), factory); + cb_ = factory.createFilterFactoryFromProto(*message, "stats", factory_context_); + cb_(filter_callback_); + } catch (const EnvoyException& e) { + ENVOY_LOG_MISC(debug, "Controlled exception {}", e.what()); + return; + } + + decode(filter_.get(), data); + reset(); + } + + void reset() { + if (filter_.get() != nullptr) { + filter_.get()->onDestroy(); + } + filter_.reset(); + } + + NiceMock factory_context_; + NiceMock callbacks_; + NiceMock filter_callback_; + std::shared_ptr resolver_{std::make_shared()}; + std::shared_ptr filter_; + Http::FilterFactoryCb cb_; + NiceMock connection_; + Network::Address::InstanceConstSharedPtr addr_; +}; + +} // namespace HttpFilters +} // namespace Extensions +} // namespace Envoy From 9bce4dd928212801f58da334d56f1f59e6f45fe3 Mon Sep 17 00:00:00 2001 From: Asra Ali Date: Wed, 4 Mar 2020 10:39:02 -0500 Subject: [PATCH 2/3] fix build file Signed-off-by: Asra Ali --- test/extensions/filters/http/common/fuzz/BUILD | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/extensions/filters/http/common/fuzz/BUILD b/test/extensions/filters/http/common/fuzz/BUILD index d9595ace594dc..0e99f5e76546f 100644 --- a/test/extensions/filters/http/common/fuzz/BUILD +++ b/test/extensions/filters/http/common/fuzz/BUILD @@ -48,5 +48,7 @@ envoy_cc_fuzz_test( "//source/common/config:utility_lib", "//source/common/protobuf:utility_lib", "//test/config:utility_lib", + "@envoy_api//envoy/service/auth/v3:pkg_cc_proto", + "@envoy_api//envoy/service/auth/v2alpha:pkg_cc_proto", ] + envoy_all_extensions(), ) From 26e347ed4d19bc1e6f483b112e19ca2bb1e4f239 Mon Sep 17 00:00:00 2001 From: Asra Ali Date: Tue, 10 Mar 2020 10:52:13 -0400 Subject: [PATCH 3/3] fixup Signed-off-by: Asra Ali --- .../http/common/fuzz/filter_fuzz_test.cc | 3 - .../filters/http/common/fuzz/uber_filter.h | 3 - ...ized-h1_capture_fuzz_test-5675304995782656 | 380 ++++++++++++++++++ 3 files changed, 380 insertions(+), 6 deletions(-) create mode 100644 test/integration/h1_corpus/clusterfuzz-testcase-minimized-h1_capture_fuzz_test-5675304995782656 diff --git a/test/extensions/filters/http/common/fuzz/filter_fuzz_test.cc b/test/extensions/filters/http/common/fuzz/filter_fuzz_test.cc index 6a9293b9e90cd..6b076f0da3003 100644 --- a/test/extensions/filters/http/common/fuzz/filter_fuzz_test.cc +++ b/test/extensions/filters/http/common/fuzz/filter_fuzz_test.cc @@ -1,6 +1,3 @@ -#include -#include - #include "common/config/utility.h" #include "common/protobuf/utility.h" diff --git a/test/extensions/filters/http/common/fuzz/uber_filter.h b/test/extensions/filters/http/common/fuzz/uber_filter.h index e22d16ece4b71..8acfe0e0657a3 100644 --- a/test/extensions/filters/http/common/fuzz/uber_filter.h +++ b/test/extensions/filters/http/common/fuzz/uber_filter.h @@ -1,6 +1,3 @@ -#include -#include - #include "common/config/utility.h" #include "common/config/version_converter.h" #include "common/protobuf/utility.h" diff --git a/test/integration/h1_corpus/clusterfuzz-testcase-minimized-h1_capture_fuzz_test-5675304995782656 b/test/integration/h1_corpus/clusterfuzz-testcase-minimized-h1_capture_fuzz_test-5675304995782656 new file mode 100644 index 0000000000000..3ae90c370715a --- /dev/null +++ b/test/integration/h1_corpus/clusterfuzz-testcase-minimized-h1_capture_fuzz_test-5675304995782656 @@ -0,0 +1,380 @@ +events { +} +events { + downstream_send_bytes: "POST /tes HTTP/1.1\r\ncontent-type: application/grpc\n\r\n" +} +events { + downstream_send_bytes: "POST /test/long/url HTTP/1.1\r\nhost: host\r\nx-lyft-user-id: 0\r\nx-forwarded-for: 10.0.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad$for: -49442\2147483647.aaaaaaa0a" +} +events { + downstream_send_bytes: "POST /r HTTP/2.2\n\n\n" +} +events { +} +events { +} +events { + downstream_send_bytes: "POST /tes HTTP/1.1\r\ncontent-type: application/gr/grpc\n\r\n" +} +events { + upstream_send_bytes: "" +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { +} +events { + upstream_send_bytes: "" +} +events { +} +events { +} +events { +} +events { +} +events { + downstream_send_bytes: "POST /test/long/url HTTP/1.1\r\nhost: hr: 10.0.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad$aaa0a" +} +events { +} +events { +} +events { + downstream_recv_bytes { + } +} +events { +} +events { +} +events { +} +events { + downstream_send_bytes: "**" +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { + downstream_send_bytes: "POST /test/long/url HTTP/1.1\r\nhost: host\r\nx-lyft-user-id: 0\r\nx-forwarded-for: 10.0.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad$aaa0a" +} +events { +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { + upstream_send_bytes: "HTTP/1.1 100\n\r\n" +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { + downstream_send_bytes: "D" +} +events { +} +events { +} +events { +} +events { + downstream_send_bytes: "POST /tes HTTP/1.1\r\ncontent-type: application/gr/grpc\n\r\n" +} +events { + downstream_send_bytes: "\n" +} +events { + downstream_send_bytes: "D" +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { + upstream_send_bytes: "" +} +events { + upstream_send_bytes: "HTTP/1.1 100\n\r\n" +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { +} +events { +} +events { +} +events { +} +events { + upstream_recv_bytes { + } +} +events { + downstream_send_bytes: "POST /test/long/url HTTP/1.1\r\nhost: host\r\nx-lyft-user-id: 0\r\nx-forwarded-for: 10.0.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad$for: -49442\2147483647.aaaaaaa0a" +} +events { +} +events { +} +events { +} +events { + upstream_send_bytes: "" +} +events { + downstream_recv_bytes { + } +} +events { +} +events { + downstream_recv_bytes { + } +} +events { +} +events { +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { +} +events { + upstream_send_bytes: "" +} +events { + downstream_recv_bytes { + } +} +events { +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { +} +events { + upstream_send_bytes: "" +} +events { +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { + upstream_send_bytes: "HTTP/1.1 100\n\r\n" +} +events { + upstream_send_bytes: "HTTP/1.1 100 OK\r\ntransfee.coding: chunkedinK: chunked\r\n\r\n" +} +events { + upstream_send_bytes: "" +} +events { + upstream_send_bytes: "" +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { + downstream_send_bytes: "POST /test/long/url HTTP/1.1\r\nhost: host\r\nx-lyft-user-id: 123\r\nx-fkrwardedK: chunked\r\n\r\n" +} +events { +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { + downstream_send_bytes: "POST /tes HTTP/1.1\r\ncontent-type: application/gr/grpc\n\r\n" +} +events { + downstream_send_bytes: "POST /t/long/?g/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.2\r\n\r\n\rPOST /t/long/?#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/?#l HTTP/1.2\r\n\r\n\rPOST /t/long/?#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/2.1\r\n\r\n\rPOST /t/llong/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\n\n\n\n" +} +events { +} +events { +} +events { +} +events { + downstream_send_bytes: "D" +} +events { + downstream_send_bytes: "POST /test/long/url HTTP/1.1\r\nhost: host\r\nx-lyft-user-id: 0\r\nx-forwarded-for: 10.0.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad$aaa0a" +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { + downstream_send_bytes: "POST /testg/url HTTP/2.2\n\n\n" +} +events { +} +events { + downstream_send_bytes: "\n" +} +events { +} +events { + downstream_send_bytes: "**" +} +events { +} +events { +} +events { + downstream_send_bytes: "POST /t/long/?#l HTTP/1.2\r\n\r\n\rPOST /t/long/?#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/?#l HTTP/1.2\r\n\r\n\rPOST /t/long/?#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.2\r\n\r\n\rPOST /t/long/?#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/?#l HTTP/1.2\r\n\r\n\rPOST /t/long/?#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/2.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.2\r\n\r\n\rPOST /t/long/?#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /tlo/ng/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.3\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\r\n\r\n\rPOST /t/long/u#l HTTP/1.1\n\n\n\n" +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { + downstream_send_bytes: "D" +} +events { + downstream_send_bytes: "POST /rl HTTP/2.2\n\n\n" +} +events { + downstream_recv_bytes { + } +} +events { +} +events { +} +events { +} +events { +} +events { + downstream_send_bytes: "HEAD /te/url HTTP/1.1\r\nhost: hos\n\r\n" +} +events { + upstream_recv_bytes { + } +} +events { + downstream_send_bytes: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" +} +events { + downstream_send_bytes: "POST /rl HTTP/2.3\n\n\n" +} +events { +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { + downstream_send_bytes: "?" +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { +} +events { + downstream_send_bytes: "POST /t/long/url HTTP/1.1\r\n\r\n\r\n" +} +events { +} +events { + upstream_recv_bytes { + } +} +events { +} +events { + downstream_send_bytes: "D" +} +events { + upstream_recv_bytes { + } +} +events { +} +events { + downstream_send_bytes: "POST /test/long/url HTTP/1.1\r\nhost: host\r\nx-lyft-user-id: 123\r\nx-fkrwardedK: chunked\r\n\r\n" +} +events { +} +events { + upstream_send_bytes: "" +} +events { + downstream_send_bytes: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" +} +events { +} +events { + downstream_send_bytes: "N" +} +events { +}