@@ -704,40 +704,41 @@ struct ResponseHeader:
704704 if len (s.key()) > 0 :
705705 self .parse_header(s.key(), s.value())
706706
707- fn parse_header (inout self , key : String, value : String) raises -> None :
708- # The below is based on the code from Golang's FastHTTP library
709- # Spaces between header key and colon not allowed (RFC 7230, 3.2.4)
710- if key.find(" " ) != - 1 or key.find(" \t " ) != - 1 :
711- raise Error(" Invalid header key" )
712- elif key[0 ] == " c" or key[0 ] == " C" :
713- if key.lower() == " content-type" :
707+ fn parse_header (inout self , key : Bytes, value : Bytes) raises -> None :
708+ if index_byte(key, bytes (colonChar, pop = False )[0 ]) == - 1 or index_byte(key, bytes (tab, pop = False )[0 ]) != - 1 :
709+ raise Error(" Invalid header key: " + String(key))
710+
711+ var key_first = key[0 ].__xor__ (0x 20 )
712+
713+ if key_first == bytes (" c" , pop = False )[0 ] or key_first == bytes (" C" , pop = False )[0 ]:
714+ if compare_case_insensitive(key, bytes (" content-type" , pop = False )):
714715 _ = self .set_content_type_bytes(bytes (value, pop = False ))
715716 return
716- if key.lower() == " content-encoding" :
717+ if compare_case_insensitive(key, bytes ( " content-encoding" , pop = False )) :
717718 _ = self .set_content_encoding_bytes(bytes (value, pop = False ))
718719 return
719- if key.lower() == " content-length" :
720+ if compare_case_insensitive(key, bytes ( " content-length" , pop = False )) :
720721 if self .content_length() != - 1 :
721722 var content_length = value
722723 _ = self .set_content_length(atol(content_length))
723724 _ = self .set_content_length_bytes(bytes (content_length))
724725 return
725- if key.lower() == " connection" :
726- if value == " close" :
726+ if compare_case_insensitive(key, bytes ( " connection" , pop = False )) :
727+ if compare_case_insensitive( value, bytes ( " close" , pop = False )) :
727728 _ = self .set_connection_close()
728729 else :
729730 _ = self .reset_connection_close()
730731 return
731- elif key[ 0 ] == " s" or key [0 ] == " S" :
732- if key.lower() == " server" :
732+ elif key_first == bytes ( " s" , pop = False ) [0 ] or key_first == bytes ( " S" , pop = False )[ 0 ] :
733+ if compare_case_insensitive(key, bytes ( " server" , pop = False )) :
733734 _ = self .set_server_bytes(bytes (value, pop = False ))
734735 return
735- elif key[ 0 ] == " t" or key [0 ] == " T" :
736- if key.lower() == " transfer-encoding" :
737- if value != " identity" :
736+ elif key_first == bytes ( " t" , pop = False ) [0 ] or key_first == bytes ( " T" , pop = False )[ 0 ] :
737+ if compare_case_insensitive(key, bytes ( " transfer-encoding" , pop = False )) :
738+ if not compare_case_insensitive( value, bytes ( " identity" , pop = False )) :
738739 _ = self .set_content_length(- 1 )
739740 return
740- if key.lower() == " trailer" :
741+ if compare_case_insensitive(key, bytes ( " trailer" , pop = False )) :
741742 _ = self .set_trailer_bytes(bytes (value, pop = False ))
742743
743744 fn read_raw_headers (inout self , buf : Bytes) raises -> Int:
0 commit comments