Skip to content

Commit

Permalink
HTTP: improved request uri.
Browse files Browse the repository at this point in the history
  • Loading branch information
hongzhidao committed Feb 28, 2024
1 parent 23e807d commit ebc198b
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 34 deletions.
68 changes: 62 additions & 6 deletions src/nxt_h1proto.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ static void nxt_h1p_peer_connect(nxt_task_t *task, nxt_http_peer_t *peer);
static void nxt_h1p_peer_connected(nxt_task_t *task, void *obj, void *data);
static void nxt_h1p_peer_refused(nxt_task_t *task, void *obj, void *data);
static void nxt_h1p_peer_header_send(nxt_task_t *task, nxt_http_peer_t *peer);
static nxt_int_t nxt_h1p_peer_request_target(nxt_http_request_t *r,
nxt_str_t *target);
static void nxt_h1p_peer_header_sent(nxt_task_t *task, void *obj, void *data);
static void nxt_h1p_peer_header_read(nxt_task_t *task, nxt_http_peer_t *peer);
static ssize_t nxt_h1p_peer_io_read_handler(nxt_task_t *task, nxt_conn_t *c);
Expand Down Expand Up @@ -654,6 +656,8 @@ nxt_h1p_header_process(nxt_task_t *task, nxt_h1proto_t *h1p,
r->target.start = h1p->parser.target_start;
r->target.length = h1p->parser.target_end - h1p->parser.target_start;

r->quoted_target = h1p->parser.quoted_target;

if (h1p->parser.version.ui64 != 0) {
r->version.start = h1p->parser.version.str;
r->version.length = sizeof(h1p->parser.version.str);
Expand Down Expand Up @@ -2263,6 +2267,8 @@ nxt_h1p_peer_header_send(nxt_task_t *task, nxt_http_peer_t *peer)
{
u_char *p;
size_t size;
nxt_int_t ret;
nxt_str_t target;
nxt_buf_t *header, *body;
nxt_conn_t *c;
nxt_http_field_t *field;
Expand All @@ -2272,7 +2278,12 @@ nxt_h1p_peer_header_send(nxt_task_t *task, nxt_http_peer_t *peer)

r = peer->request;

size = r->method->length + sizeof(" ") + r->target.length
ret = nxt_h1p_peer_request_target(r, &target);
if (nxt_slow_path(ret != NXT_OK)) {
goto fail;
}

size = r->method->length + sizeof(" ") + target.length
+ sizeof(" HTTP/1.1\r\n")
+ sizeof("Connection: close\r\n")
+ sizeof("\r\n");
Expand All @@ -2288,15 +2299,14 @@ nxt_h1p_peer_header_send(nxt_task_t *task, nxt_http_peer_t *peer)

header = nxt_http_buf_mem(task, r, size);
if (nxt_slow_path(header == NULL)) {
r->state->error_handler(task, r, peer);
return;
goto fail;
}

p = header->mem.free;

p = nxt_cpymem(p, r->method->start, r->method->length);
*p++ = ' ';
p = nxt_cpymem(p, r->target.start, r->target.length);
p = nxt_cpymem(p, target.start, target.length);
p = nxt_cpymem(p, " HTTP/1.1\r\n", 11);
p = nxt_cpymem(p, "Connection: close\r\n", 19);

Expand Down Expand Up @@ -2328,8 +2338,7 @@ nxt_h1p_peer_header_send(nxt_task_t *task, nxt_http_peer_t *peer)
}

if (nxt_slow_path(body == NULL)) {
r->state->error_handler(task, r, peer);
return;
goto fail;
}

header->next = body;
Expand All @@ -2353,6 +2362,53 @@ nxt_h1p_peer_header_send(nxt_task_t *task, nxt_http_peer_t *peer)
}

nxt_conn_write(task->thread->engine, c);

return;

fail:

r->state->error_handler(task, r, peer);
}


static nxt_int_t
nxt_h1p_peer_request_target(nxt_http_request_t *r, nxt_str_t *target)
{
u_char *p;
size_t size, encode;

if (r->uri_changed) {

if (r->quoted_target) {
encode = nxt_encode_complex_uri(NULL, r->path->start,
r->path->length);

size = r->path->length + encode * 2 + 1 + r->args->length;

target->start = nxt_mp_nget(r->mem_pool, size);
if (target->start == NULL) {
return NXT_ERROR;
}

p = (u_char *) nxt_encode_complex_uri(target->start, r->path->start,
r->path->length);

if (r->args->length > 0) {
*p++ = '?';
p = nxt_cpymem(p, r->args->start, r->args->length);
}

target->length = p - target->start;

} else {
*target = *r->path;
}

} else {
*target = r->target;
}

return NXT_OK;
}


Expand Down
2 changes: 2 additions & 0 deletions src/nxt_http.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@ struct nxt_http_request_s {
nxt_http_status_t status:16;

uint8_t log_route; /* 1 bit */
uint8_t quoted_target; /* 1 bit */
uint8_t uri_changed; /* 1 bit */

uint8_t pass_count; /* 8 bits */
uint8_t app_target;
Expand Down
2 changes: 1 addition & 1 deletion src/nxt_http_parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -1041,7 +1041,7 @@ nxt_http_parse_complex_target(nxt_http_request_parse_t *rp)
break;

case sw_quoted:
//rp->quoted_target = 1;
rp->quoted_target = 1;

if (ch >= '0' && ch <= '9') {
high = (u_char) (ch - '0');
Expand Down
2 changes: 1 addition & 1 deletion src/nxt_http_parse.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ struct nxt_http_request_parse_s {

/* target with "/." */
uint8_t complex_target; /* 1 bit */
#if 0
/* target with "%" */
uint8_t quoted_target; /* 1 bit */
#if 0
/* target with " " */
uint8_t space_in_target; /* 1 bit */
#endif
Expand Down
30 changes: 4 additions & 26 deletions src/nxt_http_rewrite.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,8 @@ nxt_http_rewrite_init(nxt_router_conf_t *rtcf, nxt_http_action_t *action,
nxt_int_t
nxt_http_rewrite(nxt_task_t *task, nxt_http_request_t *r)
{
u_char *p;
nxt_int_t ret;
nxt_str_t str, encoded_path, target;
nxt_str_t str;
nxt_router_conf_t *rtcf;
nxt_http_action_t *action;
nxt_http_request_parse_t rp;
Expand Down Expand Up @@ -72,37 +71,16 @@ nxt_http_rewrite(nxt_task_t *task, nxt_http_request_t *r)
return NXT_ERROR;
}

p = (rp.args.length > 0) ? rp.args.start - 1 : rp.target_end;

encoded_path.start = rp.target_start;
encoded_path.length = p - encoded_path.start;

if (r->args->length == 0) {
r->target = encoded_path;

} else {
target.length = encoded_path.length + 1 + r->args->length;

target.start = nxt_mp_alloc(r->mem_pool, target.length);
if (target.start == NULL) {
return NXT_ERROR;
}

p = nxt_cpymem(target.start, encoded_path.start, encoded_path.length);
*p++ = '?';
nxt_memcpy(p, r->args->start, r->args->length);

r->target = target;
r->args->start = p;
}

r->path = nxt_mp_alloc(r->mem_pool, sizeof(nxt_str_t));
if (nxt_slow_path(r->path == NULL)) {
return NXT_ERROR;
}

*r->path = rp.path;

r->quoted_target = rp.quoted_target;
r->uri_changed = 1;

if (nxt_slow_path(r->log_route)) {
nxt_log(task, NXT_LOG_NOTICE, "URI rewritten to \"%V\"", &r->target);
}
Expand Down

0 comments on commit ebc198b

Please sign in to comment.