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, " scheme : %s <br>\n",
evhttp_uri_get_scheme(decoded_url));
evbuffer_add_printf(response_body, " host : %s <br>\n",
evhttp_uri_get_host(decoded_url));
evbuffer_add_printf(response_body, " port : %d <br>\n",
evhttp_uri_get_port(decoded_url));
evbuffer_add_printf(response_body, " path : %s <br>\n",
evhttp_uri_get_path(decoded_url));
evbuffer_add_printf(response_body, " 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);
}