|
|
|
@ -394,6 +394,32 @@ error_handler: |
|
|
|
|
|
|
|
|
|
static void free_timeout(void* p) { gpr_free(p); } |
|
|
|
|
|
|
|
|
|
static bool md_key_cmp(grpc_mdelem md, const grpc_slice& reference) { |
|
|
|
|
GPR_DEBUG_ASSERT(grpc_slice_is_interned(GRPC_MDKEY(md))); |
|
|
|
|
return GRPC_MDKEY(md).refcount == reference.refcount; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static bool md_cmp(grpc_mdelem md, grpc_mdelem ref_md, |
|
|
|
|
const grpc_slice& ref_key) { |
|
|
|
|
if (GPR_LIKELY(GRPC_MDELEM_IS_INTERNED(md))) { |
|
|
|
|
return md.payload == ref_md.payload; |
|
|
|
|
} |
|
|
|
|
if (md_key_cmp(md, ref_key)) { |
|
|
|
|
return grpc_slice_eq_static_interned(GRPC_MDVALUE(md), |
|
|
|
|
GRPC_MDVALUE(ref_md)); |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static bool is_nonzero_status(grpc_mdelem md) { |
|
|
|
|
// If md.payload == GRPC_MDELEM_GRPC_STATUS_1 or GRPC_MDELEM_GRPC_STATUS_2,
|
|
|
|
|
// then we have seen an error. In fact, if it is a GRPC_STATUS and it's
|
|
|
|
|
// not equal to GRPC_MDELEM_GRPC_STATUS_0, then we have seen an error.
|
|
|
|
|
// TODO(ctiller): check for a status like " 0"
|
|
|
|
|
return md_key_cmp(md, GRPC_MDSTR_GRPC_STATUS) && |
|
|
|
|
!md_cmp(md, GRPC_MDELEM_GRPC_STATUS_0, GRPC_MDSTR_GRPC_STATUS); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void on_initial_header(void* tp, grpc_mdelem md) { |
|
|
|
|
GPR_TIMER_SCOPE("on_initial_header", 0); |
|
|
|
|
|
|
|
|
@ -411,15 +437,9 @@ static void on_initial_header(void* tp, grpc_mdelem md) { |
|
|
|
|
gpr_free(value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If md.payload == GRPC_MDELEM_GRPC_STATUS_1 or GRPC_MDELEM_GRPC_STATUS_2,
|
|
|
|
|
// then we have seen an error. In fact, if it is a GRPC_STATUS and it's
|
|
|
|
|
// not equal to GRPC_MDELEM_GRPC_STATUS_0, then we have seen an error.
|
|
|
|
|
if (grpc_slice_eq_static_interned(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) && |
|
|
|
|
!grpc_mdelem_static_value_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) { |
|
|
|
|
/* TODO(ctiller): check for a status like " 0" */ |
|
|
|
|
if (is_nonzero_status(md)) { // not GRPC_MDELEM_GRPC_STATUS_0?
|
|
|
|
|
s->seen_error = true; |
|
|
|
|
} else if (grpc_slice_eq_static_interned(GRPC_MDKEY(md), |
|
|
|
|
GRPC_MDSTR_GRPC_TIMEOUT)) { |
|
|
|
|
} else if (md_key_cmp(md, GRPC_MDSTR_GRPC_TIMEOUT)) { |
|
|
|
|
grpc_millis* cached_timeout = |
|
|
|
|
static_cast<grpc_millis*>(grpc_mdelem_get_user_data(md, free_timeout)); |
|
|
|
|
grpc_millis timeout; |
|
|
|
@ -496,12 +516,7 @@ static void on_trailing_header(void* tp, grpc_mdelem md) { |
|
|
|
|
gpr_free(value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If md.payload == GRPC_MDELEM_GRPC_STATUS_1 or GRPC_MDELEM_GRPC_STATUS_2,
|
|
|
|
|
// then we have seen an error. In fact, if it is a GRPC_STATUS and it's
|
|
|
|
|
// not equal to GRPC_MDELEM_GRPC_STATUS_0, then we have seen an error.
|
|
|
|
|
if (grpc_slice_eq_static_interned(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) && |
|
|
|
|
!grpc_mdelem_static_value_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) { |
|
|
|
|
/* TODO(ctiller): check for a status like " 0" */ |
|
|
|
|
if (is_nonzero_status(md)) { // not GRPC_MDELEM_GRPC_STATUS_0?
|
|
|
|
|
s->seen_error = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|