fix memory leaks

This commit is contained in:
floscodes 2023-04-28 21:53:30 +02:00
parent 7c216f91c0
commit 98709106e5
2 changed files with 17 additions and 22 deletions

View file

@ -30,6 +30,7 @@ pub const Server = struct {
defer conn.stream.close(); defer conn.stream.close();
var buffer = std.ArrayList(u8).init(allocator); var buffer = std.ArrayList(u8).init(allocator);
defer buffer.deinit();
var chunk_buf: [4096]u8 = undefined; var chunk_buf: [4096]u8 = undefined;
// Collect max 4096 bytes of data from the stream into the chunk_buf. Then add it // Collect max 4096 bytes of data from the stream into the chunk_buf. Then add it
@ -42,7 +43,9 @@ pub const Server = struct {
} }
// Build the Request // Build the Request
const req_stream = try buffer.toOwnedSlice(); const req_stream = try buffer.toOwnedSlice();
defer allocator.free(req_stream);
var req = try buildRequest(req_stream, allocator); var req = try buildRequest(req_stream, allocator);
defer allocator.free(req.headers);
// if there ist a path set in the uri trim the trailing slash in order to accept it later during the matching check. // if there ist a path set in the uri trim the trailing slash in order to accept it later during the matching check.
if (req.uri.len > 1) req.uri = std.mem.trimRight(u8, req.uri, "/"); if (req.uri.len > 1) req.uri = std.mem.trimRight(u8, req.uri, "/");
@ -64,8 +67,11 @@ pub const Server = struct {
break; break;
} }
} }
// Stringify the Response and send it to the client. // Stringify the Response.
const response_string = try stringifyResponse(res, allocator); const response_string = try stringifyResponse(res, allocator);
// Free memory after writing Response and sending it to client.
defer allocator.free(response_string);
// Write stringified Response and send it to client.
_ = try conn.stream.write(response_string); _ = try conn.stream.write(response_string);
} }
} }
@ -104,7 +110,9 @@ fn buildRequest(bytes: []const u8, allocator: std.mem.Allocator) !Request {
// Test the Request build function // Test the Request build function
test "build a Request" { test "build a Request" {
const bytes = "GET /test HTTP/1.1\nHost: localhost:8080\nUser-Agent: Testbot\r\nThis is the test body!"; const bytes = "GET /test HTTP/1.1\nHost: localhost:8080\nUser-Agent: Testbot\r\nThis is the test body!";
const req = try buildRequest(bytes); const allocator = std.testing.allocator;
const req = try buildRequest(bytes, allocator);
defer allocator.free(req.headers);
try std.testing.expect(req.method == Method.GET); try std.testing.expect(req.method == Method.GET);
try std.testing.expect(req.httpVersion == HTTP_Version.HTTP1_1); try std.testing.expect(req.httpVersion == HTTP_Version.HTTP1_1);
try std.testing.expect(std.mem.eql(u8, req.uri, "/test")); try std.testing.expect(std.mem.eql(u8, req.uri, "/test"));
@ -124,7 +132,9 @@ fn stringifyResponse(r: Response, allocator: std.mem.Allocator) ![]const u8 {
try res.appendSlice("\r\n"); try res.appendSlice("\r\n");
for (r.headers) |header| { for (r.headers) |header| {
try res.appendSlice(try header.stringify()); try res.appendSlice(header.key);
try res.appendSlice(": ");
try res.appendSlice(header.value);
try res.appendSlice("\n"); try res.appendSlice("\n");
} }
try res.appendSlice("\r\n\r\n"); try res.appendSlice("\r\n\r\n");
@ -134,9 +144,10 @@ fn stringifyResponse(r: Response, allocator: std.mem.Allocator) ![]const u8 {
} }
test "stringify Response" { test "stringify Response" {
const allocator = std.heap.page_allocator; const allocator = std.testing.allocator;
const headers = [_]types.Header{.{ .key = "User-Agent", .value = "Testbot" }}; const headers = [_]types.Header{.{ .key = "User-Agent", .value = "Testbot" }};
const res = Response{ .headers = &headers, .body = "This is the body!" }; const res = Response{ .headers = &headers, .body = "This is the body!" };
const res_str = try stringifyResponse(res, allocator);
try std.testing.expect(eql(u8, try stringifyResponse(res, allocator), "HTTP/1.1 200 OK\r\nUser-Agent: Testbot\n\r\n\r\nThis is the body!")); defer allocator.free(res_str);
try std.testing.expect(eql(u8, res_str, "HTTP/1.1 200 OK\r\nUser-Agent: Testbot\n\r\n\r\nThis is the body!"));
} }

View file

@ -15,22 +15,6 @@ pub const Route = tuple(&.{ []const u8, *const fn (Request) Response });
pub const Header = struct { pub const Header = struct {
key: []const u8, key: []const u8,
value: []const u8, value: []const u8,
/// Turns the header key and value into a string.
pub fn stringify(header: Header) ![]const u8 {
var string = std.ArrayList(u8).init(allocator);
string.appendSlice(header.key) catch unreachable;
string.appendSlice(": ") catch unreachable;
string.appendSlice(header.value) catch unreachable;
const out = try string.toOwnedSlice();
return out;
}
test "stringify Header" {
var header = Header{ .key = "User-Agent", .value = "Testbot" };
const compare = "User-Agent: Testbot";
try std.testing.expect(std.mem.eql(u8, header.stringify(), compare[0..]));
}
}; };
/// The HTTP Version. /// The HTTP Version.