@ -22,6 +22,7 @@
# include <string.h>
# include <grpc/support/alloc.h>
# include <grpc/support/host_port.h>
# include <grpc/support/log.h>
# include <grpc/support/string_util.h>
@ -30,6 +31,7 @@
# include "src/core/ext/filters/client_channel/uri_parser.h"
# include "src/core/lib/channel/channel_args.h"
# include "src/core/lib/support/env.h"
# include "src/core/lib/support/string.h"
static char * grpc_get_http_proxy_server ( grpc_exec_ctx * exec_ctx ) {
char * uri_str = gpr_getenv ( " http_proxy " ) ;
@ -80,6 +82,50 @@ static bool proxy_mapper_map_name(grpc_exec_ctx* exec_ctx,
grpc_uri_destroy ( uri ) ;
return false ;
}
char * no_proxy_str = gpr_getenv ( " no_proxy " ) ;
if ( no_proxy_str ! = NULL ) {
static const char * NO_PROXY_SEPARATOR = " , " ;
bool use_proxy = true ;
char * server_host ;
char * server_port ;
if ( ! gpr_split_host_port ( uri - > path [ 0 ] = = ' / ' ? uri - > path + 1 : uri - > path ,
& server_host , & server_port ) ) {
gpr_log ( GPR_INFO ,
" unable to split host and port, not checking no_proxy list for "
" host '%s' " ,
server_uri ) ;
} else {
size_t uri_len = strlen ( server_host ) ;
char * * no_proxy_hosts ;
size_t num_no_proxy_hosts ;
gpr_string_split ( no_proxy_str , NO_PROXY_SEPARATOR , & no_proxy_hosts ,
& num_no_proxy_hosts ) ;
for ( size_t i = 0 ; i < num_no_proxy_hosts ; i + + ) {
char * no_proxy_entry = no_proxy_hosts [ i ] ;
size_t no_proxy_len = strlen ( no_proxy_entry ) ;
if ( no_proxy_len < = uri_len & &
gpr_stricmp ( no_proxy_entry , & server_host [ uri_len - no_proxy_len ] ) = =
0 ) {
gpr_log ( GPR_INFO , " not using proxy for host in no_proxy list '%s' " ,
server_uri ) ;
use_proxy = false ;
break ;
}
}
for ( size_t i = 0 ; i < num_no_proxy_hosts ; i + + ) {
gpr_free ( no_proxy_hosts [ i ] ) ;
}
gpr_free ( no_proxy_hosts ) ;
gpr_free ( server_host ) ;
gpr_free ( server_port ) ;
if ( ! use_proxy ) {
grpc_uri_destroy ( uri ) ;
gpr_free ( * name_to_resolve ) ;
* name_to_resolve = NULL ;
return false ;
}
}
}
grpc_arg new_arg = grpc_channel_arg_string_create (
GRPC_ARG_HTTP_CONNECT_SERVER ,
uri - > path [ 0 ] = = ' / ' ? uri - > path + 1 : uri - > path ) ;