Ejemplo n.º 1
0
Archivo: httpcli.c Proyecto: sihai/grpc
void grpc_httpcli_post(grpc_httpcli_context *context, grpc_pollset *pollset,
                       const grpc_httpcli_request *request,
                       const char *body_bytes, size_t body_size,
                       gpr_timespec deadline,
                       grpc_httpcli_response_cb on_response, void *user_data) {
  internal_request *req;
  char *name;
  if (g_post_override && g_post_override(request, body_bytes, body_size,
                                         deadline, on_response, user_data)) {
    return;
  }
  req = gpr_malloc(sizeof(internal_request));
  memset(req, 0, sizeof(*req));
  req->request_text =
      grpc_httpcli_format_post_request(request, body_bytes, body_size);
  grpc_httpcli_parser_init(&req->parser);
  req->on_response = on_response;
  req->user_data = user_data;
  req->deadline = deadline;
  req->use_ssl = request->use_ssl;
  req->context = context;
  req->pollset = pollset;
  gpr_asprintf(&name, "HTTP:GET:%s:%s", request->host, request->path);
  grpc_iomgr_register_object(&req->iomgr_obj, name);
  gpr_free(name);
  if (req->use_ssl) {
    req->host = gpr_strdup(request->host);
  }

  grpc_pollset_set_add_pollset(&req->context->pollset_set, req->pollset);
  grpc_resolve_address(request->host, req->use_ssl ? "https" : "http",
                       on_resolved, req);
}
Ejemplo n.º 2
0
void grpc_httpcli_post(const grpc_httpcli_request *request,
                       const char *body_bytes, size_t body_size,
                       gpr_timespec deadline,
                       grpc_httpcli_response_cb on_response, void *user_data) {
  internal_request *req;
  if (g_post_override && g_post_override(request, body_bytes, body_size,
                                         deadline, on_response, user_data)) {
    return;
  }
  req = gpr_malloc(sizeof(internal_request));
  memset(req, 0, sizeof(*req));
  req->request_text =
      grpc_httpcli_format_post_request(request, body_bytes, body_size);
  grpc_httpcli_parser_init(&req->parser);
  req->on_response = on_response;
  req->user_data = user_data;
  req->deadline = deadline;
  req->use_ssl = request->use_ssl;
  if (req->use_ssl) {
    req->host = gpr_strdup(request->host);
  }

  grpc_resolve_address(request->host, req->use_ssl ? "https" : "http",
                       on_resolved, req);
}
Ejemplo n.º 3
0
static void zookeeper_get_children_node_completion(int rc, const char *value,
                                                   int value_len,
                                                   const struct Stat *stat,
                                                   const void *arg) {
  char *address = NULL;
  zookeeper_resolver *r = (zookeeper_resolver *)arg;
  int resolve_done = 0;
  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;

  if (rc != 0) {
    gpr_log(GPR_ERROR, "Error in getting a child node of %s", r->name);
    grpc_exec_ctx_finish(&exec_ctx);
    return;
  }

  address = zookeeper_parse_address(value, (size_t)value_len);
  if (address != NULL) {
    /** Further resolves address by DNS */
    grpc_resolve_address(&exec_ctx, address, NULL, zookeeper_dns_resolved, r);
    gpr_free(address);
  } else {
    gpr_log(GPR_ERROR, "Error in resolving a child node of %s", r->name);
    gpr_mu_lock(&r->mu);
    r->resolved_total--;
    resolve_done = (r->resolved_num == r->resolved_total);
    gpr_mu_unlock(&r->mu);
    if (resolve_done) {
      zookeeper_on_resolved(&exec_ctx, r, r->resolved_addrs);
    }
  }

  grpc_exec_ctx_finish(&exec_ctx);
}
Ejemplo n.º 4
0
static void internal_request_begin(
    grpc_exec_ctx *exec_ctx, grpc_httpcli_context *context,
    grpc_pollset *pollset, const grpc_httpcli_request *request,
    gpr_timespec deadline, grpc_httpcli_response_cb on_response,
    void *user_data, const char *name, gpr_slice request_text) {
  internal_request *req = gpr_malloc(sizeof(internal_request));
  memset(req, 0, sizeof(*req));
  req->request_text = request_text;
  grpc_httpcli_parser_init(&req->parser);
  req->on_response = on_response;
  req->user_data = user_data;
  req->deadline = deadline;
  req->handshaker =
      request->handshaker ? request->handshaker : &grpc_httpcli_plaintext;
  req->context = context;
  req->pollset = pollset;
  grpc_closure_init(&req->on_read, on_read, req);
  grpc_closure_init(&req->done_write, done_write, req);
  gpr_slice_buffer_init(&req->incoming);
  gpr_slice_buffer_init(&req->outgoing);
  grpc_iomgr_register_object(&req->iomgr_obj, name);
  req->host = gpr_strdup(request->host);
  req->ssl_host_override = gpr_strdup(request->ssl_host_override);

  grpc_pollset_set_add_pollset(exec_ctx, &req->context->pollset_set,
                               req->pollset);
  grpc_resolve_address(request->host, req->handshaker->default_port,
                       on_resolved, req);
}
Ejemplo n.º 5
0
static void dns_start_resolving_locked(grpc_exec_ctx *exec_ctx,
                                       dns_resolver *r) {
  GRPC_RESOLVER_REF(&r->base, "dns-resolving");
  GPR_ASSERT(!r->resolving);
  r->resolving = true;
  r->addresses = NULL;
  grpc_resolve_address(exec_ctx, r->name_to_resolve, r->default_port,
                       grpc_closure_create(dns_on_resolved, r), &r->addresses);
}
Ejemplo n.º 6
0
static void initiate_setup(void *sp, grpc_client_setup_request *cs_request) {
  request *r = gpr_malloc(sizeof(request));
  r->setup = sp;
  r->cs_request = cs_request;
  r->resolved = NULL;
  r->resolved_index = 0;
  /* TODO(klempner): Make grpc_resolve_address respect deadline */
  grpc_resolve_address(r->setup->target, "http", on_resolved, r);
}
Ejemplo n.º 7
0
static void test_unix_socket(void) {
  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
  args_struct args;
  args_init(&exec_ctx, &args);
  poll_pollset_until_request_done(&args);
  grpc_resolve_address(
      &exec_ctx, "unix:/path/name", NULL, args.pollset_set,
      GRPC_CLOSURE_CREATE(must_succeed, &args, grpc_schedule_on_exec_ctx),
      &args.addrs);
  args_finish(&exec_ctx, &args);
  grpc_exec_ctx_finish(&exec_ctx);
}
Ejemplo n.º 8
0
static void test_invalid_ip_addresses(void) {
  const char* const kCases[] = {
      "293.283.1238.3:1", "[2001:db8::11111]:1",
  };
  unsigned i;
  for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
    gpr_event ev;
    gpr_event_init(&ev);
    grpc_resolve_address(kCases[i], NULL, must_fail, &ev);
    GPR_ASSERT(gpr_event_wait(&ev, test_deadline()));
  }
}
Ejemplo n.º 9
0
static void test_ipv6_without_port(void) {
  const char* const kCases[] = {
      "2001:db8::1", "2001:db8::1.2.3.4", "[2001:db8::1]",
  };
  unsigned i;
  for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
    gpr_event ev;
    gpr_event_init(&ev);
    grpc_resolve_address(kCases[i], "80", must_succeed, &ev);
    GPR_ASSERT(gpr_event_wait(&ev, test_deadline()));
  }
}
Ejemplo n.º 10
0
static void test_unparseable_hostports(void) {
  const char* const kCases[] = {
      "[", "[::1", "[::1]bad", "[1.2.3.4]", "[localhost]", "[localhost]:1",
  };
  unsigned i;
  for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
    gpr_event ev;
    gpr_event_init(&ev);
    grpc_resolve_address(kCases[i], "1", must_fail, &ev);
    GPR_ASSERT(gpr_event_wait(&ev, test_deadline()));
  }
}
Ejemplo n.º 11
0
static void test_unix_socket_path_name_too_long(void) {
  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
  args_struct args;
  args_init(&exec_ctx, &args);
  const char prefix[] = "unix:/path/name";
  size_t path_name_length =
      GPR_ARRAY_SIZE(((struct sockaddr_un *)0)->sun_path) + 6;
  char *path_name = gpr_malloc(sizeof(char) * path_name_length);
  memset(path_name, 'a', path_name_length);
  memcpy(path_name, prefix, strlen(prefix) - 1);
  path_name[path_name_length - 1] = '\0';

  poll_pollset_until_request_done(&args);
  grpc_resolve_address(
      &exec_ctx, path_name, NULL, args.pollset_set,
      GRPC_CLOSURE_CREATE(must_fail, &args, grpc_schedule_on_exec_ctx),
      &args.addrs);
  gpr_free(path_name);
  args_finish(&exec_ctx, &args);
  grpc_exec_ctx_finish(&exec_ctx);
}
Ejemplo n.º 12
0
static void zookeeper_get_node_completion(int rc, const char *value,
                                          int value_len,
                                          const struct Stat *stat,
                                          const void *arg) {
  int status;
  char *address = NULL;
  zookeeper_resolver *r = (zookeeper_resolver *)arg;
  r->resolved_addrs = NULL;
  r->resolved_total = 0;
  r->resolved_num = 0;

  if (rc != 0) {
    gpr_log(GPR_ERROR, "Error in getting zookeeper node %s", r->name);
    return;
  }

  /** If zookeeper node of path r->name does not have address
      (i.e. service node), get its children */
  address = zookeeper_parse_address(value, (size_t)value_len);
  if (address != NULL) {
    r->resolved_addrs = gpr_malloc(sizeof(grpc_resolved_addresses));
    r->resolved_addrs->addrs = NULL;
    r->resolved_addrs->naddrs = 0;
    r->resolved_total = 1;
    /** Further resolves address by DNS */
    grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
    grpc_resolve_address(&exec_ctx, address, NULL, zookeeper_dns_resolved, r);
    gpr_free(address);
    grpc_exec_ctx_finish(&exec_ctx);
    return;
  }

  status = zoo_awget_children(r->zookeeper_handle, r->name, zookeeper_watcher,
                              r, zookeeper_get_children_completion, r);
  if (status != 0) {
    gpr_log(GPR_ERROR, "Error in getting zookeeper children of %s", r->name);
  }
}
Ejemplo n.º 13
0
static void dns_start_resolving_locked(dns_resolver *r) {
  GRPC_RESOLVER_REF(&r->base, "dns-resolving");
  GPR_ASSERT(!r->resolving);
  r->resolving = 1;
  grpc_resolve_address(r->name, r->default_port, dns_on_resolved, r);
}
Ejemplo n.º 14
0
static void test_ipv6_with_port(void) {
  gpr_event ev;
  gpr_event_init(&ev);
  grpc_resolve_address("[2001:db8::1]:1", NULL, must_succeed, &ev);
  GPR_ASSERT(gpr_event_wait(&ev, test_deadline()));
}
Ejemplo n.º 15
0
static void test_missing_default_port(void) {
  gpr_event ev;
  gpr_event_init(&ev);
  grpc_resolve_address("localhost", NULL, must_fail, &ev);
  GPR_ASSERT(gpr_event_wait(&ev, test_deadline()));
}
Ejemplo n.º 16
0
static void test_default_port(void) {
  gpr_event ev;
  gpr_event_init(&ev);
  grpc_resolve_address("localhost", "1", must_succeed, &ev);
  GPR_ASSERT(gpr_event_wait(&ev, test_deadline()));
}