static njs_ret_t ngx_http_js_ext_get_variable(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { nxt_str_t *v; ngx_str_t name; ngx_uint_t key; ngx_http_request_t *r; ngx_http_variable_value_t *vv; r = (ngx_http_request_t *) obj; v = (nxt_str_t *) data; name.data = v->start; name.len = v->length; key = ngx_hash_strlow(name.data, name.data, name.len); vv = ngx_http_get_variable(r, &name, key); if (vv == NULL || vv->not_found) { return njs_string_create(vm, value, NULL, 0, 0); } return njs_string_create(vm, value, vv->data, vv->len, 0); }
static njs_ret_t ngx_http_js_ext_next_header(njs_vm_t *vm, njs_value_t *value, void *obj, void *next) { ngx_http_js_table_entry_t **e = next; ngx_table_elt_t *header, *h; ngx_http_js_table_entry_t *entry; entry = *e; while (entry->part) { if (entry->item >= entry->part->nelts) { entry->part = entry->part->next; entry->item = 0; continue; } header = entry->part->elts; h = &header[entry->item++]; return njs_string_create(vm, value, h->key.data, h->key.len, 0); } return NJS_DONE; }
static njs_ret_t ngx_http_js_ext_get_http_version(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { ngx_str_t v; ngx_http_request_t *r; r = (ngx_http_request_t *) obj; switch (r->http_version) { case NGX_HTTP_VERSION_9: ngx_str_set(&v, "0.9"); break; case NGX_HTTP_VERSION_10: ngx_str_set(&v, "1.0"); break; default: /* NGX_HTTP_VERSION_11 */ ngx_str_set(&v, "1.1"); break; } return njs_string_create(vm, value, v.data, v.len, 0); }
static njs_ret_t njs_regexp_string_create(njs_vm_t *vm, njs_value_t *value, u_char *start, uint32_t size, int32_t length) { length = (length >= 0) ? length : 0; return njs_string_create(vm, value, start, size, length); }
static njs_ret_t ngx_http_js_ext_get_arg(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { nxt_str_t *v; ngx_str_t arg; ngx_http_request_t *r; r = (ngx_http_request_t *) obj; v = (nxt_str_t *) data; if (ngx_http_arg(r, v->start, v->length, &arg) == NGX_OK) { return njs_string_create(vm, value, arg.data, arg.len, 0); } return njs_string_create(vm, value, NULL, 0, 0); }
static njs_ret_t ngx_http_js_ext_get_header_in(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { nxt_str_t *v; ngx_table_elt_t *h; ngx_http_request_t *r; r = (ngx_http_request_t *) obj; v = (nxt_str_t *) data; h = ngx_http_js_get_header(&r->headers_in.headers.part, v->data, v->len); if (h == NULL) { return njs_string_create(vm, value, NULL, 0, 0); } return njs_string_create(vm, value, h->value.data, h->value.len, 0); }
static njs_ret_t njs_regexp_string_create(njs_vm_t *vm, njs_value_t *value, u_char *start, uint32_t size, int32_t length) { if (nxt_fast_path(length >= 0)) { return njs_string_create(vm, value, start, size, length); } vm->exception = &njs_exception_internal_error; return NXT_ERROR; }
static njs_ret_t ngx_http_js_ext_get_string(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { char *p = obj; ngx_str_t *field; field = (ngx_str_t *) (p + data); return njs_string_create(vm, value, field->data, field->len, 0); }
static njs_ret_t ngx_http_js_ext_get_remote_address(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { ngx_connection_t *c; ngx_http_request_t *r; r = (ngx_http_request_t *) obj; c = r->connection; return njs_string_create(vm, value, c->addr_text.data, c->addr_text.len, 0); }
static njs_ret_t ngx_http_js_ext_get_content_length(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { size_t len; u_char *p; ngx_http_request_t *r; r = (ngx_http_request_t *) obj; p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); if (p == NULL) { return NJS_ERROR; } len = ngx_sprintf(p, "%O", r->headers_out.content_length_n) - p; return njs_string_create(vm, value, p, len, 0); }
static njs_ret_t ngx_http_js_ext_get_status(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { size_t len; u_char *p; ngx_http_request_t *r; r = (ngx_http_request_t *) obj; p = ngx_pnalloc(r->pool, 3); if (p == NULL) { return NJS_ERROR; } len = ngx_snprintf(p, 3, "%ui", r->headers_out.status) - p; return njs_string_create(vm, value, p, len, 0); }
njs_value_t * njs_array_add(njs_vm_t *vm, njs_value_t *value, u_char *start, size_t size) { njs_ret_t ret; njs_array_t *array; if (value != NULL) { array = value->data.u.array; if (array->size == array->length) { ret = njs_array_realloc(vm, array, 0, array->size + 1); if (nxt_slow_path(ret != NXT_OK)) { return NULL; } } } else { value = nxt_mem_cache_align(vm->mem_cache_pool, sizeof(njs_value_t), sizeof(njs_value_t)); if (nxt_slow_path(value == NULL)) { return NULL; } array = njs_array_alloc(vm, 0, NJS_ARRAY_SPARE); if (nxt_slow_path(array == NULL)) { return NULL; } value->data.u.array = array; value->type = NJS_ARRAY; value->data.truth = 1; } ret = njs_string_create(vm, &array->start[array->length++], start, size, 0); if (nxt_fast_path(ret == NXT_OK)) { return value; } return NULL; }
static njs_ret_t ngx_http_js_ext_next_arg(njs_vm_t *vm, njs_value_t *value, void *obj, void *next) { ngx_str_t **e = next; size_t len; u_char *p, *start, *end; ngx_str_t *entry; entry = *e; if (entry->len == 0) { return NJS_DONE; } start = entry->data; end = start + entry->len; p = ngx_strlchr(start, end, '='); if (p == NULL) { return NJS_ERROR; } len = p - start; p++; p = ngx_strlchr(p, end, '&'); if (p) { entry->data = &p[1]; entry->len = end - entry->data; } else { entry->len = 0; } return njs_string_create(vm, value, start, len, 0); }