int main()

in tensorflow_serving/util/net_http/socket/testing/ev_fetch_client.cc [79:194]


int main(int argc, char** argv) {
  fprintf(stdout, "Start the http client ...\n");

  if (argc < 2 || argc > 3) {
    help();
    return 1;
  }

  const char* url = argv[1];

  const char* body = nullptr;

  if (argc == 3) {
    body = argv[2];
  }

  http_uri = evhttp_uri_parse(url);
  if (http_uri == nullptr) {
    err("malformed url");
    return 1;
  }

  const char* scheme = evhttp_uri_get_scheme(http_uri);
  if (scheme == nullptr || strcasecmp(scheme, "http") != 0) {
    err("url must be http");
    return 1;
  }

  const char* host = evhttp_uri_get_host(http_uri);
  if (host == nullptr) {
    err("url must have a host");
    return 1;
  }

  int port = evhttp_uri_get_port(http_uri);
  if (port == -1) {
    port = (strcasecmp(scheme, "http") == 0) ? 80 : 443;
  }

  const char* path = evhttp_uri_get_path(http_uri);
  if (strlen(path) == 0) {
    path = "/";
  }

  char uri[256];
  const char* query = evhttp_uri_get_query(http_uri);
  if (query == nullptr) {
    snprintf(uri, sizeof(uri) - 1, "%s", path);
  } else {
    snprintf(uri, sizeof(uri) - 1, "%s?%s", path, query);
  }
  uri[sizeof(uri) - 1] = '\0';

  // Create event base
  ev_base = event_base_new();
  if (ev_base == nullptr) {
    perror("event_base_new()");
    return 1;
  }

  //  struct bufferevent* bev =
  //      bufferevent_socket_new(ev_base, -1, BEV_OPT_CLOSE_ON_FREE);
  //
  //  if (bev == nullptr) {
  //    fprintf(stderr, "bufferevent_socket_new() failed\n");
  //    return 1;
  //  }

  // blocking call (DNS resolution)
  evcon = evhttp_connection_base_bufferevent_new(
      ev_base, nullptr, nullptr, host, static_cast<uint16_t>(port));
  if (evcon == nullptr) {
    fprintf(stderr, "evhttp_connection_base_bufferevent_new() failed\n");
    return 1;
  }

  int retries = 0;
  evhttp_connection_set_retries(evcon, retries);

  int timeout_in_secs = 5;
  evhttp_connection_set_timeout(evcon, timeout_in_secs);

  struct evhttp_request* req = evhttp_request_new(response_cb, evcon);
  if (req == nullptr) {
    fprintf(stderr, "evhttp_request_new() failed\n");
    return 1;
  }

  struct evkeyvalq* output_headers = evhttp_request_get_output_headers(req);
  evhttp_add_header(output_headers, "Host", host);
  evhttp_add_header(output_headers, "Connection", "close");

  if (body) {
    struct evbuffer* output_buffer = evhttp_request_get_output_buffer(req);
    size_t size = strlen(body);

    evbuffer_add(output_buffer, body, size);

    char length_header[8];
    evutil_snprintf(length_header, sizeof(length_header) - 1, "%lu", size);
    evhttp_add_header(output_headers, "Content-Length", length_header);
  }

  int r = evhttp_make_request(evcon, req,
                              body ? EVHTTP_REQ_POST : EVHTTP_REQ_GET, uri);
  if (r != 0) {
    fprintf(stderr, "evhttp_make_request() failed\n");
    return 1;
  }

  event_base_dispatch(ev_base);

  cleanup();

  return 0;
}