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