mirror of https://github.com/grpc/grpc.git
HTTP Proxy: Ignore empty entry in no_proxy list (#29217)
* HTTP Proxy: Ignore empty entry in no_proxy list * Reviewer comments and add unit test * Reviewer comments * Fix use-after-free * Clang-tidyreviewable/pr29111/r6^2
parent
14c078bcdc
commit
4b8ea48c35
7 changed files with 288 additions and 110 deletions
@ -0,0 +1,100 @@ |
||||
//
|
||||
//
|
||||
// Copyright 2022 gRPC authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
//
|
||||
|
||||
#include <gmock/gmock.h> |
||||
|
||||
#include "src/core/ext/filters/client_channel/http_connect_handshaker.h" |
||||
#include "src/core/ext/filters/client_channel/http_proxy.h" |
||||
#include "src/core/lib/channel/channel_args.h" |
||||
#include "src/core/lib/gpr/env.h" |
||||
#include "test/core/util/test_config.h" |
||||
|
||||
namespace grpc_core { |
||||
namespace testing { |
||||
namespace { |
||||
|
||||
// Test that an empty no_proxy works as expected, i.e., proxy is used.
|
||||
TEST(NoProxyTest, EmptyList) { |
||||
gpr_setenv("no_proxy", ""); |
||||
grpc_arg proxy_arg = grpc_channel_arg_string_create( |
||||
const_cast<char*>(GRPC_ARG_HTTP_PROXY), |
||||
const_cast<char*>("http://proxy.google.com")); |
||||
grpc_channel_args args = {1, &proxy_arg}; |
||||
grpc_channel_args* new_args = nullptr; |
||||
char* name_to_resolve = nullptr; |
||||
EXPECT_TRUE(HttpProxyMapper().MapName("dns:///test.google.com:443", &args, |
||||
&name_to_resolve, &new_args)); |
||||
EXPECT_STREQ(name_to_resolve, "proxy.google.com"); |
||||
EXPECT_STREQ(grpc_channel_args_find_string( |
||||
new_args, const_cast<char*>(GRPC_ARG_HTTP_CONNECT_SERVER)), |
||||
"test.google.com:443"); |
||||
gpr_free(name_to_resolve); |
||||
grpc_channel_args_destroy(new_args); |
||||
gpr_unsetenv("no_proxy"); |
||||
} |
||||
|
||||
// Test basic usage of 'no_proxy' to avoid using proxy for certain domain names.
|
||||
TEST(NoProxyTest, Basic) { |
||||
gpr_setenv("no_proxy", "google.com"); |
||||
grpc_arg proxy_arg = grpc_channel_arg_string_create( |
||||
const_cast<char*>(GRPC_ARG_HTTP_PROXY), |
||||
const_cast<char*>("http://proxy.google.com")); |
||||
grpc_channel_args args = {1, &proxy_arg}; |
||||
grpc_channel_args* new_args = nullptr; |
||||
char* name_to_resolve = nullptr; |
||||
EXPECT_FALSE(HttpProxyMapper().MapName("dns:///test.google.com:443", &args, |
||||
&name_to_resolve, &new_args)); |
||||
EXPECT_EQ(name_to_resolve, nullptr); |
||||
EXPECT_EQ(grpc_channel_args_find_string( |
||||
new_args, const_cast<char*>(GRPC_ARG_HTTP_CONNECT_SERVER)), |
||||
nullptr); |
||||
gpr_free(name_to_resolve); |
||||
grpc_channel_args_destroy(new_args); |
||||
gpr_unsetenv("no_proxy"); |
||||
} |
||||
|
||||
// Test empty entries in 'no_proxy' list.
|
||||
TEST(NoProxyTest, EmptyEntries) { |
||||
gpr_setenv("no_proxy", "foo.com,,google.com,,"); |
||||
grpc_arg proxy_arg = grpc_channel_arg_string_create( |
||||
const_cast<char*>(GRPC_ARG_HTTP_PROXY), |
||||
const_cast<char*>("http://proxy.google.com")); |
||||
grpc_channel_args args = {1, &proxy_arg}; |
||||
grpc_channel_args* new_args = nullptr; |
||||
char* name_to_resolve = nullptr; |
||||
EXPECT_FALSE(HttpProxyMapper().MapName("dns:///test.google.com:443", &args, |
||||
&name_to_resolve, &new_args)); |
||||
EXPECT_EQ(name_to_resolve, nullptr); |
||||
EXPECT_EQ(grpc_channel_args_find_string( |
||||
new_args, const_cast<char*>(GRPC_ARG_HTTP_CONNECT_SERVER)), |
||||
nullptr); |
||||
gpr_free(name_to_resolve); |
||||
grpc_channel_args_destroy(new_args); |
||||
gpr_unsetenv("no_proxy"); |
||||
} |
||||
|
||||
} // namespace
|
||||
} // namespace testing
|
||||
} // namespace grpc_core
|
||||
|
||||
int main(int argc, char** argv) { |
||||
::testing::InitGoogleTest(&argc, argv); |
||||
grpc::testing::TestEnvironment env(&argc, argv); |
||||
auto result = RUN_ALL_TESTS(); |
||||
return result; |
||||
} |
Loading…
Reference in new issue