@ -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 ;
}