http_proxy_fixture.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2016 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
20 
21 #include <limits.h>
22 #include <string.h>
23 
24 #include "absl/strings/str_cat.h"
25 
26 #include <grpc/grpc.h>
27 #include <grpc/slice_buffer.h>
28 #include <grpc/support/alloc.h>
29 #include <grpc/support/atm.h>
30 #include <grpc/support/log.h>
31 #include <grpc/support/sync.h>
32 
38 #include "src/core/lib/gprpp/thd.h"
53 #include "src/core/lib/slice/b64.h"
55 #include "test/core/util/port.h"
56 
59  : server(nullptr), channel_args(nullptr), mu(nullptr), combiner(nullptr) {
60  gpr_ref_init(&users, 1);
62  }
68  std::vector<grpc_pollset*> pollset;
70 
72 };
73 
74 //
75 // Connection handling
76 //
77 
78 // proxy_connection structure is only accessed in the closures which are all
79 // scheduled under the same combiner lock. So there is no need for a mutex to
80 // protect this structure.
81 typedef struct proxy_connection {
83 
86 
88 
90 
91  // NOTE: All the closures execute under proxy->combiner lock. Which means
92  // there will not be any data-races between the closures
100 
103  bool client_shutdown : 1;
106  bool server_shutdown : 1;
107 
116 
120 
122  const char* /*reason*/) {
123  gpr_ref(&conn->refcount);
124 }
125 
126 // Helper function to destroy the proxy connection.
128  const char* /*reason*/) {
129  if (gpr_unref(&conn->refcount)) {
130  gpr_log(GPR_DEBUG, "endpoints: %p %p", conn->client_endpoint,
131  conn->server_endpoint);
132  grpc_endpoint_destroy(conn->client_endpoint);
133  if (conn->server_endpoint != nullptr) {
134  grpc_endpoint_destroy(conn->server_endpoint);
135  }
136  grpc_pollset_set_destroy(conn->pollset_set);
137  grpc_slice_buffer_destroy_internal(&conn->client_read_buffer);
138  grpc_slice_buffer_destroy_internal(&conn->client_deferred_write_buffer);
139  grpc_slice_buffer_destroy_internal(&conn->client_write_buffer);
140  grpc_slice_buffer_destroy_internal(&conn->server_read_buffer);
141  grpc_slice_buffer_destroy_internal(&conn->server_deferred_write_buffer);
142  grpc_slice_buffer_destroy_internal(&conn->server_write_buffer);
143  grpc_http_parser_destroy(&conn->http_parser);
144  grpc_http_request_destroy(&conn->http_request);
145  gpr_unref(&conn->proxy->users);
146  gpr_free(conn);
147  }
148 }
149 
151  SETUP_FAILED, // To be used before we start proxying.
156 };
157 
158 // Forward declarations
159 static void on_client_write_done(void* arg, grpc_error_handle error);
160 static void on_server_write_done(void* arg, grpc_error_handle error);
161 static void on_client_read_done(void* arg, grpc_error_handle error);
162 static void on_server_read_done(void* arg, grpc_error_handle error);
164 static void on_read_request_done(void* arg, grpc_error_handle error);
165 
172 
173 // Helper function to shut down the proxy connection.
175  failure_type failure, const char* prefix,
178  // Decide whether we should shut down the client and server.
179  bool shutdown_client = false;
180  bool shutdown_server = false;
181  if (failure == SETUP_FAILED) {
182  shutdown_client = true;
183  shutdown_server = true;
184  } else {
185  if ((failure == CLIENT_READ_FAILED && conn->client_write_failed) ||
186  (failure == CLIENT_WRITE_FAILED && conn->client_read_failed) ||
187  (failure == SERVER_READ_FAILED && !conn->client_is_writing)) {
188  shutdown_client = true;
189  }
190  if ((failure == SERVER_READ_FAILED && conn->server_write_failed) ||
191  (failure == SERVER_WRITE_FAILED && conn->server_read_failed) ||
192  (failure == CLIENT_READ_FAILED && !conn->server_is_writing)) {
193  shutdown_server = true;
194  }
195  }
196  // If we decided to shut down either one and have not yet done so, do so.
197  if (shutdown_client && !conn->client_shutdown) {
198  grpc_endpoint_shutdown(conn->client_endpoint, GRPC_ERROR_REF(error));
199  conn->client_shutdown = true;
200  }
201  if (shutdown_server && !conn->server_shutdown &&
202  (conn->server_endpoint != nullptr)) {
203  grpc_endpoint_shutdown(conn->server_endpoint, GRPC_ERROR_REF(error));
204  conn->server_shutdown = true;
205  }
206  // Unref the connection.
207  proxy_connection_unref(conn, "conn_failed");
209 }
210 
211 // Callback for writing proxy data to the client.
213  proxy_connection* conn = static_cast<proxy_connection*>(arg);
214  conn->client_is_writing = false;
215  if (!GRPC_ERROR_IS_NONE(error)) {
217  "HTTP proxy client write", GRPC_ERROR_REF(error));
218  return;
219  }
220  // Clear write buffer (the data we just wrote).
221  grpc_slice_buffer_reset_and_unref(&conn->client_write_buffer);
222  // If more data was read from the server since we started this write,
223  // write that data now.
224  if (conn->client_deferred_write_buffer.length > 0) {
225  grpc_slice_buffer_move_into(&conn->client_deferred_write_buffer,
226  &conn->client_write_buffer);
227  conn->client_is_writing = true;
228  GRPC_CLOSURE_INIT(&conn->on_client_write_done, on_client_write_done, conn,
229  grpc_schedule_on_exec_ctx);
230  grpc_endpoint_write(conn->client_endpoint, &conn->client_write_buffer,
231  &conn->on_client_write_done, nullptr,
232  /*max_frame_size=*/INT_MAX);
233  } else {
234  // No more writes. Unref the connection.
235  proxy_connection_unref(conn, "write_done");
236  }
237 }
238 
240  proxy_connection* conn = static_cast<proxy_connection*>(arg);
241  GRPC_CLOSURE_INIT(&conn->on_client_write_done, on_client_write_done_locked,
242  conn, nullptr);
243  conn->proxy->combiner->Run(&conn->on_client_write_done,
245 }
246 
247 // Callback for writing proxy data to the backend server.
249  proxy_connection* conn = static_cast<proxy_connection*>(arg);
250  conn->server_is_writing = false;
251  if (!GRPC_ERROR_IS_NONE(error)) {
253  "HTTP proxy server write", GRPC_ERROR_REF(error));
254  return;
255  }
256  // Clear write buffer (the data we just wrote).
257  grpc_slice_buffer_reset_and_unref(&conn->server_write_buffer);
258  // If more data was read from the client since we started this write,
259  // write that data now.
260  if (conn->server_deferred_write_buffer.length > 0) {
261  grpc_slice_buffer_move_into(&conn->server_deferred_write_buffer,
262  &conn->server_write_buffer);
263  conn->server_is_writing = true;
264  GRPC_CLOSURE_INIT(&conn->on_server_write_done, on_server_write_done, conn,
265  grpc_schedule_on_exec_ctx);
266  grpc_endpoint_write(conn->server_endpoint, &conn->server_write_buffer,
267  &conn->on_server_write_done, nullptr,
268  /*max_frame_size=*/INT_MAX);
269  } else {
270  // No more writes. Unref the connection.
271  proxy_connection_unref(conn, "server_write");
272  }
273 }
274 
276  proxy_connection* conn = static_cast<proxy_connection*>(arg);
277  GRPC_CLOSURE_INIT(&conn->on_server_write_done, on_server_write_done_locked,
278  conn, nullptr);
279  conn->proxy->combiner->Run(&conn->on_server_write_done,
281 }
282 
283 // Callback for reading data from the client, which will be proxied to
284 // the backend server.
286  proxy_connection* conn = static_cast<proxy_connection*>(arg);
287  if (!GRPC_ERROR_IS_NONE(error)) {
288  proxy_connection_failed(conn, CLIENT_READ_FAILED, "HTTP proxy client read",
290  return;
291  }
292  // If there is already a pending write (i.e., server_write_buffer is
293  // not empty), then move the read data into server_deferred_write_buffer,
294  // and the next write will be requested in on_server_write_done(), when
295  // the current write is finished.
296  //
297  // Otherwise, move the read data into the write buffer and write it.
298  if (conn->server_is_writing) {
299  grpc_slice_buffer_move_into(&conn->client_read_buffer,
300  &conn->server_deferred_write_buffer);
301  } else {
302  grpc_slice_buffer_move_into(&conn->client_read_buffer,
303  &conn->server_write_buffer);
304  proxy_connection_ref(conn, "client_read");
305  conn->server_is_writing = true;
306  GRPC_CLOSURE_INIT(&conn->on_server_write_done, on_server_write_done, conn,
307  grpc_schedule_on_exec_ctx);
308  grpc_endpoint_write(conn->server_endpoint, &conn->server_write_buffer,
309  &conn->on_server_write_done, nullptr,
310  /*max_frame_size=*/INT_MAX);
311  }
312  // Read more data.
313  GRPC_CLOSURE_INIT(&conn->on_client_read_done, on_client_read_done, conn,
314  grpc_schedule_on_exec_ctx);
315  grpc_endpoint_read(conn->client_endpoint, &conn->client_read_buffer,
316  &conn->on_client_read_done, /*urgent=*/false,
317  /*min_progress_size=*/1);
318 }
319 
321  proxy_connection* conn = static_cast<proxy_connection*>(arg);
322  GRPC_CLOSURE_INIT(&conn->on_client_read_done, on_client_read_done_locked,
323  conn, nullptr);
324  conn->proxy->combiner->Run(&conn->on_client_read_done, GRPC_ERROR_REF(error));
325 }
326 
327 // Callback for reading data from the backend server, which will be
328 // proxied to the client.
330  proxy_connection* conn = static_cast<proxy_connection*>(arg);
331  if (!GRPC_ERROR_IS_NONE(error)) {
332  proxy_connection_failed(conn, SERVER_READ_FAILED, "HTTP proxy server read",
334  return;
335  }
336  // If there is already a pending write (i.e., client_write_buffer is
337  // not empty), then move the read data into client_deferred_write_buffer,
338  // and the next write will be requested in on_client_write_done(), when
339  // the current write is finished.
340  //
341  // Otherwise, move the read data into the write buffer and write it.
342  if (conn->client_is_writing) {
343  grpc_slice_buffer_move_into(&conn->server_read_buffer,
344  &conn->client_deferred_write_buffer);
345  } else {
346  grpc_slice_buffer_move_into(&conn->server_read_buffer,
347  &conn->client_write_buffer);
348  proxy_connection_ref(conn, "server_read");
349  conn->client_is_writing = true;
350  GRPC_CLOSURE_INIT(&conn->on_client_write_done, on_client_write_done, conn,
351  grpc_schedule_on_exec_ctx);
352  grpc_endpoint_write(conn->client_endpoint, &conn->client_write_buffer,
353  &conn->on_client_write_done, nullptr,
354  /*max_frame_size=*/INT_MAX);
355  }
356  // Read more data.
357  GRPC_CLOSURE_INIT(&conn->on_server_read_done, on_server_read_done, conn,
358  grpc_schedule_on_exec_ctx);
359  grpc_endpoint_read(conn->server_endpoint, &conn->server_read_buffer,
360  &conn->on_server_read_done, /*urgent=*/false,
361  /*min_progress_size=*/1);
362 }
363 
365  proxy_connection* conn = static_cast<proxy_connection*>(arg);
366  GRPC_CLOSURE_INIT(&conn->on_server_read_done, on_server_read_done_locked,
367  conn, nullptr);
368  conn->proxy->combiner->Run(&conn->on_server_read_done, GRPC_ERROR_REF(error));
369 }
370 
371 // Callback to write the HTTP response for the CONNECT request.
373  proxy_connection* conn = static_cast<proxy_connection*>(arg);
374  conn->client_is_writing = false;
375  if (!GRPC_ERROR_IS_NONE(error)) {
376  proxy_connection_failed(conn, SETUP_FAILED, "HTTP proxy write response",
378  return;
379  }
380  // Clear write buffer.
381  grpc_slice_buffer_reset_and_unref(&conn->client_write_buffer);
382  // Start reading from both client and server. One of the read
383  // requests inherits our ref to conn, but we need to take a new ref
384  // for the other one.
385  proxy_connection_ref(conn, "client_read");
386  proxy_connection_ref(conn, "server_read");
387  proxy_connection_unref(conn, "write_response");
388  GRPC_CLOSURE_INIT(&conn->on_client_read_done, on_client_read_done, conn,
389  grpc_schedule_on_exec_ctx);
390  grpc_endpoint_read(conn->client_endpoint, &conn->client_read_buffer,
391  &conn->on_client_read_done, /*urgent=*/false,
392  /*min_progress_size=*/1);
393  GRPC_CLOSURE_INIT(&conn->on_server_read_done, on_server_read_done, conn,
394  grpc_schedule_on_exec_ctx);
395  grpc_endpoint_read(conn->server_endpoint, &conn->server_read_buffer,
396  &conn->on_server_read_done, /*urgent=*/false,
397  /*min_progress_size=*/1);
398 }
399 
401  proxy_connection* conn = static_cast<proxy_connection*>(arg);
402  GRPC_CLOSURE_INIT(&conn->on_write_response_done,
404  conn->proxy->combiner->Run(&conn->on_write_response_done,
406 }
407 
408 // Callback to connect to the backend server specified by the HTTP
409 // CONNECT request.
411  proxy_connection* conn = static_cast<proxy_connection*>(arg);
412  if (!GRPC_ERROR_IS_NONE(error)) {
413  // TODO(roth): Technically, in this case, we should handle the error
414  // by returning an HTTP response to the client indicating that the
415  // connection failed. However, for the purposes of this test code,
416  // it's fine to pretend this is a client-side error, which will
417  // cause the client connection to be dropped.
418  proxy_connection_failed(conn, SETUP_FAILED, "HTTP proxy server connect",
420  return;
421  }
422  // We've established a connection, so send back a 200 response code to
423  // the client.
424  // The write callback inherits our reference to conn.
425  grpc_slice slice =
426  grpc_slice_from_copied_string("HTTP/1.0 200 connected\r\n\r\n");
427  grpc_slice_buffer_add(&conn->client_write_buffer, slice);
428  conn->client_is_writing = true;
429  GRPC_CLOSURE_INIT(&conn->on_write_response_done, on_write_response_done, conn,
430  grpc_schedule_on_exec_ctx);
431  grpc_endpoint_write(conn->client_endpoint, &conn->client_write_buffer,
432  &conn->on_write_response_done, nullptr,
433  /*max_frame_size=*/INT_MAX);
434 }
435 
437  proxy_connection* conn = static_cast<proxy_connection*>(arg);
438  GRPC_CLOSURE_INIT(&conn->on_server_connect_done,
440  conn->proxy->combiner->Run(&conn->on_server_connect_done,
442 }
443 
449 static bool proxy_auth_header_matches(char* proxy_auth_header_val,
450  char* expected_cred) {
451  GPR_ASSERT(proxy_auth_header_val != nullptr);
452  GPR_ASSERT(expected_cred != nullptr);
453  if (strncmp(proxy_auth_header_val, "Basic ", 6) != 0) {
454  return false;
455  }
456  proxy_auth_header_val += 6;
457  grpc_slice decoded_slice = grpc_base64_decode(proxy_auth_header_val, 0);
458  const bool header_matches =
459  grpc_slice_str_cmp(decoded_slice, expected_cred) == 0;
460  grpc_slice_unref_internal(decoded_slice);
461  return header_matches;
462 }
463 
464 // Callback to read the HTTP CONNECT request.
465 // TODO(roth): Technically, for any of the failure modes handled by this
466 // function, we should handle the error by returning an HTTP response to
467 // the client indicating that the request failed. However, for the purposes
468 // of this test code, it's fine to pretend this is a client-side error,
469 // which will cause the client connection to be dropped.
471  proxy_connection* conn = static_cast<proxy_connection*>(arg);
472  gpr_log(GPR_DEBUG, "on_read_request_done: %p %s", conn,
474  if (!GRPC_ERROR_IS_NONE(error)) {
475  proxy_connection_failed(conn, SETUP_FAILED, "HTTP proxy read request",
477  return;
478  }
479  // Read request and feed it to the parser.
480  for (size_t i = 0; i < conn->client_read_buffer.count; ++i) {
481  if (GRPC_SLICE_LENGTH(conn->client_read_buffer.slices[i]) > 0) {
483  &conn->http_parser, conn->client_read_buffer.slices[i], nullptr);
484  if (!GRPC_ERROR_IS_NONE(error)) {
485  proxy_connection_failed(conn, SETUP_FAILED, "HTTP proxy request parse",
488  return;
489  }
490  }
491  }
492  grpc_slice_buffer_reset_and_unref(&conn->client_read_buffer);
493  // If we're not done reading the request, read more data.
494  if (conn->http_parser.state != GRPC_HTTP_BODY) {
495  GRPC_CLOSURE_INIT(&conn->on_read_request_done, on_read_request_done, conn,
496  grpc_schedule_on_exec_ctx);
497  grpc_endpoint_read(conn->client_endpoint, &conn->client_read_buffer,
498  &conn->on_read_request_done, /*urgent=*/false,
499  /*min_progress_size=*/1);
500  return;
501  }
502  // Make sure we got a CONNECT request.
503  if (strcmp(conn->http_request.method, "CONNECT") != 0) {
505  "HTTP proxy got request method ", conn->http_request.method));
506  proxy_connection_failed(conn, SETUP_FAILED, "HTTP proxy read request",
509  return;
510  }
511  // If proxy auth is being used, check if the header is present and as expected
512  const grpc_arg* proxy_auth_arg = grpc_channel_args_find(
513  conn->proxy->channel_args, GRPC_ARG_HTTP_PROXY_AUTH_CREDS);
514  char* proxy_auth_str = grpc_channel_arg_get_string(proxy_auth_arg);
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) {
519  client_authenticated = proxy_auth_header_matches(
520  conn->http_request.hdrs[i].value, proxy_auth_str);
521  break;
522  }
523  }
524  if (!client_authenticated) {
525  const char* msg = "HTTP Connect could not verify authentication";
527  proxy_connection_failed(conn, SETUP_FAILED, "HTTP proxy read request",
530  return;
531  }
532  }
533  // Resolve address.
535  grpc_core::GetDNSResolver()->ResolveNameBlocking(conn->http_request.path,
536  "80");
537  if (!addresses_or.ok()) {
538  proxy_connection_failed(conn, SETUP_FAILED, "HTTP proxy DNS lookup",
540  return;
541  }
542  GPR_ASSERT(!addresses_or->empty());
543  // Connect to requested address.
544  // The connection callback inherits our reference to conn.
545  const grpc_core::Timestamp deadline =
547  GRPC_CLOSURE_INIT(&conn->on_server_connect_done, on_server_connect_done, conn,
548  grpc_schedule_on_exec_ctx);
551  .PreconditionChannelArgs(nullptr)
552  .ToC();
553  grpc_tcp_client_connect(&conn->on_server_connect_done, &conn->server_endpoint,
554  conn->pollset_set, args, &(*addresses_or)[0],
555  deadline);
557 }
558 
560  proxy_connection* conn = static_cast<proxy_connection*>(arg);
561  GRPC_CLOSURE_INIT(&conn->on_read_request_done, on_read_request_done_locked,
562  conn, nullptr);
563  conn->proxy->combiner->Run(&conn->on_read_request_done,
565 }
566 
567 static void on_accept(void* arg, grpc_endpoint* endpoint,
568  grpc_pollset* /*accepting_pollset*/,
569  grpc_tcp_server_acceptor* acceptor) {
570  gpr_free(acceptor);
571  grpc_end2end_http_proxy* proxy = static_cast<grpc_end2end_http_proxy*>(arg);
572  // Instantiate proxy_connection.
573  proxy_connection* conn = grpc_core::Zalloc<proxy_connection>();
574  gpr_ref(&proxy->users);
575  conn->client_endpoint = endpoint;
576  conn->proxy = proxy;
577  gpr_ref_init(&conn->refcount, 1);
578  conn->pollset_set = grpc_pollset_set_create();
579  grpc_pollset_set_add_pollset(conn->pollset_set, proxy->pollset[0]);
580  grpc_endpoint_add_to_pollset_set(endpoint, conn->pollset_set);
581  grpc_slice_buffer_init(&conn->client_read_buffer);
582  grpc_slice_buffer_init(&conn->client_deferred_write_buffer);
583  conn->client_is_writing = false;
584  grpc_slice_buffer_init(&conn->client_write_buffer);
585  grpc_slice_buffer_init(&conn->server_read_buffer);
586  grpc_slice_buffer_init(&conn->server_deferred_write_buffer);
587  conn->server_is_writing = false;
588  grpc_slice_buffer_init(&conn->server_write_buffer);
590  &conn->http_request);
591  GRPC_CLOSURE_INIT(&conn->on_read_request_done, on_read_request_done, conn,
592  grpc_schedule_on_exec_ctx);
593  grpc_endpoint_read(conn->client_endpoint, &conn->client_read_buffer,
594  &conn->on_read_request_done, /*urgent=*/false,
595  /*min_progress_size=*/1);
596 }
597 
598 //
599 // Proxy class
600 //
601 
602 static void thread_main(void* arg) {
603  grpc_end2end_http_proxy* proxy = static_cast<grpc_end2end_http_proxy*>(arg);
605  do {
606  gpr_ref(&proxy->users);
607  grpc_pollset_worker* worker = nullptr;
608  gpr_mu_lock(proxy->mu);
609  GRPC_LOG_IF_ERROR("grpc_pollset_work",
610  grpc_pollset_work(proxy->pollset[0], &worker,
613  gpr_mu_unlock(proxy->mu);
615  } while (!gpr_unref(&proxy->users));
616 }
617 
619  const grpc_channel_args* args) {
622  // Construct proxy address.
623  const int proxy_port = grpc_pick_unused_port_or_die();
624  proxy->proxy_name = grpc_core::JoinHostPort("localhost", proxy_port);
625  gpr_log(GPR_INFO, "Proxy address: %s", proxy->proxy_name.c_str());
626  // Create TCP server.
630  .ToC();
632  grpc_tcp_server_create(nullptr, proxy->channel_args, &proxy->server);
634  // Bind to port.
635  grpc_resolved_address resolved_addr;
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;
640  grpc_sockaddr_set_port(&resolved_addr, proxy_port);
641  int port;
642  error = grpc_tcp_server_add_port(proxy->server, &resolved_addr, &port);
644  GPR_ASSERT(port == proxy_port);
645  // Start server.
646  auto* pollset = static_cast<grpc_pollset*>(gpr_zalloc(grpc_pollset_size()));
647  grpc_pollset_init(pollset, &proxy->mu);
648  proxy->pollset.push_back(pollset);
649  grpc_tcp_server_start(proxy->server, &proxy->pollset, on_accept, proxy);
650 
651  // Start proxy thread.
652  proxy->thd = grpc_core::Thread("grpc_http_proxy", thread_main, proxy);
653  proxy->thd.Start();
654  return proxy;
655 }
656 
657 static void destroy_pollset(void* arg, grpc_error_handle /*error*/) {
658  grpc_pollset* pollset = static_cast<grpc_pollset*>(arg);
659  grpc_pollset_destroy(pollset);
660  gpr_free(pollset);
661 }
662 
664  gpr_unref(&proxy->users); // Signal proxy thread to shutdown.
666  proxy->thd.Join();
670  grpc_pollset_shutdown(proxy->pollset[0],
672  grpc_schedule_on_exec_ctx));
673  GRPC_COMBINER_UNREF(proxy->combiner, "test");
674  delete proxy;
675 }
676 
678  grpc_end2end_http_proxy* proxy) {
679  return proxy->proxy_name.c_str();
680 }
grpc_pollset_worker
struct grpc_pollset_worker grpc_pollset_worker
Definition: pollset.h:39
GRPC_CLOSURE_INIT
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
Definition: closure.h:115
grpc_arg
Definition: grpc_types.h:103
on_server_write_done_locked
static void on_server_write_done_locked(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:248
grpc_tcp_server_shutdown_listeners
void grpc_tcp_server_shutdown_listeners(grpc_tcp_server *s)
Definition: tcp_server.cc:71
grpc_channel_arg_get_string
char * grpc_channel_arg_get_string(const grpc_arg *arg)
Definition: channel_args.cc:432
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
grpc_pollset_size
size_t grpc_pollset_size(void)
Definition: pollset.cc:56
grpc_slice_buffer_move_into
GPRAPI void grpc_slice_buffer_move_into(grpc_slice_buffer *src, grpc_slice_buffer *dst)
Definition: slice/slice_buffer.cc:291
grpc_end2end_http_proxy::proxy_name
std::string proxy_name
Definition: http_proxy_fixture.cc:63
gpr_mu_unlock
GPRAPI void gpr_mu_unlock(gpr_mu *mu)
pollset.h
proxy_auth_header_matches
static bool proxy_auth_header_matches(char *proxy_auth_header_val, char *expected_cred)
Definition: http_proxy_fixture.cc:449
log.h
proxy_connection::on_read_request_done
grpc_closure on_read_request_done
Definition: http_proxy_fixture.cc:93
port.h
sockaddr_utils.h
on_client_read_done_locked
static void on_client_read_done_locked(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:285
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
memset
return memset(p, 0, total)
on_server_connect_done
static void on_server_connect_done(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:436
grpc_slice_from_copied_string
GPRAPI grpc_slice grpc_slice_from_copied_string(const char *source)
Definition: slice/slice.cc:177
proxy_connection::client_shutdown
bool client_shutdown
Definition: http_proxy_fixture.cc:103
on_server_write_done
static void on_server_write_done(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:275
grpc_pollset_set
struct grpc_pollset_set grpc_pollset_set
Definition: iomgr_fwd.h:23
string.h
proxy_connection::server_endpoint
grpc_endpoint * server_endpoint
Definition: http_proxy_fixture.cc:85
proxy_connection::client_write_buffer
grpc_slice_buffer client_write_buffer
Definition: http_proxy_fixture.cc:111
proxy_connection_failed
static void proxy_connection_failed(proxy_connection *conn, failure_type failure, const char *prefix, grpc_error_handle error)
Definition: http_proxy_fixture.cc:174
proxy_connection
struct proxy_connection proxy_connection
grpc_pollset_set_create
grpc_pollset_set * grpc_pollset_set_create()
Definition: pollset_set.cc:29
grpc_core::Timestamp
Definition: src/core/lib/gprpp/time.h:62
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
grpc_endpoint_read
void grpc_endpoint_read(grpc_endpoint *ep, grpc_slice_buffer *slices, grpc_closure *cb, bool urgent, int min_progress_size)
Definition: endpoint.cc:25
http_proxy_fixture.h
proxy_connection::client_deferred_write_buffer
grpc_slice_buffer client_deferred_write_buffer
Definition: http_proxy_fixture.cc:109
resolve_address.h
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error
grpc_error_handle error
Definition: retry_filter.cc:499
grpc_end2end_http_proxy::server
grpc_tcp_server * server
Definition: http_proxy_fixture.cc:65
CLIENT_WRITE_FAILED
@ CLIENT_WRITE_FAILED
Definition: http_proxy_fixture.cc:153
grpc_resolved_address
Definition: resolved_address.h:34
destroy_pollset
static void destroy_pollset(void *arg, grpc_error_handle)
Definition: http_proxy_fixture.cc:657
closure.h
grpc_tcp_server
Definition: tcp_server_utils_posix.h:53
grpc_end2end_http_proxy_get_proxy_name
const char * grpc_end2end_http_proxy_get_proxy_name(grpc_end2end_http_proxy *proxy)
Definition: http_proxy_fixture.cc:677
grpc_end2end_http_proxy::mu
gpr_mu * mu
Definition: http_proxy_fixture.cc:67
grpc_end2end_http_proxy
Definition: http_proxy_fixture.cc:57
on_read_request_done
static void on_read_request_done(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:559
grpc_pollset_work
grpc_error_handle grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker **worker, grpc_core::Timestamp deadline)
Definition: pollset.cc:45
GRPC_LOG_IF_ERROR
#define GRPC_LOG_IF_ERROR(what, error)
Definition: error.h:398
grpc_tcp_client_connect
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)
Definition: tcp_client.cc:25
on_client_write_done
static void on_client_write_done(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:239
GRPC_CLOSURE_CREATE
#define GRPC_CLOSURE_CREATE(cb, cb_arg, scheduler)
Definition: closure.h:160
proxy_connection::client_is_writing
bool client_is_writing
Definition: http_proxy_fixture.cc:110
grpc_end2end_http_proxy::thd
grpc_core::Thread thd
Definition: http_proxy_fixture.cc:64
proxy_connection::client_endpoint
grpc_endpoint * client_endpoint
Definition: http_proxy_fixture.cc:84
sockaddr.h
grpc_tcp_server_unref
void grpc_tcp_server_unref(grpc_tcp_server *s)
Definition: tcp_server.cc:67
grpc_channel_args
Definition: grpc_types.h:132
gpr_refcount
Definition: impl/codegen/sync_generic.h:39
proxy_connection::on_server_connect_done
grpc_closure on_server_connect_done
Definition: http_proxy_fixture.cc:94
grpc_pollset_init
void grpc_pollset_init(grpc_pollset *pollset, gpr_mu **mu)
Definition: pollset.cc:33
on_read_request_done_locked
static void on_read_request_done_locked(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:470
grpc_tcp_server_start
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)
Definition: tcp_server.cc:31
grpc_end2end_http_proxy_destroy
void grpc_end2end_http_proxy_destroy(grpc_end2end_http_proxy *proxy)
Definition: http_proxy_fixture.cc:663
gpr_zalloc
GPRAPI void * gpr_zalloc(size_t size)
Definition: alloc.cc:40
proxy_connection::refcount
gpr_refcount refcount
Definition: http_proxy_fixture.cc:87
memory.h
proxy_connection_ref
static void proxy_connection_ref(proxy_connection *conn, const char *)
Definition: http_proxy_fixture.cc:121
proxy_connection::server_shutdown
bool server_shutdown
Definition: http_proxy_fixture.cc:106
grpc_end2end_http_proxy::grpc_end2end_http_proxy
grpc_end2end_http_proxy()
Definition: http_proxy_fixture.cc:58
proxy_connection::on_server_write_done
grpc_closure on_server_write_done
Definition: http_proxy_fixture.cc:99
proxy_connection::pollset_set
grpc_pollset_set * pollset_set
Definition: http_proxy_fixture.cc:89
proxy_connection_unref
static void proxy_connection_unref(proxy_connection *conn, const char *)
Definition: http_proxy_fixture.cc:127
grpc_tcp_server_add_port
grpc_error_handle grpc_tcp_server_add_port(grpc_tcp_server *s, const grpc_resolved_address *addr, int *out_port)
Definition: tcp_server.cc:37
grpc_combiner_create
grpc_core::Combiner * grpc_combiner_create(void)
Definition: combiner.cc:54
grpc_http_request_destroy
void grpc_http_request_destroy(grpc_http_request *request)
Definition: src/core/lib/http/parser.cc:422
SERVER_WRITE_FAILED
@ SERVER_WRITE_FAILED
Definition: http_proxy_fixture.cc:155
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
proxy_connection::on_client_write_done
grpc_closure on_client_write_done
Definition: http_proxy_fixture.cc:97
grpc::testing::shutdown_server
static void shutdown_server(grpc_end2end_test_fixture *f)
Definition: h2_ssl_cert_test.cc:280
grpc_core::CoreConfiguration::Get
static const CoreConfiguration & Get()
Definition: core_configuration.h:82
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
grpc_core::ExecCtx::Flush
bool Flush()
Definition: exec_ctx.cc:69
proxy_connection::http_request
grpc_http_request http_request
Definition: http_proxy_fixture.cc:118
grpc_base64_decode
grpc_slice grpc_base64_decode(const char *b64, int url_safe)
Definition: b64.cc:126
slice
grpc_slice slice
Definition: src/core/lib/surface/server.cc:467
grpc_sockaddr_set_port
int grpc_sockaddr_set_port(grpc_resolved_address *resolved_addr, int port)
Definition: sockaddr_utils.cc:324
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
worker
Definition: worker.py:1
on_server_connect_done_locked
static void on_server_connect_done_locked(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:410
proxy_connection::client_read_buffer
grpc_slice_buffer client_read_buffer
Definition: http_proxy_fixture.cc:108
proxy_connection::server_is_writing
bool server_is_writing
Definition: http_proxy_fixture.cc:114
grpc_slice_buffer_reset_and_unref
GPRAPI void grpc_slice_buffer_reset_and_unref(grpc_slice_buffer *sb)
Definition: slice_buffer_api.cc:32
grpc.h
grpc_pollset_set_destroy
void grpc_pollset_set_destroy(grpc_pollset_set *pollset_set)
Definition: pollset_set.cc:33
thread_main
static void thread_main(void *arg)
Definition: http_proxy_fixture.cc:602
proxy_connection::client_write_failed
bool client_write_failed
Definition: http_proxy_fixture.cc:102
grpc_core::JoinHostPort
std::string JoinHostPort(absl::string_view host, int port)
Definition: host_port.cc:32
proxy_connection::server_write_buffer
grpc_slice_buffer server_write_buffer
Definition: http_proxy_fixture.cc:115
pollset_set.h
grpc_core::ChannelArgs::ToC
const grpc_channel_args * ToC() const
Definition: channel_args.cc:94
slice_buffer.h
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
b64.h
arg
Definition: cmdline.cc:40
GRPC_HTTP_REQUEST
@ GRPC_HTTP_REQUEST
Definition: src/core/lib/http/parser.h:65
grpc_end2end_http_proxy::pollset
std::vector< grpc_pollset * > pollset
Definition: http_proxy_fixture.cc:68
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
grpc_core::Thread::Join
void Join()
Definition: thd.h:141
gpr_mu_lock
GPRAPI void gpr_mu_lock(gpr_mu *mu)
error.h
on_server_read_done_locked
static void on_server_read_done_locked(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:329
grpc_endpoint_shutdown
void grpc_endpoint_shutdown(grpc_endpoint *ep, grpc_error_handle why)
Definition: endpoint.cc:49
host_port.h
grpc_http_parser_destroy
void grpc_http_parser_destroy(grpc_http_parser *)
Definition: src/core/lib/http/parser.cc:420
slice_internal.h
proxy_connection::server_read_buffer
grpc_slice_buffer server_read_buffer
Definition: http_proxy_fixture.cc:112
grpc_pick_unused_port_or_die
int grpc_pick_unused_port_or_die(void)
grpc_endpoint_destroy
void grpc_endpoint_destroy(grpc_endpoint *ep)
Definition: endpoint.cc:53
grpc_core::CoreConfiguration::channel_args_preconditioning
const ChannelArgsPreconditioning & channel_args_preconditioning() const
Definition: core_configuration.h:139
grpc_core::ExecCtx
Definition: exec_ctx.h:97
grpc_core::Thread::Start
void Start()
Definition: thd.h:125
tcp_client.h
grpc_slice_buffer_init
GPRAPI void grpc_slice_buffer_init(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:116
CLIENT_READ_FAILED
@ CLIENT_READ_FAILED
Definition: http_proxy_fixture.cc:152
http2_server_health_check.conn
conn
Definition: http2_server_health_check.py:29
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
GRPC_HTTP_BODY
@ GRPC_HTTP_BODY
Definition: src/core/lib/http/parser.h:44
GRPC_SLICE_LENGTH
#define GRPC_SLICE_LENGTH(slice)
Definition: include/grpc/impl/codegen/slice.h:104
proxy_connection::http_parser
grpc_http_parser http_parser
Definition: http_proxy_fixture.cc:117
tests.unit._exit_scenarios.port
port
Definition: _exit_scenarios.py:179
grpc_end2end_http_proxy
struct grpc_end2end_http_proxy grpc_end2end_http_proxy
Definition: http_proxy_fixture.h:33
absl::StatusOr::ok
ABSL_MUST_USE_RESULT bool ok() const
Definition: abseil-cpp/absl/status/statusor.h:491
grpc_slice_buffer_add
GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer *sb, grpc_slice slice)
Definition: slice/slice_buffer.cc:170
parser.h
proxy_connection
Definition: http_proxy_fixture.cc:81
GRPC_ERROR_REF
#define GRPC_ERROR_REF(err)
Definition: error.h:261
SETUP_FAILED
@ SETUP_FAILED
Definition: http_proxy_fixture.cc:151
on_client_write_done_locked
static void on_client_write_done_locked(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:212
server
Definition: examples/python/async_streaming/server.py:1
gpr_mu
pthread_mutex_t gpr_mu
Definition: impl/codegen/sync_posix.h:47
grpc_core::GetDNSResolver
DNSResolver * GetDNSResolver()
Definition: resolve_address.cc:38
grpc_tcp_server_acceptor
Definition: tcp_server.h:36
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
on_write_response_done
static void on_write_response_done(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:400
grpc_endpoint_add_to_pollset_set
void grpc_endpoint_add_to_pollset_set(grpc_endpoint *ep, grpc_pollset_set *pollset_set)
Definition: endpoint.cc:39
grpc_pollset_shutdown
void grpc_pollset_shutdown(grpc_pollset *pollset, grpc_closure *closure)
Definition: pollset.cc:37
GRPC_ERROR_CREATE_FROM_CPP_STRING
#define GRPC_ERROR_CREATE_FROM_CPP_STRING(desc)
Definition: error.h:297
proxy_connection::client_read_failed
bool client_read_failed
Definition: http_proxy_fixture.cc:101
alloc.h
SERVER_READ_FAILED
@ SERVER_READ_FAILED
Definition: http_proxy_fixture.cc:154
on_accept
static void on_accept(void *arg, grpc_endpoint *endpoint, grpc_pollset *, grpc_tcp_server_acceptor *acceptor)
Definition: http_proxy_fixture.cc:567
proxy_connection::server_deferred_write_buffer
grpc_slice_buffer server_deferred_write_buffer
Definition: http_proxy_fixture.cc:113
shutdown_client
static void shutdown_client(grpc_endpoint **client_fd)
Definition: bad_client.cc:85
grpc_core::Duration::Seconds
static constexpr Duration Seconds(int64_t seconds)
Definition: src/core/lib/gprpp/time.h:151
thd.h
grpc_end2end_http_proxy_create
grpc_end2end_http_proxy * grpc_end2end_http_proxy_create(const grpc_channel_args *args)
Definition: http_proxy_fixture.cc:618
grpc_http_parser_parse
grpc_error_handle grpc_http_parser_parse(grpc_http_parser *parser, const grpc_slice &slice, size_t *start_of_body)
Definition: src/core/lib/http/parser.cc:444
prefix
static const char prefix[]
Definition: head_of_line_blocking.cc:28
proxy_connection::on_server_read_done
grpc_closure on_server_read_done
Definition: http_proxy_fixture.cc:98
combiner.h
grpc_http_parser_init
void grpc_http_parser_init(grpc_http_parser *parser, grpc_http_type type, void *request_or_response)
Definition: src/core/lib/http/parser.cc:411
arg
struct arg arg
on_client_read_done
static void on_client_read_done(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:320
exec_ctx.h
grpc_core::Thread
Definition: thd.h:43
grpc_tcp_server_create
grpc_error_handle grpc_tcp_server_create(grpc_closure *shutdown_complete, const grpc_channel_args *args, grpc_tcp_server **server)
Definition: tcp_server.cc:25
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
GRPC_ARG_HTTP_PROXY_AUTH_CREDS
#define GRPC_ARG_HTTP_PROXY_AUTH_CREDS
Definition: http_proxy_fixture.h:31
on_write_response_done_locked
static void on_write_response_done_locked(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:372
grpc_core::Combiner
Definition: combiner.h:34
proxy_connection::server_write_failed
bool server_write_failed
Definition: http_proxy_fixture.cc:105
channel_args.h
timer.h
grpc_slice_buffer_destroy_internal
void grpc_slice_buffer_destroy_internal(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:123
grpc_endpoint_write
void grpc_endpoint_write(grpc_endpoint *ep, grpc_slice_buffer *slices, grpc_closure *cb, void *arg, int max_frame_size)
Definition: endpoint.cc:30
GPR_DEBUG
#define GPR_DEBUG
Definition: include/grpc/impl/codegen/log.h:55
grpc_slice_buffer
Definition: include/grpc/impl/codegen/slice.h:83
proxy_connection::on_client_read_done
grpc_closure on_client_read_done
Definition: http_proxy_fixture.cc:96
gpr_ref_init
GPRAPI void gpr_ref_init(gpr_refcount *r, int n)
Definition: sync.cc:86
atm.h
failure_type
failure_type
Definition: http_proxy_fixture.cc:150
proxy_connection::server_read_failed
bool server_read_failed
Definition: http_proxy_fixture.cc:104
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
grpc_core::ExecCtx::Now
Timestamp Now()
Definition: exec_ctx.cc:90
endpoint.h
gpr_unref
GPRAPI int gpr_unref(gpr_refcount *r)
Definition: sync.cc:103
grpc_error
Definition: error_internal.h:42
grpc_slice_str_cmp
GPRAPI int grpc_slice_str_cmp(grpc_slice a, const char *b)
Definition: slice/slice.cc:426
grpc_end2end_http_proxy::users
gpr_refcount users
Definition: http_proxy_fixture.cc:69
tcp_server.h
grpc_pollset
Definition: bm_cq_multiple_threads.cc:37
proxy_connection::on_write_response_done
grpc_closure on_write_response_done
Definition: http_proxy_fixture.cc:95
grpc_http_parser
Definition: src/core/lib/http/parser.h:99
grpc_pollset_destroy
void grpc_pollset_destroy(grpc_pollset *pollset)
Definition: pollset.cc:41
GRPC_COMBINER_UNREF
#define GRPC_COMBINER_UNREF(combiner, reason)
Definition: combiner.h:71
grpc_end2end_http_proxy::combiner
grpc_core::Combiner * combiner
Definition: http_proxy_fixture.cc:71
sync.h
grpc_closure
Definition: closure.h:56
grpc_pollset_set_add_pollset
void grpc_pollset_set_add_pollset(grpc_pollset_set *pollset_set, grpc_pollset *pollset)
Definition: pollset_set.cc:37
grpc_channel_args_find
const grpc_arg * grpc_channel_args_find(const grpc_channel_args *args, const char *name)
Definition: channel_args.cc:393
grpc_resolved_address::addr
char addr[GRPC_MAX_SOCKADDR_SIZE]
Definition: resolved_address.h:35
grpc_endpoint
Definition: endpoint.h:105
grpc_core::DNSResolver::ResolveNameBlocking
virtual absl::StatusOr< std::vector< grpc_resolved_address > > ResolveNameBlocking(absl::string_view name, absl::string_view default_port)=0
gpr_ref
GPRAPI void gpr_ref(gpr_refcount *r)
Definition: sync.cc:88
grpc_end2end_http_proxy::channel_args
const grpc_channel_args * channel_args
Definition: http_proxy_fixture.cc:66
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
grpc_core::ChannelArgsPreconditioning::PreconditionChannelArgs
ChannelArgs PreconditionChannelArgs(const grpc_channel_args *args) const
Definition: channel_args_preconditioning.cc:34
grpc_core::ExecCtx::Get
static ExecCtx * Get()
Definition: exec_ctx.h:205
proxy_connection::proxy
grpc_end2end_http_proxy * proxy
Definition: http_proxy_fixture.cc:82
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
grpc_slice_unref_internal
void grpc_slice_unref_internal(const grpc_slice &slice)
Definition: slice_refcount.h:39
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
grpc_http_request
Definition: src/core/lib/http/parser.h:69
api.h
on_server_read_done
static void on_server_read_done(void *arg, grpc_error_handle error)
Definition: http_proxy_fixture.cc:364


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:02