| ... | @@ -1256,3 +1256,63 @@ test "redirect to different connection" { | ... | @@ -1256,3 +1256,63 @@ test "redirect to different connection" { |
| 1256 | try expectEqualStrings("good job, you pass", body); | 1256 | try expectEqualStrings("good job, you pass", body); |
| 1257 | } | 1257 | } |
| 1258 | } | 1258 | } |
| | 1259 | |
| | 1260 | test "boot failed connections from the pool" { |
| | 1261 | if (builtin.cpu.arch.isPowerPC64() and builtin.mode != .Debug) return error.SkipZigTest; // https://github.com/llvm/llvm-project/issues/171879 |
| | 1262 | if (builtin.os.tag == .openbsd) return error.SkipZigTest; // https://codeberg.org/ziglang/zig/issues/30806 |
| | 1263 | |
| | 1264 | const io = std.testing.io; |
| | 1265 | const gpa = std.testing.allocator; |
| | 1266 | |
| | 1267 | const test_server_orig = try createTestServer(io, struct { |
| | 1268 | fn run(test_server: *TestServer) anyerror!void { |
| | 1269 | const net_server = &test_server.net_server; |
| | 1270 | var recv_buffer: [500]u8 = undefined; |
| | 1271 | var send_buffer: [500]u8 = undefined; |
| | 1272 | |
| | 1273 | accept: while (!test_server.shutting_down) { |
| | 1274 | var stream = try net_server.accept(io); |
| | 1275 | defer stream.close(io); |
| | 1276 | |
| | 1277 | for (0..2) |i| { |
| | 1278 | var connection_br = stream.reader(io, &recv_buffer); |
| | 1279 | var connection_bw = stream.writer(io, &send_buffer); |
| | 1280 | var server = http.Server.init(&connection_br.interface, &connection_bw.interface); |
| | 1281 | var request = server.receiveHead() catch |err| switch (err) { |
| | 1282 | error.HttpConnectionClosing => continue :accept, |
| | 1283 | else => |e| return e, |
| | 1284 | }; |
| | 1285 | if (i == 0) try request.respond("hello", .{}); |
| | 1286 | } |
| | 1287 | } |
| | 1288 | } |
| | 1289 | }); |
| | 1290 | defer test_server_orig.destroy(); |
| | 1291 | |
| | 1292 | var client: http.Client = .{ |
| | 1293 | .allocator = gpa, |
| | 1294 | .io = io, |
| | 1295 | }; |
| | 1296 | defer client.deinit(); |
| | 1297 | |
| | 1298 | var loc_buf: [100]u8 = undefined; |
| | 1299 | const location = try std.fmt.bufPrint(&loc_buf, "http://127.0.0.1:{d}/", .{ |
| | 1300 | test_server_orig.port(), |
| | 1301 | }); |
| | 1302 | const uri = try std.Uri.parse(location); |
| | 1303 | |
| | 1304 | { |
| | 1305 | const response = try client.fetch(.{ .location = .{ .uri = uri } }); |
| | 1306 | try expectEqual(.ok, response.status); |
| | 1307 | } |
| | 1308 | { |
| | 1309 | try expectError(error.HttpConnectionClosing, client.fetch(.{ .location = .{ .uri = uri } })); |
| | 1310 | } |
| | 1311 | { |
| | 1312 | const response = try client.fetch(.{ .location = .{ .uri = uri } }); |
| | 1313 | try expectEqual(.ok, response.status); |
| | 1314 | } |
| | 1315 | { |
| | 1316 | try expectError(error.HttpConnectionClosing, client.fetch(.{ .location = .{ .uri = uri } })); |
| | 1317 | } |
| | 1318 | } |