Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/memc_touch.rl
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
%%{
machine memc_touch;

alphtype short;

include memc_common "memc_common.rl";

response = "TOUCHED\r\n"
| "NOT_FOUND\r\n" @handle_not_found
| error
;

main := response @finalize
;

}%%

10 changes: 9 additions & 1 deletion src/ngx_http_memc_handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,13 @@ ngx_http_memc_handler(ngx_http_request_t *r)
u->input_filter_init = ngx_http_memc_empty_filter_init;
u->input_filter = ngx_http_memc_empty_filter;

} else if (memc_cmd == ngx_http_memc_cmd_touch) {
u->create_request = ngx_http_memc_create_touch_cmd_request;
u->process_header = ngx_http_memc_process_simple_header;

u->input_filter_init = ngx_http_memc_empty_filter_init;
u->input_filter = ngx_http_memc_empty_filter;

} else {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"assertion failed: command \"%v\" does not have proper "
Expand All @@ -297,7 +304,8 @@ ngx_http_memc_handler(ngx_http_request_t *r)

if (is_storage_cmd
|| memc_cmd == ngx_http_memc_cmd_flush_all
|| memc_cmd == ngx_http_memc_cmd_delete)
|| memc_cmd == ngx_http_memc_cmd_delete
|| memc_cmd == ngx_http_memc_cmd_touch)
{
exptime_vv = ngx_http_get_indexed_variable(r, mmcf->exptime_index);

Expand Down
2 changes: 2 additions & 0 deletions src/ngx_http_memc_module.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ typedef enum {

ngx_http_memc_cmd_flush_all,
ngx_http_memc_cmd_version,

ngx_http_memc_cmd_touch,
/* ngx_http_memc_cmd_verbosity, */

/* we do not want to support the "quit" command here */
Expand Down
75 changes: 75 additions & 0 deletions src/ngx_http_memc_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -569,3 +569,78 @@ ngx_http_memc_create_incr_decr_cmd_request(ngx_http_request_t *r)

return NGX_OK;
}


ngx_int_t
ngx_http_memc_create_touch_cmd_request(ngx_http_request_t *r)
{
size_t len;
ngx_buf_t *b;
ngx_http_memc_ctx_t *ctx;
ngx_chain_t *cl;
uintptr_t escape;
ngx_http_variable_value_t *key_vv;
ngx_http_variable_value_t *exptime_vv;

ctx = ngx_http_get_module_ctx(r, ngx_http_memc_module);

/* prepare the "key" argument */

key_vv = ctx->memc_key_vv;

if (key_vv == NULL || key_vv->not_found || key_vv->len == 0) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"the \"$memc_key\" variable is not set");
return NGX_ERROR;
}

escape = 2 * ngx_escape_uri(NULL, key_vv->data, key_vv->len,
NGX_ESCAPE_MEMCACHED);

/* prepare the "exptime" argument */

exptime_vv = ctx->memc_exptime_vv;

if (exptime_vv == NULL || exptime_vv->not_found || exptime_vv->len == 0) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"the \"$memc_exptime\" variable is not set");
return NGX_ERROR;
}

len = ctx->cmd_str.len + sizeof(' ') + key_vv->len + escape + sizeof(' ')
+ exptime_vv->len + sizeof(CRLF) - 1;

b = ngx_create_temp_buf(r->pool, len);
if (b == NULL) {
return NGX_ERROR;
}

cl = ngx_alloc_chain_link(r->pool);
if (cl == NULL) {
return NGX_ERROR;
}

cl->buf = b;
cl->next = NULL;

r->upstream->request_bufs = cl;

b->last = ngx_copy(b->last, ctx->cmd_str.data, ctx->cmd_str.len);

*b->last++ = ' ';

if (escape == 0) {
b->last = ngx_copy(b->last, key_vv->data, key_vv->len);

} else {
b->last = (u_char *) ngx_escape_uri(b->last, key_vv->data, key_vv->len,
NGX_ESCAPE_MEMCACHED);
}

*b->last++ = ' ';
b->last = ngx_copy(b->last, exptime_vv->data, exptime_vv->len);

*b->last++ = CR; *b->last++ = LF;

return NGX_OK;
}
1 change: 1 addition & 0 deletions src/ngx_http_memc_request.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ ngx_int_t ngx_http_memc_create_delete_cmd_request(ngx_http_request_t *r);

ngx_int_t ngx_http_memc_create_incr_decr_cmd_request(ngx_http_request_t *r);

ngx_int_t ngx_http_memc_create_touch_cmd_request(ngx_http_request_t *r);

#endif /* NGX_HTTP_MEMC_REQUEST_H */

Loading