|  | @@ -66,6 +66,7 @@ typedef struct {
 | 
	
		
			
				|  |  |    size_t header_idx;
 | 
	
		
			
				|  |  |    /* was the last frame emitted a header? (if yes, we'll need a CONTINUATION */
 | 
	
		
			
				|  |  |    gpr_uint8 last_was_header;
 | 
	
		
			
				|  |  | +  gpr_uint8 seen_regular_header;
 | 
	
		
			
				|  |  |    /* output stream id */
 | 
	
		
			
				|  |  |    gpr_uint32 stream_id;
 | 
	
		
			
				|  |  |    gpr_slice_buffer *output;
 | 
	
	
		
			
				|  | @@ -361,6 +362,16 @@ static grpc_mdelem *hpack_enc(grpc_chttp2_hpack_compressor *c,
 | 
	
		
			
				|  |  |    gpr_uint32 indices_key;
 | 
	
		
			
				|  |  |    int should_add_elem;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  if (GPR_SLICE_LENGTH(elem->key->slice) > 0) {
 | 
	
		
			
				|  |  | +    if (GPR_SLICE_START_PTR(elem->key->slice)[0] != ':') { /* regular header */
 | 
	
		
			
				|  |  | +      st->seen_regular_header = 1;
 | 
	
		
			
				|  |  | +    } else if (st->seen_regular_header != 0) { /* reserved header */
 | 
	
		
			
				|  |  | +      gpr_log(GPR_ERROR,
 | 
	
		
			
				|  |  | +              "Reserved header (colon-prefixed) happening after regular ones.");
 | 
	
		
			
				|  |  | +      abort();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    inc_filter(HASH_FRAGMENT_1(elem_hash), &c->filter_elems_sum, c->filter_elems);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* is this elem currently in the decoders table? */
 | 
	
	
		
			
				|  | @@ -566,6 +577,7 @@ void grpc_chttp2_encode(grpc_stream_op *ops, size_t ops_count, int eof,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    st.cur_frame_type = NONE;
 | 
	
		
			
				|  |  |    st.last_was_header = 0;
 | 
	
		
			
				|  |  | +  st.seen_regular_header = 0;
 | 
	
		
			
				|  |  |    st.stream_id = stream_id;
 | 
	
		
			
				|  |  |    st.output = output;
 | 
	
		
			
				|  |  |  
 |