Improving response header fields processing.
Fields are filtered one by one before being added to fields list. This avoids adding and then skipping connection-specific fields.
This commit is contained in:
@@ -3483,7 +3483,13 @@ nxt_router_response_ready_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
field = NULL;
|
||||
|
||||
for (f = resp->fields; f < resp->fields + resp->fields_count; f++) {
|
||||
if (f->skip) {
|
||||
continue;
|
||||
}
|
||||
|
||||
field = nxt_list_add(r->resp.fields);
|
||||
|
||||
if (nxt_slow_path(field == NULL)) {
|
||||
@@ -3491,26 +3497,30 @@ nxt_router_response_ready_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg,
|
||||
}
|
||||
|
||||
field->hash = f->hash;
|
||||
field->skip = f->skip;
|
||||
field->skip = 0;
|
||||
|
||||
field->name_length = f->name_length;
|
||||
field->value_length = f->value_length;
|
||||
field->name = nxt_unit_sptr_get(&f->name);
|
||||
field->value = nxt_unit_sptr_get(&f->value);
|
||||
|
||||
nxt_debug(task, "header: %*s: %*s",
|
||||
ret = nxt_http_field_process(field, &nxt_response_fields_hash, r);
|
||||
if (nxt_slow_path(ret != NXT_OK)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
nxt_debug(task, "header%s: %*s: %*s",
|
||||
(field->skip ? " skipped" : ""),
|
||||
(size_t) field->name_length, field->name,
|
||||
(size_t) field->value_length, field->value);
|
||||
|
||||
if (field->skip) {
|
||||
r->resp.fields->last->nelts--;
|
||||
}
|
||||
}
|
||||
|
||||
r->status = resp->status;
|
||||
|
||||
ret = nxt_http_fields_process(r->resp.fields,
|
||||
&nxt_response_fields_hash, r);
|
||||
if (nxt_slow_path(ret != NXT_OK)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (resp->piggyback_content_length != 0) {
|
||||
b->mem.pos = nxt_unit_sptr_get(&resp->piggyback_content);
|
||||
b->mem.free = b->mem.pos + resp->piggyback_content_length;
|
||||
|
||||
Reference in New Issue
Block a user