Go to the documentation of this file.
24 #include "absl/strings/str_cat.h"
131 conn->server_endpoint);
133 if (
conn->server_endpoint !=
nullptr) {
199 conn->client_shutdown =
true;
202 (
conn->server_endpoint !=
nullptr)) {
204 conn->server_shutdown =
true;
214 conn->client_is_writing =
false;
224 if (
conn->client_deferred_write_buffer.length > 0) {
226 &
conn->client_write_buffer);
227 conn->client_is_writing =
true;
229 grpc_schedule_on_exec_ctx);
231 &
conn->on_client_write_done,
nullptr,
243 conn->proxy->combiner->Run(&
conn->on_client_write_done,
250 conn->server_is_writing =
false;
260 if (
conn->server_deferred_write_buffer.length > 0) {
262 &
conn->server_write_buffer);
263 conn->server_is_writing =
true;
265 grpc_schedule_on_exec_ctx);
267 &
conn->on_server_write_done,
nullptr,
279 conn->proxy->combiner->Run(&
conn->on_server_write_done,
298 if (
conn->server_is_writing) {
300 &
conn->server_deferred_write_buffer);
303 &
conn->server_write_buffer);
305 conn->server_is_writing =
true;
307 grpc_schedule_on_exec_ctx);
309 &
conn->on_server_write_done,
nullptr,
314 grpc_schedule_on_exec_ctx);
316 &
conn->on_client_read_done,
false,
342 if (
conn->client_is_writing) {
344 &
conn->client_deferred_write_buffer);
347 &
conn->client_write_buffer);
349 conn->client_is_writing =
true;
351 grpc_schedule_on_exec_ctx);
353 &
conn->on_client_write_done,
nullptr,
358 grpc_schedule_on_exec_ctx);
360 &
conn->on_server_read_done,
false,
374 conn->client_is_writing =
false;
389 grpc_schedule_on_exec_ctx);
391 &
conn->on_client_read_done,
false,
394 grpc_schedule_on_exec_ctx);
396 &
conn->on_server_read_done,
false,
404 conn->proxy->combiner->Run(&
conn->on_write_response_done,
428 conn->client_is_writing =
true;
430 grpc_schedule_on_exec_ctx);
432 &
conn->on_write_response_done,
nullptr,
440 conn->proxy->combiner->Run(&
conn->on_server_connect_done,
450 char* expected_cred) {
453 if (strncmp(proxy_auth_header_val,
"Basic ", 6) != 0) {
456 proxy_auth_header_val += 6;
458 const bool header_matches =
461 return header_matches;
480 for (
size_t i = 0;
i <
conn->client_read_buffer.count; ++
i) {
483 &
conn->http_parser,
conn->client_read_buffer.slices[
i],
nullptr);
496 grpc_schedule_on_exec_ctx);
498 &
conn->on_read_request_done,
false,
503 if (strcmp(
conn->http_request.method,
"CONNECT") != 0) {
505 "HTTP proxy got request method ",
conn->http_request.method));
515 if (proxy_auth_str !=
nullptr) {
516 bool client_authenticated =
false;
517 for (
size_t i = 0;
i <
conn->http_request.hdr_count;
i++) {
518 if (strcmp(
conn->http_request.hdrs[
i].key,
"Proxy-Authorization") == 0) {
520 conn->http_request.hdrs[
i].value, proxy_auth_str);
524 if (!client_authenticated) {
525 const char*
msg =
"HTTP Connect could not verify authentication";
537 if (!addresses_or.
ok()) {
548 grpc_schedule_on_exec_ctx);
554 conn->pollset_set,
args, &(*addresses_or)[0],
563 conn->proxy->combiner->Run(&
conn->on_read_request_done,
575 conn->client_endpoint = endpoint;
583 conn->client_is_writing =
false;
587 conn->server_is_writing =
false;
590 &
conn->http_request);
592 grpc_schedule_on_exec_ctx);
594 &
conn->on_read_request_done,
false,
636 grpc_sockaddr_in*
addr =
637 reinterpret_cast<grpc_sockaddr_in*
>(resolved_addr.
addr);
638 memset(&resolved_addr, 0,
sizeof(resolved_addr));
639 addr->sin_family = GRPC_AF_INET;
648 proxy->
pollset.push_back(pollset);
672 grpc_schedule_on_exec_ctx));
struct grpc_pollset_worker grpc_pollset_worker
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
static void on_server_write_done_locked(void *arg, grpc_error_handle error)
void grpc_tcp_server_shutdown_listeners(grpc_tcp_server *s)
char * grpc_channel_arg_get_string(const grpc_arg *arg)
size_t grpc_pollset_size(void)
GPRAPI void grpc_slice_buffer_move_into(grpc_slice_buffer *src, grpc_slice_buffer *dst)
GPRAPI void gpr_mu_unlock(gpr_mu *mu)
static bool proxy_auth_header_matches(char *proxy_auth_header_val, char *expected_cred)
grpc_closure on_read_request_done
static void on_client_read_done_locked(void *arg, grpc_error_handle error)
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
return memset(p, 0, total)
static void on_server_connect_done(void *arg, grpc_error_handle error)
GPRAPI grpc_slice grpc_slice_from_copied_string(const char *source)
static void on_server_write_done(void *arg, grpc_error_handle error)
struct grpc_pollset_set grpc_pollset_set
grpc_endpoint * server_endpoint
grpc_slice_buffer client_write_buffer
static void proxy_connection_failed(proxy_connection *conn, failure_type failure, const char *prefix, grpc_error_handle error)
struct proxy_connection proxy_connection
grpc_pollset_set * grpc_pollset_set_create()
GPRAPI void gpr_free(void *ptr)
void grpc_endpoint_read(grpc_endpoint *ep, grpc_slice_buffer *slices, grpc_closure *cb, bool urgent, int min_progress_size)
grpc_slice_buffer client_deferred_write_buffer
static void destroy_pollset(void *arg, grpc_error_handle)
const char * grpc_end2end_http_proxy_get_proxy_name(grpc_end2end_http_proxy *proxy)
static void on_read_request_done(void *arg, grpc_error_handle error)
grpc_error_handle grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker **worker, grpc_core::Timestamp deadline)
#define GRPC_LOG_IF_ERROR(what, error)
int64_t grpc_tcp_client_connect(grpc_closure *on_connect, grpc_endpoint **endpoint, grpc_pollset_set *interested_parties, const grpc_channel_args *channel_args, const grpc_resolved_address *addr, grpc_core::Timestamp deadline)
static void on_client_write_done(void *arg, grpc_error_handle error)
#define GRPC_CLOSURE_CREATE(cb, cb_arg, scheduler)
grpc_endpoint * client_endpoint
void grpc_tcp_server_unref(grpc_tcp_server *s)
grpc_closure on_server_connect_done
void grpc_pollset_init(grpc_pollset *pollset, gpr_mu **mu)
static void on_read_request_done_locked(void *arg, grpc_error_handle error)
void grpc_tcp_server_start(grpc_tcp_server *server, const std::vector< grpc_pollset * > *pollsets, grpc_tcp_server_cb on_accept_cb, void *cb_arg)
void grpc_end2end_http_proxy_destroy(grpc_end2end_http_proxy *proxy)
GPRAPI void * gpr_zalloc(size_t size)
static void proxy_connection_ref(proxy_connection *conn, const char *)
grpc_end2end_http_proxy()
grpc_closure on_server_write_done
grpc_pollset_set * pollset_set
static void proxy_connection_unref(proxy_connection *conn, const char *)
grpc_error_handle grpc_tcp_server_add_port(grpc_tcp_server *s, const grpc_resolved_address *addr, int *out_port)
grpc_core::Combiner * grpc_combiner_create(void)
void grpc_http_request_destroy(grpc_http_request *request)
grpc_closure on_client_write_done
static void shutdown_server(grpc_end2end_test_fixture *f)
static const CoreConfiguration & Get()
def c_str(s, encoding='ascii')
grpc_http_request http_request
grpc_slice grpc_base64_decode(const char *b64, int url_safe)
int grpc_sockaddr_set_port(grpc_resolved_address *resolved_addr, int port)
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
static void on_server_connect_done_locked(void *arg, grpc_error_handle error)
grpc_slice_buffer client_read_buffer
GPRAPI void grpc_slice_buffer_reset_and_unref(grpc_slice_buffer *sb)
void grpc_pollset_set_destroy(grpc_pollset_set *pollset_set)
static void thread_main(void *arg)
std::string JoinHostPort(absl::string_view host, int port)
grpc_slice_buffer server_write_buffer
const grpc_channel_args * ToC() const
void grpc_channel_args_destroy(grpc_channel_args *a)
std::vector< grpc_pollset * > pollset
GPRAPI void gpr_mu_lock(gpr_mu *mu)
static void on_server_read_done_locked(void *arg, grpc_error_handle error)
void grpc_endpoint_shutdown(grpc_endpoint *ep, grpc_error_handle why)
void grpc_http_parser_destroy(grpc_http_parser *)
grpc_slice_buffer server_read_buffer
int grpc_pick_unused_port_or_die(void)
void grpc_endpoint_destroy(grpc_endpoint *ep)
const ChannelArgsPreconditioning & channel_args_preconditioning() const
GPRAPI void grpc_slice_buffer_init(grpc_slice_buffer *sb)
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
#define GRPC_SLICE_LENGTH(slice)
grpc_http_parser http_parser
struct grpc_end2end_http_proxy grpc_end2end_http_proxy
ABSL_MUST_USE_RESULT bool ok() const
GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer *sb, grpc_slice slice)
#define GRPC_ERROR_REF(err)
static void on_client_write_done_locked(void *arg, grpc_error_handle error)
DNSResolver * GetDNSResolver()
grpc_core::ExecCtx exec_ctx
std::string grpc_error_std_string(grpc_error_handle error)
static void on_write_response_done(void *arg, grpc_error_handle error)
void grpc_endpoint_add_to_pollset_set(grpc_endpoint *ep, grpc_pollset_set *pollset_set)
void grpc_pollset_shutdown(grpc_pollset *pollset, grpc_closure *closure)
#define GRPC_ERROR_CREATE_FROM_CPP_STRING(desc)
static void on_accept(void *arg, grpc_endpoint *endpoint, grpc_pollset *, grpc_tcp_server_acceptor *acceptor)
grpc_slice_buffer server_deferred_write_buffer
static void shutdown_client(grpc_endpoint **client_fd)
static constexpr Duration Seconds(int64_t seconds)
grpc_end2end_http_proxy * grpc_end2end_http_proxy_create(const grpc_channel_args *args)
grpc_error_handle grpc_http_parser_parse(grpc_http_parser *parser, const grpc_slice &slice, size_t *start_of_body)
static const char prefix[]
grpc_closure on_server_read_done
void grpc_http_parser_init(grpc_http_parser *parser, grpc_http_type type, void *request_or_response)
static void on_client_read_done(void *arg, grpc_error_handle error)
grpc_error_handle grpc_tcp_server_create(grpc_closure *shutdown_complete, const grpc_channel_args *args, grpc_tcp_server **server)
#define GRPC_ERROR_UNREF(err)
#define GRPC_ARG_HTTP_PROXY_AUTH_CREDS
static void on_write_response_done_locked(void *arg, grpc_error_handle error)
void grpc_slice_buffer_destroy_internal(grpc_slice_buffer *sb)
void grpc_endpoint_write(grpc_endpoint *ep, grpc_slice_buffer *slices, grpc_closure *cb, void *arg, int max_frame_size)
grpc_closure on_client_read_done
GPRAPI void gpr_ref_init(gpr_refcount *r, int n)
GPRAPI int gpr_unref(gpr_refcount *r)
GPRAPI int grpc_slice_str_cmp(grpc_slice a, const char *b)
grpc_closure on_write_response_done
void grpc_pollset_destroy(grpc_pollset *pollset)
#define GRPC_COMBINER_UNREF(combiner, reason)
grpc_core::Combiner * combiner
void grpc_pollset_set_add_pollset(grpc_pollset_set *pollset_set, grpc_pollset *pollset)
const grpc_arg * grpc_channel_args_find(const grpc_channel_args *args, const char *name)
char addr[GRPC_MAX_SOCKADDR_SIZE]
virtual absl::StatusOr< std::vector< grpc_resolved_address > > ResolveNameBlocking(absl::string_view name, absl::string_view default_port)=0
GPRAPI void gpr_ref(gpr_refcount *r)
const grpc_channel_args * channel_args
ChannelArgs PreconditionChannelArgs(const grpc_channel_args *args) const
grpc_end2end_http_proxy * proxy
void grpc_slice_unref_internal(const grpc_slice &slice)
#define GRPC_ERROR_IS_NONE(err)
static void on_server_read_done(void *arg, grpc_error_handle error)
grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:02