Skip to content

Commit 557e252

Browse files
committed
use pointer directly
1 parent 73ba9a5 commit 557e252

File tree

5 files changed

+87
-59
lines changed

5 files changed

+87
-59
lines changed

external/libc.mojo

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -633,8 +633,28 @@ fn connect(socket: c_int, address: UnsafePointer[sockaddr], address_len: socklen
633633
](socket, address, address_len)
634634

635635

636+
# fn recv(
637+
# socket: c_int, buffer: UnsafePointer[c_void], length: c_size_t, flags: c_int
638+
# ) -> c_ssize_t:
639+
# """Libc POSIX `recv` function
640+
# Reference: https://man7.org/linux/man-pages/man3/recv.3p.html
641+
# Fn signature: ssize_t recv(int socket, void *buffer, size_t length, int flags).
642+
# """
643+
# return external_call[
644+
# "recv",
645+
# c_ssize_t, # FnName, RetType
646+
# c_int,
647+
# UnsafePointer[c_void],
648+
# c_size_t,
649+
# c_int, # Args
650+
# ](socket, buffer, length, flags)
651+
652+
636653
fn recv(
637-
socket: c_int, buffer: UnsafePointer[c_void], length: c_size_t, flags: c_int
654+
socket: c_int,
655+
buffer: DTypePointer[DType.uint8],
656+
length: c_size_t,
657+
flags: c_int,
638658
) -> c_ssize_t:
639659
"""Libc POSIX `recv` function
640660
Reference: https://man7.org/linux/man-pages/man3/recv.3p.html
@@ -644,12 +664,11 @@ fn recv(
644664
"recv",
645665
c_ssize_t, # FnName, RetType
646666
c_int,
647-
UnsafePointer[c_void],
667+
DTypePointer[DType.uint8],
648668
c_size_t,
649669
c_int, # Args
650670
](socket, buffer, length, flags)
651671

652-
653672
fn send(
654673
socket: c_int, buffer: UnsafePointer[c_void], length: c_size_t, flags: c_int
655674
) -> c_ssize_t:

lightbug_http/net.mojo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ from external.libc import (
1414
inet_ntop
1515
)
1616

17-
alias default_buffer_size = 8200
17+
alias default_buffer_size = 4096
1818
alias default_tcp_keep_alive = Duration(15 * 1000 * 1000 * 1000) # 15 seconds
1919

2020

lightbug_http/sys/net.mojo

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,14 @@ struct SysConnection(Connection):
217217
self.fd = fd
218218

219219
fn read(self, inout buf: Bytes) raises -> Int:
220-
var new_buf = UnsafePointer[UInt8]().alloc(default_buffer_size)
221-
var bytes_recv = recv(self.fd, new_buf, default_buffer_size, 0)
220+
var bytes_recv = recv(self.fd, DTypePointer[DType.uint8](buf.unsafe_ptr()).offset(buf.size), buf.capacity - buf.size, 0)
222221
if bytes_recv == -1:
223222
return 0
223+
buf.size += bytes_recv
224224
if bytes_recv == 0:
225225
return 0
226-
var bytes_str = String(new_buf.bitcast[UInt8](), bytes_recv + 1)
227-
buf = bytes(bytes_str, pop=False)
226+
if bytes_recv < buf.capacity:
227+
return bytes_recv
228228
return bytes_recv
229229

230230
fn write(self, msg: String) raises -> Int:

lightbug_http/sys/server.mojo

Lines changed: 59 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ struct SysServer:
149149

150150
while True:
151151
var conn = self.ln.accept()
152-
# while True:
153152
self.serve_connection(conn, handler)
154153

155154
fn serve_connection[T: HTTPService](inout self, conn: SysConnection, handler: T) raises -> None:
@@ -163,14 +162,14 @@ struct SysServer:
163162
Raises:
164163
If there is an error while serving the connection.
165164
"""
166-
var b = Bytes()
167-
_ = conn.read(b)
168-
if len(b) == 0:
165+
var b = Bytes(capacity=default_buffer_size)
166+
var bytes_recv = conn.read(b)
167+
if bytes_recv == 0:
169168
conn.close()
170169
return
171170

172-
var buf = buffer.new_buffer(b)
173-
var reader = Reader(buf)
171+
var buf = buffer.new_buffer(b^)
172+
var reader = Reader(buf^)
174173

175174
var error = Error()
176175

@@ -180,57 +179,67 @@ struct SysServer:
180179

181180
var req_number = 0
182181

183-
# while True:
184-
req_number += 1
182+
while True:
183+
req_number += 1
185184

186-
var first_byte = reader.peek(1)
187-
if len(first_byte) == 0:
188-
error = Error("Failed to read first byte from connection")
189-
190-
var header = RequestHeader()
191-
var first_line_and_headers_len = 0
192-
try:
193-
first_line_and_headers_len = header.parse_raw(reader)
194-
except e:
195-
error = Error("Failed to parse request headers: " + e.__str__())
196-
197-
var uri = URI(self.address() + String(header.request_uri()))
198-
try:
199-
uri.parse()
200-
except e:
201-
error = Error("Failed to parse request line:" + e.__str__())
202-
203-
if header.content_length() > 0:
204-
if max_request_body_size > 0 and header.content_length() > max_request_body_size:
205-
error = Error("Request body too large")
185+
if req_number > 1:
186+
var b = Bytes(capacity=default_buffer_size)
187+
var bytes_recv = conn.read(b)
188+
if bytes_recv == 0:
189+
conn.close()
190+
break
191+
buf = buffer.new_buffer(b^)
192+
reader = Reader(buf^)
193+
194+
195+
var first_byte = reader.peek(1)
196+
if len(first_byte) == 0:
197+
error = Error("Failed to read first byte from connection")
198+
199+
var header = RequestHeader()
200+
var first_line_and_headers_len = 0
201+
try:
202+
first_line_and_headers_len = header.parse_raw(reader)
203+
except e:
204+
error = Error("Failed to parse request headers: " + e.__str__())
205+
206+
var uri = URI(self.address() + String(header.request_uri()))
207+
try:
208+
uri.parse()
209+
except e:
210+
error = Error("Failed to parse request line:" + e.__str__())
211+
212+
if header.content_length() > 0:
213+
if max_request_body_size > 0 and header.content_length() > max_request_body_size:
214+
error = Error("Request body too large")
215+
216+
var request = HTTPRequest(
217+
uri,
218+
Bytes(),
219+
header,
220+
)
221+
222+
try:
223+
request.read_body(reader, header.content_length(), first_line_and_headers_len, max_request_body_size)
224+
except e:
225+
error = Error("Failed to read request body: " + e.__str__())
206226

207227
# var remaining_body = Bytes()
208228
# var remaining_len = header.content_length() - (len(request_body) + 1)
209229
# while remaining_len > 0:
210230
# var read_len = conn.read(remaining_body)
211231
# buf.extend(remaining_body)
212232
# remaining_len -= read_len
213-
214-
var request = HTTPRequest(
215-
uri,
216-
Bytes(),
217-
header,
218-
)
219-
220-
try:
221-
request.read_body(reader, header.content_length(), first_line_and_headers_len, max_request_body_size)
222-
except e:
223-
error = Error("Failed to read request body: " + e.__str__())
224-
225-
var res = handler.func(request)
226-
227-
# if not self.tcp_keep_alive:
228-
_ = res.set_connection_close()
229-
230-
var res_encoded = encode(res)
233+
234+
var res = handler.func(request)
235+
236+
if not self.tcp_keep_alive:
237+
_ = res.set_connection_close()
238+
239+
var res_encoded = encode(res)
231240

232-
_ = conn.write(res_encoded)
241+
_ = conn.write(res_encoded)
233242

234-
# if not self.tcp_keep_alive:
235-
conn.close()
236-
# break
243+
if not self.tcp_keep_alive:
244+
conn.close()
245+
return

test.mojo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ struct MyPrinter(HTTPService):
99

1010

1111
fn main() raises:
12-
var server = SysServer()
12+
var server = SysServer(tcp_keep_alive=True)
1313
var handler = MyPrinter()
1414
server.listen_and_serve("0.0.0.0:8080", handler)

0 commit comments

Comments
 (0)