Skip to content

Commit 143d744

Browse files
committed
pointer fixes
1 parent 8a8b98e commit 143d744

File tree

8 files changed

+78
-75
lines changed

8 files changed

+78
-75
lines changed

external/libc.mojo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ fn to_char_ptr(s: Bytes) -> UnsafePointer[c_char]:
9393
return ptr
9494

9595
fn c_charptr_to_string(s: UnsafePointer[c_char]) -> String:
96-
return String(s.bitcast[Int8](), strlen(s))
96+
return String(s.bitcast[UInt8](), strlen(s))
9797

9898

9999
fn cftob(val: c_int) -> Bool:

lightbug_http/header.mojo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ struct RequestHeader:
296296
raise Error("Invalid protocol, HTTP version not supported: " + String(proto))
297297

298298
_ = self.set_protocol_bytes(proto)
299-
_ = self.set_request_uri_bytes(b[:n])
299+
_ = self.set_request_uri_bytes(b[:n - 2]) # without the null terminator
300300

301301
return len(buf) - len(b_next)
302302

@@ -653,7 +653,7 @@ struct ResponseHeader:
653653
_ = self.parse_first_line(first_line)
654654

655655
for header in headers:
656-
var header_str = header.__getitem__()
656+
var header_str = header[]
657657
var separator = header_str.find(":")
658658
if separator == -1:
659659
raise Error("Invalid header")

lightbug_http/http.mojo

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,10 @@ fn encode(req: HTTPRequest, uri: URI) raises -> StringSlice[False, ImmutableStat
321321
else:
322322
_ = builder.write_string(strSlash)
323323
_ = builder.write_string(whitespace)
324-
325-
_ = builder.write(req.header.protocol())
324+
325+
# _ = builder.write(req.header.protocol())
326+
# hardcoded for now
327+
_ = builder.write_string("HTTP/1.1")
326328

327329
_ = builder.write_string(rChar)
328330
_ = builder.write_string(nChar)
@@ -421,7 +423,7 @@ fn encode(res: HTTPResponse) raises -> String:
421423
_ = builder.write_string(rChar)
422424
_ = builder.write_string(nChar)
423425
_ = builder.write(res.get_body_bytes())
424-
426+
425427
return StringSlice[False, ImmutableStaticLifetime](unsafe_from_utf8_ptr=builder.render().unsafe_ptr(), len=builder.size)
426428

427429
fn split_http_string(buf: Bytes) raises -> (String, String, String):

lightbug_http/io/bytes.mojo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ fn next_line(b: Bytes) raises -> (Bytes, Bytes):
4949
var n = n_next
5050
if n > 0 and (b[n-1] == bytes(rChar, pop=False)[0]):
5151
n -= 1
52-
return (b[:n], b[n_next+1:])
52+
return (b[:n+1], b[n_next+1:])
5353

5454
@value
5555
@register_passable("trivial")

lightbug_http/net.mojo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ fn get_sock_name(fd: Int32) raises -> HostPort:
258258
)
259259
if status == -1:
260260
raise Error("get_sock_name: Failed to get address of local socket.")
261-
var addr_in = local_address_ptr.bitcast[sockaddr_in]().__getitem__()
261+
var addr_in = local_address_ptr.bitcast[sockaddr_in]()[]
262262

263263
return HostPort(
264264
host=convert_binary_ip_to_string(addr_in.sin_addr.s_addr, AF_INET, 16),
@@ -279,7 +279,7 @@ fn get_peer_name(fd: Int32) raises -> HostPort:
279279
raise Error("get_peer_name: Failed to get address of remote socket.")
280280

281281
# Cast sockaddr struct to sockaddr_in to convert binary IP to string.
282-
var addr_in = remote_address_ptr.bitcast[sockaddr_in]().__getitem__()
282+
var addr_in = remote_address_ptr.bitcast[sockaddr_in]()[]
283283

284284
return HostPort(
285285
host=convert_binary_ip_to_string(addr_in.sin_addr.s_addr, AF_INET, 16),

lightbug_http/sys/net.mojo

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,8 @@ struct SysListenConfig(ListenConfig):
142142
ip_buf_size = 16
143143

144144
var ip_buf = UnsafePointer[c_void].alloc(ip_buf_size)
145-
var raw_ip = ip_buf.bitcast[c_uint]().__getitem__()
145+
var conv_status = inet_pton(address_family, to_char_ptr(addr.ip), ip_buf)
146+
var raw_ip = ip_buf.bitcast[c_uint]()[]
146147

147148
var bin_port = htons(UInt16(addr.port))
148149

@@ -154,14 +155,13 @@ struct SysListenConfig(ListenConfig):
154155
print("Socket creation error")
155156

156157
var yes: Int = 1
157-
var opterr = setsockopt(
158+
_ = setsockopt(
158159
sockfd,
159160
SOL_SOCKET,
160161
SO_REUSEADDR,
161162
UnsafePointer[Int].address_of(yes).bitcast[c_void](),
162163
sizeof[Int](),
163164
)
164-
print(opterr)
165165

166166
var bind_success = False
167167
var bind_fail_logged = False
@@ -276,13 +276,13 @@ struct addrinfo_macos(AnAddrInfo):
276276
var ai_socktype: c_int
277277
var ai_protocol: c_int
278278
var ai_addrlen: socklen_t
279-
var ai_canonname: Pointer[c_char]
280-
var ai_addr: Pointer[sockaddr]
281-
var ai_next: Pointer[c_void]
279+
var ai_canonname: UnsafePointer[c_char]
280+
var ai_addr: UnsafePointer[sockaddr]
281+
var ai_next: UnsafePointer[c_void]
282282

283283
fn __init__() -> Self:
284284
return Self(
285-
0, 0, 0, 0, 0, Pointer[c_char](), Pointer[sockaddr](), Pointer[c_void]()
285+
0, 0, 0, 0, 0, UnsafePointer[c_char](), UnsafePointer[sockaddr](), UnsafePointer[c_void]()
286286
)
287287

288288
fn get_ip_address(self, host: String) raises -> in_addr:
@@ -298,7 +298,7 @@ struct addrinfo_macos(AnAddrInfo):
298298
"""
299299
var host_ptr = to_char_ptr(host)
300300
var servinfo = UnsafePointer[Self]().alloc(1)
301-
servinfo[0] = Self()
301+
initialize_pointee_move(servinfo, Self())
302302

303303
var hints = Self()
304304
hints.ai_family = AF_INET
@@ -315,7 +315,7 @@ struct addrinfo_macos(AnAddrInfo):
315315
print("getaddrinfo failed")
316316
raise Error("Failed to get IP address. getaddrinfo failed.")
317317

318-
var addrinfo = servinfo[0]
318+
var addrinfo = servinfo[]
319319

320320
var ai_addr = addrinfo.ai_addr
321321
if not ai_addr:
@@ -325,7 +325,7 @@ struct addrinfo_macos(AnAddrInfo):
325325
" ai_addr is null."
326326
)
327327

328-
var addr_in = ai_addr.bitcast[sockaddr_in]().load()
328+
var addr_in = ai_addr.bitcast[sockaddr_in]()[]
329329

330330
return addr_in.sin_addr
331331

@@ -342,13 +342,13 @@ struct addrinfo_unix(AnAddrInfo):
342342
var ai_socktype: c_int
343343
var ai_protocol: c_int
344344
var ai_addrlen: socklen_t
345-
var ai_addr: Pointer[sockaddr]
346-
var ai_canonname: Pointer[c_char]
347-
var ai_next: Pointer[c_void]
345+
var ai_addr: UnsafePointer[sockaddr]
346+
var ai_canonname: UnsafePointer[c_char]
347+
var ai_next: UnsafePointer[c_void]
348348

349349
fn __init__() -> Self:
350350
return Self(
351-
0, 0, 0, 0, 0, Pointer[sockaddr](), Pointer[c_char](), Pointer[c_void]()
351+
0, 0, 0, 0, 0, UnsafePointer[sockaddr](), UnsafePointer[c_char](), UnsafePointer[c_void]()
352352
)
353353

354354
fn get_ip_address(self, host: String) raises -> in_addr:
@@ -364,7 +364,7 @@ struct addrinfo_unix(AnAddrInfo):
364364
"""
365365
var host_ptr = to_char_ptr(String(host))
366366
var servinfo = UnsafePointer[Self]().alloc(1)
367-
servinfo[0] = Self()
367+
initialize_pointee_move(servinfo, Self())
368368

369369
var hints = Self()
370370
hints.ai_family = AF_INET
@@ -381,7 +381,7 @@ struct addrinfo_unix(AnAddrInfo):
381381
print("getaddrinfo failed")
382382
raise Error("Failed to get IP address. getaddrinfo failed.")
383383

384-
var addrinfo = servinfo[0]
384+
var addrinfo = servinfo[]
385385

386386
var ai_addr = addrinfo.ai_addr
387387
if not ai_addr:
@@ -391,7 +391,7 @@ struct addrinfo_unix(AnAddrInfo):
391391
" ai_addr is null."
392392
)
393393

394-
var addr_in = ai_addr.bitcast[sockaddr_in]().load()
394+
var addr_in = ai_addr.bitcast[sockaddr_in]()[]
395395

396396
return addr_in.sin_addr
397397

lightbug_http/sys/server.mojo

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -177,56 +177,56 @@ struct SysServer:
177177

178178
var req_number = 0
179179

180-
while True:
181-
req_number += 1
180+
# while True:
181+
req_number += 1
182182

183-
var first_byte = reader.peek(1)
184-
if len(first_byte) == 0:
185-
error = Error("Failed to read first byte from connection")
186-
187-
var header = RequestHeader()
188-
# var end_of_first_line_headers: Int
189-
190-
try:
191-
_ = header.parse_raw(reader)
192-
except e:
193-
error = Error("Failed to parse request headers: " + e.__str__())
194-
183+
var first_byte = reader.peek(1)
184+
if len(first_byte) == 0:
185+
error = Error("Failed to read first byte from connection")
186+
187+
var header = RequestHeader()
188+
# var end_of_first_line_headers: Int
189+
190+
try:
191+
_ = header.parse_raw(reader)
192+
except e:
193+
error = Error("Failed to parse request headers: " + e.__str__())
194+
195195

196-
var uri = URI(self.address() + String(header.request_uri()))
197-
try:
198-
uri.parse()
199-
except e:
200-
error = Error("Failed to parse request line:" + e.__str__())
201-
202-
if header.content_length() > 0:
203-
if max_request_body_size > 0 and header.content_length() > max_request_body_size:
204-
error = Error("Request body too large")
205-
206-
# var remaining_body = Bytes()
207-
# var remaining_len = header.content_length() - (len(request_body) + 1)
208-
# while remaining_len > 0:
209-
# var read_len = conn.read(remaining_body)
210-
# buf.extend(remaining_body)
211-
# remaining_len -= read_len
212-
213-
var request = HTTPRequest(
214-
uri,
215-
Bytes(),
216-
header,
217-
)
218-
219-
_ = request.read_body(reader, header.content_length(), max_request_body_size)
220-
221-
var res = handler.func(request)
222-
223-
# if not self.tcp_keep_alive:
224-
_ = res.set_connection_close()
196+
var uri = URI(self.address() + String(header.request_uri()))
197+
try:
198+
uri.parse()
199+
except e:
200+
error = Error("Failed to parse request line:" + e.__str__())
201+
202+
if header.content_length() > 0:
203+
if max_request_body_size > 0 and header.content_length() > max_request_body_size:
204+
error = Error("Request body too large")
225205

226-
var res_encoded = encode(res)
206+
# var remaining_body = Bytes()
207+
# var remaining_len = header.content_length() - (len(request_body) + 1)
208+
# while remaining_len > 0:
209+
# var read_len = conn.read(remaining_body)
210+
# buf.extend(remaining_body)
211+
# remaining_len -= read_len
212+
213+
var request = HTTPRequest(
214+
uri,
215+
Bytes(),
216+
header,
217+
)
218+
219+
_ = request.read_body(reader, header.content_length(), max_request_body_size)
220+
print(encode(request, uri))
221+
var res = handler.func(request)
222+
223+
# if not self.tcp_keep_alive:
224+
_ = res.set_connection_close()
225+
226+
var res_encoded = encode(res)
227227

228-
_ = conn.write(res_encoded)
228+
_ = conn.write(res_encoded)
229229

230-
# if not self.tcp_keep_alive:
231-
conn.close()
232-
# break
230+
# if not self.tcp_keep_alive:
231+
conn.close()
232+
# break

test.mojo

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ from lightbug_http import *
44
struct MyPrinter(HTTPService):
55
fn func(self, req: HTTPRequest) raises -> HTTPResponse:
66
var body = req.get_body_bytes()
7+
78
return HTTPResponse(body)
89

910

1011
fn main() raises:
11-
var server = SysServer(tcp_keep_alive=True)
12+
var server = SysServer()
1213
var handler = MyPrinter()
1314
server.listen_and_serve("0.0.0.0:8080", handler)

0 commit comments

Comments
 (0)