Skip to content

Commit 639cd00

Browse files
committed
update client parse_header
1 parent 43289ee commit 639cd00

File tree

1 file changed

+18
-17
lines changed

1 file changed

+18
-17
lines changed

lightbug_http/header.mojo

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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__(0x20)
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

Comments
 (0)