HTTP: added a $request_time variable.
This commit is contained in:
@@ -37,6 +37,12 @@ support rack v3 in ruby applications.
|
|||||||
</para>
|
</para>
|
||||||
</change>
|
</change>
|
||||||
|
|
||||||
|
<change type="feature">
|
||||||
|
<para>
|
||||||
|
the $request_time variable contains the request processing time.
|
||||||
|
</para>
|
||||||
|
</change>
|
||||||
|
|
||||||
<change type="bugfix">
|
<change type="bugfix">
|
||||||
<para>
|
<para>
|
||||||
fix HTTP cookie parsing when the value contains an equals sign.
|
fix HTTP cookie parsing when the value contains an equals sign.
|
||||||
|
|||||||
@@ -140,6 +140,8 @@ struct nxt_http_request_s {
|
|||||||
nxt_buf_t *out;
|
nxt_buf_t *out;
|
||||||
const nxt_http_request_state_t *state;
|
const nxt_http_request_state_t *state;
|
||||||
|
|
||||||
|
nxt_nsec_t start_time;
|
||||||
|
|
||||||
nxt_str_t host;
|
nxt_str_t host;
|
||||||
nxt_str_t server_name;
|
nxt_str_t server_name;
|
||||||
nxt_str_t target;
|
nxt_str_t target;
|
||||||
|
|||||||
@@ -278,6 +278,8 @@ nxt_http_request_create(nxt_task_t *task)
|
|||||||
r->resp.content_length_n = -1;
|
r->resp.content_length_n = -1;
|
||||||
r->state = &nxt_http_request_init_state;
|
r->state = &nxt_http_request_init_state;
|
||||||
|
|
||||||
|
r->start_time = nxt_thread_monotonic_time(task->thread);
|
||||||
|
|
||||||
task->thread->engine->requests_cnt++;
|
task->thread->engine->requests_cnt++;
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
|
|
||||||
static nxt_int_t nxt_http_var_dollar(nxt_task_t *task, nxt_str_t *str,
|
static nxt_int_t nxt_http_var_dollar(nxt_task_t *task, nxt_str_t *str,
|
||||||
void *ctx, uint16_t field);
|
void *ctx, uint16_t field);
|
||||||
|
static nxt_int_t nxt_http_var_request_time(nxt_task_t *task, nxt_str_t *str,
|
||||||
|
void *ctx, uint16_t field);
|
||||||
static nxt_int_t nxt_http_var_method(nxt_task_t *task, nxt_str_t *str,
|
static nxt_int_t nxt_http_var_method(nxt_task_t *task, nxt_str_t *str,
|
||||||
void *ctx, uint16_t field);
|
void *ctx, uint16_t field);
|
||||||
static nxt_int_t nxt_http_var_request_uri(nxt_task_t *task, nxt_str_t *str,
|
static nxt_int_t nxt_http_var_request_uri(nxt_task_t *task, nxt_str_t *str,
|
||||||
@@ -45,6 +47,9 @@ static nxt_var_decl_t nxt_http_vars[] = {
|
|||||||
{
|
{
|
||||||
.name = nxt_string("dollar"),
|
.name = nxt_string("dollar"),
|
||||||
.handler = nxt_http_var_dollar,
|
.handler = nxt_http_var_dollar,
|
||||||
|
}, {
|
||||||
|
.name = nxt_string("request_time"),
|
||||||
|
.handler = nxt_http_var_request_time,
|
||||||
}, {
|
}, {
|
||||||
.name = nxt_string("method"),
|
.name = nxt_string("method"),
|
||||||
.handler = nxt_http_var_method,
|
.handler = nxt_http_var_method,
|
||||||
@@ -110,6 +115,34 @@ nxt_http_var_dollar(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static nxt_int_t
|
||||||
|
nxt_http_var_request_time(nxt_task_t *task, nxt_str_t *str, void *ctx,
|
||||||
|
uint16_t field)
|
||||||
|
{
|
||||||
|
u_char *p;
|
||||||
|
nxt_msec_t ms;
|
||||||
|
nxt_nsec_t now;
|
||||||
|
nxt_http_request_t *r;
|
||||||
|
|
||||||
|
r = ctx;
|
||||||
|
|
||||||
|
now = nxt_thread_monotonic_time(task->thread);
|
||||||
|
ms = (now - r->start_time) / 1000000;
|
||||||
|
|
||||||
|
str->start = nxt_mp_nget(r->mem_pool, NXT_TIME_T_LEN + 4);
|
||||||
|
if (nxt_slow_path(str->start == NULL)) {
|
||||||
|
return NXT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = nxt_sprintf(str->start, str->start + NXT_TIME_T_LEN, "%T.%03M",
|
||||||
|
(nxt_time_t) ms / 1000, ms % 1000);
|
||||||
|
|
||||||
|
str->length = p - str->start;
|
||||||
|
|
||||||
|
return NXT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static nxt_int_t
|
static nxt_int_t
|
||||||
nxt_http_var_method(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
|
nxt_http_var_method(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user