void request_cb()

in tensorflow_serving/util/net_http/socket/testing/ev_print_req_server.cc [36:154]


void request_cb(struct evhttp_request *req, void *arg) {
  const char *method;

  switch (evhttp_request_get_command(req)) {
    case EVHTTP_REQ_GET:
      method = "GET";
      break;
    case EVHTTP_REQ_POST:
      method = "POST";
      break;
    case EVHTTP_REQ_HEAD:
      method = "HEAD";
      break;
    case EVHTTP_REQ_PUT:
      method = "PUT";
      break;
    case EVHTTP_REQ_DELETE:
      method = "DELETE";
      break;
    case EVHTTP_REQ_OPTIONS:
      method = "OPTIONS";
      break;
    case EVHTTP_REQ_TRACE:
      method = "TRACE";
      break;
    case EVHTTP_REQ_CONNECT:
      method = "CONNECT";
      break;
    case EVHTTP_REQ_PATCH:
      method = "PATCH";
      break;
    default:
      method = "unknown";
      break;
  }

  struct evbuffer *response_body = evbuffer_new();
  if (response_body == nullptr) {
    evhttp_send_error(req, HTTP_SERVUNAVAIL, nullptr);
    return;
  }

  evbuffer_add_printf(response_body,
                      "<!DOCTYPE html>\n"
                      "<html>\n <head>\n"
                      "  <meta charset='utf-8'>\n"
                      "  <title>Mini libevent httpserver</title>\n"
                      " </head>\n"
                      " <body>\n"
                      "  <h1>Print the HTTP request detail</h1>\n"
                      "  <ul>\n");

  evbuffer_add_printf(response_body, "HTTP Method: %s <br>\n", method);

  const char *uri = evhttp_request_get_uri(req);  // no malloc
  evbuffer_add_printf(response_body, "Request Uri: %s <br>\n", uri);

  struct evhttp_uri *decoded_url = evhttp_uri_parse(uri);
  if (decoded_url == nullptr) {
    evhttp_send_error(req, HTTP_BADREQUEST, nullptr);
    return;
  }

  evbuffer_add_printf(response_body, "Decoded Uri:<br>\n");

  evbuffer_add_printf(response_body, "&nbsp;&nbsp;scheme : %s <br>\n",
                      evhttp_uri_get_scheme(decoded_url));
  evbuffer_add_printf(response_body, "&nbsp;&nbsp;host : %s <br>\n",
                      evhttp_uri_get_host(decoded_url));
  evbuffer_add_printf(response_body, "&nbsp;&nbsp;port : %d <br>\n",
                      evhttp_uri_get_port(decoded_url));
  evbuffer_add_printf(response_body, "&nbsp;&nbsp;path : %s <br>\n",
                      evhttp_uri_get_path(decoded_url));
  evbuffer_add_printf(response_body, "&nbsp;&nbsp;query : %s <br>\n",
                      evhttp_uri_get_query(decoded_url));

  const char *path = evhttp_uri_get_path(decoded_url);
  if (path == nullptr) {
    path = "/";
  }

  evbuffer_add_printf(response_body, "Uri path: %s <br>\n", path);

  char *decoded_path = evhttp_uridecode(path, 1, nullptr);
  if (decoded_path == nullptr) {
    evhttp_send_error(req, HTTP_BADREQUEST, nullptr);
    return;
  }

  evbuffer_add_printf(response_body, "Decoded path: %s <br>\n", decoded_path);

  evbuffer_add_printf(response_body, "<br><br>====<br><br>\n");

  struct evkeyvalq *headers = evhttp_request_get_input_headers(req);

  struct evkeyval *header;
  for (header = headers->tqh_first; header; header = header->next.tqe_next) {
    evbuffer_add_printf(response_body, "%s : %s<br>\n", header->key,
                        header->value);
  }

  struct evbuffer *request_body = evhttp_request_get_input_buffer(req);
  if (request_body != nullptr) {
    evbuffer_add_printf(response_body, "<br><br>====<br><br>\n");
    int result = evbuffer_add_buffer_reference(response_body, request_body);
    if (result < 0) {
      evbuffer_add_printf(response_body, ">>> Failed to print the body<br>\n");
    }
  }

  evhttp_add_header(evhttp_request_get_output_headers(req), "Content-Type",
                    "text/html");

  evhttp_send_reply(req, 200, "OK", response_body);

  evhttp_uri_free(decoded_url);
  free(decoded_path);
  evbuffer_free(response_body);
}