Skip to content

Commit ade04d6

Browse files
committed
split sync and async serve
1 parent 710d05e commit ade04d6

File tree

3 files changed

+49
-41
lines changed

3 files changed

+49
-41
lines changed

bench.mojo

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn main():
1515
try:
1616
var server = SysServer()
1717
let handler = TechEmpowerRouter()
18-
server.listen_and_serve("0.0.0.0:8080", handler)
18+
server.listen_and_serve_async("0.0.0.0:8080", handler)
1919
except e:
2020
print("Error starting server: " + e.__str__())
2121
return

lightbug_http/sys/net.mojo

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ struct SysListener(Listener):
6161
self.__addr = addr
6262
self.fd = fd
6363

64-
@always_inline
64+
# @always_inline
6565
fn accept[T: Connection](self) raises -> T:
6666
let their_addr_ptr = Pointer[sockaddr].alloc(1)
6767
var sin_size = socklen_t(sizeof[socklen_t]())

lightbug_http/sys/server.mojo

+47-39
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,19 @@ struct SysServer:
5555
let listener = __net.listen(NetworkType.tcp4.value, address)
5656
self.serve(listener, handler)
5757

58-
fn serve[T: HTTPService](inout self, ln: SysListener, handler: T) raises -> None:
58+
fn listen_and_serve_async[
59+
T: HTTPService
60+
](inout self, address: String, handler: T) raises -> None:
61+
var __net = SysNet()
62+
let listener = __net.listen(NetworkType.tcp4.value, address)
63+
self.serve_async(listener, handler)
64+
65+
fn serve_async[
66+
T: HTTPService
67+
](inout self, ln: SysListener, handler: T) raises -> None:
5968
self.ln = ln
69+
# let max_worker_count = self.get_concurrency()
70+
# TODO: logic for non-blocking read and write here, see for example https://github.com/valyala/fasthttp/blob/9ba16466dfd5d83e2e6a005576ee0d8e127457e2/server.go#L1789
6071

6172
async fn handle_connection(conn: SysConnection, handler: T) -> None:
6273
var buf = Bytes()
@@ -126,41 +137,38 @@ struct SysServer:
126137
let coroutine: Coroutine[NoneType] = handle_connection(conn, handler)
127138
_ = coroutine() # Execute the coroutine synchronously
128139

129-
# fn serve[T: HTTPService](inout self, ln: SysListener, handler: T) raises -> None:
130-
# # let max_worker_count = self.get_concurrency()
131-
# # TODO: logic for non-blocking read and write here, see for example https://github.com/valyala/fasthttp/blob/9ba16466dfd5d83e2e6a005576ee0d8e127457e2/server.go#L1789
132-
133-
# self.ln = ln
134-
135-
# while True:
136-
# let conn = self.ln.accept[SysConnection]()
137-
# var buf = Bytes()
138-
# let read_len = conn.read(buf)
139-
# let first_line_and_headers = next_line(buf)
140-
# let request_line = first_line_and_headers.first_line
141-
# let rest_of_headers = first_line_and_headers.rest
142-
143-
# var uri = URI(request_line)
144-
# try:
145-
# uri.parse()
146-
# except:
147-
# conn.close()
148-
# raise Error("Failed to parse request line")
149-
150-
# var header = RequestHeader(buf)
151-
# try:
152-
# header.parse()
153-
# except:
154-
# conn.close()
155-
# raise Error("Failed to parse request header")
156-
157-
# let res = handler.func(
158-
# HTTPRequest(
159-
# uri,
160-
# buf,
161-
# header,
162-
# )
163-
# )
164-
# let res_encoded = encode(res)
165-
# _ = conn.write(res_encoded)
166-
# conn.close()
140+
fn serve[T: HTTPService](inout self, ln: SysListener, handler: T) raises -> None:
141+
self.ln = ln
142+
143+
while True:
144+
let conn = self.ln.accept[SysConnection]()
145+
var buf = Bytes()
146+
let read_len = conn.read(buf)
147+
let first_line_and_headers = next_line(buf)
148+
let request_line = first_line_and_headers.first_line
149+
let rest_of_headers = first_line_and_headers.rest
150+
151+
var uri = URI(request_line)
152+
try:
153+
uri.parse()
154+
except:
155+
conn.close()
156+
raise Error("Failed to parse request line")
157+
158+
var header = RequestHeader(buf)
159+
try:
160+
header.parse()
161+
except:
162+
conn.close()
163+
raise Error("Failed to parse request header")
164+
165+
let res = handler.func(
166+
HTTPRequest(
167+
uri,
168+
buf,
169+
header,
170+
)
171+
)
172+
let res_encoded = encode(res)
173+
_ = conn.write(res_encoded)
174+
conn.close()

0 commit comments

Comments
 (0)