Skip to content
This repository has been archived by the owner on Jun 30, 2021. It is now read-only.

Commit

Permalink
Additions to make life easier fetching status codes + examples
Browse files Browse the repository at this point in the history
- added `evhtp_request_get_status_code(<request>)` which returns the
  last status code set for a <request>

- added `evhtp_request_get_status_code_str(<request>)` which returns the
  string of the last status code set for a <request>

- added a quick example of how to use request_fini hooks (resolves #75)
  • Loading branch information
NathanFrench committed Mar 14, 2018
1 parent 676b885 commit f1e015d
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 8 deletions.
17 changes: 12 additions & 5 deletions evhtp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1250,7 +1250,6 @@ htp__request_free_(evhtp_request_t * request) {

evhtp_safe_free(request->hooks, htp__free_);
evhtp_safe_free(request, htp__free_);

}

/**
Expand Down Expand Up @@ -5020,17 +5019,25 @@ evhtp_request_set_keepalive(evhtp_request_t * request, int val)
}

evhtp_connection_t *
evhtp_request_get_connection(evhtp_request_t * request)
{
evhtp_request_get_connection(evhtp_request_t * request) {
return request->conn;
}

evhtp_proto
evhtp_request_get_proto(evhtp_request_t * request)
{
evhtp_request_get_proto(evhtp_request_t * request) {
return request->proto;
}

evhtp_res
evhtp_request_get_status_code(evhtp_request_t * request) {
return request->status;
}

const char *
evhtp_request_get_status_code_str(evhtp_request_t * request) {
return status_code_to_str(request->status);
}

inline void
evhtp_connection_set_timeouts(evhtp_connection_t * c,
const struct timeval * rtimeo,
Expand Down
5 changes: 3 additions & 2 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ add_executable(test_perf EXCLUDE_FROM_ALL test_perf.c)
add_executable(example_vhost EXCLUDE_FROM_ALL example_vhost.c)
add_executable(example_pause EXCLUDE_FROM_ALL example_pause.c)
add_executable(example_chunked EXCLUDE_FROM_ALL example_chunked.c)
add_executable(example_request_fini EXCLUDE_FROM_ALL example_request_fini.c)


if (NOT EVHTP_DISABLE_EVTHR)
Expand All @@ -26,7 +27,7 @@ target_link_libraries(test_perf evhtp ${LIBEVHTP_EXTERNAL_LIBS} ${SYS_LIBS})
target_link_libraries(example_vhost evhtp ${LIBEVHTP_EXTERNAL_LIBS} ${SYS_LIBS})
target_link_libraries(example_pause evhtp ${LIBEVHTP_EXTERNAL_LIBS} ${SYS_LIBS})
target_link_libraries(example_chunked evhtp ${LIBEVHTP_EXTERNAL_LIBS} ${SYS_LIBS})

target_link_libraries(example_request_fini evhtp ${LIBEVHTP_EXTERNAL_LIBS} ${SYS_LIBS})

if (NOT EVHTP_DISABLE_SSL)
file (COPY
Expand All @@ -47,4 +48,4 @@ if (NOT EVHTP_DISABLE_SSL)
add_dependencies(examples example_https_server example_https_client)
endif()

add_dependencies(examples example_chunked example_pause example_vhost test_extensive test_basic test_vhost test_client test_query test_perf)
add_dependencies(examples example_request_fini example_chunked example_pause example_vhost test_extensive test_basic test_vhost test_client test_query test_perf)
64 changes: 64 additions & 0 deletions examples/example_request_fini.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/* Example of how to use a hook_request_fini callback.
* any hook defined as `evhtp_hook_on_request_fini` will invoke
* a user-defined function just prior to being free()'d.
*
* Here is just a quick example.
*/
#include <stdio.h>
#include <stdlib.h>

#include "../log.h"
#include "./eutils.h"
#include "internal.h"
#include "evhtp/evhtp.h"

static evhtp_res
request__callback_fini_(evhtp_request_t * req, void * arg) {
log_info("req=%p, statusCode=%d statusCodeString=%s for path=%s", req,
evhtp_request_get_status_code(req),
evhtp_request_get_status_code_str(req),
req->uri->path->full);

return EVHTP_RES_OK;
}

static void
request__callback_(evhtp_request_t * req, void * arg) {
evbuffer_add_printf(req->buffer_out, "Hello, world\n");
evhtp_send_reply(req, EVHTP_RES_200);
}

int
main(int argc, char ** argv) {
struct event_base * evbase;
evhtp_callback_t * req_callback;
evhtp_t * htp;

evbase = event_base_new();
evhtp_alloc_assert(evbase);

htp = evhtp_new(evbase, NULL);
evhtp_alloc_assert(htp);

req_callback = evhtp_set_cb(htp, "/", request__callback_, NULL);
evhtp_alloc_assert(req_callback);

/* Here we are going to make a on_request_fini for a specific
* callback, in this case "/" (which will match /anything/really).
*/
evhtp_callback_set_hook(req_callback,
evhtp_hook_on_request_fini,
request__callback_fini_, NULL);

srand(time(NULL));

#define GENCHAR() ((char)('a' + rand() % 26))

log_info("Simple usage of using request_fini hooks, run: "
"curl http://127.0.0.1:%d/%c/%c/%c",
bind__sock_port0_(htp),
GENCHAR(), GENCHAR(), GENCHAR());


return event_base_loop(evbase, 0);
}
5 changes: 4 additions & 1 deletion examples/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,10 @@ static evhtp_res
pause_request_fini(evhtp_request_t * request, void * arg) {
struct pauser * pause = (struct pauser *)arg;

printf("pause_request_fini() req=%p, c=%p\n", request, request->conn);
printf("pause_request_fini() req=%p, c=%p status_code=%d::%s\n", request,
evhtp_request_get_connection(request),
evhtp_request_get_status_code(request),
evhtp_request_get_status_code_str(request));

evhtp_safe_free(pause->timer_ev, event_free);
evhtp_safe_free(pause->tv, free);
Expand Down
21 changes: 21 additions & 0 deletions include/evhtp/evhtp.h
Original file line number Diff line number Diff line change
Expand Up @@ -1243,6 +1243,27 @@ EVHTP_EXPORT const char * evhtp_header_find(evhtp_headers_t * headers, const cha
EVHTP_EXPORT htp_method evhtp_request_get_method(evhtp_request_t * r);
EVHTP_EXPORT evhtp_proto evhtp_request_get_proto(evhtp_request_t * r);


/**
* @brief Returns the last status code set for a request (request/response)
*
* @param r
*
* @return the HTTP status code or related error.
*/
EVHTP_EXPORT evhtp_res evhtp_request_get_status_code(evhtp_request_t * r);


/**
* @brief wrapper around get_status_code that returns the string version
* of the last status code set for a request.
*
* @param r
*
* @return NULL on error
*/
EVHTP_EXPORT const char * evhtp_request_get_status_code_str(evhtp_request_t * r);

/* the following functions all do the same thing, pause and the processing */

/**
Expand Down

0 comments on commit f1e015d

Please sign in to comment.