Skip to content

Commit 6a39841

Browse files
committed
Merge remote-tracking branch 'refs/remotes/origin/main'
2 parents 3a56996 + bd2f4ef commit 6a39841

File tree

4 files changed

+51
-40
lines changed

4 files changed

+51
-40
lines changed

lightbug_http/header.mojo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,9 @@ struct RequestHeader:
214214
fn headers(self) -> String:
215215
return String(self.raw_headers)
216216

217-
# This is translated to Mojo from Golang FastHTTP
218217
fn parse(inout self, request_line: String) raises -> None:
219218
var headers = self.raw_headers
220-
219+
221220
var n = request_line.find(" ")
222221
if n <= 0:
223222
raise Error("Cannot find HTTP request method in the request")
@@ -254,6 +253,7 @@ struct RequestHeader:
254253
s.disable_normalization = self.disable_normalization
255254

256255
while s.next():
256+
# The below is based on the code from Golang's FastHTTP library
257257
if len(s.key) > 0:
258258
# Spaces between the header key and colon are not allowed.
259259
# See RFC 7230, Section 3.2.4.

lightbug_http/python/server.mojo

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ struct PythonServer:
7070
var conn = self.ln.accept()
7171
var buf = Bytes()
7272
var read_len = conn.read(buf)
73+
if read_len == 0:
74+
conn.close()
75+
break
7376
var first_line_and_headers = next_line(buf)
7477
var request_line = first_line_and_headers.first_line
7578
var rest_of_headers = first_line_and_headers.rest

lightbug_http/sys/net.mojo

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,9 @@ struct SysConnection(Connection):
220220
var bytes_recv = recv(self.fd, new_buf, default_buffer_size, 0)
221221
if bytes_recv == -1:
222222
print("Failed to receive message")
223+
return 0
224+
if bytes_recv == 0:
225+
return 0
223226
var bytes_str = String(new_buf.bitcast[Int8](), bytes_recv)
224227
buf = bytes_str._buffer
225228
return bytes_recv

lightbug_http/sys/server.mojo

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -83,48 +83,53 @@ struct SysServer:
8383
Raises:
8484
If there is an error while serving requests.
8585
"""
86-
# var max_worker_count = self.get_concurrency()
87-
# TODO: logic for non-blocking read and write here, see for example https://github.com/valyala/fasthttp/blob/9ba16466dfd5d83e2e6a005576ee0d8e127457e2/server.go#L1789
88-
8986
self.ln = ln
9087

9188
while True:
9289
var conn = self.ln.accept()
9390
var buf = Bytes()
94-
var read_len = conn.read(buf)
95-
var request = next_line(buf)
96-
var headers_and_body = next_line(request.rest, "\n\n")
97-
var request_headers = headers_and_body.first_line
98-
var request_body = headers_and_body.rest
99-
var uri = URI(request.first_line)
100-
try:
101-
uri.parse()
102-
except e:
103-
conn.close()
104-
raise Error("Failed to parse request line:" + e.__str__())
105-
106-
var header = RequestHeader(request_headers._buffer)
107-
try:
108-
header.parse(request.first_line)
109-
except e:
110-
conn.close()
111-
raise Error("Failed to parse request header: " + e.__str__())
11291

113-
if header.content_length() != 0 and header.content_length() != (len(request_body) + 1):
114-
var remaining_body = Bytes()
115-
var remaining_len = header.content_length() - len(request_body + 1)
116-
while remaining_len > 0:
117-
var read_len = conn.read(remaining_body)
118-
buf.extend(remaining_body)
119-
remaining_len -= read_len
120-
121-
var res = handler.func(
122-
HTTPRequest(
123-
uri,
124-
buf,
125-
header,
92+
while True:
93+
var read_len = conn.read(buf)
94+
if read_len == 0:
95+
conn.close()
96+
break
97+
var request = next_line(buf)
98+
var headers_and_body = next_line(request.rest, "\n\n")
99+
var request_headers = headers_and_body.first_line
100+
var request_body = headers_and_body.rest
101+
var uri = URI(request.first_line)
102+
try:
103+
uri.parse()
104+
except e:
105+
conn.close()
106+
raise Error("Failed to parse request line:" + e.__str__())
107+
108+
var header = RequestHeader(request_headers._buffer)
109+
try:
110+
header.parse(request.first_line)
111+
except e:
112+
conn.close()
113+
raise Error("Failed to parse request header: " + e.__str__())
114+
115+
if header.content_length() != 0 and header.content_length() != (len(request_body) + 1):
116+
var remaining_body = Bytes()
117+
var remaining_len = header.content_length() - len(request_body + 1)
118+
while remaining_len > 0:
119+
var read_len = conn.read(remaining_body)
120+
buf.extend(remaining_body)
121+
remaining_len -= read_len
122+
123+
var res = handler.func(
124+
HTTPRequest(
125+
uri,
126+
buf,
127+
header,
128+
)
126129
)
127-
)
128-
var res_encoded = encode(res)
129-
_ = conn.write(res_encoded)
130-
conn.close()
130+
var res_encoded = encode(res)
131+
_ = conn.write(res_encoded)
132+
133+
if header.connection_close():
134+
conn.close()
135+
break

0 commit comments

Comments
 (0)