修正HTTP1构建新头部时处理多个具有相同名称头部字段的处理逻辑。

* 原实现假设头部字段名称不重复,因此在构建具有同名称头部字段时,后设置的值会替换先设置的值;
* 现修正,构建具有同名称头部字段时不覆盖原来的值,而是在头部追加。
This commit is contained in:
luqiuwen
2019-08-22 11:17:27 +08:00
committed by 陆秋文
parent 0f47507196
commit b689485fea

View File

@@ -517,41 +517,34 @@ int hf_ops_field_write(struct tfe_http_half * half, const struct http_field_name
struct http_half_private * hf_private = to_hf_private(half); struct http_half_private * hf_private = to_hf_private(half);
assert(hf_private->major == 0 || hf_private->major == 1); assert(hf_private->major == 0 || hf_private->major == 1);
struct http_header_private * __header_iter = NULL; /* Add a k-v in the tail of the header list */
struct http_header_private * __header_found = NULL; if (value != NULL)
TAILQ_FOREACH(__header_iter, &hf_private->header_list, next)
{ {
if (http_field_name_compare(__header_iter->field, field) != 0) continue; struct http_header_private * new_header = ALLOC(struct http_header_private, 1);
__header_found = __header_iter; new_header->field = http_field_name_duplicate(field);
break; new_header->value = tfe_strdup(value);
TAILQ_INSERT_TAIL(&hf_private->header_list, new_header, next);
} }
/* Delete a value */
/* Update the value */
if (__header_found != NULL && value != NULL)
{
free(__header_found->value);
__header_found->value = tfe_strdup(value);
}
/* Delete the key and value */
else if (__header_found != NULL && value == NULL)
{
TAILQ_REMOVE(&hf_private->header_list, __header_found, next);
free(__header_found->value);
free(__header_found);
}
/* Insert a new header k-v in the tail of the header list */
else if (__header_found == NULL && value != NULL)
{
struct http_header_private * __header = ALLOC(struct http_header_private, 1);
__header->field = http_field_name_duplicate(field);
__header->value = tfe_strdup(value);
TAILQ_INSERT_TAIL(&hf_private->header_list, __header, next);
}
/* Nothing found, and delete nothing */
else else
{ {
return -1; struct http_header_private * header_iter = NULL;
struct http_header_private * header_titer = NULL;
bool delete_success = false;
TAILQ_FOREACH_SAFE(header_iter, &hf_private->header_list, next, header_titer)
{
if (http_field_name_compare(header_iter->field, field) != 0)
continue;
TAILQ_REMOVE(&hf_private->header_list, header_iter, next);
http_field_name_destory(header_iter->field);
free(header_iter->value);
free(header_iter);
delete_success = true;
}
return delete_success ? 0 : -ENOENT;
} }
return 0; return 0;