Skip to content

Commit

Permalink
Merge branch 'bugfix/httpd_sess_ctx_backportv3.2' into 'release/v3.2'
Browse files Browse the repository at this point in the history
esp_http_server: Provide apps an option to let http_server ignore sess_ctx changes

See merge request idf/esp-idf!4421
  • Loading branch information
projectgus committed Mar 8, 2019
2 parents e1e82c8 + f8f0c81 commit a7dc804
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 4 deletions.
12 changes: 12 additions & 0 deletions components/esp_http_server/include/esp_http_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,18 @@ typedef struct httpd_req {
* function for freeing the session context, please specify that here.
*/
httpd_free_ctx_fn_t free_ctx;

/**
* Flag indicating if Session Context changes should be ignored
*
* By default, if you change the sess_ctx in some URI handler, the http server
* will internally free the earlier context (if non NULL), after the URI handler
* returns. If you want to manage the allocation/reallocation/freeing of
* sess_ctx yourself, set this flag to true, so that the server will not
* perform any checks on it. The context will be cleared by the server
* (by calling free_ctx or free()) only if the socket gets closed.
*/
bool ignore_sess_ctx_changes;
} httpd_req_t;

/**
Expand Down
1 change: 1 addition & 0 deletions components/esp_http_server/src/esp_httpd_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ typedef enum {
struct sock_db {
int fd; /*!< The file descriptor for this socket */
void *ctx; /*!< A custom context for this socket */
bool ignore_sess_ctx_changes; /*!< Flag indicating if session context changes should be ignored */
void *transport_ctx; /*!< A custom 'transport' context for this socket, to be used by send/recv/pending */
httpd_handle_t handle; /*!< Server handle */
httpd_free_ctx_fn_t free_ctx; /*!< Function for freeing the context */
Expand Down
11 changes: 7 additions & 4 deletions components/esp_http_server/src/httpd_parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,7 @@ static void init_req(httpd_req_t *r, httpd_config_t *config)
r->user_ctx = 0;
r->sess_ctx = 0;
r->free_ctx = 0;
r->ignore_sess_ctx_changes = 0;
}

static void init_req_aux(struct httpd_req_aux *ra, httpd_config_t *config)
Expand All @@ -556,13 +557,14 @@ static void httpd_req_cleanup(httpd_req_t *r)
{
struct httpd_req_aux *ra = r->aux;

/* Retrieve session info from the request into the socket database */
if (ra->sd->ctx != r->sess_ctx) {
/* Free previous context */
/* Check if the context has changed and needs to be cleared */
if ((r->ignore_sess_ctx_changes == false) && (ra->sd->ctx != r->sess_ctx)) {
httpd_sess_free_ctx(ra->sd->ctx, ra->sd->free_ctx);
ra->sd->ctx = r->sess_ctx;
}
/* Retrieve session info from the request into the socket database. */
ra->sd->ctx = r->sess_ctx;
ra->sd->free_ctx = r->free_ctx;
ra->sd->ignore_sess_ctx_changes = r->ignore_sess_ctx_changes;

/* Clear out the request and request_aux structures */
ra->sd = NULL;
Expand Down Expand Up @@ -590,6 +592,7 @@ esp_err_t httpd_req_new(struct httpd_data *hd, struct sock_db *sd)
/* Copy session info to the request */
r->sess_ctx = sd->ctx;
r->free_ctx = sd->free_ctx;
r->ignore_sess_ctx_changes = sd->ignore_sess_ctx_changes;
/* Parse request */
esp_err_t err = httpd_parse_req(hd);
if (err != ESP_OK) {
Expand Down

0 comments on commit a7dc804

Please sign in to comment.