@@ -8,7 +8,6 @@ from lightbug_http.strings import (
88 nChar,
99)
1010from lightbug_http.io.bytes import Bytes, bytes_equal
11- from lightbug_http.error import errNeedMore, errInvalidName
1211
1312alias statusOK = 200
1413
@@ -105,7 +104,7 @@ struct RequestHeader:
105104 self .__trailer = trailer
106105
107106 fn set_content_type (inout self , content_type : String) -> Self:
108- self .__content_type = content_type.as_bytes()
107+ self .__content_type = content_type._buffer
109108 return self
110109
111110 fn set_content_type_bytes (inout self , content_type : Bytes) -> Self:
@@ -116,7 +115,7 @@ struct RequestHeader:
116115 return self .__content_type
117116
118117 fn set_host (inout self , host : String) -> Self:
119- self .__host = host.as_bytes()
118+ self .__host = host._buffer
120119 return self
121120
122121 fn set_host_bytes (inout self , host : Bytes) -> Self:
@@ -127,7 +126,7 @@ struct RequestHeader:
127126 return self .__host
128127
129128 fn set_user_agent (inout self , user_agent : String) -> Self:
130- self .__user_agent = user_agent.as_bytes()
129+ self .__user_agent = user_agent._buffer
131130 return self
132131
133132 fn set_user_agent_bytes (inout self , user_agent : Bytes) -> Self:
@@ -138,7 +137,7 @@ struct RequestHeader:
138137 return self .__user_agent
139138
140139 fn set_method (inout self , method : String) -> Self:
141- self .__method = method.as_bytes()
140+ self .__method = method._buffer
142141 return self
143142
144143 fn set_method_bytes (inout self , method : Bytes) -> Self:
@@ -151,8 +150,8 @@ struct RequestHeader:
151150 return self .__method
152151
153152 fn set_protocol (inout self , method : String) -> Self:
154- self .no_http_1_1 = bytes_equal(method.as_bytes() , strHttp11)
155- self .proto = method.as_bytes()
153+ self .no_http_1_1 = bytes_equal(method._buffer , strHttp11)
154+ self .proto = method._buffer
156155 return self
157156
158157 fn set_protocol_bytes (inout self , method : Bytes) -> Self:
@@ -190,7 +189,7 @@ struct RequestHeader:
190189 return self .__request_uri
191190
192191 fn set_trailer (inout self , trailer : String) -> Self:
193- self .__trailer = trailer.as_bytes()
192+ self .__trailer = trailer._buffer
194193 return self
195194
196195 fn set_trailer_bytes (inout self , trailer : Bytes) -> Self:
@@ -276,7 +275,7 @@ struct RequestHeader:
276275 if self .content_length() != - 1 :
277276 var content_length = s.value
278277 _ = self .set_content_length(atol(content_length))
279- _ = self .set_content_length_bytes(content_length.as_bytes() )
278+ _ = self .set_content_length_bytes(content_length._buffer )
280279 continue
281280 if s.key.lower() == " connection" :
282281 if s.value == " close" :
@@ -461,7 +460,7 @@ struct ResponseHeader:
461460 return self .__content_type
462461
463462 fn set_content_type (inout self , content_type : String) -> Self:
464- self .__content_type = content_type.as_bytes()
463+ self .__content_type = content_type._buffer
465464 return self
466465
467466 fn set_content_type_bytes (inout self , content_type : Bytes) -> Self:
@@ -472,7 +471,7 @@ struct ResponseHeader:
472471 return self .__content_encoding
473472
474473 fn set_content_encoding (inout self , content_encoding : String) -> Self:
475- self .__content_encoding = content_encoding.as_bytes()
474+ self .__content_encoding = content_encoding._buffer
476475 return self
477476
478477 fn set_content_encoding_bytes (inout self , content_encoding : Bytes) -> Self:
@@ -494,7 +493,7 @@ struct ResponseHeader:
494493 return self .__server
495494
496495 fn set_server (inout self , server : String) -> Self:
497- self .__server = server.as_bytes()
496+ self .__server = server._buffer
498497 return self
499498
500499 fn set_server_bytes (inout self , server : Bytes) -> Self:
@@ -511,7 +510,7 @@ struct ResponseHeader:
511510 return self .__protocol
512511
513512 fn set_trailer (inout self , trailer : String) -> Self:
514- self .__trailer = trailer.as_bytes()
513+ self .__trailer = trailer._buffer
515514 return self
516515
517516 fn set_trailer_bytes (inout self , trailer : Bytes) -> Self:
@@ -532,34 +531,27 @@ struct ResponseHeader:
532531 fn connection_close (self ) -> Bool:
533532 return self .__connection_close
534533
535- fn parse (inout self , request_line : String) raises -> None :
536- var headers = self .raw_headers
537-
538- var n = request_line.find(" " )
539- if n <= 0 :
540- raise Error(" Cannot find HTTP request method in the request" )
534+ fn headers (self ) -> String:
535+ return String(self .raw_headers)
541536
542- var method = request_line[:n]
543- var rest_of_request_line = request_line[n + 1 :]
537+ fn parse ( inout self , first_line : String) raises -> None :
538+ var headers = self .raw_headers
544539
545540 # Defaults to HTTP/1.1
546541 var proto_str = String(strHttp11)
547542
548- # Parse requestURI
549- n = rest_of_request_line.rfind(" " )
550- if n < 0 :
551- n = len (rest_of_request_line)
552- proto_str = strHttp10
553- elif n == 0 :
554- raise Error(" Request URI cannot be empty" )
555- else :
556- var proto = rest_of_request_line[n + 1 :]
557- if proto != strHttp11:
558- proto_str = proto
543+ var n = first_line.find(" " )
544+ var proto = first_line[:n]
545+ if proto != strHttp11:
546+ proto_str = proto
559547
560- var request_uri = rest_of_request_line[:n]
548+ var rest_of_response_line = first_line[n + 1 :]
549+ var status_code = atol(rest_of_response_line[:3 ])
550+ var message = rest_of_response_line[4 :]
561551
562552 _ = self .set_protocol(proto_str._buffer)
553+ _ = self .set_status_code(status_code)
554+ _ = self .set_status_message(message._buffer)
563555 _ = self .set_content_length(- 2 )
564556
565557 var s = headerScanner()
@@ -568,8 +560,7 @@ struct ResponseHeader:
568560
569561 while s.next():
570562 if len (s.key) > 0 :
571- # Spaces between the header key and colon are not allowed.
572- # See RFC 7230, Section 3.2.4.
563+ # Spaces between header key and colon not allowed (RFC 7230, 3.2.4)
573564 if s.key.find(" " ) != - 1 or s.key.find(" \t " ) != - 1 :
574565 raise Error(" Invalid header key" )
575566 elif s.key[0 ] == " c" or s.key[0 ] == " C" :
@@ -583,25 +574,22 @@ struct ResponseHeader:
583574 if self .content_length() != - 1 :
584575 var content_length = s.value
585576 _ = self .set_content_length(atol(content_length))
586- _ = self .set_content_length_bytes(content_length.as_bytes() )
577+ _ = self .set_content_length_bytes(content_length._buffer )
587578 continue
588579 if s.key.lower() == " connection" :
589580 if s.value == " close" :
590581 _ = self .set_connection_close()
591582 else :
592583 _ = self .reset_connection_close()
593- # _ = self.appendargbytes(s.key, s.value)
594584 continue
595585 elif s.key[0 ] == " s" or s.key[0 ] == " S" :
596586 if s.key.lower() == " server" :
597587 _ = self .set_server(s.value)
598588 continue
599- # TODO : set cookie
600589 elif s.key[0 ] == " t" or s.key[0 ] == " T" :
601590 if s.key.lower() == " transfer-encoding" :
602591 if s.value != " identity" :
603592 _ = self .set_content_length(- 1 )
604- # _ = self.setargbytes(s.key, strChunked)
605593 continue
606594 if s.key.lower() == " trailer" :
607595 _ = self .set_trailer(s.value)
@@ -633,20 +621,17 @@ struct headerScanner:
633621 if not self .initialized:
634622 self .initialized = True
635623
636- if self .b.startswith(' \n \n ' ):
624+ if self .b.startswith(' \r\n\r \n ' ):
637625 self .b = self .b[2 :]
638- print (" Error: Double newline" )
639626 return False
640627
641- if self .b.startswith(' \n ' ):
628+ if self .b.startswith(' \r\ n ' ):
642629 self .b = self .b[1 :]
643- print (" Error: Newline at start" )
644630 return False
645631
646632 var n = self .b.find(' :' )
647- var x = self .b.find(' \n ' )
633+ var x = self .b.find(' \r\ n ' )
648634 if x != - 1 and x < n:
649- print (" Error: Newline before colon" )
650635 return False
651636
652637 if n == - 1 :
@@ -656,17 +641,15 @@ struct headerScanner:
656641 self .key = self .b[:n].strip()
657642 self .b = self .b[n+ 1 :].strip()
658643
659- x = self .b.find(' \n ' )
644+ x = self .b.find(' \r\ n ' )
660645 if x == - 1 :
661- # If we don't find a newline, assume we have reached the end
662646 if len (self .b) == 0 :
663- print (" Error: No ending newline and no data after colon" )
664647 return False
665648 self .value = self .b.strip()
666649 self .b = ' '
667650 else :
668651 self .value = self .b[:x].strip()
669652 self .b = self .b[x+ 1 :]
670-
653+
671654 return True
672655
0 commit comments