diff --git a/lib/std/http.zig b/lib/std/http.zig index 692d402d9f..99b181d05e 100644 --- a/lib/std/http.zig +++ b/lib/std/http.zig @@ -315,4 +315,5 @@ test { _ = Method; _ = Server; _ = Status; + _ = @import("http/test.zig"); } diff --git a/lib/std/http/test.zig b/lib/std/http/test.zig new file mode 100644 index 0000000000..9175660e7d --- /dev/null +++ b/lib/std/http/test.zig @@ -0,0 +1,76 @@ +const std = @import("std"); + +test "trailers" { + const gpa = std.testing.allocator; + + var http_server = std.http.Server.init(.{ + .reuse_address = true, + }); + const address = try std.net.Address.parseIp("127.0.0.1", 0); + try http_server.listen(address); + + const port = http_server.socket.listen_address.in.getPort(); + + const server_thread = try std.Thread.spawn(.{}, serverThread, .{&http_server}); + defer server_thread.join(); + + var client: std.http.Client = .{ .allocator = gpa }; + defer client.deinit(); + + const location = try std.fmt.allocPrint(gpa, "http://127.0.0.1:{d}/trailer", .{port}); + defer gpa.free(location); + const uri = try std.Uri.parse(location); + + var server_header_buffer: [1024]u8 = undefined; + var req = try client.open(.GET, uri, .{ + .server_header_buffer = &server_header_buffer, + }); + defer req.deinit(); + + try req.send(.{}); + try req.wait(); + + const body = try req.reader().readAllAlloc(gpa, 8192); + defer gpa.free(body); + + try std.testing.expectEqualStrings("Hello, World!\n", body); + if (true) @panic("TODO implement inspecting custom headers in responses"); + //try testing.expectEqualStrings("aaaa", req.response.headers.getFirstValue("x-checksum").?); + + // connection has been kept alive + try std.testing.expect(client.connection_pool.free_len == 1); +} + +fn serverThread(http_server: *std.http.Server) anyerror!void { + const gpa = std.testing.allocator; + + var header_buffer: [1024]u8 = undefined; + var remaining: usize = 1; + accept: while (remaining != 0) : (remaining -= 1) { + var res = try http_server.accept(.{ + .allocator = gpa, + .client_header_buffer = &header_buffer, + }); + defer res.deinit(); + + res.wait() catch |err| switch (err) { + error.HttpHeadersInvalid => continue :accept, + error.EndOfStream => continue, + else => return err, + }; + try serve(&res); + + try std.testing.expectEqual(.reset, res.reset()); + } +} + +fn serve(res: *std.http.Server.Response) !void { + try std.testing.expectEqualStrings(res.request.target, "/trailer"); + res.transfer_encoding = .chunked; + + try res.send(); + try res.writeAll("Hello, "); + try res.writeAll("World!\n"); + // try res.finish(); + try res.connection.writeAll("0\r\nX-Checksum: aaaa\r\n\r\n"); +} diff --git a/test/standalone/http.zig b/test/standalone/http.zig index c11bf9a0a7..ee029538bc 100644 --- a/test/standalone/http.zig +++ b/test/standalone/http.zig @@ -98,14 +98,6 @@ fn handleRequest(res: *Server.Response) !void { try res.writeAll("Hello, "); try res.writeAll("World!\n"); try res.finish(); - } else if (mem.eql(u8, res.request.target, "/trailer")) { - res.transfer_encoding = .chunked; - - try res.send(); - try res.writeAll("Hello, "); - try res.writeAll("World!\n"); - // try res.finish(); - try res.connection.writeAll("0\r\nX-Checksum: aaaa\r\n\r\n"); } else if (mem.eql(u8, res.request.target, "/redirect/1")) { res.transfer_encoding = .chunked; @@ -378,32 +370,6 @@ pub fn main() !void { // connection has been kept alive try testing.expect(client.http_proxy != null or client.connection_pool.free_len == 1); - { // check trailing headers - const location = try std.fmt.allocPrint(calloc, "http://127.0.0.1:{d}/trailer", .{port}); - defer calloc.free(location); - const uri = try std.Uri.parse(location); - - log.info("{s}", .{location}); - var server_header_buffer: [1024]u8 = undefined; - var req = try client.open(.GET, uri, .{ - .server_header_buffer = &server_header_buffer, - }); - defer req.deinit(); - - try req.send(.{}); - try req.wait(); - - const body = try req.reader().readAllAlloc(calloc, 8192); - defer calloc.free(body); - - try testing.expectEqualStrings("Hello, World!\n", body); - @panic("TODO implement inspecting custom headers in responses"); - //try testing.expectEqualStrings("aaaa", req.response.headers.getFirstValue("x-checksum").?); - } - - // connection has been kept alive - try testing.expect(client.http_proxy != null or client.connection_pool.free_len == 1); - { // send content-length request const location = try std.fmt.allocPrint(calloc, "http://127.0.0.1:{d}/echo-content", .{port}); defer calloc.free(location);