|
@@ -554,21 +554,6 @@ static int prepare_application_metadata(grpc_call *call, int count,
|
|
|
int i;
|
|
|
grpc_metadata_batch *batch =
|
|
|
&call->metadata_batch[0 /* is_receiving */][is_trailing];
|
|
|
- if (prepend_extra_metadata) {
|
|
|
- if (call->send_extra_metadata_count == 0) {
|
|
|
- prepend_extra_metadata = 0;
|
|
|
- } else {
|
|
|
- for (i = 0; i < call->send_extra_metadata_count; i++) {
|
|
|
- GRPC_MDELEM_REF(call->send_extra_metadata[i].md);
|
|
|
- }
|
|
|
- for (i = 1; i < call->send_extra_metadata_count; i++) {
|
|
|
- call->send_extra_metadata[i].prev = &call->send_extra_metadata[i - 1];
|
|
|
- }
|
|
|
- for (i = 0; i < call->send_extra_metadata_count - 1; i++) {
|
|
|
- call->send_extra_metadata[i].next = &call->send_extra_metadata[i + 1];
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
for (i = 0; i < count; i++) {
|
|
|
grpc_metadata *md = &metadata[i];
|
|
|
grpc_linked_mdelem *l = (grpc_linked_mdelem *)&md->internal_data;
|
|
@@ -579,14 +564,37 @@ static int prepare_application_metadata(grpc_call *call, int count,
|
|
|
GRPC_MDSTR_LENGTH(l->md->key))) {
|
|
|
gpr_log(GPR_ERROR, "attempt to send invalid metadata key: %s",
|
|
|
grpc_mdstr_as_c_string(l->md->key));
|
|
|
- return 0;
|
|
|
+ break;
|
|
|
} else if (!grpc_is_binary_header(grpc_mdstr_as_c_string(l->md->key),
|
|
|
GRPC_MDSTR_LENGTH(l->md->key)) &&
|
|
|
!grpc_header_nonbin_value_is_legal(
|
|
|
grpc_mdstr_as_c_string(l->md->value),
|
|
|
GRPC_MDSTR_LENGTH(l->md->value))) {
|
|
|
gpr_log(GPR_ERROR, "attempt to send invalid metadata value");
|
|
|
- return 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (i != count) {
|
|
|
+ for (int j = 0; j <= i; j++) {
|
|
|
+ grpc_metadata *md = &metadata[i];
|
|
|
+ grpc_linked_mdelem *l = (grpc_linked_mdelem *)&md->internal_data;
|
|
|
+ GRPC_MDELEM_UNREF(l->md);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if (prepend_extra_metadata) {
|
|
|
+ if (call->send_extra_metadata_count == 0) {
|
|
|
+ prepend_extra_metadata = 0;
|
|
|
+ } else {
|
|
|
+ for (i = 0; i < call->send_extra_metadata_count; i++) {
|
|
|
+ GRPC_MDELEM_REF(call->send_extra_metadata[i].md);
|
|
|
+ }
|
|
|
+ for (i = 1; i < call->send_extra_metadata_count; i++) {
|
|
|
+ call->send_extra_metadata[i].prev = &call->send_extra_metadata[i - 1];
|
|
|
+ }
|
|
|
+ for (i = 0; i < call->send_extra_metadata_count - 1; i++) {
|
|
|
+ call->send_extra_metadata[i].next = &call->send_extra_metadata[i + 1];
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
for (i = 1; i < count; i++) {
|