|  | @@ -171,8 +171,8 @@ static int add_header(grpc_http_parser *parser) {
 | 
	
		
			
				|  |  |    while (cur != end && (*cur == ' ' || *cur == '\t')) {
 | 
	
		
			
				|  |  |      cur++;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  GPR_ASSERT(end - cur >= 2);
 | 
	
		
			
				|  |  | -  hdr.value = buf2str(cur, (size_t)(end - cur) - 2);
 | 
	
		
			
				|  |  | +  GPR_ASSERT((size_t)(end - cur) >= parser->cur_line_end_length);
 | 
	
		
			
				|  |  | +  hdr.value = buf2str(cur, (size_t)(end - cur) - parser->cur_line_end_length);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (parser->type == GRPC_HTTP_RESPONSE) {
 | 
	
		
			
				|  |  |      hdr_count = &parser->http.response.hdr_count;
 | 
	
	
		
			
				|  | @@ -207,7 +207,7 @@ static int finish_line(grpc_http_parser *parser) {
 | 
	
		
			
				|  |  |        parser->state = GRPC_HTTP_HEADERS;
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      case GRPC_HTTP_HEADERS:
 | 
	
		
			
				|  |  | -      if (parser->cur_line_length == 2) {
 | 
	
		
			
				|  |  | +      if (parser->cur_line_length == parser->cur_line_end_length) {
 | 
	
		
			
				|  |  |          parser->state = GRPC_HTTP_BODY;
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -247,6 +247,30 @@ static int addbyte_body(grpc_http_parser *parser, uint8_t byte) {
 | 
	
		
			
				|  |  |    return 1;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +static int check_line(grpc_http_parser *parser) {
 | 
	
		
			
				|  |  | +  if (parser->cur_line_length >= 2 &&
 | 
	
		
			
				|  |  | +      parser->cur_line[parser->cur_line_length - 2] == '\r' &&
 | 
	
		
			
				|  |  | +      parser->cur_line[parser->cur_line_length - 1] == '\n') {
 | 
	
		
			
				|  |  | +    return 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // HTTP request with \n\r line termiantors.
 | 
	
		
			
				|  |  | +  else if (parser->cur_line_length >= 2 &&
 | 
	
		
			
				|  |  | +           parser->cur_line[parser->cur_line_length - 2] == '\n' &&
 | 
	
		
			
				|  |  | +           parser->cur_line[parser->cur_line_length - 1] == '\r') {
 | 
	
		
			
				|  |  | +    return 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // HTTP request with only \n line terminators.
 | 
	
		
			
				|  |  | +  else if (parser->cur_line_length >= 1 &&
 | 
	
		
			
				|  |  | +           parser->cur_line[parser->cur_line_length - 1] == '\n') {
 | 
	
		
			
				|  |  | +    parser->cur_line_end_length = 1;
 | 
	
		
			
				|  |  | +    return 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static int addbyte(grpc_http_parser *parser, uint8_t byte) {
 | 
	
		
			
				|  |  |    switch (parser->state) {
 | 
	
		
			
				|  |  |      case GRPC_HTTP_FIRST_LINE:
 | 
	
	
		
			
				|  | @@ -259,9 +283,7 @@ static int addbyte(grpc_http_parser *parser, uint8_t byte) {
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        parser->cur_line[parser->cur_line_length] = byte;
 | 
	
		
			
				|  |  |        parser->cur_line_length++;
 | 
	
		
			
				|  |  | -      if (parser->cur_line_length >= 2 &&
 | 
	
		
			
				|  |  | -          parser->cur_line[parser->cur_line_length - 2] == '\r' &&
 | 
	
		
			
				|  |  | -          parser->cur_line[parser->cur_line_length - 1] == '\n') {
 | 
	
		
			
				|  |  | +      if (check_line(parser)) {
 | 
	
		
			
				|  |  |          return finish_line(parser);
 | 
	
		
			
				|  |  |        } else {
 | 
	
		
			
				|  |  |          return 1;
 | 
	
	
		
			
				|  | @@ -277,6 +299,7 @@ void grpc_http_parser_init(grpc_http_parser *parser) {
 | 
	
		
			
				|  |  |    memset(parser, 0, sizeof(*parser));
 | 
	
		
			
				|  |  |    parser->state = GRPC_HTTP_FIRST_LINE;
 | 
	
		
			
				|  |  |    parser->type = GRPC_HTTP_UNKNOWN;
 | 
	
		
			
				|  |  | +  parser->cur_line_end_length = 2;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void grpc_http_parser_destroy(grpc_http_parser *parser) {
 |