/** * @brief dump_request_cb The callback of a dump request. * * @param req The request you want to dump. * @param arg It is not useful. */ void dump_request_cb(evhtp_request_t *req, void *arg) { const char *uri = req->uri->path->full; //switch (evhtp_request_t_get_command(req)) { int req_method = evhtp_request_get_method(req); if(req_method >= 16) req_method = 16; LOG_PRINT(LOG_DEBUG, "Received a %s request for %s", method_strmap[req_method], uri); evbuffer_add_printf(req->buffer_out, "uri : %s\r\n", uri); evbuffer_add_printf(req->buffer_out, "query : %s\r\n", req->uri->query_raw); evhtp_headers_for_each(req->uri->query, print_headers, req->buffer_out); evbuffer_add_printf(req->buffer_out, "Method : %s\n", method_strmap[req_method]); evhtp_headers_for_each(req->headers_in, print_headers, req->buffer_out); evbuf_t *buf = req->buffer_in;; puts("Input data: <<<"); while (evbuffer_get_length(buf)) { int n; char cbuf[128]; n = evbuffer_remove(buf, cbuf, sizeof(buf)-1); if (n > 0) (void) fwrite(cbuf, 1, n, stdout); } puts(">>>"); evhtp_headers_add_header(req->headers_out, evhtp_header_new("Server", settings.server_name, 0, 1)); evhtp_headers_add_header(req->headers_out, evhtp_header_new("Content-Type", "text/plain", 0, 0)); evhtp_send_reply(req, EVHTP_RES_OK); }
static evhtp_res print_kvs(evhtp_request_t * req, evhtp_headers_t * hdrs, void * arg ) { evhtp_headers_for_each(hdrs, output_header, req->buffer_out); return EVHTP_RES_OK; }
static evbuffer * _evhtp_create_reply(evhtp_request_t * request, evhtp_res code) { evbuffer * buf = evbuffer_new(); if (evbuffer_get_length(request->buffer_out) && request->chunked == 0) { /* add extra headers (like content-length/type) if not already present */ if (!evhtp_header_find(request->headers_out, "Content-Length")) { std::ostringstream oss; oss<<evbuffer_get_length(request->buffer_out); std::string lstr=oss.str(); evhtp_headers_add_header(request->headers_out, evhtp_header_new("Content-Length", lstr.c_str(), 0, 1)); } if (!evhtp_header_find(request->headers_out, "Server")) { evhtp_headers_add_header(request->headers_out, evhtp_header_new("Server", "nginx/1.1.0", 0, 0)); } if (!evhtp_header_find(request->headers_out, "Content-Type")) { evhtp_headers_add_header(request->headers_out, evhtp_header_new("Content-Type", "text/plain", 0, 0)); } } else { if (!evhtp_header_find(request->headers_out, "Content-Length")) { const char * chunked = evhtp_header_find(request->headers_out, "transfer-encoding"); if (!chunked || !strstr(chunked, "chunked")) { evhtp_headers_add_header(request->headers_out, evhtp_header_new("Content-Length", "0", 0, 0)); } } } /* add the proper keep-alive type headers based on http version */ switch (request->proto) { case EVHTP_PROTO_11: if (request->keepalive == 0) { /* protocol is HTTP/1.1 but client wanted to close */ evhtp_headers_add_header(request->headers_out, evhtp_header_new("Connection", "close", 0, 0)); } break; case EVHTP_PROTO_10: if (request->keepalive == 1) { /* protocol is HTTP/1.0 and clients wants to keep established */ evhtp_headers_add_header(request->headers_out, evhtp_header_new("Connection", "keep-alive", 0, 0)); } break; default: /* this sometimes happens when a response is made but paused before * the method has been parsed */ request->conn->parser->set_major(1); request->conn->parser->set_minor(0); break; } /* switch */ /* add the status line */ evbuffer_add_printf(buf, "HTTP/%d.%d %d %s\r\n", request->conn->parser->get_major(), request->conn->parser->get_minor(), code, StatusCodeManager::instance().status_code_to_str(code)); evhtp_headers_for_each(request->headers_out, _evhtp_create_headers, buf); evbuffer_add_reference(buf, "\r\n", 2, NULL, NULL); if (evbuffer_get_length(request->buffer_out)) { evbuffer_add_buffer(buf, request->buffer_out); } return buf; } /* _evhtp_create_reply */